【问题标题】:how to look at (aim) a prefab in unity 2d project如何在统一 2d 项目中查看(瞄准)预制件
【发布时间】:2018-08-30 20:40:27
【问题描述】:

我想瞄准 2d 预制件(它们随机生成)。我想瞄准靠近我的对象的最近的预制件。

这不起作用:

 Vector2 direction = target.position - transform.position;
 float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
 Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward);
 transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 
                                       speed * Time.deltaTime);

有什么想法吗?

【问题讨论】:

  • 在这里理解你的意图有点困难 - 你认为你可以用你想要实现的图表来补充你的问题,这样更容易看到你的代码的目标吗?
  • @Serlite 编辑了我的问题(添加了我想要的图片),我想要我的主要对象查看最近的预制件 -
  • 好吧,这是否意味着您已经能够确定哪个对象是最接近的(我认为它存储在 target.position 中),并且您唯一遇到问题的部分是轮换吗?
  • @Serlite 当我将预制件放入转换目标时,它不会查看随机生成的预制件
  • 请使用实际复制/粘贴的代码,而不是代码的图像/屏幕截图。否则很难提供帮助,因为我们无法复制/粘贴您的代码来尝试它。谢谢。

标签: unity3d


【解决方案1】:

这是一个可以帮助您入门的解决方案。
每当您Instantiate 目标时,将其添加到列表中。我们称之为allTargets(确保添加实例化对象,而不是预制件)。现在您唯一需要做的就是在该列表中找到最接近的target

public List<Transform> allTargets;

void Start()
{
    allTargets = new List<Transform>();
}

void Update () {
    Transform closestTarget = GetClosestTarget(allTargets);        
    Quaternion targetRotation = GetRotationTo(closestTarget);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, speed * Time.deltaTime);
}

Quaternion GetRotationTo(Transform target)
{
    Vector3 dir = target.position - transform.position;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
    return Quaternion.AngleAxis(angle, Vector3.forward);
}

Transform GetClosestTarget(List<Transform> targets)
{              
    Transform closest = null;

    float minDistance = float.MaxValue;
    foreach (var t in targets)
    {
        float distance = Vector2.Distance(t.position, transform.position);
        if(distance < minDistance)
        {
            minDistance = distance;
            closest = t;
        }
    }
    return closest;
}

【讨论】:

  • 只是一个任务,如何在 allTargets 中添加实例化对象?我有另一个创建对象的脚本。这是代码 prntscr.com/kp0u83
  • 在您的 Spawner 脚本 get a referencePlayer 脚​​本中,并使用它将对象添加到列表中。 GameObject nextTarget = Instantiate(...); player.allTargets.Add(nextTarget.transform);
【解决方案2】:

我假设您能够找到最近的游戏对象并将其设置为target.position。现在将您的脚本更改为:

void Update () 
{
    Vector2 direction = target.position - transform.position;
    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    Quaternion newQuaternion = Quaternion.Euler(new Vector3(0, 0, angle));
    transform.rotation = Quaternion.Slerp(transform.rotation, newQuaternion, speed * Time.deltaTime);
}

注意:你的游戏对象以预制件为目标,在(0,0,0)旋转时必须看右x轴(如图)

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多