/// <summary> /// Cache the default values. /// </summary> private void Awake() { m_GameObject = gameObject; m_Animator = GetComponent <Animator>(); m_CharacterLocomotion = gameObject.GetCachedParentComponent <UltimateCharacterLocomotion>(); #if FIRST_PERSON_CONTROLLER var firstPersonObjects = GetComponentInParent <FirstPersonController.Character.FirstPersonObjects>(); m_FirstPersonAnimatorMonitor = firstPersonObjects != null; // If the locomotion component doesn't exist then the item is already placed under the camera. if (m_CharacterLocomotion == null) { m_CharacterLocomotion = firstPersonObjects.Character.GetCachedComponent <UltimateCharacterLocomotion>(); } #endif m_Character = m_CharacterLocomotion.gameObject; m_CharacterAnimatorMonitor = m_Character.GetCachedComponent <AnimatorMonitor>(); if (m_CharacterAnimatorMonitor.HasItemParameters) { var slotCount = m_CharacterAnimatorMonitor.ParameterSlotCount; m_ItemSlotID = new int[slotCount]; m_ItemSlotStateIndex = new int[slotCount]; m_ItemSlotSubstateIndex = new int[slotCount]; if (s_ItemSlotSubstateIndexHash == null) { s_ItemSlotIDHash = new int[slotCount]; s_ItemSlotStateIndexHash = new int[slotCount]; s_ItemSlotStateIndexChangeHash = new int[slotCount]; s_ItemSlotSubstateIndexHash = new int[slotCount]; for (int i = 0; i < slotCount; ++i) { s_ItemSlotIDHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemID", i)); s_ItemSlotStateIndexHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemStateIndex", i)); s_ItemSlotStateIndexChangeHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemStateIndexChange", i)); s_ItemSlotSubstateIndexHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemSubstateIndex", i)); } } } #if ULTIMATE_CHARACTER_CONTROLLER_VR && FIRST_PERSON_CONTROLLER var handHandler = m_CharacterAnimatorMonitor.GetComponent <IVRHandHandler>(); m_HasVRParameters = handHandler != null && m_GameObject.GetComponent <FirstPersonController.Character.Identifiers.FirstPersonBaseObject>() != null; if (m_HasVRParameters) { s_HandStateIndexHash = Animator.StringToHash("HandStateIndex"); s_HandGripStrengthHash = Animator.StringToHash("HandGripStrength"); } #endif m_Animator.updateMode = AnimatorUpdateMode.AnimatePhysics; m_Animator.applyRootMotion = false; enabled = m_CharacterAnimatorMonitor != null; if (enabled) { EventHandler.RegisterEvent <bool>(m_Character, "OnCharacterImmediateTransformChange", OnImmediateTransformChange); EventHandler.RegisterEvent(m_Character, "OnCharacterSnapAnimator", SnapAnimator); } }
/// <summary> /// Cache the default values. /// </summary> private void Awake() { m_GameObject = gameObject; m_Animator = GetComponent <Animator>(); m_CharacterLocomotion = gameObject.GetCachedParentComponent <UltimateCharacterLocomotion>(); #if FIRST_PERSON_CONTROLLER var firstPersonObjects = GetComponentInParent <FirstPersonController.Character.FirstPersonObjects>(); m_FirstPersonAnimatorMonitor = firstPersonObjects != null; // If the locomotion component doesn't exist then the item is already placed under the camera. if (m_CharacterLocomotion == null) { m_CharacterLocomotion = firstPersonObjects.Character.GetCachedComponent <UltimateCharacterLocomotion>(); } #endif m_Character = m_CharacterLocomotion.gameObject; m_CharacterAnimatorMonitor = m_Character.GetCachedComponent <AnimatorMonitor>(); if (m_CharacterAnimatorMonitor.HasItemParameters) { var slotCount = m_CharacterAnimatorMonitor.ParameterSlotCount; m_ItemParameterExists = new HashSet <int>(); m_ItemSlotID = new int[slotCount]; m_ItemSlotStateIndex = new int[slotCount]; m_ItemSlotSubstateIndex = new int[slotCount]; if (s_ItemSlotIDHash == null || s_ItemSlotIDHash.Length < slotCount) { s_ItemSlotIDHash = new int[slotCount]; s_ItemSlotStateIndexHash = new int[slotCount]; s_ItemSlotStateIndexChangeHash = new int[slotCount]; s_ItemSlotSubstateIndexHash = new int[slotCount]; } for (int i = 0; i < slotCount; ++i) { // Animators do not need to contain every slot index. var slotIDHash = Animator.StringToHash(string.Format("Slot{0}ItemID", i)); var parameterExists = false; for (int j = 0; j < m_Animator.parameterCount; ++j) { if (m_Animator.GetParameter(j).nameHash == slotIDHash) { parameterExists = true; break; } } if (!parameterExists) { continue; } m_ItemParameterExists.Add(i); // The hash variables are static and may already be populated. if (s_ItemSlotIDHash[i] == 0) { s_ItemSlotIDHash[i] = slotIDHash; s_ItemSlotStateIndexHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemStateIndex", i)); s_ItemSlotStateIndexChangeHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemStateIndexChange", i)); s_ItemSlotSubstateIndexHash[i] = Animator.StringToHash(string.Format("Slot{0}ItemSubstateIndex", i)); } } } #if ULTIMATE_CHARACTER_CONTROLLER_VR #if FIRST_PERSON_CONTROLLER var handHandler = m_CharacterAnimatorMonitor.GetComponent <IVRHandHandler>(); m_HasVRParameters = handHandler != null && m_GameObject.GetComponent <FirstPersonController.Character.Identifiers.FirstPersonBaseObject>() != null; if (m_HasVRParameters) { s_HandStateIndexHash = Animator.StringToHash("HandStateIndex"); s_HandGripStrengthHash = Animator.StringToHash("HandGripStrength"); } #else m_HasVRParameters = false; #endif #endif m_Animator.applyRootMotion = false; OnChangeUpdateLocation(m_CharacterLocomotion.UpdateLocation == Game.KinematicObjectManager.UpdateLocation.FixedUpdate); OnChangeTimeScale(m_CharacterLocomotion.TimeScale); enabled = m_CharacterAnimatorMonitor != null; if (enabled) { EventHandler.RegisterEvent <bool>(m_Character, "OnCharacterImmediateTransformChange", OnImmediateTransformChange); EventHandler.RegisterEvent(m_Character, "OnCharacterSnapAnimator", SnapAnimator); EventHandler.RegisterEvent <bool>(m_Character, "OnCharacterChangeUpdateLocation", OnChangeUpdateLocation); EventHandler.RegisterEvent <float>(m_Character, "OnCharacterChangeTimeScale", OnChangeTimeScale); } }