/// <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); }
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(); }
/// <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; } } } }