C# 试图在另一个游戏对象的本地位置设置一些东西?

C# 试图在另一个游戏对象的本地位置设置一些东西?,c#,unity3d,C#,Unity3d,我试图设置一个相对于另一个GameObjects本地位置的GameObjects位置,但我运气不太好。通过光线投射,我检查玩家站在哪一边,这一切都很好,我试图根据你站在哪一边创建一个相对于对象本地位置的变换。当这个对象没有旋转时,一切都正常,但是当我旋转对象时,目标位置似乎仍然在世界空间中。我添加了一些图片来说明这个案例 这对于观察目标的对象位置来说效果很好,但对于三维空间中的旋转来说并不理想 using UnityEngine; public class TrackToTarget : M

我试图设置一个相对于另一个GameObjects本地位置的GameObjects位置,但我运气不太好。通过光线投射,我检查玩家站在哪一边,这一切都很好,我试图根据你站在哪一边创建一个相对于对象本地位置的变换。当这个对象没有旋转时,一切都正常,但是当我旋转对象时,目标位置似乎仍然在世界空间中。我添加了一些图片来说明这个案例


这对于观察目标的对象位置来说效果很好,但对于三维空间中的旋转来说并不理想

using UnityEngine;

public class TrackToTarget : MonoBehaviour
{
    [SerializeField]
    private Transform target;

    private Vector3 releativePosition;
    private Quaternion targetRotationAtStartInv;
    private Quaternion rotationDiffernce;

    private void Start()
    {
        releativePosition = target.position - transform.position;
        targetRotationAtStartInv = Quaternion.Inverse(target.rotation);
        rotationDiffernce = target.rotation * transform.rotation;
    }

    private void Update()
    {
        transform.position = target.position - target.rotation * (targetRotationAtStartInv * releativePosition);
        transform.rotation = rotationDiffernce * target.rotation;
    }
}

那些红球是同一个东西的后代吗?有趣的是,当你转身时3个移动,而1个不移动。哦,很抱歉,红色的圆点是在疼痛中添加的,以显示它们应该在哪里。嗨!一个简单的解决方案是将红球作为立方体的父对象——如果出于某种原因不能这样做,那么一个几乎同样简单的解决方案是使用作为立方体父对象的不可见标记游戏对象,并且在每一帧上,让周围的非父点将其绝对位置设置为其关联的不可见标记绝对位置。
using UnityEngine;

public class TrackToTarget : MonoBehaviour
{
    [SerializeField]
    private Transform target;

    private Vector3 releativePosition;
    private Quaternion targetRotationAtStartInv;
    private Quaternion rotationDiffernce;

    private void Start()
    {
        releativePosition = target.position - transform.position;
        targetRotationAtStartInv = Quaternion.Inverse(target.rotation);
        rotationDiffernce = target.rotation * transform.rotation;
    }

    private void Update()
    {
        transform.position = target.position - target.rotation * (targetRotationAtStartInv * releativePosition);
        transform.rotation = rotationDiffernce * target.rotation;
    }
}