根据第一个设置第二个游戏对象的位置和旋转

时间:2019-01-25 13:46:01

标签: unity3d

我有四个游戏对象A,B,C和D。

A是固定的,它的位置和旋转是已知的。 B是围绕A移动的移动物体。B的位置和旋转也是已知的。

C是固定的(放置在A附近,但它们之间没有关系),并且其位置和旋转是已知的。 D是围绕C移动的移动对象。但是,D的位置和旋转是未知的。 D的位置和旋转需要根据B的位置和旋转值得出。

因此,在运行时,当B在A周围移动时,D的相似移动也将在C周围发生。 如果B从A移开,D也应从C移开相同的距离(在A和B之间)。 如果B绕A旋转一些旋转值,则D也将绕C旋转相同的旋转值。

对象B仅绕X和Y轴旋转。不希望绕Z轴旋转。

使用以下代码,我错了D的动作。有时这是预期的,有时不是。 我在哪里做错了?

任何指向此的指针将非常有帮助。 谢谢。

private float distance;
private float newDistance;
private Quaternion quaternion;
private Quaternion newQuaternion;

void Update()
{
    if (A != null && B != null)
    {
        this.distance = Vector3.Distance(A.transform.position, B.transform.position);
        Vector3 relativePos = A.transform.position - B.transform.position;
        this.quaternion = Quaternion.LookRotation(relativePos, Vector3.up);

        CalculateValuesForD();
    }
}

public void CalculateValuesForD()
{
    GameObject tempGameObject = new GameObject();

    Vector3 newPos = C.transform.position - C.transform.forward * distance;

    tempGameObject.transform.position = newPos;

    //tempGameObject.transform.RotateAround(C.transform.position, Vector3.up, this.quaternion.eulerAngles.y);
    //tempGameObject.transform.RotateAround(C.transform.position, Vector3.right, this.quaternion.eulerAngles.x);
    tempGameObject.transform.RotateAround(C.transform.position, C.transform.up, this.quaternion.eulerAngles.y);
    tempGameObject.transform.RotateAround(C.transform.position, C.transform.right, this.quaternion.eulerAngles.x);

    D.transform.position = tempGameObject.transform.position;
    D.transform.rotation = tempGameObject.transform.rotation;

    this.newDistance = Vector3.Distance(C.transform.position, D.transform.position);
    Vector3 relativePos = C.transform.position - D.transform.position ;
    this.newQuaternion = Quaternion.LookRotation(relativePos, Vector3.up);

    GameObject.Destroy(tempGameObject);
}

1 个答案:

答案 0 :(得分:1)

如果您想复制所有内容!!!!

只需让B的{​​{1}}的孩子和A的{​​{1}}的孩子

然后,您只需要使D的{​​{1}}的局部值等于C中的transform

D

这将起作用,因为BUpdate的本地空间应该是相同的,因为在本地以d.transform.localRotation = b.transform.localRotation; d.transform.localPosition = b.transform.localPosition ; B为父级时,它们都以{{1}开始}。