Блокировка позиции дочерних элементов в Инспекторе

Общие вопросы о Unity3D

Блокировка позиции дочерних элементов в Инспекторе

Сообщение Jagiello 23 апр 2018, 14:15

Есть встроенная(в инспекторе) возможность двигать родителя без изменения глобальных координат дочерних объектов?
Очень неудобно создавать анимации, где повернутся должен только объект без дочерних. А писать миллион скриптов с переназначениями родителей - неудобно.
Jagiello
UNец
 
Сообщения: 18
Зарегистрирован: 11 окт 2017, 22:58
Откуда: Беларусь, Минск

Re: Блокировка позиции дочерних элементов в Инспекторе

Сообщение 1max1 23 апр 2018, 14:41

Либо скрипт, либо открепляй дочерние потом снова прикрепляй)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Блокировка позиции дочерних элементов в Инспекторе

Сообщение Jagiello 23 апр 2018, 19:28

1max1 писал(а):Либо скрипт, либо открепляй дочерние потом снова прикрепляй)

Откреплять-прикреплять не сработало, юнити с ума сходит и не понимает как интерполировать промежуточные кадры.
Общепринятое решение - через переназначение родителя?
Jagiello
UNец
 
Сообщения: 18
Зарегистрирован: 11 окт 2017, 22:58
Откуда: Беларусь, Минск

Re: Блокировка позиции дочерних элементов в Инспекторе

Сообщение TogRus 23 апр 2018, 19:39

Не знаю, будет ли работать...

Синтаксис:
Используется csharp
[CustomEditor(typeof(DontChangeChild))]
[CanEditMultipleObjects]
public class DontChangeChildEditor : Editor {
    private DontChangeChild script;

    private List<Transform> childs = new List<Transform>();
    private bool state = false;

    private List<Vector3> childPositions = new List<Vector3>();
    private List<Quaternion> childRotations = new List<Quaternion>();

    private Vector3 scale;
    private List<Vector3> childScales = new List<Vector3>();

    private void OnEnable() {
        script = (DontChangeChild)target;

        childs.Clear();

        foreach(Transform child in script.transform)
            childs.Add(child);

        foreach(var go in Selection.gameObjects)
            if(!script.gameObject.name.Equals(go.name) && go.GetComponent<DontChangeChild>())
                foreach(Transform child in go.transform)
                    childs.Add(child);
    }

    public void OnSceneGUI() {
        if(state) {
            int i = 0;

            scale = script.transform.localScale;

            foreach(var c in childs) {
                c.position = childPositions[i];
                c.rotation = childRotations[i];
                c.localScale = new Vector3(1f / scale.x, 1f / scale.y, 1f / scale.z);
                i++;
            }
        }
    }

    public override void OnInspectorGUI() {
        GUILayout.BeginVertical();

        if(GUILayout.Button(state ? "Разблокировать" : "Заблокировать")) {
            childPositions.Clear();
            childRotations.Clear();

            foreach(var c in childs) {
                childPositions.Add(c.position);
                childRotations.Add(c.rotation);
            }

            state = !state;
        }

        foreach(Transform child in childs)
            GUILayout.Label(child.gameObject.name);

        GUILayout.EndVertical();
    }
}
 


P.S. Скрипт DontChangeChild пустой
TogRus
UNец
 
Сообщения: 17
Зарегистрирован: 23 окт 2013, 20:40


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 14