Unity:如何创建一个不能传送其他对象的对象
Unity: How to create a object on which can't teleport other object
如何创建一个 2D 对象,该对象不能在其上传送其他(只能保持在同一位置)对象或只能在一侧传送(在图片左侧)。我有困难和错误的方法。对不起我的英语不好。有项目:
对于固定步进运动 ("jumping"),您需要代码逻辑来确定某个运动是否可行。我建议为目标(红色对象)创建一个 class,它有一个变量来说明哪一侧是开放的,以及一个函数来查看您是否可以从您所在的一侧进入。
在你的移动中你需要检查这样的物体是否在你想要移动的方向并询问它是否可以从你所在的一侧进入。
这是非常伪的,因为我不知道您的网格实现以及您如何确定内容的位置以及可能进行优化的方式。
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 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;
}
}
现在如果你移动,问这个class在你想要的目的地是否有障碍物。 (我从 class 中遗漏了其他内容。)
public class PlayerMove:MonoBehaviour
{
public 整数步骤;
Generator generator;
void Start()
{
generator = GameObject.FindWithTag("Generator");
}
void Update()
{
if(Input.GetKeyDown(KeyCode.LeftArrow))
{
GameObject go = generator.GetObjectAt(transform.position - new Vector3(step, 0, 0));
if(go == null || go.GetComponent<Obstacle>().CanEnterFromSide("right") == true)
{
transform.position = transform.position - new Vector3(step, 0, 0);
}
}
// repeat for the other three directions.
}
}
现在,这使用固定的国际象棋,如网格,其中障碍物占据一个单元格。您的视频显示了一些其他行为,因此这可能对您没有多大帮助。最简单的方法可能是让玩家平滑移动并使用像程序员展示的那样的碰撞器和刚体,或者像这样使用固定网格。
如何创建一个 2D 对象,该对象不能在其上传送其他(只能保持在同一位置)对象或只能在一侧传送(在图片左侧)。我有困难和错误的方法。对不起我的英语不好。有项目:
对于固定步进运动 ("jumping"),您需要代码逻辑来确定某个运动是否可行。我建议为目标(红色对象)创建一个 class,它有一个变量来说明哪一侧是开放的,以及一个函数来查看您是否可以从您所在的一侧进入。
在你的移动中你需要检查这样的物体是否在你想要移动的方向并询问它是否可以从你所在的一侧进入。
这是非常伪的,因为我不知道您的网格实现以及您如何确定内容的位置以及可能进行优化的方式。
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 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;
}
}
现在如果你移动,问这个class在你想要的目的地是否有障碍物。 (我从 class 中遗漏了其他内容。)
public class PlayerMove:MonoBehaviour { public 整数步骤;
Generator generator;
void Start()
{
generator = GameObject.FindWithTag("Generator");
}
void Update()
{
if(Input.GetKeyDown(KeyCode.LeftArrow))
{
GameObject go = generator.GetObjectAt(transform.position - new Vector3(step, 0, 0));
if(go == null || go.GetComponent<Obstacle>().CanEnterFromSide("right") == true)
{
transform.position = transform.position - new Vector3(step, 0, 0);
}
}
// repeat for the other three directions.
}
}
现在,这使用固定的国际象棋,如网格,其中障碍物占据一个单元格。您的视频显示了一些其他行为,因此这可能对您没有多大帮助。最简单的方法可能是让玩家平滑移动并使用像程序员展示的那样的碰撞器和刚体,或者像这样使用固定网格。