Страница 1 из 1

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

СообщениеДобавлено: 23 апр 2018, 14:15
Jagiello
Есть встроенная(в инспекторе) возможность двигать родителя без изменения глобальных координат дочерних объектов?
Очень неудобно создавать анимации, где повернутся должен только объект без дочерних. А писать миллион скриптов с переназначениями родителей - неудобно.

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

СообщениеДобавлено: 23 апр 2018, 14:41
1max1
Либо скрипт, либо открепляй дочерние потом снова прикрепляй)

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

СообщениеДобавлено: 23 апр 2018, 19:28
Jagiello
1max1 писал(а):Либо скрипт, либо открепляй дочерние потом снова прикрепляй)

Откреплять-прикреплять не сработало, юнити с ума сходит и не понимает как интерполировать промежуточные кадры.
Общепринятое решение - через переназначение родителя?

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

СообщениеДобавлено: 23 апр 2018, 19:39
TogRus
Не знаю, будет ли работать...

Синтаксис:
Используется 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 пустой