You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:30:48