private void Update() { #if VRC_SDK_VRCSDK2 // 再生中 if (EditorApplication.isPlayingOrWillChangePlaymode) { // 毎回取得しないとActiveへの変更がなぜか適用されない poseConstraint = poseConstraintObj.GetComponent <PoseConstraint>(); animator.runtimeAnimatorController = controller; if (playingType == PlayingType.OVERRIDE) { poseConstraint.Active = true; animator.SetInteger($"Emote", 0); switch (playingHand) { case PlayingHand.NONE: animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 0); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 0); break; case PlayingHand.RIGHT: animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 0); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 1); break; case PlayingHand.LEFT: animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 1); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 0); break; case PlayingHand.BOTH: animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 1); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 1); break; default: break; } } else if (playingType == PlayingType.EMOTE) { poseConstraint.Active = false; animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 0); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 0); } else { poseConstraint.Active = true; animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 0); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 0); } } // 未再生 else { if (animator != null && controller != null) { animator.runtimeAnimatorController = defaultController; animator.SetLayerWeight(animator.GetLayerIndex("HandLeft"), 0); animator.SetLayerWeight(animator.GetLayerIndex("HandRight"), 0); } } #endif }
private void OnGUI() { #if VRC_SDK_VRCSDK2 using (var check = new EditorGUI.ChangeCheckScope()) { avatar = EditorGUILayout.ObjectField("Avatar", avatar, typeof(VRC_AvatarDescriptor), true) as VRC_AvatarDescriptor; if (check.changed) { if (avatar != null) { animator = avatar.gameObject.GetComponent <Animator>(); controller = avatar.CustomStandingAnims; } else { animator = null; controller = null; } } } EditorGUILayout.Space(); EditorGUILayout.LabelField("Camera", EditorStyles.boldLabel); using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("Scene View")) { EditorApplication.ExecuteMenuItem("Window/General/Scene"); } if (GUILayout.Button("Game View")) { EditorApplication.ExecuteMenuItem("Window/General/Game"); } } /* * using (new EditorGUI.DisabledGroupScope(animator is null)) * { * if (GUILayout.Button("Focus on Avatar")) * { * var sceneViewCamera = SceneView.lastActiveSceneView.camera; * sceneViewCamera.transform.position = animator.transform.position; * } * } */ GUILayout.Space(15); EditorGUILayout.LabelField("Testing", EditorStyles.boldLabel); using (new EditorGUILayout.HorizontalScope()) { using (new EditorGUI.DisabledGroupScope(EditorApplication.isPlayingOrWillChangePlaymode || avatar == null)) { if (GUILayout.Button("Play")) { defaultController = animator.runtimeAnimatorController; animator.runtimeAnimatorController = controller; poseConstraintObj = CreatePoseConstrainterToRootIfNeeded(); poseConstraint = poseConstraintObj.GetComponent <PoseConstraint>(); poseConstraint.UpdateBoneInfo(animator); EditorApplication.isPlaying = true; } } using (new EditorGUI.DisabledGroupScope(!EditorApplication.isPlayingOrWillChangePlaymode)) { if (GUILayout.Button("Stop")) { EditorApplication.isPlaying = false; animator.runtimeAnimatorController = defaultController; } } } if (avatar == null && !EditorApplication.isPlaying) { EditorGUILayout.HelpBox("Avatarを設定してください", MessageType.Error); } if (avatar != null && animator != null && controller != null) { EditorGUILayout.HelpBox("Playを選択するとテストが実行できます", MessageType.Info); } EditorGUILayout.Space(); using (new EditorGUI.DisabledGroupScope(!EditorApplication.isPlayingOrWillChangePlaymode)) { if (GUILayout.Button("Reset All")) { playingType = PlayingType.NONE; playingHand = PlayingHand.NONE; } EditorGUILayout.Space(); EditorGUILayout.LabelField("AnimationOverrides", EditorStyles.boldLabel); using (new EditorGUI.IndentLevelScope()) { using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.LabelField("NONE"); if (GUILayout.Button("Left")) { if (playingType == PlayingType.OVERRIDE && playingHand == PlayingHand.BOTH) { playingHand = PlayingHand.RIGHT; } else { playingType = PlayingType.NONE; } PlayOverride("Left", 0, animator); } if (GUILayout.Button("Right")) { if (playingType == PlayingType.OVERRIDE && playingHand == PlayingHand.BOTH) { playingHand = PlayingHand.LEFT; } else { playingType = PlayingType.NONE; } PlayOverride("Right", 0, animator); } } for (int overrideNumber = 0; overrideNumber < OVERRIDES.Length; overrideNumber++) { AnimationClip overrideAnimation = null; string overrideName = string.Empty; if (controller != null) { overrideAnimation = controller[OVERRIDES[overrideNumber]]; if (overrideAnimation.name != OVERRIDES[overrideNumber]) { overrideName = $"({overrideAnimation.name})"; } } // AnimationClipとOVERRIDES[overrideNumber]の名前が同じであれば未設定 using (new EditorGUI.DisabledGroupScope(controller == null || overrideAnimation.name == OVERRIDES[overrideNumber])) using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.LabelField(OVERRIDES[overrideNumber], overrideName); if (GUILayout.Button("Left")) { playingType = PlayingType.OVERRIDE; if (playingHand == PlayingHand.RIGHT || playingHand == PlayingHand.BOTH) { playingHand = PlayingHand.BOTH; } else { playingHand = PlayingHand.LEFT; } PlayOverride("Left", overrideNumber, animator); } if (GUILayout.Button("Right")) { playingType = PlayingType.OVERRIDE; if (playingHand == PlayingHand.LEFT || playingHand == PlayingHand.BOTH) { playingHand = PlayingHand.BOTH; } else { playingHand = PlayingHand.RIGHT; } PlayOverride("Right", overrideNumber, animator); } } } } } EditorGUILayout.Space(); using (new EditorGUI.DisabledGroupScope(!EditorApplication.isPlayingOrWillChangePlaymode)) { EditorGUILayout.LabelField("Emotes", EditorStyles.boldLabel); using (new EditorGUI.IndentLevelScope()) { for (int emoteNumber = 0; emoteNumber < EMOTES.Length; emoteNumber++) { AnimationClip emoteAnimation = null; string buttonText = EMOTES[emoteNumber]; if (controller != null) { emoteAnimation = controller[EMOTES[emoteNumber]]; buttonText = emoteAnimation.name; } // 取得できるAnimationClipの名前が"EMOTE*"だったら設定されていない using (new EditorGUI.DisabledGroupScope(emoteAnimation == null || emoteAnimation.name == EMOTES[emoteNumber])) using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.LabelField(EMOTES[emoteNumber]); if (GUILayout.Button(buttonText) && emoteAnimation != null) { if (animator.GetInteger($"Emote") != 0) { return; } playingType = PlayingType.EMOTE; playingHand = PlayingHand.NONE; PlayEmote(emoteNumber + 1, animator, emoteAnimation); } } } } } #else EditorGUILayout.HelpBox("使用するにはVRCSDK2がプロジェクトにインポートされている必要があります", MessageType.Error); #endif }