public override void OnInspectorGUI() { if (GUILayout.Button("Open Event Editor")) { MecanimEventEditor editor = EditorWindow.GetWindow <MecanimEventEditor>(); editor.TargetController = serializedObject.FindProperty("lastEdit").objectReferenceValue; } if (previewedMotion != null && previewedMotion is BlendTree && avatarPreview != null) { EditorGUILayout.Separator(); GUILayout.Label("BlendTree Parameter(s)", GUILayout.ExpandWidth(true)); BlendTree bt = previewedMotion as BlendTree; for (int i = 0; i < bt.GetRecursiveBlendParamCount(); i++) { float min = bt.GetRecursiveBlendParamMin(i); float max = bt.GetRecursiveBlendParamMax(i); string paramName = bt.GetRecursiveBlendParam(i); float value = Mathf.Clamp(avatarPreview.Animator.GetFloat(paramName), min, max); value = EditorGUILayout.Slider(paramName, value, min, max); avatarPreview.Animator.SetFloat(paramName, value); } } }
private void CreateParameters() { if (previewedMotion is BlendTree) { BlendTree blendTree = previewedMotion as BlendTree; for (int j = 0; j < blendTree.GetRecursiveBlendParamCount(); j++) { controller.AddParameter(blendTree.GetRecursiveBlendParam(j), AnimatorControllerParameterType.Float); } } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { //TODO change to obtain controller thru property.serializedObject.Find(attribute.animator).... UnityEditor.Animations.AnimatorController animatorController = ((MonoBehaviour)property.serializedObject.targetObject).GetComponent <Animator> ().runtimeAnimatorController as UnityEditor.Animations.AnimatorController; if (animatorController != null) { //property.serializedObject.Update(); animatorStateValues = MecanimUtility.GetAnimatorStates(animatorController); displayOptions = MecanimUtility.GetDisplayOptions(animatorController); EditorGUI.indentLevel = 0; //if already have been serialzied before if (property.objectReferenceValue != null) { if (animatorStateValues.Length > 0) { animatorStateSelected = animatorStateValues.FirstOrDefault((itm) => itm.nameHash == ((ws.winx.unity.AnimatorState)property.objectReferenceValue).nameHash) as UnityEditor.Animations.AnimatorState; } } //animaStateInfoSelected = property.objectReferenceValue as UnityEditor.Animations.AnimatorState; // Check if it was modified this frame, to avoid overwriting the property constantly UnityEditor.Animations.AnimatorState prevAnimatorStateSelected = animatorStateSelected; animatorStateSelected = EditorGUILayoutEx.CustomObjectPopup(label, animatorStateSelected, displayOptions, animatorStateValues, null, null, null, null, position) as UnityEditor.Animations.AnimatorState; if (animatorStateSelected != null && animatorStateSelected.nameHash != prevAnimatorStateSelected.nameHash) { ws.winx.unity.AnimatorState state = property.objectReferenceValue as ws.winx.unity.AnimatorState; if (state == null) { state = ScriptableObject.CreateInstance <ws.winx.unity.AnimatorState>(); } state.motion = animatorStateSelected.motion; state.nameHash = animatorStateSelected.nameHash; state.name = animatorStateSelected.name; if (state.motion is UnityEditor.Animations.BlendTree) { BlendTree tree = (BlendTree)state.motion; int blendParamsNum = tree.GetRecursiveBlendParamCount(); state.blendParamsHashes = new int[blendParamsNum]; for (int i = 0; i < blendParamsNum; i++) { state.blendParamsHashes[i] = Animator.StringToHash(tree.GetRecursiveBlendParam(i)); } } else { state.blendParamsHashes = null; } property.objectReferenceValue = state; property.serializedObject.ApplyModifiedProperties(); } } }
// // Methods // /// <summary> /// Handles the onGUI event. /// </summary> /// <param name="property">Property.</param> /// <param name="node">Node.</param> /// <param name="guiContent">GUI content.</param> public override void OnGUI(SerializedNodeProperty property, ActionNode node, GUIContent guiContent) { //if (animatorSerialized == null || aniController == null) { if (aniController == null) { //!!! Serialization never serialized Animator cos its initialized in Reset after // NodePropertyIterator iter= property.serializedNode.GetIterator(); // iter.Find(attribute.animatorFieldName); // animatorSerialized=iter.current; // // if(animatorSerialized==null || animatorSerialized.value==null){ // Debug.LogError("AnimatorStateNodePropertyDrawer> No Animator component set on node parent GameObject"); // return; // } //runtimeContoller =( (Animator)animatorSerialized.value).runtimeAnimatorController; Animator animator = node.GetType().GetField(attribute.animatorFieldName).GetValue(node) as Animator; RuntimeAnimatorController runtimeContoller; runtimeContoller = animator.runtimeAnimatorController; if (runtimeContoller is AnimatorOverrideController) { aniController = ((AnimatorOverrideController)runtimeContoller).runtimeAnimatorController as UnityEditor.Animations.AnimatorController; } else { aniController = runtimeContoller as UnityEditor.Animations.AnimatorController; } } animatorStateDisplayOptions = MecanimUtility.GetDisplayOptions(aniController); animatorStateValues = MecanimUtility.GetAnimatorStates(aniController); if (property.value != null) { if (animatorStateValues.Length > 0) { animatorStateSelectedPrev = animatorStateSelected = animatorStateValues.FirstOrDefault((itm) => itm.nameHash == ((ws.winx.unity.AnimatorState)property.value).nameHash); } } animatorStateSelected = EditorGUILayoutEx.CustomObjectPopup(guiContent, animatorStateSelected, animatorStateDisplayOptions, animatorStateValues); //,compare); //TODO try Begin/End Check if (animatorStateSelectedPrev != animatorStateSelected) { NodePropertyIterator iter = property.serializedNode.GetIterator(); iter.Find(attribute.layerIndexFieldName); SerializedNodeProperty layerIndexSerialized = iter.current; layerIndexSerialized.value = MecanimUtility.GetLayerIndex(aniController, animatorStateSelected); layerIndexSerialized.ApplyModifiedValue(); ws.winx.unity.AnimatorState state = property.value as ws.winx.unity.AnimatorState; if (state == null) { state = ScriptableObject.CreateInstance <ws.winx.unity.AnimatorState>(); } state.motion = animatorStateSelected.motion; state.nameHash = animatorStateSelected.nameHash; state.layer = (int)layerIndexSerialized.value; if (state.motion is UnityEditor.Animations.BlendTree) { BlendTree tree = (BlendTree)state.motion; int blendParamsNum = tree.GetRecursiveBlendParamCount(); state.blendParamsHashes = new int[blendParamsNum]; for (int i = 0; i < blendParamsNum; i++) { state.blendParamsHashes[i] = Animator.StringToHash(tree.GetRecursiveBlendParam(i)); } } else { state.blendParamsHashes = null; } //property.value=state; property.ValueChanged(); property.ApplyModifiedValue(); animatorStateSelectedPrev = animatorStateSelected; } if (animatorStateSelected.motion == null) { Debug.LogError("Selected state doesn't have Motion set"); } }
private void UpdateAvatarState() { if (Event.current.type != EventType.Repaint) { return; } if (avatarPreview.PreviewObject == null || controllerIsDitry) { avatarPreview.ResetPreviewInstance(); if (avatarPreview.PreviewObject != null) { ResetStateMachine(); } } Animator animator = avatarPreview.Animator; if (animator != null) { if (PrevIKOnFeet != avatarPreview.IKOnFeet) { PrevIKOnFeet = avatarPreview.IKOnFeet; Vector3 rootPosition = avatarPreview.Animator.rootPosition; Quaternion rootRotation = avatarPreview.Animator.rootRotation; ResetStateMachine(); avatarPreview.Animator.UpdateWrapper(avatarPreview.timeControl.currentTime); avatarPreview.Animator.UpdateWrapper(0f); avatarPreview.Animator.rootPosition = rootPosition; avatarPreview.Animator.rootRotation = rootRotation; } if (avatarPreview.Animator != null) { BlendTree blendTree = previewedMotion as BlendTree; if (blendTree != null) { for (int i = 0; i < blendTree.GetRecursiveBlendParamCount(); i++) { string recurvieBlendParameter = blendTree.GetRecursiveBlendParam(i); float inputBlendValue = blendTree.GetInputBlendVal(recurvieBlendParameter); avatarPreview.Animator.SetFloat(recurvieBlendParameter, inputBlendValue); } } } avatarPreview.timeControl.loop = true; float length = 1f; float currentTime = 0f; if (animator.layerCount > 0) { AnimatorStateInfo currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); length = currentAnimatorStateInfo.length; currentTime = currentAnimatorStateInfo.normalizedTime; } avatarPreview.timeControl.startTime = 0f; avatarPreview.timeControl.stopTime = length; avatarPreview.timeControl.Update(); float num3 = this.avatarPreview.timeControl.deltaTime; if (float.IsInfinity(num3)) { num3 = 0; } if (!previewedMotion.isLooping) { if (currentTime >= 1f) { num3 -= length; } else { if (currentTime < 0f) { num3 += length; } } } animator.UpdateWrapper(num3); } }