unity2D代码实现敌人在x轴和y轴移动追踪玩家不可斜角追踪自动躲避障碍物
时间: 2023-06-19 22:07:01 浏览: 105
【unity造轮子】2d敌人AI的实现,并自动躲避障碍物
下面是一个简单的Unity2D脚本示例,用于实现敌人在x轴和y轴移动追踪玩家,不可斜角追踪,并自动躲避障碍物。该脚本应该附加到敌人对象上。
```c#
using UnityEngine;
public class EnemyMovement : MonoBehaviour
{
public Transform target; // 目标对象,即玩家
public float speed = 5f; // 移动速度
public float stoppingDistance = 1f; // 距离目标多远停止移动
public float retreatDistance = 2f; // 远离障碍物的距离
private bool isMoving = false; // 是否正在移动
private Vector3 targetPosition; // 目标位置
void Start()
{
targetPosition = target.position;
}
void Update()
{
// 如果目标对象不存在,则返回
if (target == null) return;
// 计算敌人与目标之间的距离
float distance = Vector2.Distance(transform.position, target.position);
// 如果距离小于停止距离,则停止移动
if (distance < stoppingDistance)
{
isMoving = false;
}
else
{
// 否则,计算目标位置,朝目标移动
isMoving = true;
targetPosition = target.position;
// 如果敌人与目标的x和y坐标之差都小于它们之间的距离,则只朝x或y轴移动,不可斜角追踪
if (Mathf.Abs(transform.position.x - target.position.x) < distance && Mathf.Abs(transform.position.y - target.position.y) < distance)
{
if (Mathf.Abs(transform.position.x - target.position.x) > Mathf.Abs(transform.position.y - target.position.y))
{
targetPosition.y = transform.position.y;
}
else
{
targetPosition.x = transform.position.x;
}
}
// 如果敌人与目标之间有障碍物,则自动躲避障碍物
RaycastHit2D hit = Physics2D.Raycast(transform.position, target.position - transform.position, distance);
if (hit.collider != null && hit.collider.tag == "Obstacle")
{
Vector3 retreatPosition = transform.position + (transform.position - target.position).normalized * retreatDistance;
targetPosition = retreatPosition;
}
}
// 移动
if (isMoving)
{
transform.position = Vector2.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
}
}
}
```
该脚本使用 `target` 变量作为目标对象,即玩家。根据目标位置,敌人将始终向目标移动,但在距离目标一定距离时停止移动。如果敌人与目标之间有障碍物,则敌人将自动躲避障碍物。如果敌人与目标的x和y坐标之差都小于它们之间的距离,则只朝x或y轴移动,不可斜角追踪。
阅读全文