unity2D敌人在x轴和y轴移动追踪玩家不可斜角追踪自动躲避障碍物并且输出方向
时间: 2023-06-19 19:07:57 浏览: 156
实现这个功能,你可以使用Unity的NavMesh Agent。
首先,你需要创建一个NavMesh,以便你的敌人可以在其上移动。你可以在场景中选择一个地面,然后点击菜单栏中的Navigation -> Bake选项来创建NavMesh。
接下来,你需要创建一个敌人,并将其添加到NavMesh中。你可以在敌人的GameObject上添加一个NavMesh Agent组件,然后设置它的Speed属性来控制敌人的速度。
接着,你需要编写脚本来控制敌人的移动。你可以在脚本中使用NavMesh Agent的SetDestination方法来设置敌人的目标位置,以便它可以追踪玩家。你可以使用Vector3.MoveTowards方法来限制敌人只能在x轴和y轴上移动,以避免斜角追踪。
在脚本中添加检测障碍物的代码,如果发现障碍物就尝试躲避。你可以使用Physics.SphereCast方法来检测敌人前方是否有障碍物,如果有,就使用Vector3.RotateTowards方法来计算敌人需要躲避的方向。
最后,在脚本中添加输出方向的代码,以便你可以知道敌人的移动方向。你可以使用Vector3.Normalize方法来获取敌人的朝向,然后使用Mathf.Atan2方法来计算敌人的角度。
下面是一个示例代码,你可以修改它来适应你的游戏:
```
using UnityEngine;
using System.Collections;
public class EnemyController : MonoBehaviour {
public float speed;
public float detectionDistance;
public float avoidanceDistance;
private Transform player;
private NavMeshAgent agent;
void Start () {
player = GameObject.FindGameObjectWithTag("Player").transform;
agent = GetComponent<NavMeshAgent>();
}
void Update () {
// Chase the player
agent.SetDestination(player.position);
// Limit movement to x and y axis
Vector3 targetPosition = new Vector3(player.position.x, transform.position.y, player.position.z);
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
// Avoid obstacles
RaycastHit hit;
if (Physics.SphereCast(transform.position, 0.5f, transform.forward, out hit, avoidanceDistance)) {
Vector3 avoidanceDirection = Vector3.RotateTowards(transform.forward, hit.normal, Mathf.PI, 0.0f);
agent.SetDestination(transform.position + avoidanceDirection * avoidanceDistance);
}
// Output direction
Vector3 direction = agent.velocity.normalized;
float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
Debug.Log("Direction: " + angle);
}
}
```
阅读全文