不跟随父母的孩子

时间:2014-04-29 15:22:15

标签: c# unity3d 2d

我正在制作一个口袋妖怪克隆。 这是一个自上而下的平铺瓦片。

所以我在玩家身上添加了4个游戏对象。向上,向下,向左,向右调用。 我把它们放在玩家周围。我用这个设置来检查gameObject是否正常。站在水面上。如果这是真的那么玩家就不能上去。这是我的碰撞工作。但是我的孩子不想跟随我的父母。我所做的就是将4个游戏对象拖到播放器上,并添加了这个c#脚本:

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{

    public LayerMask GroundLayer;
    Vector2 startPoint;
    Vector2 endPoint;
    private float increment;
    bool isMoving;
    public float speed;

    public tk2dTileMap tilemap;
    public GameObject up;
    public GameObject down;
    public GameObject left;
    public GameObject right;


    void Start()
    {
        startPoint = transform.position;
        endPoint = transform.position;


    }

    void Update()
    {


        if (increment <= 1 && isMoving == true)
        {
            increment += speed / 100;
        }
        else
        {
            isMoving = false;
        }

        if (isMoving)
        {
            transform.position = Vector2.Lerp(startPoint, endPoint, increment);
        }

        if (Input.GetKey(KeyCode.UpArrow) && isMoving == false)
        {
            if (MovementEvents(up) == 0)
            {
                move(up);
            }
        }
        else if (Input.GetKey(KeyCode.DownArrow) && isMoving == false)
        {
            if (MovementEvents(down) == 0)
            {
                move(down);
            }
        }
        else if (Input.GetKey(KeyCode.LeftArrow) && isMoving == false)
        {       
            if (MovementEvents(left) == 0)
            {
                move(left);
            }
        }
        else if (Input.GetKey(KeyCode.RightArrow) && isMoving == false)
        {
            if (MovementEvents(right) == 0)
            {
                move(right);
            }
        }
    }

    int MovementEvents(GameObject direction)
    {
        switch (tilemap.GetTileIdAtPosition(direction.transform.position, 0)) //gettileIdAtPosition returns the id of a tile in this case 0 is grass and 1 is water
        {
        case 0:
            return 0;
        default:
            return 1;   
        }
    }
    void move(GameObject direction)
    {
        increment = 0;
        isMoving = true;
        startPoint = transform.position;
        endPoint = direction.transform.position;
    }
}

我正在使用2d工具包。

我知道这是可能的,因为我以错误的方式设置它们但我做错了什么?

1 个答案:

答案 0 :(得分:2)

您在脚本(GameObjectup等)中创建了与您在编辑器中创建的对象无关的新down。有两种解决方案:

1)您需要将updown等分配给您在编辑器中创建的GameObject。您可以通过修改Start方法来执行此操作,以包含:

up = GameObject.Find( "up" );
down = GameObject.Find( "down" );
// etc.

"up"替换为您在编辑器中命名为up GameObject的任何内容。


2)使用

updown等作为子项分配给您的父GameObject
up.transform.parent   = parentGameObject.transform;
down.transform.parent = parentGameObject.transform;
// etc.

请注意,如果您选择此路线,则不会使用您在编辑器中创建的updown等对象。您还需要翻译新对象(在设置其父对象之后),否则它们将仅位于(0,0,0)相对于父对象。

编辑以回应评论

如果我正确理解了问题,那么您似乎只是在编辑器中将updown等对象添加为子项时出错。只需将它们全部拖到同一级别的父级上:

enter image description here

然后,只要TestParent对象移动,其他对象就会保持与父对象相同的相对位置,因此也会移动。然后,如果您将GameObjects添加到如下脚本:

enter image description here

您可以单独移动对象(同时仍然相对于父对象)。使用以下示例脚本,父对象每秒向上移动一个单位(Y +)。 Down对象也以每秒一个单位向上移动。这导致ParentTestUpLeftRight维持阵型,每秒移动一个单位,而Down以每秒两个单位移动,慢慢地走过它们。

using UnityEngine;
using System.Collections;

public class DeleteMe : MonoBehaviour 
{
    public GameObject Up;
    public GameObject Down;
    public GameObject Left;
    public GameObject Right;

    void Start( ) 
    {

    }

    // Update is called once per frame
    void Update( ) 
    {
        Move( gameObject );
        Move( Down );
    }

    private void Move( GameObject obj )
    {
        Vector3 position = obj.transform.position;
        position.y += UnityEngine.Time.deltaTime;
        obj.transform.position = position;
    }
}

一开始的截图:

enter image description here

经过一段时间后又过了一​​次:

enter image description here

最后请注意,您不需要在脚本中使用public GameObject,然后将它们拖放到脚本上以访问子项。通过将脚本修改为:

可以实现相同的结果
    private GameObject Up;
    private GameObject Down;
    private GameObject Left;
    private GameObject Right;

    void Start( ) 
    {
        Up    = transform.Find( "Up" ).gameObject;
        Down  = transform.Find( "Down" ).gameObject;
        Left  = transform.Find( "Left" ).gameObject;
        Right = transform.Find( "Right" ).gameObject;
    }

这可以防止必须拖放到脚本本身上的繁琐工作,并且还允许您访问可能动态添加到父级的子级,因此无法拖放。

希望这有帮助!