Как скопировать ротацию родительского объекта, сохраняя его как в unity3d - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать экземпляр игрового объекта 3d-плоскости внутри 3d-плоскости, но вращение родительской 3d-плоскости может быть любым, дочерняя плоскость должна быть точно параллельна родительской 3d-плоскости, но она также должна сохранять свое собственное вращение.

Я пробовал следующий скрипт, но он не работал

child.rotation = child.rotation * parent.rotation;

здесь у меня есть имена игровых объектов дочерней плоскости как B (вращение: -90, 0, 0), и я делаюдругой большой игровой объект плоскости (вращение: что-нибудь) как его родитель.но дочерняя плоскость иногда идет параллельно своей родительской плоскости, иногда это не так, когда родительская плоскость находится под некоторым другим углом / поворотом.

Объяснение: На скриншоте ниже я установил вращение дочерней плоскости вручную в редакторе простопри повороте на 90/180 градусов в требуемый угол шкала автоматически настраивается при перетаскивании этого объекта из мира в дочерний (локальный).

Ниже приведены фрагменты кода для достижения необходимого, но неt работа.

var chile = Instantiate(Resources.Load<GameObject>(prefabsPath), parent);
var t = child.transform;
t.position = pos;
t.rotation = parent.rotation;

Также я попробовал

t.forward = parent.forward;

Также этот

child.SetParent(parent); // wasn't passing parent in Instantiate

выше одного работал отлично с точки зрения масштабирования соответственно, но все ещеЯ не смог исправить вращение.

enter image description here

@ derHego ответ, дочерняя плоскость растягивается, как показано ниже, я экспериментировал с прикреплением ребенка к другому размеруродительские плоскости, я обнаружил, что он растягивается в соответствии с его родительским масштабом, если у родителя у больше х, то у у ребенка также становится больше, чем х с ту него такое же соотношение как и у родителя.Как это исправить?

enter image description here

1 Ответ

0 голосов
/ 21 февраля 2019

Я предполагаю, что вы хотите, чтобы обе плоскости были направлены, например, с их локальной осью Y в одном и том же направлении, в то время как они все еще могли бы вращаться друг относительно друга вокруг этой грани.

В зависимости от направления, в котором стоят ваши самолетыВы можете использовать, например,

child.up = parent.up;

, чтобы сделать обе плоскости параллельными (= указывающими на одно и то же направление), в этом случае я предположил, что ваша плоскость по умолчанию лежит расклешенной на полу, поэтому она направлена ​​вверх в направлении Y


например,

public class Example : MonoBehaviour
{
    public Transform child;

    private void Start()
    {
        child.up = transform.up;
    }
}

enter image description here

(зеленая плоскость является родительской, белая плоскость - дочерней)


После вашего обновления похоже, что на самом деле вы могли бы просто сделать

var child = Instantiate(prefab);

child.rotation = parent.rotation;

var scale = child.lossyScale;
child.SetParent(parent);

var invertParentScale = new Vector3(1 / parent.lossyScale.x, 1 / parent.lossyScale.y, 1 / parent.lossyScale.z)
child.localScale = Vector3.Scale(scale, invertParentScale);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...