예제 #1
0
        /// <summary>
        /// 未作成であればAnchorTargetに設定用のオブジェクトを作成し,
        /// targetPosに設定する
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="targetPos"></param>
        /// <param name="anchorTargetObj"></param>
        /// <returns></returns>
        public static bool CreateAndSetProbeAnchorObject(GameObject obj, TARGETPOS targetPos, ref GameObject anchorTargetObj)
        {
            var animator = obj.GetComponent <Animator>();

            if (animator == null)
            {
                return(false);
            }

            // AnchorTargetを設定する基準の場所を取得
            Transform targetPosTrans = null;

            if (targetPos == TARGETPOS.HEAD)
            {
                targetPosTrans = animator.GetBoneTransform(HumanBodyBones.Head);
            }
            else if (targetPos == TARGETPOS.CHEST)
            {
                targetPosTrans = animator.GetBoneTransform(HumanBodyBones.Chest);
            }

            /*else if (targetPos == TARGETPOS.ARMATURE)
             * {
             *  var hipsTrans = animator.GetBoneTransform(HumanBodyBones.Hips);
             *  targetPosTrans = hipsTrans.parent;
             * }*/
            else if (targetPos == TARGETPOS.ROOTOBJECT)
            {
                targetPosTrans = obj.transform;
            }
            else
            {
                return(false);
            }

            // AnchorTargetに設定用のオブジェクトを作成
            anchorTargetObj = GameObject.Find(obj.name + "/" + TARGETOBJNAME);
            if (anchorTargetObj == null)
            {
                anchorTargetObj = new GameObject(TARGETOBJNAME);
                anchorTargetObj.transform.SetParent(obj.transform);
            }
            anchorTargetObj.transform.position = targetPosTrans.position;

            return(true);
        }
예제 #2
0
        private void OnGUI()
        {
            EditorGUI.BeginChangeCheck();

            targetObject = EditorGUILayout.ObjectField(
                "TargetObject",
                targetObject,
                typeof(GameObject),
                true
                ) as GameObject;

            if (EditorGUI.EndChangeCheck())
            {
                if (targetObject != null)
                {
                    skinnedMeshList        = GetSkinnedMeshList(targetObject);
                    meshList               = GetMeshList(targetObject);
                    isSettingToSkinnedMesh = new bool[skinnedMeshList.Count];
                    for (int i = 0; i < skinnedMeshList.Count; i++)
                    {
                        isSettingToSkinnedMesh[i] = true;
                    }
                    isSettingToMesh = new bool[meshList.Count];
                    for (int i = 0; i < meshList.Count; i++)
                    {
                        isSettingToMesh[i] = true;
                    }
                }
            }

            // 設定するRendererの選択
            isGettingSkinnedMeshRenderer = EditorGUILayout.Toggle("Set To SkinnedMeshRenderer", isGettingSkinnedMeshRenderer);
            isGettingMeshRenderer        = EditorGUILayout.Toggle("Set To MeshRenderer", isGettingMeshRenderer);

            // ライティングの計算の基準とする位置を選択
            targetPos = (TARGETPOS)EditorGUILayout.EnumPopup("TargetPosition", targetPos);

            // Rendererの一覧を表示
            if (targetObject != null)
            {
                isOpeningRendererList = EditorGUILayout.Foldout(isOpeningRendererList, "Renderer List");

                if (isOpeningRendererList)
                {
                    leftScrollPos = EditorGUILayout.BeginScrollView(leftScrollPos, GUI.skin.box);
                    {
                        EditorGUI.indentLevel++;

                        int index = 0;

                        if (isGettingSkinnedMeshRenderer)
                        {
                            foreach (var skinnedMesh in skinnedMeshList)
                            {
                                EditorGUILayout.BeginHorizontal();
                                isSettingToSkinnedMesh[index] = EditorGUILayout.Toggle(skinnedMesh.gameObject.name, isSettingToSkinnedMesh[index]);
                                if (GUILayout.Button("Select"))
                                {
                                    Selection.activeGameObject = skinnedMesh.gameObject;
                                }
                                EditorGUILayout.EndHorizontal();
                                index++;
                            }
                        }

                        index = 0;

                        if (isGettingMeshRenderer)
                        {
                            foreach (var mesh in meshList)
                            {
                                EditorGUILayout.BeginHorizontal();
                                isSettingToMesh[index] = EditorGUILayout.Toggle(mesh.gameObject.name, isSettingToMesh[index]);
                                if (GUILayout.Button("Select"))
                                {
                                    Selection.activeGameObject = mesh.gameObject;
                                }
                                EditorGUILayout.EndHorizontal();
                                index++;
                            }
                        }
                        EditorGUI.indentLevel--;
                    }
                    EditorGUILayout.EndScrollView();
                }
            }

            EditorGUI.BeginDisabledGroup(targetObject == null);
            if (GUILayout.Button("Set ProbeAnchor"))
            {
                SetProbeAnchor(targetObject);
            }
            EditorGUI.EndDisabledGroup();
        }
예제 #3
0
        /// <summary>
        /// 特定のオブジェクト以下のRendererのProbeAnchorに設定する
        /// </summary>
        /// <param name="obj"></param>
        public static void SetProbeAnchor(GameObject obj, TARGETPOS targetPos, ref List <SkinnedMeshRenderer> skinnedMeshRendererList, ref List <MeshRenderer> meshRendererList, bool[] isSettingToSkinnedMesh, bool[] isSettingToMesh, bool isGettingSkinnedMeshRenderer, bool isGettingMeshRenderer)
        {
            var animator = obj.GetComponent <Animator>();

            if (animator == null)
            {
                return;
            }

            // AnchorTargetを設定する基準の場所を取得
            Transform targetPosTrans = null;

            if (targetPos == TARGETPOS.HEAD)
            {
                targetPosTrans = animator.GetBoneTransform(HumanBodyBones.Head);
            }
            else if (targetPos == TARGETPOS.CHEST)
            {
                targetPosTrans = animator.GetBoneTransform(HumanBodyBones.Chest);
            }

            /*else if (targetPos == TARGETPOS.ARMATURE)
             * {
             *  var hipsTrans = animator.GetBoneTransform(HumanBodyBones.Hips);
             *  targetPosTrans = hipsTrans.parent;
             * }*/
            else if (targetPos == TARGETPOS.ROOTOBJECT)
            {
                targetPosTrans = obj.transform;
            }
            if (targetPosTrans == null)
            {
                return;
            }

            // AnchorTargetに設定用のオブジェクトを作成
            GameObject anchorTargetObj = GameObject.Find(obj.name + "/" + TARGETOBJNAME);

            if (anchorTargetObj == null)
            {
                anchorTargetObj = new GameObject(TARGETOBJNAME);
                anchorTargetObj.transform.parent = obj.transform;
            }
            anchorTargetObj.transform.position = targetPosTrans.position;

            // SkiinedMeshRendererに設定
            if (isGettingSkinnedMeshRenderer)
            {
                int index         = 0;
                var skinnedMeshes = skinnedMeshRendererList;
                foreach (var skinnedMesh in skinnedMeshes)
                {
                    if (isSettingToSkinnedMesh.Length <= index)
                    {
                        break;
                    }

                    if (isSettingToSkinnedMesh[index])
                    {
                        skinnedMesh.probeAnchor = anchorTargetObj.transform;
                    }
                    else
                    {
                        skinnedMesh.probeAnchor = null;
                    }

                    index++;
                }
            }

            // MeshRendererに設定
            if (isGettingMeshRenderer)
            {
                int index  = 0;
                var meshes = meshRendererList;
                foreach (var mesh in meshes)
                {
                    if (isSettingToMesh[index++])
                    {
                        mesh.probeAnchor = anchorTargetObj.transform;
                    }
                    else
                    {
                        mesh.probeAnchor = null;
                    }
                }
            }
        }