Установка положения и поворота второго игрового объекта на основе первого - PullRequest
0 голосов
/ 25 января 2019

У меня есть четыре игровых объекта 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 голосов
/ 25 января 2019

Если вы хотите скопировать все !!!!

Просто сделайте B потомком A и D потомком C

Тогда вам нужно только сделать transform локальные значения D равными B in Update

d.transform.localRotation = b.transform.localRotation;
d.transform.localPosition = b.transform.localPosition ;

Это будет работать, поскольку локальное пространство должно быть одинаковым для B и D, потому что локально, когда они связаны с A и C, они оба начинаются с Vector3.zero.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...