コード例 #1
0
        /// <summary>
        /// Draws the custom inspector.
        /// </summary>
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(PropertyFromName("m_StateName"));
            EditorGUILayout.PropertyField(PropertyFromName("m_Delay"));
            EditorGUILayout.PropertyField(PropertyFromName("m_Duration"));
            EditorGUILayout.PropertyField(PropertyFromName("m_LayerMask"));
            EditorGUILayout.PropertyField(PropertyFromName("m_RequireCharacter"));
            EditorGUILayout.PropertyField(PropertyFromName("m_CharacterTransformChange"));
            if (Foldout("Audio"))
            {
                EditorGUI.indentLevel++;
                m_ReorderableActivateAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_StateTrigger.ActivateAudioClipSet, PropertyFromName("m_ActivateAudioClipSet"), m_ReorderableActivateAudioClipsList, OnActivateAudioClipDraw, OnActivateAudioClipListAdd, OnActivateAudioClipListRemove);
                EditorGUI.indentLevel--;
            }

            if (EditorGUI.EndChangeCheck())
            {
                InspectorUtility.RecordUndoDirtyObject(target, "Value Change");
                serializedObject.ApplyModifiedProperties();
            }
        }
コード例 #2
0
        /// <summary>
        /// Draws the fields related to the inspector drawer.
        /// </summary>
        /// <param name="target">The object that is being drawn.</param>
        /// <param name="parent">The Unity Object that the object belongs to.</param>
        protected override void DrawInspectorDrawerFields(object target, Object parent)
        {
            ObjectInspector.DrawFields(target, true);

            m_PlayAudioClip = (target as PlayAudioClip);
            AudioClipSetInspector.DrawAudioClipSet(m_PlayAudioClip.AudioClipSet, null, ref m_AudioClipsList, OnAudioClipDraw, OnAudioClipListAdd, OnAudioClipListRemove);
        }
コード例 #3
0
        /// <summary>
        /// Draws the custom inspector.
        /// </summary>
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(PropertyFromName("m_ExplodeOnEnable"));
            EditorGUILayout.PropertyField(PropertyFromName("m_Radius"));
            EditorGUILayout.PropertyField(PropertyFromName("m_DamageAmount"));
            EditorGUILayout.PropertyField(PropertyFromName("m_ImpactForce"));
            EditorGUILayout.PropertyField(PropertyFromName("m_ImpactForceFrames"));
            EditorGUILayout.PropertyField(PropertyFromName("m_ImpactLayers"));
            EditorGUILayout.PropertyField(PropertyFromName("m_LineOfSight"));
            EditorGUILayout.PropertyField(PropertyFromName("m_Lifespan"));
            EditorGUILayout.PropertyField(PropertyFromName("m_MaxCollisionCount"));
            if (Foldout("Audio"))
            {
                EditorGUI.indentLevel++;
                AudioClipSetInspector.DrawAudioClipSet(m_Explosion.ExplosionAudioClipSet, PropertyFromName("m_ExplosionAudioClipSet"), ref m_ReorderableExplosionAudioClipsList, OnExplosionAudioClipDraw, OnExplosionAudioClipListAdd, OnExplosionAudioClipListRemove);
                EditorGUI.indentLevel--;
            }
            InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnImpactEvent"));

            if (EditorGUI.EndChangeCheck())
            {
                InspectorUtility.RecordUndoDirtyObject(target, "Value Change");
                serializedObject.ApplyModifiedProperties();
                InspectorUtility.SetDirty(target);
            }
        }
コード例 #4
0
        /// <summary>
        /// Draws the fields related to the inspector drawer.
        /// </summary>
        /// <param name="target">The object that is being drawn.</param>
        /// <param name="parent">The Unity Object that the object belongs to.</param>
        protected override void DrawInspectorDrawerFields(object target, Object parent)
        {
            m_Jump = target as Jump;

            InspectorUtility.DrawField(target, "m_MinCeilingJumpHeight");
            InspectorUtility.DrawField(target, "m_GroundedGracePeriod");
            InspectorUtility.DrawField(target, "m_Force");
            InspectorUtility.DrawField(target, "m_SidewaysForceMultiplier");
            InspectorUtility.DrawField(target, "m_BackwardsForceMultiplier");
            InspectorUtility.DrawField(target, "m_Frames");
            InspectorUtility.DrawField(target, "m_JumpEvent");
            InspectorUtility.DrawField(target, "m_JumpSurfaceImpact");
            InspectorUtility.DrawField(target, "m_ForceHold");
            InspectorUtility.DrawField(target, "m_ForceDampingHold");
            InspectorUtility.DrawField(target, "m_MaxRepeatedJumpCount");
            if (m_Jump.MaxRepeatedJumpCount > 0)
            {
                EditorGUI.indentLevel++;
                InspectorUtility.DrawField(target, "m_RepeatedJumpForce");
                InspectorUtility.DrawField(target, "m_RepeatedJumpFrames");
                if (InspectorUtility.Foldout(target, "Repeated Jump Audio"))
                {
                    EditorGUI.indentLevel++;
                    m_ReorderableRepeatedJumpAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_Jump.RepeatedJumpAudioClipSet, null, m_ReorderableRepeatedJumpAudioClipsList, OnRepeatedJumpAudioClipDraw, OnRepeatedJumpAudioClipListAdd, OnRepeatedJumpAudioClipListRemove);
                    EditorGUI.indentLevel--;
                }
                EditorGUI.indentLevel--;
            }
            InspectorUtility.DrawField(target, "m_VerticalVelocityStopThreshold");
            InspectorUtility.DrawField(target, "m_RecurrenceDelay");
        }
コード例 #5
0
        /// <summary>
        /// Draws the custom inspector.
        /// </summary>
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            EditorGUI.BeginChangeCheck();
            DrawObjectPickupFields();
            EditorGUILayout.PropertyField(PropertyFromName("m_TriggerEnableDelay"));
            EditorGUILayout.PropertyField(PropertyFromName("m_PickupOnTriggerEnter"));
            EditorGUILayout.PropertyField(PropertyFromName("m_RotationSpeed"));
            if (Foldout("UI"))
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(PropertyFromName("m_PickupMessageText"));
                EditorGUILayout.PropertyField(PropertyFromName("m_PickupMessageIcon"));
                EditorGUI.indentLevel--;
            }
            if (Foldout("Audio"))
            {
                EditorGUI.indentLevel++;
                m_ReorderablePickupAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_ObjectPickup.PickupAudioClipSet, PropertyFromName("m_PickupAudioClipSet"), m_ReorderablePickupAudioClipsList, OnPickupAudioClipDraw, OnPickupAudioClipListAdd, OnPickupAudioClipListRemove);
                EditorGUI.indentLevel--;
            }

            if (EditorGUI.EndChangeCheck())
            {
                InspectorUtility.RecordUndoDirtyObject(target, "Value Change");
                serializedObject.ApplyModifiedProperties();
            }
        }
コード例 #6
0
        /// <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 positioningMode = PropertyFromName("m_PositioningMode");
                EditorGUILayout.PropertyField(positioningMode);
                if ((Respawner.SpawnPositioningMode)positioningMode.enumValueIndex == Respawner.SpawnPositioningMode.SpawnPoint)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(PropertyFromName("m_Grouping"));
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.PropertyField(PropertyFromName("m_MinRespawnTime"));
                EditorGUILayout.PropertyField(PropertyFromName("m_MaxRespawnTime"));
                EditorGUILayout.PropertyField(PropertyFromName("m_ScheduleRespawnOnDeath"));
                EditorGUILayout.PropertyField(PropertyFromName("m_ScheduleRespawnOnDisable"));

                if (Foldout("Respawn Audio"))
                {
                    EditorGUI.indentLevel++;
                    AudioClipSetInspector.DrawAudioClipSet(m_Respawner.RespawnAudioClipSet, PropertyFromName("m_RespawnAudioClipSet"), ref m_ReorderableRespawnAudioClipsList, OnRespawnAudioClipDraw, OnRespawnAudioClipListAdd, OnRespawnAudioClipListRemove);
                    EditorGUI.indentLevel--;
                }

                if (Foldout("Events"))
                {
                    EditorGUI.indentLevel++;
                    InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnRespawnEvent"));
                    EditorGUI.indentLevel--;
                }
            };

            return(baseCallback);
        }
コード例 #7
0
 /// <summary>
 /// Remove the AudioClip element at the list index.
 /// </summary>
 private void OnStopAudioClipListRemove(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListRemove(list, m_Ability.StopAudioClipSet, null);
     m_Ability.StopAudioClipSet.AudioClips = (AudioClip[])list.list;
 }
コード例 #8
0
 /// <summary>
 /// Draws the AudioClip element.
 /// </summary>
 private void OnStopAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
 {
     AudioClipSetInspector.OnAudioClipDraw(m_ReorderableStartAudioClipsList, rect, index, m_Ability.StopAudioClipSet, null);
 }
コード例 #9
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnStopAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_Ability.StopAudioClipSet, null);
 }
コード例 #10
0
        /// <summary>
        /// Remove the AudioClip element at the list index.
        /// </summary>
        public static void OnAudioClipListRemove(ReorderableList list, AnimatorAudioStateSet.AnimatorAudioState[] animatorAudioStates, string preferencesKey, UnityEngine.Object target)
        {
            var state = animatorAudioStates[EditorPrefs.GetInt(preferencesKey, 0)];

            AudioClipSetInspector.OnAudioClipListRemove(list, state.AudioClipSet, target);
        }
コード例 #11
0
        /// <summary>
        /// Called when the object should be drawn to the inspector.
        /// </summary>
        /// <param name="target">The object that is being drawn.</param>
        /// <param name="parent">The Unity Object that the object belongs to.</param>
        public override void OnInspectorGUI(object target, Object parent)
        {
            m_Ability = (target as Ability);

            DrawInputFieldsFields(target, parent);

            InspectorUtility.DrawAttributeModifier((parent as Component).GetComponent <AttributeManager>(), (target as Ability).AttributeModifier, "Attribute Name");

            EditorGUILayout.BeginHorizontal();
            InspectorUtility.DrawField(target, "m_State");
            GUI.enabled = !string.IsNullOrEmpty(InspectorUtility.GetFieldValue <string>(target, "m_State"));
            // The InspectorUtility doesn't support a toggle with the text on the right.
            var field = InspectorUtility.GetField(target, "m_StateAppendItemIdentifierName");

            GUILayout.Space(-5);
            var value = EditorGUILayout.ToggleLeft(new GUIContent("Append Item", InspectorUtility.GetFieldTooltip(field)), (bool)field.GetValue(target), GUILayout.Width(110));

            InspectorUtility.SetFieldValue(target, "m_StateAppendItemIdentifierName", value);
            GUI.enabled = true;
            EditorGUILayout.EndHorizontal();
            InspectorUtility.DrawField(target, "m_AbilityIndexParameter");

            DrawInspectorDrawerFields(target, parent);

            if (InspectorUtility.Foldout(target, "Audio"))
            {
                EditorGUI.indentLevel++;
                if (InspectorUtility.Foldout(target, "Start"))
                {
                    EditorGUI.indentLevel++;
                    m_ReorderableStartAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_Ability.StartAudioClipSet, null, m_ReorderableStartAudioClipsList, OnStartAudioClipDraw, OnStartAudioClipListAdd, OnStartAudioClipListRemove);
                    EditorGUI.indentLevel--;
                }
                DrawAudioFields();
                if (InspectorUtility.Foldout(target, "Stop"))
                {
                    EditorGUI.indentLevel++;
                    m_ReorderableStopAudioClipsList = AudioClipSetInspector.DrawAudioClipSet(m_Ability.StopAudioClipSet, null, m_ReorderableStopAudioClipsList, OnStopAudioClipDraw, OnStopAudioClipListAdd, OnStopAudioClipListRemove);
                    EditorGUI.indentLevel--;
                }
                EditorGUI.indentLevel--;
            }

            var startEffectValue    = InspectorUtility.GetFieldValue <string>(target, "m_StartEffectName");
            var newStartEffectValue = InspectorUtility.DrawTypePopup(typeof(UltimateCharacterController.Character.Effects.Effect), startEffectValue, "Start Effect", true);

            if (startEffectValue != newStartEffectValue)
            {
                InspectorUtility.SetFieldValue(target, "m_StartEffectName", newStartEffectValue);
                InspectorUtility.SetDirty(parent);
            }

            if (!string.IsNullOrEmpty(newStartEffectValue))
            {
                EditorGUI.indentLevel++;
                InspectorUtility.DrawField(target, "m_StartEffectIndex");
                EditorGUI.indentLevel--;
            }

            if (InspectorUtility.Foldout(target, "General"))
            {
                EditorGUI.indentLevel++;
                InspectorUtility.DrawField(target, "m_InspectorDescription");
                GUI.enabled = !(target is MoveTowards);
                InspectorUtility.DrawField(target, "m_AllowPositionalInput");
                InspectorUtility.DrawField(target, "m_AllowRotationalInput");
                GUI.enabled = true;
                InspectorUtility.DrawField(target, "m_UseGravity");
                InspectorUtility.DrawField(target, "m_UseRootMotionPosition");
                InspectorUtility.DrawField(target, "m_UseRootMotionRotation");
                InspectorUtility.DrawField(target, "m_DetectHorizontalCollisions");
                InspectorUtility.DrawField(target, "m_DetectVerticalCollisions");
                InspectorUtility.DrawField(target, "m_AnimatorMotion");
                var itemAbilityMoveTowards = (target is MoveTowards) || (target is UltimateCharacterController.Character.Abilities.Items.ItemAbility);
                GUI.enabled = !itemAbilityMoveTowards;
                var inventory = (parent as Component).GetComponent <UltimateCharacterController.Inventory.InventoryBase>();
                if (inventory != null && (parent as Component).GetComponent <UltimateCharacterController.Inventory.ItemSetManagerBase>() != null)
                {
                    var slotCount = inventory.SlotCount;
                    if (InspectorUtility.Foldout(target, "Allow Equipped Items"))
                    {
                        EditorGUI.indentLevel++;
                        var mask    = InspectorUtility.GetFieldValue <int>(target, "m_AllowEquippedSlotsMask");
                        var newMask = 0;
                        for (int i = 0; i < slotCount; ++i)
                        {
                            var enabled = (mask & (1 << i)) == (1 << i);
                            if (EditorGUILayout.Toggle("Slot " + i, enabled))
                            {
                                newMask |= 1 << i;
                            }
                        }
                        // If all of the slots are enabled then use -1.
                        if (newMask == (1 << slotCount) - 1 || itemAbilityMoveTowards)
                        {
                            newMask = -1;
                        }
                        if (mask != newMask)
                        {
                            InspectorUtility.SetFieldValue(target, "m_AllowEquippedSlotsMask", newMask);
                        }
                        InspectorUtility.DrawField(target, "m_AllowItemDefinitions");
                        InspectorUtility.DrawField(target, "m_ImmediateUnequip");
                        InspectorUtility.DrawField(target, "m_ReequipSlots");
                        if (itemAbilityMoveTowards && InspectorUtility.GetFieldValue <bool>(target, "m_ReequipSlots"))
                        {
                            InspectorUtility.SetFieldValue(target, "m_ReequipSlots", false);
                            GUI.changed = true;
                        }
                        EditorGUI.indentLevel--;
                    }
                }
                GUI.enabled = true;
                EditorGUI.indentLevel--;
            }

            if (InspectorUtility.Foldout(target, "UI"))
            {
                EditorGUI.indentLevel++;
                InspectorUtility.DrawField(target, "m_AbilityMessageText");
                InspectorUtility.DrawField(target, "m_AbilityMessageIcon");
                EditorGUI.indentLevel--;
            }
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
        /// <summary>
        /// Draws the AnimatorAudioStateSet.
        /// </summary>
        public static void DrawAnimatorAudioStateSet(UnityEngine.Object target, AnimatorAudioStateSet animatorAudioStateSet, string animatorAudioStateSetFieldName, bool randomDefaultSelector,
                                                     ref ReorderableList reorderableList, ReorderableList.ElementCallbackDelegate drawCallback, ReorderableList.SelectCallbackDelegate selectCallback,
                                                     ReorderableList.AddCallbackDelegate addCallback, ReorderableList.RemoveCallbackDelegate removeCallback, string preferencesKey,
                                                     ref ReorderableList reorderableAudioList, ReorderableList.ElementCallbackDelegate drawAudioElementCallback,
                                                     ReorderableList.AddCallbackDelegate addAudioCallback, ReorderableList.RemoveCallbackDelegate removeAudioCallback,
                                                     ref ReorderableList reorderableStateList, ReorderableList.ElementCallbackDelegate stateDrawElementCallback,
                                                     ReorderableList.AddCallbackDelegate stateAddCallback, ReorderableList.ReorderCallbackDelegate stateReorderCallback,
                                                     ReorderableList.RemoveCallbackDelegate stateRemoveCallback, string statePreferencesKey)
        {
            PopulateAnimatorAudioStateSelectorTypes();
            if (s_SelectorTypeNameCache != null)
            {
                var selected    = 0;
                var forceUpdate = true;
                if (animatorAudioStateSet.AnimatorAudioStateSelectorData != null && !string.IsNullOrEmpty(animatorAudioStateSet.AnimatorAudioStateSelectorData.ObjectType))
                {
                    for (int i = 0; i < s_SelectorTypeCache.Count; ++i)
                    {
                        if (s_SelectorTypeCache[i].FullName == animatorAudioStateSet.AnimatorAudioStateSelectorData.ObjectType)
                        {
                            selected    = i;
                            forceUpdate = false;
                            break;
                        }
                    }
                }
                var newSelected = EditorGUILayout.Popup("Selector", selected, s_SelectorTypeNameCache.ToArray());
                if (newSelected != selected || forceUpdate)
                {
                    // Use the Sequence selector as the default (or recoil in the case of a melee weapon).
                    if (forceUpdate)
                    {
                        for (int i = 0; i < s_SelectorTypeCache.Count; ++i)
                        {
                            if ((randomDefaultSelector && s_SelectorTypeCache[i].FullName == "Opsive.UltimateCharacterController.Items.AnimatorAudioStates.Sequence") ||
                                (!randomDefaultSelector && s_SelectorTypeCache[i].FullName == "Opsive.UltimateCharacterController.Items.AnimatorAudioStates.ConstantRecoil"))
                            {
                                newSelected = i;
                                break;
                            }
                        }
                    }
                    var animatorAudioOutputSelector = Activator.CreateInstance(s_SelectorTypeCache[newSelected]) as AnimatorAudioStateSelector;
                    animatorAudioStateSet.AnimatorAudioStateSelectorData = Serialization.Serialize(animatorAudioOutputSelector);
                    InspectorUtility.SetDirty(target);
                }
            }

            if (animatorAudioStateSet.AnimatorAudioStateSelector != null)
            {
                EditorGUI.indentLevel++;
                InspectorUtility.DrawObject(animatorAudioStateSet.AnimatorAudioStateSelector, false, true, target, false, () => {
                    animatorAudioStateSet.AnimatorAudioStateSelectorData = Serialization.Serialize(animatorAudioStateSet.AnimatorAudioStateSelector);
                    InspectorUtility.SetDirty(target);
                });
                EditorGUI.indentLevel--;
            }

            if (animatorAudioStateSet.States == null || animatorAudioStateSet.States.Length == 0)
            {
                animatorAudioStateSet.States = new AnimatorAudioStateSet.AnimatorAudioState[] { new AnimatorAudioStateSet.AnimatorAudioState() };
            }

            var serializedObject   = new SerializedObject(target);
            var serializedProperty = serializedObject.FindProperty(animatorAudioStateSetFieldName).FindPropertyRelative("m_States");

            if (reorderableList == null)
            {
                reorderableList = new ReorderableList(animatorAudioStateSet.States, typeof(AnimatorAudioStateSet.AnimatorAudioState), false, true, true, animatorAudioStateSet.States.Length > 1);
                reorderableList.drawHeaderCallback  = OnAnimatorAudioStateListHeaderDraw;
                reorderableList.drawElementCallback = drawCallback;
                reorderableList.onSelectCallback    = selectCallback;
                reorderableList.onAddCallback       = addCallback;
                reorderableList.onRemoveCallback    = removeCallback;
                reorderableList.serializedProperty  = serializedProperty;
                if (EditorPrefs.GetInt(preferencesKey, -1) != -1)
                {
                    reorderableList.index = EditorPrefs.GetInt(preferencesKey, -1);
                }
            }

            // ReorderableLists do not like indentation.
            var indentLevel = EditorGUI.indentLevel;

            while (EditorGUI.indentLevel > 0)
            {
                EditorGUI.indentLevel--;
            }

            var listRect = GUILayoutUtility.GetRect(0, reorderableList.GetHeight());

            // Indent the list so it lines up with the rest of the content.
            listRect.x    += InspectorUtility.IndentWidth * indentLevel;
            listRect.xMax -= InspectorUtility.IndentWidth * indentLevel;
            EditorGUI.BeginChangeCheck();
            var prevPref = EditorPrefs.GetInt(preferencesKey, 0);

            reorderableList.DoList(listRect);
            while (EditorGUI.indentLevel < indentLevel)
            {
                EditorGUI.indentLevel++;
            }
            if (EditorGUI.EndChangeCheck() || prevPref != EditorPrefs.GetInt(preferencesKey, 0))
            {
                reorderableList      = null;
                reorderableAudioList = null;
                reorderableStateList = null;
                return;
            }

            if (EditorPrefs.GetInt(preferencesKey, 0) >= animatorAudioStateSet.States.Length)
            {
                EditorPrefs.SetInt(preferencesKey, 0);
            }

            serializedProperty = serializedProperty.GetArrayElementAtIndex(EditorPrefs.GetInt(preferencesKey, 0));
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(serializedProperty.FindPropertyRelative("m_AllowDuringMovement"));
            EditorGUILayout.PropertyField(serializedProperty.FindPropertyRelative("m_RequireGrounded"));
            EditorGUILayout.PropertyField(serializedProperty.FindPropertyRelative("m_StateName"));
            EditorGUILayout.PropertyField(serializedProperty.FindPropertyRelative("m_ItemSubstateIndex"));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
            }

            var animatorAudioState = animatorAudioStateSet.States[EditorPrefs.GetInt(preferencesKey, 0)];

            AudioClipSetInspector.DrawAudioClipSet(animatorAudioState.AudioClipSet, serializedProperty.FindPropertyRelative("m_AudioClipSet"), ref reorderableAudioList, drawAudioElementCallback, addAudioCallback, removeAudioCallback);
            if (InspectorUtility.Foldout(animatorAudioState, new GUIContent("States"), false))
            {
                EditorGUI.indentLevel--;
                // The MovementType class derives from system.object at the base level and reorderable lists can only operate on Unity objects. To get around this restriction
                // create a dummy array within a Unity object that corresponds to the number of elements within the ability's state list. When the reorderable list is drawn
                // the ability object will be used so it's like the dummy object never existed.
                var gameObject       = new GameObject();
                var stateIndexHelper = gameObject.AddComponent <StateInspectorHelper>();
                stateIndexHelper.StateIndexData = new int[animatorAudioState.States.Length];
                for (int i = 0; i < stateIndexHelper.StateIndexData.Length; ++i)
                {
                    stateIndexHelper.StateIndexData[i] = i;
                }
                var stateIndexSerializedObject = new SerializedObject(stateIndexHelper);
                reorderableStateList = StateInspector.DrawStates(reorderableStateList, new SerializedObject(target), stateIndexSerializedObject.FindProperty("m_StateIndexData"),
                                                                 statePreferencesKey, stateDrawElementCallback, stateAddCallback,
                                                                 stateReorderCallback, stateRemoveCallback);
                GameObject.DestroyImmediate(gameObject);
                EditorGUI.indentLevel++;
            }
            GUILayout.Space(5);
        }
コード例 #14
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnTakeDamageAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_Health.TakeDamageAudioClipSet, null);
 }
コード例 #15
0
 /// <summary>
 /// Remove the AudioClip element at the list index.
 /// </summary>
 private void OnDeathAudioClipListRemove(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListRemove(list, m_Health.DeathAudioClipSet, null);
     m_Health.DeathAudioClipSet.AudioClips = (AudioClip[])list.list;
 }
コード例 #16
0
 /// <summary>
 /// Remove the AudioClip element at the list index.
 /// </summary>
 private void OnExplosionAudioClipListRemove(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListRemove(list, m_Explosion.ExplosionAudioClipSet, null);
     m_Explosion.ExplosionAudioClipSet.AudioClips = (AudioClip[])list.list;
 }
コード例 #17
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_PlayAudioClip.AudioClipSet, null);
 }
コード例 #18
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnExplosionAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_Explosion.ExplosionAudioClipSet, null);
 }
コード例 #19
0
 /// <summary>
 /// Draws the AudioClip element.
 /// </summary>
 private void OnExplosionAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
 {
     AudioClipSetInspector.OnAudioClipDraw(m_ReorderableExplosionAudioClipsList, rect, index, m_Explosion.ExplosionAudioClipSet, null);
 }
コード例 #20
0
 /// <summary>
 /// Remove the AudioClip element at the list index.
 /// </summary>
 private void OnReloadCompleteAudioClipListRemove(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListRemove(list, m_ShootableWeapon.ReloadCompleteAudioClipSet, null);
 }
コード例 #21
0
 /// <summary>
 /// Draws the AudioClip element.
 /// </summary>
 private void OnChargeAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
 {
     AudioClipSetInspector.OnAudioClipDraw(m_ReorderableChargeAudioClipsList, rect, index, m_ShootableWeapon.ChargeAudioClipSet, null);
 }
コード例 #22
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnDryFireAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_ShootableWeapon.DryFireAudioClipSet, null);
 }
コード例 #23
0
 /// <summary>
 /// Draws the AudioClip element.
 /// </summary>
 private void OnAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
 {
     AudioClipSetInspector.OnAudioClipDraw(m_AudioClipsList, rect, index, m_PlayAudioClip.AudioClipSet, null);
 }
コード例 #24
0
 /// <summary>
 /// Remove the AudioClip element at the list index.
 /// </summary>
 private void OnChargeAudioClipListRemove(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListRemove(list, m_ShootableWeapon.ChargeAudioClipSet, null);
 }
コード例 #25
0
 /// <summary>
 /// Draws the AudioClip element.
 /// </summary>
 private void OnDeathAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
 {
     AudioClipSetInspector.OnAudioClipDraw(m_ReorderableDeathAudioClipsList, rect, index, m_Health.DeathAudioClipSet, null);
 }
コード例 #26
0
 /// <summary>
 /// Draws the AudioClip element.
 /// </summary>
 private void OnPickupAudioClipDraw(Rect rect, int index, bool isActive, bool isFocused)
 {
     AudioClipSetInspector.OnAudioClipDraw(m_ReorderablePickupAudioClipsList, rect, index, m_ObjectPickup.PickupAudioClipSet, null);
 }
コード例 #27
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnDeathAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_Health.DeathAudioClipSet, null);
 }
コード例 #28
0
 /// <summary>
 /// Adds a new AudioClip element to the AudioClipSet.
 /// </summary>
 private void OnPickupAudioClipListAdd(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListAdd(list, m_ObjectPickup.PickupAudioClipSet, null);
 }
コード例 #29
0
        /// <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_Invincible"));
                EditorGUILayout.PropertyField(PropertyFromName("m_TimeInvincibleAfterSpawn"));

                // The names will be retrieved by the Attribute Manager.
                var attributeNames = new string[m_AttributeManager.Attributes.Length + 1];
                attributeNames[0] = "(None)";
                var healthNameIndex = 0;
                var shieldNameIndex = 0;
                for (int i = 0; i < m_AttributeManager.Attributes.Length; ++i)
                {
                    attributeNames[i + 1] = m_AttributeManager.Attributes[i].Name;
                    if (m_Health.HealthAttributeName == attributeNames[i + 1])
                    {
                        healthNameIndex = i + 1;
                    }
                    if (m_Health.ShieldAttributeName == attributeNames[i + 1])
                    {
                        shieldNameIndex = i + 1;
                    }
                }

                var selectedHealthNameIndex = EditorGUILayout.Popup("Health Attribute", healthNameIndex, attributeNames);
                if (healthNameIndex != selectedHealthNameIndex)
                {
                    m_Health.HealthAttributeName = (selectedHealthNameIndex == 0 ? string.Empty : m_AttributeManager.Attributes[selectedHealthNameIndex - 1].Name);
                    InspectorUtility.SetDirty(target);
                }
                // Show the current health value.
                if (Application.isPlaying && !string.IsNullOrEmpty(m_Health.HealthAttributeName) && selectedHealthNameIndex > 0 && selectedHealthNameIndex - 1 < m_AttributeManager.Attributes.Length)
                {
                    EditorGUI.indentLevel++;
                    GUI.enabled = false;
                    EditorGUILayout.TextField("Value", m_AttributeManager.Attributes[selectedHealthNameIndex - 1].Value.ToString());
                    GUI.enabled = true;
                    EditorGUI.indentLevel--;
                }

                var selectedShieldNameIndex = EditorGUILayout.Popup("Shield Attribute", shieldNameIndex, attributeNames);
                if (shieldNameIndex != selectedShieldNameIndex)
                {
                    m_Health.ShieldAttributeName = (selectedShieldNameIndex == 0 ? string.Empty : m_AttributeManager.Attributes[selectedShieldNameIndex - 1].Name);
                    InspectorUtility.SetDirty(target);
                }
                // Show the current shield value.
                if (Application.isPlaying && !string.IsNullOrEmpty(m_Health.ShieldAttributeName) && selectedShieldNameIndex > 0 && selectedShieldNameIndex - 1 < m_AttributeManager.Attributes.Length)
                {
                    EditorGUI.indentLevel++;
                    GUI.enabled = false;
                    EditorGUILayout.TextField("Value", m_AttributeManager.Attributes[selectedShieldNameIndex - 1].Value.ToString());
                    GUI.enabled = true;
                    EditorGUI.indentLevel--;
                }

                if (Foldout("Hitboxes"))
                {
                    EditorGUI.indentLevel++;
                    HitboxInspector.DrawHitbox(ref m_ReorderableHitboxList, serializedObject, PropertyFromName("m_Hitboxes"), OnHitboxElementDraw);
                    EditorGUILayout.PropertyField(PropertyFromName("m_MaxHitboxCollisionCount"));
                    EditorGUI.indentLevel--;
                }

                var healthCallback = GetHealthDrawCallback();
                if (healthCallback != null)
                {
                    healthCallback();
                }

                if (Foldout("Audio"))
                {
                    EditorGUI.indentLevel++;
                    if (InspectorUtility.Foldout(target, "Take Damage"))
                    {
                        EditorGUI.indentLevel++;
                        AudioClipSetInspector.DrawAudioClipSet(m_Health.TakeDamageAudioClipSet, PropertyFromName("m_TakeDamageAudioClipSet"), ref m_ReorderableTakeDamageAudioClipsList, OnTakeDamageAudioClipDraw, OnTakeDamageAudioClipListAdd, OnTakeDamageAudioClipListRemove);
                        EditorGUI.indentLevel--;
                    }
                    if (InspectorUtility.Foldout(target, "Heal"))
                    {
                        EditorGUI.indentLevel++;
                        AudioClipSetInspector.DrawAudioClipSet(m_Health.HealAudioClipSet, PropertyFromName("m_HealAudioClipSet"), ref m_ReorderableHealAudioClipsList, OnHealAudioClipDraw, OnHealAudioClipListAdd, OnHealAudioClipListRemove);
                        EditorGUI.indentLevel--;
                    }
                    if (InspectorUtility.Foldout(target, "Death"))
                    {
                        EditorGUI.indentLevel++;
                        AudioClipSetInspector.DrawAudioClipSet(m_Health.DeathAudioClipSet, PropertyFromName("m_DeathAudioClipSet"), ref m_ReorderableDeathAudioClipsList, OnDeathAudioClipDraw, OnDeathAudioClipListAdd, OnDeathAudioClipListRemove);
                        EditorGUI.indentLevel--;
                    }
                    EditorGUI.indentLevel--;
                }

                if (Foldout("Death"))
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(PropertyFromName("m_SpawnedObjectsOnDeath"), true);
                    EditorGUILayout.PropertyField(PropertyFromName("m_DestroyedObjectsOnDeath"), true);
                    var deactivateOnDeath = PropertyFromName("m_DeactivateOnDeath");
                    EditorGUILayout.PropertyField(deactivateOnDeath);
                    if (deactivateOnDeath.boolValue)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(PropertyFromName("m_DeactivateOnDeathDelay"));
                        EditorGUI.indentLevel--;
                    }
                    var deathLayerProperty = PropertyFromName("m_DeathLayer");
                    deathLayerProperty.intValue = EditorGUILayout.LayerField("Death Layer", deathLayerProperty.intValue);
                    EditorGUI.indentLevel--;
                }

                if (Foldout("Events"))
                {
                    EditorGUI.indentLevel++;
                    InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnDamageEvent"));
                    InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnHealEvent"));
                    InspectorUtility.UnityEventPropertyField(PropertyFromName("m_OnDeathEvent"));
                    EditorGUI.indentLevel--;
                }
            };

            return(baseCallback);
        }
コード例 #30
0
 /// <summary>
 /// Remove the AudioClip element at the list index.
 /// </summary>
 private void OnPickupAudioClipListRemove(ReorderableList list)
 {
     AudioClipSetInspector.OnAudioClipListRemove(list, m_ObjectPickup.PickupAudioClipSet, null);
     m_ObjectPickup.PickupAudioClipSet.AudioClips = (AudioClip[])list.list;
 }