unity3d 旋转父对象以使子对象面指向2D

0s0u357o  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(171)

我尝试在Unity中沿z轴旋转父游戏对象,以便该对象的子对象面向某个目标点。
只要子对象的位置被置零,这段代码就可以工作。脚本被附加到父对象,我正在一个2D项目中工作。

Vector3 parentDir = (targetPoint - transform.position).normalized;
offset = Vector2.SignedAngle(transform.right, child.transform.right);
float rotationZ = (Mathf.Atan2(parentDir .y, parentDir .x) * Mathf.Rad2Deg) - offset;
transform.rotation = Quaternion.Euler(0, 0, rotationZ);

然而,当子节点的位置不为零时,对于offset值,显然不足以计算父节点和子节点的x轴之间的带符号Angular ,但我无法完全理解这个问题。
This answer looks promising,但我似乎无法将它的三维部分转换为二维。
先谢了!

wnavrhmk

wnavrhmk1#

using UnityEngine;

public class Parent : MonoBehaviour
{
    [SerializeField] private Transform _child;
    [SerializeField] private Transform _target;

    private void Update()
    {
        // Can be cached (Start/Awake) if relative child position not changed.
        var childToParent = transform.rotation * Quaternion.Inverse(_child.rotation);

        var directionTarget = (_target.position - transform.position).normalized;
        var angleToTarget = Vector3.SignedAngle(Vector3.right, directionTarget, Vector3.forward);
        var toTargetRotation = Quaternion.AngleAxis(angleToTarget, Vector3.forward);

        transform.rotation = childToParent * toTargetRotation;
    }
}

相关问题