using UnityEngine; using System.Collections.Generic; using MalbersAnimations.Events; using UnityEngine.Events; using MalbersAnimations.Scriptables; namespace MalbersAnimations.Controller { /// This will controll all Animals Motion /// Version 1.3.1 /// See changelog here https://malbersanimations.gitbook.io/animal-controller/annex/changelog /// [HelpURL("https://malbersanimations.gitbook.io/animal-controller/main-components/manimal-controller")] [DefaultExecutionOrder(-10)] [SelectionBase] [AddComponentMenu("Malbers/Animal Controller/Animal")] public partial class MAnimal : MonoBehaviour, IAnimatorListener, ICharacterMove, IGravity, /*IMLayer , */ IRandomizer, IMAnimator, ISleepController, IMDamagerSet, IAnimatorStateCycle, ICharacterAction// ITriggerInteract, IInteracter { //Animal Variables: All variables //Animal Movement: All Locomotion Logic //Animal CallBacks: All public methods and behaviors that it can be called outside the script #region Editor Show [HideInInspector] public bool showPivots = true; [HideInInspector] public int PivotPosDir; [HideInInspector] public bool showStates = true; [HideInInspector] public bool ModeShowEvents; [HideInInspector] public int Editor_Tabs1; [HideInInspector] public int Editor_Tabs2; [HideInInspector] public int Editor_EventTabs; [HideInInspector] public int SelectedMode; [HideInInspector] public int SelectedState; [HideInInspector] public bool debugStates; [HideInInspector] public bool debugStances; [HideInInspector] public bool debugModes; [HideInInspector] public bool ShowAnimParametersOptional = false; [HideInInspector] public bool ShowAnimParameters = false; [HideInInspector] public bool ShowLockInputs = false; [HideInInspector] public bool ShowMisc = false; [HideInInspector] public bool ShowStateInInspector = false; [HideInInspector] public bool debugGizmos = true; [HideInInspector] public bool ShowMovement = false; [HideInInspector] public bool ShowGround = true; //[HideInInspector] public bool ShowFreeMovement = true; [HideInInspector] public bool showGeneral = true; [HideInInspector] public bool showExposedVariables = false; [HideInInspector] public bool showReferences = true; [HideInInspector] public bool showGravity = true; #endregion #if UNITY_EDITOR void Reset() { MTools.SetLayer(base.transform, 20); //Set all the Childrens to Animal Layer . gameObject.tag = "Animal"; //Set the Animal to Tag Animal AnimatorSpeed = 1; Anim = GetComponentInParent(); //Cache the Animator RB = GetComponentInParent(); //Catche the Rigid Body if (RB == null) { RB = gameObject.AddComponent(); RB.useGravity = false; RB.constraints = RigidbodyConstraints.FreezeRotation; RB.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic; } speedSets = new List(1) { new MSpeedSet() { name = "Ground", StartVerticalIndex = new IntReference(1), TopIndex = new IntReference(3), states = new List(2) { MTools.GetInstance("Idle") , MTools.GetInstance("Locomotion")}, Speeds = new List(3) { new MSpeed("Walk",1,4,4) , new MSpeed("Trot", 2, 4, 4), new MSpeed("Run", 3, 4, 4) } } }; BoolVar useCameraInp = MTools.GetInstance("Global Camera Input"); BoolVar globalSmooth = MTools.GetInstance("Global Smooth Vertical"); FloatVar globalTurn = MTools.GetInstance("Global Turn Multiplier"); if (useCameraInp != null) useCameraInput.Variable = useCameraInp; if (globalSmooth != null) SmoothVertical.Variable = globalSmooth; if (globalTurn != null) TurnMultiplier.Variable = globalTurn; MTools.SetDirty(this); defaultStance = MTools.GetInstance("Default"); currentStance = MTools.GetInstance("Default"); } [ContextMenu("Create Event Listeners")] void CreateListeners() { MEventListener listener = GetComponent(); if (listener == null) listener = gameObject.AddComponent(); if (listener.Events == null) listener.Events = new List(); MEvent MovementMobile = MTools.GetInstance("Set Movement Mobile"); if (listener.Events.Find(item => item.Event == MovementMobile) == null) { var item = new MEventItemListener() { Event = MovementMobile, useVoid = true, useVector2 = true, }; UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseVector2, SetInputAxis); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.Response, UseCameraBasedInput); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseFloat, SetUpDownAxis); listener.Events.Add(item); Debug.Log("Set Movement Mobile Added to the Event Listeners"); } //********************************// SetModesListeners(listener, "Set Attack1", "Attack1"); SetModesListeners(listener, "Set Attack2", "Attack2"); SetModesListeners(listener, "Set Action", "Action"); /************************/ MEvent actionstatus = MTools.GetInstance("Set Action Status"); if (listener.Events.Find(item => item.Event == actionstatus) == null) { var item = new MEventItemListener() { Event = actionstatus, useVoid = false, useInt = true, useFloat = true }; ModeID ac = MTools.GetInstance("Action"); UnityEditor.Events.UnityEventTools.AddObjectPersistentListener(item.ResponseInt, Mode_Pin, ac); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseInt, Mode_Pin_Status); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseFloat, Mode_Pin_Time); listener.Events.Add(item); Debug.Log("Set Action Status Added to the Event Listeners"); } /************************/ MEvent sprinting = MTools.GetInstance("Set Sprint"); if (listener.Events.Find(item => item.Event == sprinting) == null) { var item = new MEventItemListener() { Event = sprinting, useVoid = false, useBool = true, }; UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseBool, SetSprint); listener.Events.Add(item); Debug.Log("Sprint Listener Added to the Event Listeners"); } MEvent timeline = MTools.GetInstance("Timeline"); if (listener.Events.Find(item => item.Event == timeline) == null) { var item = new MEventItemListener() { Event = timeline, useVoid = false, useBool = true, }; UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseBool,SetTimeline); listener.Events.Add(item); Debug.Log("Timeline Listener Added to the Event Listeners"); } /************************/ SetStateListeners(listener, "Set Jump", "Jump"); SetStateListeners(listener, "Set Fly", "Fly"); /************************/ } void SetModesListeners(MEventListener listener ,string EventName, string ModeName) { MEvent e = MTools.GetInstance(EventName); if (listener.Events.Find(item => item.Event == e) == null) { var item = new MEventItemListener() { Event = e, useVoid = true, useInt = true, useBool = true, }; ModeID att2 = MTools.GetInstance(ModeName); UnityEditor.Events.UnityEventTools.AddObjectPersistentListener(item.ResponseBool, Mode_Pin, att2); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseBool, Mode_Pin_Input); UnityEditor.Events.UnityEventTools.AddObjectPersistentListener(item.ResponseInt, Mode_Pin, att2); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseInt, Mode_Pin_Ability); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.Response, Mode_Interrupt); listener.Events.Add(item); Debug.Log(""+EventName+" Added to the Event Listeners"); } } void SetStateListeners(MEventListener listener, string EventName, string statename) { MEvent e = MTools.GetInstance(EventName); if (listener.Events.Find(item => item.Event == e) == null) { var item = new MEventItemListener() { Event = e, useVoid = false, useInt = true, useBool = true, }; StateID ss = MTools.GetInstance(statename); UnityEditor.Events.UnityEventTools.AddObjectPersistentListener(item.ResponseBool, State_Pin, ss); UnityEditor.Events.UnityEventTools.AddPersistentListener(item.ResponseBool, State_Pin_ByInput); listener.Events.Add(item); Debug.Log("" + EventName + " Added to the Event Listeners"); } } private void OnDrawGizmosSelected() { if (!debugGizmos) return; float sc = transform.localScale.y; Gizmos.color = Color.red; Gizmos.DrawSphere(Center, 0.02f * sc); Gizmos.DrawWireSphere(Center, 0.02f * sc); } void OnDrawGizmos() { float sc = transform.localScale.y; var pos = transform.position; if (showPivots) { foreach (var pivot in pivots) { if (pivot != null) { if (pivot.PivotColor.a == 0) { pivot.PivotColor = Color.blue; } Gizmos.color = pivot.PivotColor; Gizmos.DrawWireSphere(pivot.World(transform), sc * RayCastRadius); Gizmos.DrawRay(pivot.World(transform), pivot.WorldDir(transform) * pivot.multiplier * sc); } } } if (!debugGizmos) return; if (states.Count>1) states[SelectedState]?.StateGizmos(this); if (Application.isPlaying) { Gizmos.color = Color.green; MTools.Gizmo_Arrow(pos, TargetSpeed * 5 * sc); //Draw the Target Direction Gizmos.color = Color.white; MTools.Gizmo_Arrow(pos, InertiaPositionSpeed * 2 * sc); //Draw the Intertia Direction Gizmos.color = Color.red; // MTools.Gizmo_Arrow(pos, Move_Direction * sc*2); //MOVE DIRECTION RED Gizmos.color = Color.black; Gizmos.DrawSphere(pos + DeltaPos, 0.02f * sc); if (showPivots) { Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(Center, 0.02f * sc); Gizmos.DrawSphere(Center, 0.02f * sc); } // return; if (CurrentExternalForce != Vector3.zero) { Gizmos.color = Color.cyan; Gizmos.DrawRay(Center, CurrentExternalForce * sc /10); Gizmos.DrawSphere(Center + (CurrentExternalForce * sc/10), 0.05f * sc); } } } #endif } [System.Serializable] public class AnimalEvent : UnityEvent { } }