unity3d敌人追击玩家代码,遇到墙壁会转弯
时间: 2024-10-17 15:03:43 浏览: 9
在Unity3D中编写一个简单的敌人AI追击玩家,遇到墙壁转向的代码示例可能会涉及C#脚本。首先,假设我们有`Player`、`Enemy`两个游戏对象,分别代表玩家和敌人,并且有一个`WallCollider2D`组件用于检测碰撞。
```csharp
using UnityEngine;
public class EnemyChase : MonoBehaviour
{
public Transform player; // 玩家的游戏对象引用
public float chaseSpeed = 5f; // 追击速度
private RaycastHit2D[] hits; // 存储碰撞信息
void Update()
{
// 获取玩家当前的位置
Vector2 targetPosition = player.position;
// 如果敌人能看到玩家并且两者之间有直接路径
if (Physics2D.Linecast(transform.position, targetPosition, out hits))
{
// 计算直线方向向量并减去敌人的宽度,以避免撞到自身
Vector2 direction = (targetPosition - transform.position).normalized - GetComponent Rigidbody2D>().sizeDelta.x;
// 设置移动速度
GetComponent<Rigidbody2D>().velocity = direction * chaseSpeed;
// 当敌人接近墙壁时,检查下一个直角方向
foreach (var hit in hits)
{
Vector2 newDirection = GetNextDirection(direction, hit.normal);
if (newDirection != Vector2.zero)
{
direction = newDirection;
break;
}
}
}
else
{
// 如果看不到玩家,随机改变方向
direction = Random.insideUnitCircle;
}
// 更新敌人位置
transform.position += direction * chaseSpeed * Time.deltaTime;
}
// 获取下一个直角方向
private Vector2 GetNextDirection(Vector2 currentDir, Vector2 wallNormal)
{
// 取反墙法线方向作为新的可能方向
Vector2 nextDir = Quaternion.AngleAxis(Mathf.Atan2(wallNormal.y, wallNormal.x) + Mathf.PI / 2, Vector3.up) * currentDir;
// 调整新方向使其朝向墙壁远离玩家的方向
return Mathf.Sign(dot(nextDir, currentDir)) * nextDir.normalized;
}
// dot product 函数计算两个向量之间的夹角余弦值
private static float dot(Vector2 a, Vector2 b)
{
return a.x * b.x + a.y * b.y;
}
}
```
在这个脚本中,敌人会持续沿着直线方向追逐玩家,当遇到墙壁时,它会选择下一个直角方向继续前进。请注意,这只是一个基本的示例,实际应用可能需要处理更多的边界情况和复杂场景。
阅读全文