Unity:如何创建一个无法传送其他对象的对象

时间:2016-05-16 17:49:31

标签: unity3d collision unity3d-2dtools

如何创建一个2D对象,在该对象上不能传送其他(仅停留在同一位置)对象,或者只能在一侧传送(在图片左侧)。我有困难和错误的方式。对不起我的英语不好。有项目:

link 3

picture

1 个答案:

答案 0 :(得分:0)

通过固定步骤移动(“跳跃”),您需要代码逻辑来确定是否可以进行某种移动。我建议为目标(红色对象)创建一个类,该类具有一个变量,该变量指出哪一侧是打开的,以及一个函数,以查看是否可以从您所在的一侧进入。
在您的移动中,您需要检查这样的物体是否朝向您想要移动的方向,并询问它是否可以从您所在的一侧进入。

这是非常伪的,因为我不知道你的网格实现以及你如何确定它们的位置并且可能会被优化。

Dim path
path = "C:\Users\lnguy\Desktop\FTO Development\New Chemical Receipt Form.xlsm"

' ....

Set xlBook = xlApp.Workbooks.Open(path, 0, True)

xlApp.Run "'" & path & "'!Expired2"

并在对象上放置一个脚本(如果已有脚本,则将其添加到脚本中),如下所示。

public class Player : MonoBehaviour
{
    void Update()
    {
        if("move to left" && "object on left".GetComponent<RedObject>().canEnterFromSide("right") == true)
        {
            //move
        }
        else if("move to right" && "object on right".GetComponent<RedObject>().canEnterFromSide("left") == true)
        {
            //move
        }
        else if("move to top" && "object on top".GetComponent<RedObject>().canEnterFromSide("bottom") == true)
        {
            //move
        }
        else if("move to bottom" && "object on bottom".GetComponent<RedObject>().canEnterFromSide("top") == true)
        {
            //move
        }            
    }
}

<强>更新
好的,我看了你的项目。目前,您还没有放置障碍物的部分。这应该是下一步。

创建一个生成器,它将在你的网格上产生障碍物(网格间隔将是你的玩家速度。有一个列表或字典,其中包含你所有放置的障碍的参考,所以你可以参考它们。一个简单的方法会是这样的:

public class RedObject : MonoBehaviour
{
    // use e.g. "left", "right", "top", "bottom" to specify the open side
    // if you spawn the objects, set this upon spawning and according to the orientation obviously
    public string openSide = "left";

    public bool canEnterFromSide(string side)
    {
        return side == openSide;
    }
}

现在,如果您移动,请询问此课程是否在所需目的地有障碍物。 (我遗漏了这堂课的其他内容。)

public class PlayerMove:MonoBehaviour {     public int step;

public class Generator : MonoBehaviour
{
    public GameObject obstaclePrefab;

    Dictionary<string, GameObject> obstacles;    // Dictionary requires using System.Collections.Generic;

    // default rotation = open to the left
    Dictionary<string, Quaternion> rotations;

    void Start()
    {
        rotations = new Dictionary<string, Quaternion>()
        {
            { "left", Quaternion.Euler(0,0,0) },
            { "bottom", Quaternion.Euler(0,90,0) },
            { "right", Quaternion.Euler(0,180,0) },
            { "top", Quaternion.Euler(0,270,0) }
        }
    }

    void SpawnObstacle(Vector2 position, string openSide)
    {
        GameObject go = (GameObject)Instantiate(obstaclePrefab, position, rotations[openSide]);
        go.GetComponent<Obstacle>().openSide = openSide;
        string pos = position.x + "_" + position.y;
        obstacles.Add(pos, go);
    }

    GameObject GetObjectAt(Vector3 position)
    {
        string pos = position.x + "_" + position.y;
        if(obstacles.ContainsKey(pos) == true)
        {
            return obstacles[pos];
        }
        return null;
    }
}

}

现在,它使用像网格一样的固定象棋,其中障碍物占据一个单元格。您的视频显示了其他一些行为,因此这可能对您没有多大帮助。它最简单的可能是让玩家以平滑的动作移动并使用像程序员所展示的碰撞器和刚体,或使用像这样的固定网格。