|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
namespace MalbersAnimations.Controller
|
|
|
|
|
|
{
|
|
|
|
|
|
[HelpURL("https://malbersanimations.gitbook.io/animal-controller/main-components/manimal-controller/modes#mode-behaviour")]
|
|
|
|
|
|
public class ModeBehaviour : StateMachineBehaviour
|
|
|
|
|
|
{
|
|
|
|
|
|
public ModeID ModeID;
|
|
|
|
|
|
|
|
|
|
|
|
[Tooltip("Calls 'Animation Tag Enter' on the Modes")]
|
|
|
|
|
|
public bool EnterMode = true;
|
|
|
|
|
|
[Tooltip("Calls 'Animation Tag Exit' on the Modes")]
|
|
|
|
|
|
public bool ExitMode = true;
|
|
|
|
|
|
|
|
|
|
|
|
[Tooltip("Used for Playing an Ability and Finish on another Ability Mode")]
|
|
|
|
|
|
public bool ExitOnAbility = false;
|
|
|
|
|
|
[Tooltip("Next Ability to do on the Mode. -1 is the Default and the Exit On Ability Logic will be ignored")]
|
|
|
|
|
|
public int ExitAbility = -1;
|
|
|
|
|
|
|
|
|
|
|
|
private MAnimal animal;
|
|
|
|
|
|
private Mode ModeOwner;
|
|
|
|
|
|
private Ability ActiveAbility;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void InitializeBehaviour(MAnimal animal)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.animal = animal;
|
|
|
|
|
|
if (ModeID != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
ModeOwner = animal.Mode_Get(ModeID);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogWarning("There's a Mode behaviour without an ID. Please check all your Mode Animations states.");
|
|
|
|
|
|
Destroy(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!animal) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (ModeID == null) { Debug.LogError("Mode behaviour needs an ID"); return; }
|
|
|
|
|
|
if (ModeOwner == null) { Debug.LogError($"There's no [{ModeID.name}] mode on your character"); return; }
|
|
|
|
|
|
|
|
|
|
|
|
ActiveAbility = ModeOwner.ActiveAbility;
|
|
|
|
|
|
if (animal.ModeStatus == Int_ID.Loop) return; //Means is Looping so Skip!!!
|
|
|
|
|
|
|
|
|
|
|
|
if (EnterMode) ModeOwner.AnimationTagEnter();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!animal) return;
|
|
|
|
|
|
//Means is Looping to itself So Skip the Exit Mode EXTREMELY IMPORTANT
|
|
|
|
|
|
if (animator.GetCurrentAnimatorStateInfo(layerIndex).fullPathHash == stateInfo.fullPathHash) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (ExitMode) ModeOwner.AnimationTagExit(ActiveAbility, ExitOnAbility ? ExitAbility : -1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!animal) return;
|
|
|
|
|
|
ModeOwner.OnModeStateMove(stateInfo, animator, layerIndex);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
[CustomEditor(typeof(ModeBehaviour))]
|
|
|
|
|
|
public class ModeBehaviourED : Editor
|
|
|
|
|
|
{
|
|
|
|
|
|
SerializedProperty EnterMode, ExitMode, ModeID, ExitOnAbility, ExitAbility;
|
|
|
|
|
|
Color RequiredColor = new Color(1,0.4f,0.4f,1);
|
|
|
|
|
|
|
|
|
|
|
|
void OnEnable()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
ModeID = serializedObject.FindProperty("ModeID");
|
|
|
|
|
|
EnterMode = serializedObject.FindProperty("EnterMode");
|
|
|
|
|
|
ExitMode = serializedObject.FindProperty("ExitMode");
|
|
|
|
|
|
ExitOnAbility = serializedObject.FindProperty("ExitOnAbility");
|
|
|
|
|
|
ExitAbility = serializedObject.FindProperty("ExitAbility");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void OnInspectorGUI()
|
|
|
|
|
|
{
|
|
|
|
|
|
serializedObject.Update();
|
|
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
|
|
|
|
|
|
|
|
var currentGUIColor = GUI.color;
|
|
|
|
|
|
GUI.color = ModeID.objectReferenceValue == null ? RequiredColor : currentGUIColor;
|
|
|
|
|
|
EditorGUIUtility.labelWidth = 70;
|
|
|
|
|
|
EditorGUILayout.PropertyField(ModeID);
|
|
|
|
|
|
|
|
|
|
|
|
var width = 42;
|
|
|
|
|
|
GUI.color = EnterMode.boolValue ? Color.green : currentGUIColor;
|
|
|
|
|
|
|
|
|
|
|
|
EnterMode.boolValue = GUILayout.Toggle(EnterMode.boolValue,
|
|
|
|
|
|
new GUIContent("Enter"), EditorStyles.miniButton, GUILayout.Width(width));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GUI.color = ExitMode.boolValue ? Color.green : currentGUIColor;
|
|
|
|
|
|
|
|
|
|
|
|
ExitMode.boolValue = GUILayout.Toggle(ExitMode.boolValue,
|
|
|
|
|
|
new GUIContent("Exit"), EditorStyles.miniButton, GUILayout.Width(width));
|
|
|
|
|
|
|
|
|
|
|
|
GUI.color = currentGUIColor;
|
|
|
|
|
|
|
|
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
|
|
|
|
|
|
|
|
if (ExitMode.boolValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
|
|
ExitOnAbility.boolValue = EditorGUILayout.ToggleLeft(
|
|
|
|
|
|
new GUIContent("Exit on Ability", "Used for Playing an Ability and Finish on another Ability Mode."), ExitOnAbility.boolValue, GUILayout.Width(105));
|
|
|
|
|
|
|
|
|
|
|
|
if (ExitOnAbility.boolValue)
|
|
|
|
|
|
EditorGUILayout.PropertyField(ExitAbility,
|
|
|
|
|
|
new GUIContent(" ", "Next Ability to do on the Mode. -1 is the Default and the Exit On Ability Logic will be ignored.\n" +
|
|
|
|
|
|
"Used for Playing an Ability and Finish on another Ability Mode. E.g.: The wolf can Howl he is Sit. The Howl Ability will go to the Sit Ability Right After"));
|
|
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
|
|
}
|
|
|
|
|
|
EditorGUIUtility.labelWidth =0;
|
|
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|