Unity AI追踪目标时垂直旋转问题求助
解决AI追踪目标时的垂直旋转问题
问题根源确实是transform.LookAt()会默认指向目标对象的世界空间中心,包括高度(Y轴)差异,导致AI产生不必要的垂直旋转。要实现仅在水平方向朝向目标,只需忽略目标的Y轴高度,让AI只在X-Z平面上对齐目标。
修改方案
创建一个与AI自身Y轴高度一致的目标位置向量,将该向量传入transform.LookAt(),具体修改如下:
在调用transform.LookAt()的位置,替换为以下逻辑:
Transform closestEnemy = GetClosestEnemy(Transforms.ToArray()); if (closestEnemy != null) { // 创建仅保留X、Z轴的目标位置,Y轴与AI自身一致 Vector3 targetPosition = new Vector3(closestEnemy.position.x, transform.position.y, closestEnemy.position.z); transform.LookAt(targetPosition); }
完整修改后的代码
using System.Collections.Generic; using UnityEngine; public class AI : MonoBehaviour { [SerializeField] public float speed = 2f; public float SphereRadius; public LayerMask mask; private void FixedUpdate() { // 检测附近对象 Collider[] hitColliders = Physics.OverlapSphere(transform.position, SphereRadius, mask, QueryTriggerInteraction.UseGlobal); List<Transform> transforms = new List<Transform>(); foreach (var hitCollider in hitColliders) { transforms.Add(hitCollider.transform); } Transform closestEnemy = GetClosestEnemy(transforms.ToArray()); if (closestEnemy != null) { // 忽略目标Y轴高度,仅在水平方向朝向目标 Vector3 targetPosition = new Vector3(closestEnemy.position.x, transform.position.y, closestEnemy.position.z); transform.LookAt(targetPosition); transform.Translate(Vector3.forward * speed * Time.deltaTime); } } Transform GetClosestEnemy(Transform[] enemies) { Transform tMin = null; float minDist = Mathf.Infinity; Vector3 currentPos = transform.position; foreach (Transform t in enemies) { float dist = Vector3.Distance(t.position, currentPos); if (dist < minDist) { tMin = t; minDist = dist; } } return tMin; } }
额外优化点
- 增加了
closestEnemy != null的判断,避免没有检测到目标时出现空引用错误 - 变量名遵循C#命名规范(将
Transforms改为transforms)
内容的提问来源于stack exchange,提问作者user19527558
相关产品推荐
相关产品推荐

