/// <summary> /// Returns the actions to draw before the State list is drawn. /// </summary> /// <returns>The actions to draw before the State list is drawn.</returns> protected override Action GetDrawCallback() { var baseCallback = base.GetDrawCallback(); baseCallback += () => { EditorGUILayout.PropertyField(PropertyFromName("m_RequireAim")); EditorGUILayout.PropertyField(PropertyFromName("m_AbsorptionFactor")); EditorGUILayout.PropertyField(PropertyFromName("m_AbsorbExplosions")); // The names will be retrieved by the Attribute Manager. var attributeName = InspectorUtility.DrawAttribute(target, m_AttributeManager, (target as Shield).DurabilityAttributeName, "Durability Attribute"); if (attributeName != (target as Shield).DurabilityAttributeName) { PropertyFromName("m_DurabilityAttributeName").stringValue = attributeName; serializedObject.ApplyModifiedProperties(); } if (!string.IsNullOrEmpty(attributeName)) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_DropWhenDurabilityDepleted")); EditorGUI.indentLevel--; } if (Foldout("Impact")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ApplyImpact")); InspectorUtility.DrawAnimationEventTrigger(target, "Impact Complete Event", PropertyFromName("m_ImpactCompleteEvent")); if (Foldout("Animator Audio")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_Shield, m_Shield.ImpactAnimatorAudioStateSet, "m_ImpactAnimatorAudioStateSet", true, ref m_ReorderableImpactAnimatorAudioStateSetList, OnImpactAnimatorAudioStateListDraw, OnImpactAnimatorAudioStateListSelect, OnImpactAnimatorAudioStateListAdd, OnImpactAnimatorAudioStateListRemove, SelectedImpactAnimatorAudioStateSetIndexKey, ref m_ReorderableImpactAnimatorAudioStateSetAudioList, OnImpactAudioListElementDraw, OnImpactAudioListAdd, OnImpactAudioListRemove, ref m_ReorderableImpactAnimatorAudioStateSetStateList, OnImpactAnimatorAudioStateSetStateListDraw, OnImpactAnimatorAudioStateSetStateListAdd, OnImpactAnimatorAudioStateSetStateListReorder, OnImpactAnimatorAudioStateListRemove, GetSelectedImpactAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedImpactAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } } GUI.enabled = true; }; return(baseCallback); }
/// <summary> /// Draws the AudioStateSet element. /// </summary> private void OnAnimatorAudioStateListDraw(Rect rect, int index, bool isActive, bool isFocused) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateElementDraw(m_ReorderableUseAnimatorAudioStateSetAudioList, m_UsableItem.UseAnimatorAudioStateSet, rect, index, isActive, isFocused, target); }
/// <summary> /// Removes the state at the list index. /// </summary> private void OnAnimatorAudioStateListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateListRemove(list, m_ShootableWeapon.ReloadAnimatorAudioStateSet, SelectedReloadAnimatorAudioStateSetIndexKey); }
/// <summary> /// Removes the state at the list index. /// </summary> private void OnRecoilAnimatorAudioStateListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateListRemove(list, m_MeleeWeapon.RecoilAnimatorAudioStateSet, SelectedRecoilAnimatorAudioStateSetIndexKey); }
/// <summary> /// Draws all of the added audio clip elements. /// </summary> private void OnReloadAudioListElementDraw(Rect rect, int index, bool isActive, bool isFocused) { AnimatorAudioStateSetInspector.OnAudioClipDraw(m_ReorderableReloadAnimatorAudioStateSetAudioList, rect, index, m_ShootableWeapon.ReloadAnimatorAudioStateSet.States, SelectedReloadAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Draws the AudioStateSet element. /// </summary> private void OnAnimatorAudioStateListDraw(Rect rect, int index, bool isActive, bool isFocused) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateElementDraw(m_ReorderableReloadAnimatorAudioStateSetList, m_ShootableWeapon.ReloadAnimatorAudioStateSet, rect, index, isActive, isFocused, target); }
/// <summary> /// Removes the state at the list index. /// </summary> private void OnEquipAnimatorAudioStateListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateListRemove(list, m_Item.EquipAnimatorAudioStateSet, SelectedEquipAnimatorAudioStateSetIndexKey); }
/// <summary> /// Removes the audio clip at the list index. /// </summary> private void OnUseAudioListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAudioClipListRemove(list, m_UsableItem.UseAnimatorAudioStateSet.States, SelectedUseAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Adds a new audio clip element to the list. /// </summary> private void OnUnequipAudioListAdd(ReorderableList list) { AnimatorAudioStateSetInspector.OnAudioClipListAdd(list, m_Item.UnequipAnimatorAudioStateSet.States, SelectedUnequipAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Adds a new state element to the list. /// </summary> private void OnUnequipAnimatorAudioStateListAdd(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateListAdd(list, m_Item.UnequipAnimatorAudioStateSet, SelectedUnequipAnimatorAudioStateSetIndexKey); }
/// <summary> /// Removes the audio clip at the list index. /// </summary> private void OnEquipAudioListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAudioClipListRemove(list, m_Item.EquipAnimatorAudioStateSet.States, SelectedEquipAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Returns the actions to draw before the State list is drawn. /// </summary> /// <returns>The actions to draw before the State list is drawn.</returns> protected override Action GetDrawCallback() { var baseCallback = base.GetDrawCallback(); baseCallback += () => { EditorGUILayout.PropertyField(PropertyFromName("m_ItemType")); EditorGUILayout.PropertyField(PropertyFromName("m_SlotID")); EditorGUILayout.PropertyField(PropertyFromName("m_AnimatorItemID")); EditorGUILayout.PropertyField(PropertyFromName("m_AnimatorMovementSetID")); EditorGUILayout.PropertyField(PropertyFromName("m_DominantItem")); EditorGUILayout.PropertyField(PropertyFromName("m_AllowCameraZoom")); EditorGUILayout.PropertyField(PropertyFromName("m_DropPrefab")); #if ULTIMATE_CHARACTER_CONTROLLER_VR if (PropertyFromName("m_DropPrefab").objectReferenceValue != null) { EditorGUILayout.PropertyField(PropertyFromName("m_DropVelocityMultiplier")); } #endif if (Foldout("Equip")) { EditorGUI.indentLevel++; InspectorUtility.DrawAnimationEventTrigger(target, "Equip Event", PropertyFromName("m_EquipEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Equip Complete Event", PropertyFromName("m_EquipCompleteEvent")); if (Foldout("Animator Audio")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_Item, m_Item.EquipAnimatorAudioStateSet, "m_EquipAnimatorAudioStateSet", true, ref m_ReorderableEquipAnimatorAudioStateSetList, OnEquipAnimatorAudioStateListDraw, OnEquipAnimatorAudioStateListSelect, OnEquipAnimatorAudioStateListAdd, OnEquipAnimatorAudioStateListRemove, SelectedEquipAnimatorAudioStateSetIndexKey, ref m_ReorderableEquipAnimatorAudioStateSetAudioList, OnEquipAudioListElementDraw, OnEquipAudioListAdd, OnEquipAudioListRemove, ref m_ReorderableEquipAnimatorAudioStateSetStateList, OnEquipAnimatorAudioStateSetStateListDraw, OnEquipAnimatorAudioStateSetStateListAdd, OnEquipAnimatorAudioStateSetStateListReorder, OnEquipAnimatorAudioStateSetStateListRemove, GetSelectedEquipAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedEquipAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("Unequip")) { EditorGUI.indentLevel++; InspectorUtility.DrawAnimationEventTrigger(target, "Unequip Event", PropertyFromName("m_UnequipEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Unequip Complete Event", PropertyFromName("m_UnequipCompleteEvent")); if (Foldout("Animator Audio")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_Item, m_Item.UnequipAnimatorAudioStateSet, "m_UnequipAnimatorAudioStateSet", true, ref m_ReorderableUnequipAnimatorAudioStateSetList, OnUnequipAnimatorAudioStateListDraw, OnUnequipAnimatorAudioStateListSelect, OnUnequipAnimatorAudioStateListAdd, OnUnequipAnimatorAudioStateListRemove, SelectedUnequipAnimatorAudioStateSetIndexKey, ref m_ReorderableUnequipAnimatorAudioStateSetAudioList, OnUnequipAudioListElementDraw, OnUnequipAudioListAdd, OnUnequipAudioListRemove, ref m_ReorderableUnequipAnimatorAudioStateSetStateList, OnUnequipAnimatorAudioStateSetStateListDraw, OnUnequipAnimatorAudioStateSetStateListAdd, OnUnequipAnimatorAudioStateSetStateListReorder, OnUnequipAnimatorAudioStateSetStateListRemove, GetSelectedUnequipAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedUnequipAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("UI")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_UIMonitorID")); EditorGUILayout.PropertyField(PropertyFromName("m_Icon")); EditorGUILayout.PropertyField(PropertyFromName("m_ShowCrosshairsOnAim")); EditorGUILayout.PropertyField(PropertyFromName("m_CenterCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_QuadrantOffset")); EditorGUILayout.PropertyField(PropertyFromName("m_MaxQuadrantSpread")); EditorGUILayout.PropertyField(PropertyFromName("m_QuadrantSpreadDamping")); EditorGUILayout.PropertyField(PropertyFromName("m_LeftCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_TopCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_RightCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_BottomCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_ShowFullScreenUI")); EditorGUILayout.PropertyField(PropertyFromName("m_FullScreenUIID")); EditorGUI.indentLevel--; } if (Foldout("Events")) { EditorGUI.indentLevel++; InspectorUtility.UnityEventPropertyField(PropertyFromName("m_PickupItemEvent")); InspectorUtility.UnityEventPropertyField(PropertyFromName("m_EquipItemEvent")); InspectorUtility.UnityEventPropertyField(PropertyFromName("m_UnequipItemEvent")); InspectorUtility.UnityEventPropertyField(PropertyFromName("m_DropItemEvent")); EditorGUI.indentLevel--; } }; return(baseCallback); }
/// <summary> /// Returns the actions to draw before the State list is drawn. /// </summary> /// <returns>The actions to draw before the State list is drawn.</returns> protected override Action GetDrawCallback() { var baseCallback = base.GetDrawCallback(); baseCallback += () => { if (Foldout("Melee")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_RequireInAirMeleeAbilityInAir")); EditorGUILayout.PropertyField(PropertyFromName("m_RequireCounterAttackAbility")); EditorGUILayout.PropertyField(PropertyFromName("m_AimItemSubstateIndexAddition")); EditorGUILayout.PropertyField(PropertyFromName("m_MaxCollisionCount")); EditorGUILayout.PropertyField(PropertyFromName("m_ForwardShieldSensitivity")); EditorGUILayout.PropertyField(PropertyFromName("m_SingleHit")); EditorGUILayout.PropertyField(PropertyFromName("m_MultiHitFrameCount")); EditorGUILayout.PropertyField(PropertyFromName("m_CanHitDelay")); EditorGUILayout.PropertyField(PropertyFromName("m_AllowAttackCombos")); var states = m_MeleeWeapon.UseAnimatorAudioStateSet.States; if (states != null) { if (PropertyFromName("m_AllowAttackCombos").boolValue&& states.Length == 1) { EditorGUILayout.HelpBox("Only 1 Use AnimatorAudio state has been added. " + "Allow Attack Combos may need to be disabled in order for the animator to transition correctly.", MessageType.Warning); } } EditorGUI.indentLevel--; } if (Foldout("Impact")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ImpactLayers")); EditorGUILayout.PropertyField(PropertyFromName("m_TriggerInteraction")); EditorGUILayout.PropertyField(PropertyFromName("m_DamageAmount")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactForce")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactForceFrames")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactStateName")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactStateDisableTimer")); EditorGUILayout.PropertyField(PropertyFromName("m_SurfaceImpact")); EditorGUI.indentLevel--; } if (Foldout("Recoil")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ApplyRecoil")); if (Foldout("Animator Audio")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_MeleeWeapon, m_MeleeWeapon.RecoilAnimatorAudioStateSet, "m_RecoilAnimatorAudioStateSet", false, ref m_ReorderableRecoilAnimatorAudioStateSetList, OnRecoilAnimatorAudioStateListDraw, OnRecoilAnimatorAudioStateListSelect, OnRecoilAnimatorAudioStateListAdd, OnRecoilAnimatorAudioStateListRemove, SelectedRecoilAnimatorAudioStateSetIndexKey, ref m_ReorderableRecoilAnimatorAudioStateSetAudioList, OnRecoilAudioListElementDraw, OnRecoilAudioListAdd, OnRecoilAudioListRemove, ref m_ReorderableRecoilAnimatorAudioStateSetStateList, OnRecoilAnimatorAudioStateSetStateListDraw, OnRecoilAnimatorAudioStateSetStateListAdd, OnRecoilAnimatorAudioStateSetStateListReorder, OnRecoilAnimatorAudioStateListRemove, GetSelectedRecoilAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedRecoilAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("Trail")) { EditorGUI.indentLevel++; var trail = PropertyFromName("m_Trail"); EditorGUILayout.PropertyField(trail); if (trail.objectReferenceValue != null) { EditorGUILayout.PropertyField(PropertyFromName("m_TrailVisibility")); EditorGUILayout.PropertyField(PropertyFromName("m_TrailSpawnDelay")); InspectorUtility.DrawAnimationEventTrigger(target, "Attack Stop Trail Event", PropertyFromName("m_AttackStopTrailEvent")); } EditorGUI.indentLevel--; } if (Foldout("Events")) { EditorGUI.indentLevel++; InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnImpactEvent")); EditorGUI.indentLevel--; } }; return(baseCallback); }
/// <summary> /// Removes the state at the list index. /// </summary> private void OnAnimatorAudioStateListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateListRemove(list, m_UsableItem.UseAnimatorAudioStateSet, SelectedUseAnimatorAudioStateSetIndexKey); }
/// <summary> /// Returns the actions to draw before the State list is drawn. /// </summary> /// <returns>The actions to draw before the State list is drawn.</returns> protected override Action GetDrawCallback() { var baseCallback = base.GetDrawCallback(); baseCallback += () => { var itemDefinition = PropertyFromName("m_ItemDefinition"); EditorGUILayout.PropertyField(itemDefinition); if (itemDefinition == null) { EditorGUILayout.HelpBox("An Item Definition is required.", MessageType.Error); } else { // Ensure the Item Definition exists within the collection set by the Item Set Manager. var itemSetManager = (target as Item).GetComponentInParent <ItemSetManager>(); if (itemSetManager != null && itemSetManager.ItemCollection != null) { if (AssetDatabase.GetAssetPath(itemDefinition.objectReferenceValue) != AssetDatabase.GetAssetPath(itemSetManager.ItemCollection)) { EditorGUILayout.HelpBox("The Item Definition must exist within the Item Collection specified on the character's Item Set Manager.", MessageType.Error); } } } if (Application.isPlaying) { EditorGUI.indentLevel++; EditorGUILayout.LabelField("Item Identifier", m_Item.ItemIdentifier == null ? "(none)" : m_Item.ItemIdentifier.ToString()); EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(PropertyFromName("m_SlotID")); EditorGUILayout.PropertyField(PropertyFromName("m_AnimatorItemID")); EditorGUILayout.PropertyField(PropertyFromName("m_AnimatorMovementSetID")); EditorGUILayout.PropertyField(PropertyFromName("m_DominantItem")); EditorGUILayout.PropertyField(PropertyFromName("m_UniqueItemSet")); EditorGUILayout.PropertyField(PropertyFromName("m_AllowCameraZoom")); EditorGUILayout.PropertyField(PropertyFromName("m_DropPrefab")); if (PropertyFromName("m_DropPrefab").objectReferenceValue != null) { EditorGUI.indentLevel++; #if ULTIMATE_CHARACTER_CONTROLLER_VR EditorGUILayout.PropertyField(PropertyFromName("m_DropVelocityMultiplier")); #endif EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(PropertyFromName("m_FullInventoryDrop")); EditorGUILayout.PropertyField(PropertyFromName("m_DropConsumableItems")); if (Foldout("Equip")) { EditorGUI.indentLevel++; InspectorUtility.DrawAnimationEventTrigger(target, "Equip Event", PropertyFromName("m_EquipEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Equip Complete Event", PropertyFromName("m_EquipCompleteEvent")); if (Foldout("Animator Audio", "Equip")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_Item, m_Item.EquipAnimatorAudioStateSet, "m_EquipAnimatorAudioStateSet", true, ref m_ReorderableEquipAnimatorAudioStateSetList, OnEquipAnimatorAudioStateListDraw, OnEquipAnimatorAudioStateListSelect, OnEquipAnimatorAudioStateListAdd, OnEquipAnimatorAudioStateListRemove, SelectedEquipAnimatorAudioStateSetIndexKey, ref m_ReorderableEquipAnimatorAudioStateSetAudioList, OnEquipAudioListElementDraw, OnEquipAudioListAdd, OnEquipAudioListRemove, ref m_ReorderableEquipAnimatorAudioStateSetStateList, OnEquipAnimatorAudioStateSetStateListDraw, OnEquipAnimatorAudioStateSetStateListAdd, OnEquipAnimatorAudioStateSetStateListReorder, OnEquipAnimatorAudioStateSetStateListRemove, GetSelectedEquipAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedEquipAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("Unequip")) { EditorGUI.indentLevel++; InspectorUtility.DrawAnimationEventTrigger(target, "Unequip Event", PropertyFromName("m_UnequipEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Unequip Complete Event", PropertyFromName("m_UnequipCompleteEvent")); if (Foldout("Animator Audio", "Unequip")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_Item, m_Item.UnequipAnimatorAudioStateSet, "m_UnequipAnimatorAudioStateSet", true, ref m_ReorderableUnequipAnimatorAudioStateSetList, OnUnequipAnimatorAudioStateListDraw, OnUnequipAnimatorAudioStateListSelect, OnUnequipAnimatorAudioStateListAdd, OnUnequipAnimatorAudioStateListRemove, SelectedUnequipAnimatorAudioStateSetIndexKey, ref m_ReorderableUnequipAnimatorAudioStateSetAudioList, OnUnequipAudioListElementDraw, OnUnequipAudioListAdd, OnUnequipAudioListRemove, ref m_ReorderableUnequipAnimatorAudioStateSetStateList, OnUnequipAnimatorAudioStateSetStateListDraw, OnUnequipAnimatorAudioStateSetStateListAdd, OnUnequipAnimatorAudioStateSetStateListReorder, OnUnequipAnimatorAudioStateSetStateListRemove, GetSelectedUnequipAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedUnequipAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("UI")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_UIMonitorID")); EditorGUILayout.PropertyField(PropertyFromName("m_Icon")); EditorGUILayout.PropertyField(PropertyFromName("m_ShowCrosshairsOnAim")); EditorGUILayout.PropertyField(PropertyFromName("m_CenterCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_QuadrantOffset")); EditorGUILayout.PropertyField(PropertyFromName("m_MaxQuadrantSpread")); EditorGUILayout.PropertyField(PropertyFromName("m_QuadrantSpreadDamping")); EditorGUILayout.PropertyField(PropertyFromName("m_LeftCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_TopCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_RightCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_BottomCrosshairs")); EditorGUILayout.PropertyField(PropertyFromName("m_ShowFullScreenUI")); EditorGUILayout.PropertyField(PropertyFromName("m_FullScreenUIID")); EditorGUI.indentLevel--; } if (Foldout("Events")) { EditorGUI.indentLevel++; Shared.Editor.Inspectors.Utility.InspectorUtility.UnityEventPropertyField(PropertyFromName("m_PickupItemEvent")); Shared.Editor.Inspectors.Utility.InspectorUtility.UnityEventPropertyField(PropertyFromName("m_EquipItemEvent")); Shared.Editor.Inspectors.Utility.InspectorUtility.UnityEventPropertyField(PropertyFromName("m_UnequipItemEvent")); Shared.Editor.Inspectors.Utility.InspectorUtility.UnityEventPropertyField(PropertyFromName("m_DropItemEvent")); EditorGUI.indentLevel--; } }; return(baseCallback); }
/// <summary> /// Draws all of the added audio clip elements. /// </summary> private void OnUseAudioListElementDraw(Rect rect, int index, bool isActive, bool isFocused) { AnimatorAudioStateSetInspector.OnAudioClipDraw(m_ReorderableUseAnimatorAudioStateSetList, rect, index, m_UsableItem.UseAnimatorAudioStateSet.States, SelectedUseAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Draws all of the added audio clip elements. /// </summary> private void OnImpactAudioListElementDraw(Rect rect, int index, bool isActive, bool isFocused) { AnimatorAudioStateSetInspector.OnAudioClipDraw(m_ReorderableImpactAnimatorAudioStateSetAudioList, rect, index, m_Shield.ImpactAnimatorAudioStateSet.States, SelectedImpactAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Returns the actions to draw before the State list is drawn. /// </summary> /// <returns>The actions to draw before the State list is drawn.</returns> protected override Action GetDrawCallback() { var baseCallback = base.GetDrawCallback(); baseCallback += () => { if (Foldout("Use")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_UseRate")); EditorGUILayout.PropertyField(PropertyFromName("m_CanEquipEmptyItem")); EditorGUILayout.PropertyField(PropertyFromName("m_FaceTarget")); EditorGUILayout.PropertyField(PropertyFromName("m_StopUseAbilityDelay")); InspectorUtility.DrawAnimationEventTrigger(target, "Use Event", PropertyFromName("m_UseEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Use Complete Event", PropertyFromName("m_UseCompleteEvent")); EditorGUILayout.PropertyField(PropertyFromName("m_ForceRootMotionPosition")); EditorGUILayout.PropertyField(PropertyFromName("m_ForceRootMotionRotation")); if (Foldout("Attributes")) { EditorGUI.indentLevel++; var attributeName = InspectorUtility.DrawAttribute(target, m_AttributeManager, m_UsableItem.UseAttributeName, "Use Attribute"); if (attributeName != m_UsableItem.UseAttributeName) { m_UsableItem.UseAttributeName = attributeName; InspectorUtility.SetDirty(target); } if (!string.IsNullOrEmpty(m_UsableItem.UseAttributeName)) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_UseAttributeAmount"), new GUIContent("Use Amount")); EditorGUILayout.PropertyField(PropertyFromName("m_DropWhenUseDepleted")); EditorGUI.indentLevel--; } attributeName = InspectorUtility.DrawAttribute(target, m_CharacterAttributeManager, m_UsableItem.CharacterUseAttributeName, "Character Use Attribute"); if (attributeName != m_UsableItem.CharacterUseAttributeName) { m_UsableItem.CharacterUseAttributeName = attributeName; InspectorUtility.SetDirty(target); } if (!string.IsNullOrEmpty(m_UsableItem.CharacterUseAttributeName)) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_CharacterUseAttributeAmount"), new GUIContent("Use Amount")); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("Animator Audio")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_PlayAudioOnStartUse")); AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_UsableItem, m_UsableItem.UseAnimatorAudioStateSet, "m_UseAnimatorAudioStateSet", true, ref m_ReorderableUseAnimatorAudioStateSetAudioList, OnAnimatorAudioStateListDraw, OnAnimatorAudioStateListSelect, OnAnimatorAudioStateListAdd, OnAnimatorAudioStateListRemove, SelectedUseAnimatorAudioStateSetIndexKey, ref m_ReorderableUseAnimatorAudioStateSetList, OnUseAudioListElementDraw, OnUseAudioListAdd, OnUseAudioListRemove, ref m_ReorderableUseAnimatorAudioStateSetStateList, OnAnimatorAudioStateSetStateListDraw, OnAnimatorAudioStateSetStateListAdd, OnAnimatorAudioStateSetStateListReorder, OnAnimatorAudioStateSetStateListRemove, GetSelectedAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedUseAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } } }; return(baseCallback); }
/// <summary> /// Removes the audio clip at the list index. /// </summary> private void OnImpactAudioListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAudioClipListRemove(list, m_Shield.ImpactAnimatorAudioStateSet.States, SelectedImpactAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Removes the audio clip at the list index. /// </summary> private void OnReloadAudioListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAudioClipListRemove(list, m_ShootableWeapon.ReloadAnimatorAudioStateSet.States, SelectedReloadAnimatorAudioStateSetIndexKey, target); }
/// <summary> /// Draws the AudioStateSet element. /// </summary> private void OnImpactAnimatorAudioStateListDraw(Rect rect, int index, bool isActive, bool isFocused) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateElementDraw(m_ReorderableImpactAnimatorAudioStateSetList, m_Shield.ImpactAnimatorAudioStateSet, rect, index, isActive, isFocused, target); }
/// <summary> /// A new element has been selected. /// </summary> private void OnAnimatorAudioStateListSelect(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateSelect(list, SelectedReloadAnimatorAudioStateSetIndexKey); }
/// <summary> /// Removes the state at the list index. /// </summary> private void OnImpactAnimatorAudioStateListRemove(ReorderableList list) { AnimatorAudioStateSetInspector.OnAnimatorAudioStateListRemove(list, m_Shield.ImpactAnimatorAudioStateSet, SelectedImpactAnimatorAudioStateSetIndexKey); }
/// <summary> /// Returns the actions to draw before the State list is drawn. /// </summary> /// <returns>The actions to draw before the State list is drawn.</returns> protected override Action GetDrawCallback() { var baseCallback = base.GetDrawCallback(); baseCallback += () => { var projectile = PropertyFromName("m_Projectile"); if (Foldout("Firing")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ConsumableItemDefinition")); var fireMode = PropertyFromName("m_FireMode"); EditorGUILayout.PropertyField(fireMode); if (fireMode.enumValueIndex == (int)ShootableWeapon.FireMode.Burst) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_BurstCount")); EditorGUILayout.PropertyField(PropertyFromName("m_BurstDelay")); EditorGUI.indentLevel--; } var fireType = PropertyFromName("m_FireType"); EditorGUILayout.PropertyField(fireType); if (fireType.enumValueIndex != (int)ShootableWeapon.FireType.Instant) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_MinChargeLength")); EditorGUILayout.PropertyField(PropertyFromName("m_FullChargeLength")); EditorGUILayout.PropertyField(PropertyFromName("m_ChargeItemSubstateParameterValue")); EditorGUILayout.PropertyField(PropertyFromName("m_MinChargeStrength")); if (Foldout("Charge Audio")) { EditorGUI.indentLevel++; m_ReorderableChargeAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_ShootableWeapon.ChargeAudioClipSet, PropertyFromName("m_ChargeAudioClipSet"), m_ReorderableChargeAudioClipsList, OnChargeAudioClipDraw, OnChargeAudioClipListAdd, OnChargeAudioClipListRemove); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(PropertyFromName("m_FireCount")); EditorGUILayout.PropertyField(PropertyFromName("m_Spread")); EditorGUILayout.PropertyField(PropertyFromName("m_FireInLookSourceDirection")); EditorGUILayout.HelpBox("If a projectile prefab is specified then this projectile will be fired from the weapon. If no projectile is specified then a hitscan will be used.", MessageType.Info); EditorGUILayout.PropertyField(projectile); if (projectile.objectReferenceValue == null) { EditorGUILayout.PropertyField(PropertyFromName("m_HitscanFireDelay")); EditorGUILayout.PropertyField(PropertyFromName("m_HitscanFireRange")); EditorGUILayout.PropertyField(PropertyFromName("m_MaxHitscanCollisionCount")); Shared.Editor.Inspectors.Utility.InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnHitscanImpactEvent")); } else { if ((projectile.objectReferenceValue as GameObject).GetComponent <UltimateCharacterController.Objects.Projectile>() == null) { EditorGUILayout.HelpBox("The projectile must have the Projectile component attached to it.", MessageType.Error); } EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ProjectileFireVelocityMagnitude")); EditorGUILayout.PropertyField(PropertyFromName("m_ProjectileVisibility")); var shootableWeapon = target as ShootableWeapon; shootableWeapon.ProjectileStartLayer = EditorGUILayout.LayerField(new GUIContent("Projectile Start Layer", "The layer that the projectile should occupy when initially spawned."), shootableWeapon.ProjectileStartLayer); shootableWeapon.ProjectileFiredLayer = EditorGUILayout.LayerField(new GUIContent("Projectile Fired Layer", "The layer that the projectile object should change to after being fired."), shootableWeapon.ProjectileFiredLayer); EditorGUILayout.PropertyField(PropertyFromName("m_LayerChangeDelay")); EditorGUILayout.PropertyField(PropertyFromName("m_ProjectileEnableDelayAfterOtherUse")); EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(PropertyFromName("m_DryFireItemSubstateParameterValue")); if (Shared.Editor.Inspectors.Utility.InspectorUtility.Foldout(target, "Dry Fire Audio")) { EditorGUI.indentLevel++; m_ReorderableDryFireAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_ShootableWeapon.DryFireAudioClipSet, PropertyFromName("m_DryFireAudioClipSet"), m_ReorderableDryFireAudioClipsList, OnDryFireAudioClipDraw, OnDryFireAudioClipListAdd, OnDryFireAudioClipListRemove); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } if (Foldout("Impact")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ImpactLayers")); if (projectile.objectReferenceValue == null) { EditorGUILayout.PropertyField(PropertyFromName("m_HitscanTriggerInteraction")); } EditorGUILayout.PropertyField(PropertyFromName("m_DamageAmount")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactForce")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactForceFrames")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactStateName")); EditorGUILayout.PropertyField(PropertyFromName("m_ImpactStateDisableTimer")); EditorGUILayout.PropertyField(PropertyFromName("m_SurfaceImpact")); EditorGUI.indentLevel--; } if (Foldout("Reload")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_ClipSize")); var autoReloadProperty = PropertyFromName("m_AutoReload"); var autoReloadString = Enum.GetNames(typeof(UltimateCharacterController.Character.Abilities.Items.Reload.AutoReloadType)); autoReloadProperty.intValue = EditorGUILayout.MaskField(new GUIContent("Auto Reload", autoReloadProperty.tooltip), (int)autoReloadProperty.intValue, autoReloadString); EditorGUILayout.PropertyField(PropertyFromName("m_ReloadType")); EditorGUILayout.PropertyField(PropertyFromName("m_ReloadCanCameraZoom")); EditorGUILayout.PropertyField(PropertyFromName("m_ReloadCrosshairsSpread")); InspectorUtility.DrawAnimationEventTrigger(target, "Reload Event", PropertyFromName("m_ReloadEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Reload Complete Event", PropertyFromName("m_ReloadCompleteEvent")); EditorGUILayout.PropertyField(PropertyFromName("m_ReloadDetachAttachClip")); InspectorUtility.DrawAnimationEventTrigger(target, "Reload Detach Clip Event", PropertyFromName("m_ReloadDetachClipEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Reload Show Projectile Event", PropertyFromName("m_ReloadShowProjectileEvent")); InspectorUtility.DrawAnimationEventTrigger(target, "Reload Attach Projectile Event", PropertyFromName("m_ReloadAttachProjectileEvent")); var reloadClipProperty = PropertyFromName("m_ReloadDropClip"); EditorGUILayout.PropertyField(reloadClipProperty); if (reloadClipProperty.objectReferenceValue != null) { EditorGUI.indentLevel++; var shootableWeapon = target as ShootableWeapon; shootableWeapon.ReloadClipTargetLayer = EditorGUILayout.LayerField(new GUIContent("Reload Clip Target Layer", "The layer that the clip object should change to after being reloaded."), shootableWeapon.ReloadClipTargetLayer); EditorGUILayout.PropertyField(PropertyFromName("m_ReloadClipLayerChangeDelay")); InspectorUtility.DrawAnimationEventTrigger(target, "Reload Drop Clip Event", PropertyFromName("m_ReloadDropClipEvent")); EditorGUI.indentLevel--; } InspectorUtility.DrawAnimationEventTrigger(target, "Reload Attach Clip Event", PropertyFromName("m_ReloadAttachClipEvent")); if (Foldout("Animator Audio")) { EditorGUI.indentLevel++; AnimatorAudioStateSetInspector.DrawAnimatorAudioStateSet(m_ShootableWeapon, m_ShootableWeapon.ReloadAnimatorAudioStateSet, "m_ReloadAnimatorAudioStateSet", true, ref m_ReorderableReloadAnimatorAudioStateSetList, OnAnimatorAudioStateListDraw, OnAnimatorAudioStateListSelect, OnAnimatorAudioStateListAdd, OnAnimatorAudioStateListRemove, SelectedReloadAnimatorAudioStateSetIndexKey, ref m_ReorderableReloadAnimatorAudioStateSetAudioList, OnReloadAudioListElementDraw, OnReloadAudioListAdd, OnReloadAudioListRemove, ref m_ReorderableReloadAnimatorAudioStateSetStateList, OnAnimatorAudioStateSetStateListDraw, OnAnimatorAudioStateSetStateListAdd, OnAnimatorAudioStateSetStateListReorder, OnAnimatorAudioStateSetStateListRemove, GetSelectedAnimatorAudioStateSetStateIndexKey(EditorPrefs.GetInt(SelectedReloadAnimatorAudioStateSetIndexKey))); EditorGUI.indentLevel--; } if (Shared.Editor.Inspectors.Utility.InspectorUtility.Foldout(target, "Reload Complete Audio")) { EditorGUI.indentLevel++; m_ReorderableReloadCompleteAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_ShootableWeapon.ReloadCompleteAudioClipSet, PropertyFromName("m_ReloadCompleteAudioClipSet"), m_ReorderableReloadCompleteAudioClipsList, OnReloadCompleteAudioClipDraw, OnReloadCompleteAudioClipListAdd, OnReloadCompleteAudioClipListRemove); EditorGUI.indentLevel--; } } if (Foldout("Recoil")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_PositionRecoil"), true); EditorGUILayout.PropertyField(PropertyFromName("m_RotationRecoil"), true); EditorGUILayout.PropertyField(PropertyFromName("m_PositionCameraRecoil"), true); EditorGUILayout.PropertyField(PropertyFromName("m_RotationCameraRecoil"), true); EditorGUILayout.PropertyField(PropertyFromName("m_CameraRecoilAccumulation")); EditorGUILayout.PropertyField(PropertyFromName("m_LocalizeRecoilForce")); EditorGUI.indentLevel--; } if (Foldout("Muzzle Flash")) { EditorGUI.indentLevel++; var muzzleFlash = PropertyFromName("m_MuzzleFlash"); EditorGUILayout.PropertyField(muzzleFlash); if (muzzleFlash.objectReferenceValue != null) { EditorGUILayout.PropertyField(PropertyFromName("m_PoolMuzzleFlash")); } EditorGUI.indentLevel--; } if (Foldout("Shell")) { EditorGUI.indentLevel++; var shell = PropertyFromName("m_Shell"); EditorGUILayout.PropertyField(shell); if (shell.objectReferenceValue != null) { EditorGUILayout.PropertyField(PropertyFromName("m_ShellVelocity"), true); EditorGUILayout.PropertyField(PropertyFromName("m_ShellTorque"), true); EditorGUILayout.PropertyField(PropertyFromName("m_ShellEjectDelay")); } EditorGUI.indentLevel--; } if (Foldout("Smoke")) { EditorGUI.indentLevel++; var smoke = PropertyFromName("m_Smoke"); EditorGUILayout.PropertyField(smoke); if (smoke.objectReferenceValue != null) { EditorGUILayout.PropertyField(PropertyFromName("m_SmokeSpawnDelay")); } EditorGUI.indentLevel--; } if (Foldout("Tracer")) { EditorGUI.indentLevel++; if (PropertyFromName("m_Projectile").objectReferenceValue == null) { var tracer = PropertyFromName("m_Tracer"); EditorGUILayout.PropertyField(tracer); if (tracer.objectReferenceValue != null) { EditorGUILayout.PropertyField(PropertyFromName("m_TracerDefaultLength")); EditorGUILayout.PropertyField(PropertyFromName("m_TracerSpawnDelay")); } } else { EditorGUILayout.HelpBox("A tracer can only be applied to hitscan weapons.", MessageType.Info); } EditorGUI.indentLevel--; } if (Foldout("Attachments")) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(PropertyFromName("m_DisableScopeCameraOnNoAim")); EditorGUI.indentLevel--; } }; return(baseCallback); }
/// <summary> /// Adds a new audio clip element to the list. /// </summary> private void OnRecoilAudioListAdd(ReorderableList list) { AnimatorAudioStateSetInspector.OnAudioClipListAdd(list, m_MeleeWeapon.RecoilAnimatorAudioStateSet.States, SelectedRecoilAnimatorAudioStateSetIndexKey, target); }