如何在沿着随机路径时避开物体?统一 2d
How Do I avoid objects while following a random path? Unity 2d
我有一个敌人对象设置为在二维迷宫环境中向随机节点移动。我遇到的唯一问题是防止敌人像蟑螂一样挤过碰撞墙。这是我从教程中遵循的代码,用于使用路径点移动敌人。感谢所有帮助,自从我一直在努力解决这个问题以来已经差不多一周了!
public class Enemy_AI : MonoBehaviour {
public float speed;
public float waitTime;
public float startWaitTime;
public Transform[] moveSpots;
private int randomSpot;
private void Start()
{
randomSpot = Random.Range(0, moveSpots.Length);
waitTime = startWaitTime;
}
void Update()
{
transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);
if(Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
{
if(waitTime <= 0)
{
randomSpot = Random.Range(0, moveSpots.Length);
waitTime = startWaitTime;
}
else
{
waitTime -= Time.deltaTime;
}
}
}
}
为此你应该使用Raycast,光线投射可以检测给定位置和方向之间是否有物体,你还可以传递光线的长度以及应该考虑哪些物体层。
请记住,您的代码可能类似于以下内容:
public LayerMask mask;
void Update()
{
RaycastHit2D hit = Physics2D.Raycast(transform.position, moveSpots[randomSpot].position, 0.2f, mask);
if(!hit)
{
transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);
}
if(Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
{
if(waitTime <= 0)
{
randomSpot = Random.Range(0, moveSpots.Length);
waitTime = startWaitTime;
}
else
{
waitTime -= Time.deltaTime;
}
}
}
使用检查器中的遮罩,您可以 select 将用作射线碰撞的元素,因此您的 "Obstacles" 应该被标记在那里(并有自己的图层)
为了调试,如果有任何地方可以移动,你可以这样做:
if(Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
{
// as it is
}
else
{
bool canMove = false;
for(int i = 0; i < moveSpots.Lenght;i++)
{
if(Vector2.Distance(transform.position, moveSpots[i].position) < 0.2f)
{
canMove = true;
}
}
Debug.Log("Is avaliable any move?" + canMove);
}
我有一个敌人对象设置为在二维迷宫环境中向随机节点移动。我遇到的唯一问题是防止敌人像蟑螂一样挤过碰撞墙。这是我从教程中遵循的代码,用于使用路径点移动敌人。感谢所有帮助,自从我一直在努力解决这个问题以来已经差不多一周了!
public class Enemy_AI : MonoBehaviour {
public float speed;
public float waitTime;
public float startWaitTime;
public Transform[] moveSpots;
private int randomSpot;
private void Start()
{
randomSpot = Random.Range(0, moveSpots.Length);
waitTime = startWaitTime;
}
void Update()
{
transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);
if(Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
{
if(waitTime <= 0)
{
randomSpot = Random.Range(0, moveSpots.Length);
waitTime = startWaitTime;
}
else
{
waitTime -= Time.deltaTime;
}
}
}
}
为此你应该使用Raycast,光线投射可以检测给定位置和方向之间是否有物体,你还可以传递光线的长度以及应该考虑哪些物体层。
请记住,您的代码可能类似于以下内容:
public LayerMask mask;
void Update()
{
RaycastHit2D hit = Physics2D.Raycast(transform.position, moveSpots[randomSpot].position, 0.2f, mask);
if(!hit)
{
transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);
}
if(Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
{
if(waitTime <= 0)
{
randomSpot = Random.Range(0, moveSpots.Length);
waitTime = startWaitTime;
}
else
{
waitTime -= Time.deltaTime;
}
}
}
使用检查器中的遮罩,您可以 select 将用作射线碰撞的元素,因此您的 "Obstacles" 应该被标记在那里(并有自己的图层)
为了调试,如果有任何地方可以移动,你可以这样做:
if(Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
{
// as it is
}
else
{
bool canMove = false;
for(int i = 0; i < moveSpots.Lenght;i++)
{
if(Vector2.Distance(transform.position, moveSpots[i].position) < 0.2f)
{
canMove = true;
}
}
Debug.Log("Is avaliable any move?" + canMove);
}