Example #1
0
    void OnEnable()
    {
        GetEditorPrefs();

        jiggleBone = (SoxAtkJiggleBoneSimple)target;

        ms_targetDistance = serializedObject.FindProperty("m_targetDistance");
        ms_targetFlip     = serializedObject.FindProperty("m_targetFlip");
        ms_tension        = serializedObject.FindProperty("m_tension");
        ms_inercia        = serializedObject.FindProperty("m_inercia");
        ms_upWorld        = serializedObject.FindProperty("m_upWorld");
        ms_upNode         = serializedObject.FindProperty("m_upNode");
        ms_upNodeAxis     = serializedObject.FindProperty("m_upNodeAxis");
        ms_upnodeControl  = serializedObject.FindProperty("m_upnodeControl");

        ms_gravity   = serializedObject.FindProperty("m_gravity");
        ms_colliders = serializedObject.FindProperty("m_colliders");

        ms_optShowGizmosAtPlaying = serializedObject.FindProperty("m_optShowGizmosAtPlaying");
        ms_optShowGizmosAtEditor  = serializedObject.FindProperty("m_optShowGizmosAtEditor");
        ms_optGizmoSize           = serializedObject.FindProperty("m_optGizmoSize");
        ms_optShowHiddenNodes     = serializedObject.FindProperty("m_optShowHiddenNodes");

        // 프로젝트 창에서 선택한 프리팹을 버전체크하면 문제가 발생한다. Selection.transforms.Length가 0이면 Project View 라는 뜻
        if (Selection.transforms.Length > 0 && Application.isPlaying && jiggleBone.gameObject.activeInHierarchy && jiggleBone.enabled)
        {
            jiggleBone.EnsureGoodVars();
        }
    }
Example #2
0
    // 모든 지글본의 SetHead가 수행된 이후 불리우는 함수. 최상위 진짜 헤드를 세팅한다.
    public void SetRealHead()
    {
        int  safetyCheck = 0; // 무한루프를 위한 안전장치
        bool found       = false;
        SoxAtkJiggleBoneSimple jiggleBone = m_tree[0];
        SoxAtkJiggleBoneSimple realHead   = m_tree[0];

        while (!found)
        {
            if (jiggleBone.m_ifHead)
            {
                realHead = jiggleBone;
                found    = true;
            }
            else
            {
                jiggleBone = jiggleBone.m_tree[0];
                safetyCheck++;
            }

            // 십만번 이상 루프를 돌면 뭔가 문제가 있는 상황
            if (safetyCheck > 100000)
            {
                found = true;
            }
        }
        m_tree[0] = realHead;
    }
Example #3
0
    // 누가 우두머리인지 결정한다. m_ifHead, m_tree 결정, Awake에서 호출됨
    private void SetHead()
    {
        // 부모가 없거나 부모 지글본이 없으면 내가 우두머리다. 아무것도 안하고 그냥 리턴
        if (meTrans.parent == null)
        {
            return;
        }
        SoxAtkJiggleBoneSimple headJiggleBone = meTrans.parent.GetComponent <SoxAtkJiggleBoneSimple>();

        if (headJiggleBone == null)
        {
            return;
        }
        // 부모 지글본이 꺼져있으면 역시 내가 우두머리다.
        if (headJiggleBone.gameObject.activeInHierarchy == false || headJiggleBone.enabled == false)
        {
            return;
        }

        // 이후 부모 지글본이 있는 경우

        // while 로 진짜 헤드 찾기. 초기화가 무작위로 되기때문에 헤드의 헤드의 헤드의 헤드가 진짜 해드일 수 있다.
        bool found = false;

        while (!found)
        {
            if (headJiggleBone.m_ifHead)
            {
                found = true;
            }
            else
            {
                // 헤드의 헤드 찾기
                headJiggleBone = headJiggleBone.m_tree[0];
            }
        }

        // 자신의 트리를 헤드 트리의 밑으로 더한다.
        // 헤드의 Start 함수가 작동 했을 수도 있고 안했을 수도 있다. m_treeInit을 검사해야함
        if (!headJiggleBone.m_treeInit)
        {
            // 초기화 안했으면 대신 초기화 해준다.
            headJiggleBone.m_tree     = new SoxAtkJiggleBoneSimple[] { headJiggleBone };
            headJiggleBone.m_treeInit = true;
        }

        headJiggleBone.m_tree = ArrayAdd(headJiggleBone.m_tree, m_tree);

        // 나는 더이상 헤드가 아니다.
        m_ifHead = false;

        // 내 헤드는 headJiggleBone이다.
        m_tree = new SoxAtkJiggleBoneSimple[] { headJiggleBone };
    }
Example #4
0
    private SoxAtkJiggleBoneSimple[] ArrayAdd(SoxAtkJiggleBoneSimple[] arrA, SoxAtkJiggleBoneSimple[] arrB)
    {
        if (arrA == null && arrB != null)
        {
            return(arrB);
        }
        if (arrA != null && arrB == null)
        {
            return(arrA);
        }
        if (arrA == null && arrB == null)
        {
            return(null);
        }

        SoxAtkJiggleBoneSimple[] returnArr = new SoxAtkJiggleBoneSimple[arrA.Length + arrB.Length];
        Array.Copy(arrA, 0, returnArr, 0, arrA.Length);
        Array.Copy(arrB, 0, returnArr, arrA.Length, arrB.Length);

        return(returnArr);
    }
Example #5
0
    public override void OnInspectorGUI()
    {
        jiggleBone = (SoxAtkJiggleBoneSimple)target;

        // GUI레이아웃 시작=======================================================
        //DrawDefaultInspector();
        Undo.RecordObject(target, "Jiggle Bone Changed Settings");
        EditorGUI.BeginChangeCheck();

        GUILayout.BeginHorizontal();
        EditorGUILayout.PropertyField(ms_targetDistance, new GUIContent("Target Distance"));
        // PropertyField에서는 ToggleLeft를 사용할 수 없어서 LabelField를 응용해서 ToggleLeft처럼 보이게 함
        EditorGUILayout.PropertyField(ms_targetFlip, GUIContent.none, GUILayout.Width(mc_toggleSpace));
        EditorGUILayout.LabelField("Flip");
        GUILayout.EndHorizontal();

        EditorGUILayout.PropertyField(ms_tension, new GUIContent("Tension"));
        EditorGUILayout.PropertyField(ms_inercia, new GUIContent("Inercia"));

        EditorGUILayout.PropertyField(ms_upWorld, new GUIContent("Up World"));
        if (ms_upWorld.boolValue)
        {
            GUI.enabled = false;
        }

        EditorGUILayout.PropertyField(ms_upNode, new GUIContent("Up Node"));
        GUI.enabled = true;

        GUILayout.BeginHorizontal();
        if (jiggleBone.m_upWorld)
        {
            EditorGUILayout.PropertyField(ms_upNodeAxis, new GUIContent("Up World Axis"));
        }
        else
        {
            EditorGUILayout.PropertyField(ms_upNodeAxis, new GUIContent("Up Node Axis"));
        }
        EditorGUILayout.LabelField("");
        GUILayout.EndHorizontal();

        EditorGUILayout.PropertyField(ms_upnodeControl, new GUIContent("Upnode Control"));

        EditorGUILayout.PropertyField(ms_gravity, new GUIContent("Gravity"));

        EditorGUILayout.PropertyField(ms_colliders, new GUIContent("Colliders"), true); // true 는 includeChildren 옵션임. 시리얼라이즈 된 배열을 처리하려면 true 해줘야함

        SoxAtkJiggleBoneOptions = EditorGUILayout.Foldout(SoxAtkJiggleBoneOptions, "Debug");
        if (SoxAtkJiggleBoneOptions)
        {
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(ms_optShowGizmosAtPlaying, new GUIContent("Show Gizmos at Play"));
            EditorGUILayout.PropertyField(ms_optShowGizmosAtEditor, new GUIContent("Show Gizmos at Editor"));
            //ms_optGizmoSize.floatValue = EditorGUILayout.FloatField("Gizmo Size", ms_optGizmoSize.floatValue);
            EditorGUILayout.PropertyField(ms_optGizmoSize, new GUIContent("Gizmo Size"));
            if (!Application.isPlaying)
            {
                GUI.enabled = false;
            }
            EditorGUILayout.PropertyField(ms_optShowHiddenNodes, new GUIContent("Show Hidden Nodes"));
            if (jiggleBone.m_hierarchyChanged)
            {
                EditorApplication.DirtyHierarchyWindowSorting();
                jiggleBone.m_hierarchyChanged = false;
            }
            GUI.enabled = true;
            EditorGUI.indentLevel--;
        }

        serializedObject.ApplyModifiedProperties();    // 이건 시리얼 오브젝트 에디터GUI의 변화를 실제 오브젝트에 반영하는 것
        serializedObject.Update();                     // 이건 오브젝트의 변화를 에디터에 반영하는 것. 예를 들어 Undo 등의 변화라던가 Reset 버튼에 의한 변화가 있으면 업데이트 해줘야한다.

        if (EditorGUI.EndChangeCheck())
        {
            // 프로젝트 창에서 선택한 프리팹을 버전체크하면 문제가 발생한다. Selection.transforms.Length가 0이면 Project View 라는 뜻
            if (Selection.transforms.Length > 0 && Application.isPlaying && jiggleBone.gameObject.activeInHierarchy && jiggleBone.enabled)
            {
                jiggleBone.MyValidate();
            }
        }
        Undo.FlushUndoRecordObjects();

        // GUI레이아웃 끝========================================================
    } // end of OnInspectorGUI()