Пример #1
0
        private static void DrawProperties()
        {
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(5);
            GUILayout.Label("Base Options", UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(5);
            if (properties != null)
            {
                properties.SetAIType((AIProperties.AIType)EditorGUILayout.EnumPopup(ContentProperties.Type, properties.GetAIType()));
                properties.SetName(EditorGUILayout.DelayedTextField(ContentProperties.Name, properties.GetName()));
                if (properties.GetName() == "")
                {
                    properties.SetDefaultName();
                }
                properties.SetModel((GameObject)EditorGUILayout.ObjectField(ContentProperties.Model, properties.GetModel(), typeof(GameObject), true));
                if (properties.GetModel() == null)
                {
                    UEditorHelpBoxMessages.Error("AI model cannot be empty!", "Add AI model.");
                }
                properties.SetController((AnimatorController)EditorGUILayout.ObjectField(ContentProperties.Controller, properties.GetController(), typeof(AnimatorController), true));
                properties.DefaultPreset(EditorGUILayout.Toggle(ContentProperties.DefaultPreset, properties.DefaultPreset()));

                if (properties.DefaultPreset())
                {
                    properties.SetDefaultPreset();
                }

                EditorGUI.BeginDisabledGroup(properties.DefaultPreset());
                LayerMask targetMask = EditorGUILayout.MaskField(ContentProperties.Tagrets, InternalEditorUtility.LayerMaskToConcatenatedLayersMask(properties.GetTargets()), InternalEditorUtility.layers);
                properties.SetTargets(InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(targetMask));
                LayerMask obstacleMask = EditorGUILayout.MaskField(ContentProperties.Obstacles, InternalEditorUtility.LayerMaskToConcatenatedLayersMask(properties.GetObstacles()), InternalEditorUtility.layers);
                properties.SetObstacles(InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(obstacleMask));
                EditorGUI.EndDisabledGroup();

                GUILayout.Space(5);
                UEditor.HorizontalLine();
                GUILayout.Space(5);
                EditorGUI.BeginDisabledGroup(!properties.GetModel());
                if (UEditor.Button("Create", "Right", GUILayout.Width(70)))
                {
                    _AI = CreateAI(properties);
                }
                if (_AI != null && delay.WaitForSeconds())
                {
                    if (UDisplayDialogs.Message("Create Successful", "AI was created on scene!\nSetup AI components before start play.", "Select", "Ok"))
                    {
                        Selection.activeGameObject = _AI;
                    }
                    _AI = null;
                }
                EditorGUI.EndDisabledGroup();
            }
            else
            {
                UEditorHelpBoxMessages.Error("Properties not loaded...", "Try to reload UProject Manager window.", true);
            }
            GUILayout.Space(5);
            GUILayout.EndVertical();
        }
Пример #2
0
        private static void PhysicsBulletGUI()
        {
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(5);
            GUILayout.Label(ContentProperties.BaseOptions, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);

            physicsBulletProperties.SetBulletType((PhysicsBullet.BulletType)EditorGUILayout.EnumPopup(ContentProperties.BulletType, physicsBulletProperties.GetBulletType()));
            physicsBulletProperties.SetBullet(UEditor.ObjectField <GameObject>(new GUIContent("Bullet", "Bullet gameobject."), physicsBulletProperties.GetBullet(), true));
            if (physicsBulletProperties.GetBullet() == null)
            {
                UEditorHelpBoxMessages.Error("Bullet object cannot be empty!", "Add bullet gameobject.");
            }
            physicsBulletProperties.SetModel(EditorGUILayout.TextField(ContentProperties.Model, physicsBulletProperties.GetModel()));
            physicsBulletProperties.SetDamage(EditorGUILayout.IntField(ContentProperties.Damage, physicsBulletProperties.GetDamage()));
            physicsBulletProperties.SetDelay(EditorGUILayout.FloatField(ContentProperties.Delay, physicsBulletProperties.GetDelay()));

            if (physicsBulletProperties.GetBulletType() == PhysicsBullet.BulletType.Standard)
            {
                physicsBulletProperties.SetVariance(EditorGUILayout.FloatField(ContentProperties.Variance, physicsBulletProperties.GetVariance()));
                physicsBulletProperties.SetNumberBullet(EditorGUILayout.IntField(ContentProperties.NumberBullet, physicsBulletProperties.GetNumberBullet()));
            }
            else if (physicsBulletProperties.GetBulletType() == PhysicsBullet.BulletType.Rocket)
            {
                physicsBulletProperties.SetExplosionRadius(EditorGUILayout.FloatField(ContentProperties.B_ExplosionRadius, physicsBulletProperties.GetExplosionRadius()));
                physicsBulletProperties.SetExplosionPower(EditorGUILayout.FloatField(ContentProperties.B_ExplosionPower, physicsBulletProperties.GetExplosionPower()));
                physicsBulletProperties.SetExplosionEffect(UEditor.ObjectField <ParticleSystem>(ContentProperties.B_ExplosionEffect, physicsBulletProperties.GetExplosionEffect(), true));
                physicsBulletProperties.SetExplosionSound(UEditor.ObjectField <AudioClip>(ContentProperties.ExplosionSound, physicsBulletProperties.GetExplosionSound(), true));
            }
            physicsBulletProperties.SetDecalProperties(UEditor.ObjectField <DecalProperties>(ContentProperties.DecalProperties, physicsBulletProperties.GetDecalProperties(), false));

            GUILayout.Space(5);
            UEditor.HorizontalLine();
            GUILayout.Space(5);

            EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(physicsBulletProperties.GetModel()) || physicsBulletProperties.GetBullet() == null);
            if (UEditor.Button("Create", "Right", GUILayout.Width(70)))
            {
                createdObject = CreatePhysicsBullet(physicsBulletProperties);
            }
            EditorGUI.EndDisabledGroup();

            if (createdObject != null && editorDelay.WaitForSeconds())
            {
                if (UDisplayDialogs.Message("Create Successful", "Physics bullet was created on scene!\nSetup bullet components before start play.", "Select", "Ok"))
                {
                    Selection.activeGameObject = createdObject;
                }
                createdObject = null;
            }
            GUILayout.Space(5);
            GUILayout.EndVertical();
        }
        private static void DrawFPWeaponGUI()
        {
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(5);
            GUILayout.Label(ContentProperties.BaseOptions, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            properties.SetName(EditorGUILayout.TextField(ContentProperties.WeaponName, properties.GetName()));
            properties.SetWeaponType((WeaponProperties.Type)EditorGUILayout.EnumPopup(ContentProperties.WeaponType, properties.GetWeaponType()));
            properties.SetWeapon(UEditor.ObjectField <GameObject>(ContentProperties.WeaponObject, properties.GetWeapon(), true));
            if (properties.GetWeapon() == null)
            {
                UEditorHelpBoxMessages.Error("Weapon model cannot be empty!", "Add weapon model.");
            }

            properties.SetWeaponID(UEditor.ObjectField <WeaponID>(ContentProperties.WeaponID, properties.GetWeaponID(), true));

            properties.SetController(UEditor.ObjectField <RuntimeAnimatorController>(ContentProperties.WeaponAnimator, properties.GetController(), false));
            GUILayout.Space(10);
            additionalComponentsRL.DoLayoutList();

            GUILayout.Space(5);
            UEditor.HorizontalLine();
            GUILayout.Space(5);

            EditorGUI.BeginDisabledGroup(!properties.NameIsValid() || properties.GetWeapon() == null);
            if (UEditor.Button("Create", "Right", GUILayout.Width(70)))
            {
                weapon = CreateFPWeapon(properties);
            }
            EditorGUI.EndDisabledGroup();

            if (weapon != null && delay.WaitForSeconds())
            {
                if (UDisplayDialogs.Message("Create Successful", "Weapon was created on scene!\nSetup weapon components before start play.", "Select", "Ok"))
                {
                    Selection.activeGameObject = weapon;
                }
                weapon = null;
            }

            GUILayout.Space(5);
            GUILayout.EndVertical();
        }
Пример #4
0
        private static void GrenadeGUI()
        {
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(5);
            GUILayout.Label(ContentProperties.BaseOptions, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            grenadeProperties.SetGrenadeObject((GameObject)EditorGUILayout.ObjectField(new GUIContent("Grenade", "Grenade gameobject."), grenadeProperties.GetGrenadeObject(), typeof(GameObject), true));
            if (grenadeProperties.GetGrenadeObject() == null)
            {
                UEditorHelpBoxMessages.Error("Grenade object cannot be empty!", "Add grenade gameobject.");
            }
            grenadeProperties.SetModel(EditorGUILayout.TextField(ContentProperties.Model, grenadeProperties.GetModel()));
            grenadeProperties.SetRadius(EditorGUILayout.FloatField(ContentProperties.G_ExplosionRadius, grenadeProperties.GetRadius()));
            grenadeProperties.SetDelay(EditorGUILayout.FloatField(ContentProperties.Delay, grenadeProperties.GetDelay()));
            grenadeProperties.SetExplosionEffect((ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.G_ExplosionEffect, grenadeProperties.GetExplosionEffect(), typeof(ParticleSystem), true));
            grenadeProperties.SetExplosionSound((AudioClip)EditorGUILayout.ObjectField(ContentProperties.ExplosionSound, grenadeProperties.GetExplosionSound(), typeof(AudioClip), true));
            grenadeProperties.SetExplosionProperties((ExplosionProperties)EditorGUILayout.ObjectField(ContentProperties.ExplosionProperties, grenadeProperties.GetExplosionProperties(), typeof(ExplosionProperties), true));
            grenadeProperties.SetDecalProperties((DecalProperties)EditorGUILayout.ObjectField(ContentProperties.DecalProperties, grenadeProperties.GetDecalProperties(), typeof(DecalProperties), true));

            GUILayout.Space(5);
            UEditor.HorizontalLine();
            GUILayout.Space(5);

            EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(grenadeProperties.GetModel()) || grenadeProperties.GetGrenadeObject() == null);
            if (UEditor.Button("Create", "Right", GUILayout.Width(70)))
            {
                createdObject = CreateGreanade(grenadeProperties);
            }
            EditorGUI.EndDisabledGroup();

            if (createdObject != null && editorDelay.WaitForSeconds())
            {
                if (UDisplayDialogs.Message("Create Successful", "Greanade was created on scene!\nSetup grenade components before start play.", "Select", "Ok"))
                {
                    Selection.activeGameObject = createdObject;
                }
                createdObject = null;
            }
            GUILayout.Space(5);

            GUILayout.EndVertical();
        }
        public override void BaseGUI()
        {
            BeginBox();
            GUILayout.Label(ContentProperties.ShootProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            instance.SetFirePoint((Transform)EditorGUILayout.ObjectField(ContentProperties.ShootPoint, instance.GetFirePoint(), typeof(Transform), true));
            instance.SetBullet((RayBullet)EditorGUILayout.ObjectField(ContentProperties.RayBullet, instance.GetBullet(), typeof(RayBullet), false));
            instance.SetRange(EditorGUILayout.FloatField(ContentProperties.ShootRange, instance.GetRange()));
            instance.SetImpulse(EditorGUILayout.FloatField(ContentProperties.ShootImpulse, instance.GetImpulse()));
            instance.SetDelay(EditorGUILayout.FloatField(ContentProperties.Delay, instance.GetDelay()));

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.FireEffectProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            if (instance.GetMuzzleFlash() != null)
            {
                instance.SetMuzzleFlash((ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.MuzzleFlash, instance.GetMuzzleFlash(), typeof(ParticleSystem), true));
            }
            else
            {
                GUILayout.BeginHorizontal();
                instance.SetMuzzleFlash((ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.MuzzleFlash, instance.GetMuzzleFlash(), typeof(ParticleSystem), true));
                if (SearchButton())
                {
                    ParticleSystem muzzleFlash = UEditorInternal.FindMuzzleFlash(instance.transform);
                    if (muzzleFlash != null)
                    {
                        instance.SetMuzzleFlash(muzzleFlash);
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Muzzle Flash not found, try find it manually.");
                    }
                }
                GUILayout.EndHorizontal();
                UEditorHelpBoxMessages.Tip("Muzzle flash is empty!", "Muzzle flash won't play.");
            }

            if (instance.GetCartridgeEjection() != null)
            {
                instance.SetCartridgeEjection((ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.CartridgeEjection, instance.GetCartridgeEjection(), typeof(ParticleSystem), true));
            }
            else
            {
                GUILayout.BeginHorizontal();
                instance.SetCartridgeEjection((ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.CartridgeEjection, instance.GetCartridgeEjection(), typeof(ParticleSystem), true));
                if (SearchButton())
                {
                    ParticleSystem cartridgeEjection = UEditorInternal.FindCartridgeEjection(instance.transform);
                    if (cartridgeEjection != null)
                    {
                        instance.SetCartridgeEjection(cartridgeEjection);
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Cartridge Ejection not found, try find it manually.");
                    }
                }
                GUILayout.EndHorizontal();
                UEditorHelpBoxMessages.Tip("Cartridge ejection is empty!", "Cartridge ejection won't play.");
            }

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.SoundProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            IncreaseIndentLevel();
            BeginSubBox();
            GUILayout.Space(3);
            shootSoundsFoldout = EditorGUILayout.Foldout(shootSoundsFoldout, ContentProperties.ShootSound, true);
            if (shootSoundsFoldout)
            {
                if (instance.GetFireSounds() == null || instance.GetFireSounds().Length == 0)
                {
                    UEditorHelpBoxMessages.Tip("Fire sounds is empty!", "Add new fire sound by click on [Add] button.", true);
                }
                else
                {
                    for (int i = 0; i < instance.GetFireSounds().Length; i++)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Space(3);
                        GUILayout.Label("Clip " + (i + 1), GUILayout.Width(35));
                        instance.SetFireSound(i, (AudioClip)EditorGUILayout.ObjectField(instance.GetFireSound(i), typeof(AudioClip), true));
                        if (GUILayout.Button("", GUI.skin.GetStyle("OL Minus"), GUILayout.Width(20)))
                        {
                            fireSounds.DeleteArrayElementAtIndex(i);
                        }
                        GUILayout.Space(3);
                        GUILayout.EndHorizontal();
                    }
                }
                GUILayout.Space(3);
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button(" Add "))
                {
                    fireSounds.arraySize++;
                }
                GUILayout.Space(3);
                GUILayout.EndHorizontal();
                GUILayout.Space(5);
            }
            GUILayout.Space(3);
            EndSubBox();
            DecreaseIndentLevel();
            EndBox();
        }
        private static void DrawPickableWeaponGUI()
        {
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(5);
            GUILayout.Label(ContentProperties.BaseOptions, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);

            properties.SetName(EditorGUILayout.TextField(ContentProperties.Name, properties.GetName()));
            properties.SetProcessingType((PickableItem.PickupType)EditorGUILayout.EnumPopup(ContentProperties.PickupType, properties.GetProcessingType()));
            properties.SetObjectType((PickableItem.ItemType)EditorGUILayout.EnumPopup(ContentProperties.ObjecftType, properties.GetObjectType()));

            if (properties.GetProcessingType() == PickableItem.PickupType.ByKey)
            {
                properties.SetPickUpKey((KeyCode)EditorGUILayout.EnumPopup(ContentProperties.PickupKey, properties.GetPickUpKey()));
            }

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.ItemProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            properties.SetClearWeapon(UEditor.ObjectField <GameObject>(ContentProperties.Item, properties.GetClearWeapon(), true));
            if (properties.GetClearWeapon() == null)
            {
                UEditorHelpBoxMessages.Error("Item cannot be empty!", "Add item game object!");
            }
            switch (properties.GetObjectType())
            {
            case PickableItem.ItemType.Weapon:
                properties.SetWeaponID(UEditor.ObjectField <WeaponID>(ContentProperties.Weapon, properties.GetWeaponID(), true));
                properties.AutoActivate(EditorGUILayout.Toggle(ContentProperties.AutoActivate, properties.AutoActivate()));
                break;

            case PickableItem.ItemType.Ammo:
                properties.SetWeaponID(UEditor.ObjectField <WeaponID>(new GUIContent("Target Weapon", "Target weapon for ammo."), properties.GetWeaponID(), true));
                properties.SetValue(EditorGUILayout.IntField(new GUIContent("Bullets", "How many bullet add in weapon ammo."), properties.GetValue()));
                break;

            case PickableItem.ItemType.HealthBox:
                properties.SetValue(EditorGUILayout.IntField(new GUIContent("Health Point", "How many health point add in target."), properties.GetValue()));
                break;
            }
            if (!properties.DestroyAfterUse())
            {
                float refReusableDelay = properties.GetReusableDelay();
                bool  refIsReusable    = properties.IsReusable();
                UEditor.HiddenFloatField(ContentProperties.ReusableDelay, ContentProperties.IsReusable, ref refReusableDelay, ref refIsReusable);
                properties.SetReusableDelay(refReusableDelay);
                properties.IsReusable(refIsReusable);
            }
            else
            {
                EditorGUI.BeginDisabledGroup(true);
                properties.IsReusable(EditorGUILayout.Toggle(ContentProperties.IsReusable, false));
                EditorGUI.EndDisabledGroup();
            }

            if (!properties.IsReusable())
            {
                properties.DestroyAfterUse(EditorGUILayout.Toggle(ContentProperties.DestroyAfterUse, properties.DestroyAfterUse()));
            }
            else
            {
                EditorGUI.BeginDisabledGroup(true);
                properties.DestroyAfterUse(EditorGUILayout.Toggle(ContentProperties.DestroyAfterUse, false));
                EditorGUI.EndDisabledGroup();
            }

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.UI, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);

            if (properties.GetWeaponID() != null)
            {
                GUILayout.BeginHorizontal();
                properties.SetPickUpMessage(EditorGUILayout.TextField(ContentProperties.PickUpMessage, properties.GetPickUpMessage()));
                if (UEditor.GenerateButton())
                {
                    properties.SetPickUpMessage("HOLD [{0}] TO PICKUP \"{1}\"");
                }
                GUILayout.EndHorizontal();
            }
            else
            {
                properties.SetPickUpMessage(EditorGUILayout.TextField(ContentProperties.PickUpMessage, properties.GetPickUpMessage()));
            }

            if (properties.GetWeapon() != null)
            {
                GUILayout.BeginHorizontal();
                properties.SetReplaceMessage(EditorGUILayout.TextField(ContentProperties.ReplaceMessage, properties.GetReplaceMessage()));
                if (UEditor.GenerateButton())
                {
                    properties.SetPickUpMessage("HOLD [{0}] TO CHANGE \"{1}\"");
                }
                GUILayout.EndHorizontal();
            }
            else
            {
                properties.SetReplaceMessage(EditorGUILayout.TextField(ContentProperties.ReplaceMessage, properties.GetReplaceMessage()));
            }

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.Effects, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            AudioClip se = properties.GetSoundEffect();

            UEditor.ObjectHiddenField <AudioClip>(ContentProperties.P_SoundEffect, ContentProperties.P_SoundEffect, ref se, ref useSoundEffect);
            properties.SetSoundEffect(useSoundEffect ? se : null);

            GUILayout.Space(5);
            UEditor.HorizontalLine();
            GUILayout.Space(5);

            EditorGUI.BeginDisabledGroup(!properties.NameIsValid() || properties.GetClearWeapon() == null);
            if (UEditor.Button("Create", "Right", GUILayout.Width(70)))
            {
                weapon = CreatePickableWeapon(properties);
            }
            EditorGUI.EndDisabledGroup();

            if (weapon != null && delay.WaitForSeconds())
            {
                if (UDisplayDialogs.Message("Create Successful", "Pickable weapon was created on scene!\nSetup weapon components before start play.", "Select", "Ok"))
                {
                    Selection.activeGameObject = weapon;
                }
                weapon = null;
            }

            GUILayout.Space(5);
            GUILayout.EndVertical();
        }
Пример #7
0
        public override void BaseGUI()
        {
            BeginBox();
            GUILayout.Label(ContentProperties.ShootProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            instance.SetMode((WeaponShootingSystem.Mode)EditorGUILayout.EnumPopup(ContentProperties.ShootingMode, instance.GetMode()));
            instance.SetBulletType((WeaponShootingSystem.BulletType)EditorGUILayout.EnumPopup(ContentProperties.BulletType, instance.GetBulletType()));
            instance.SetFirePoint((Transform)EditorGUILayout.ObjectField(ContentProperties.ShootPoint, instance.GetFirePoint(), typeof(Transform), true));
            switch (instance.GetBulletType())
            {
            case WeaponShootingSystem.BulletType.RayBullet:
                instance.SetRayBullet((RayBullet)EditorGUILayout.ObjectField(ContentProperties.RayBullet, instance.GetRayBullet(), typeof(RayBullet), false));
                instance.SetFireRange(EditorGUILayout.FloatField(ContentProperties.ShootRange, instance.GetFireRange()));
                break;

            case WeaponShootingSystem.BulletType.PhysicsBullet:
                instance.SetPhysicsBullet((PhysicsBullet)EditorGUILayout.ObjectField(ContentProperties.BulletType, instance.GetPhysicsBullet(), typeof(PhysicsBullet), true));
                break;
            }
            instance.SetFireImpulse(EditorGUILayout.FloatField(ContentProperties.ShootImpulse, instance.GetFireImpulse()));
            instance.SetDelay(EditorGUILayout.FloatField(ContentProperties.Delay, instance.GetDelay()));

            if (instance.GetMode() == WeaponShootingSystem.Mode.Queue)
            {
                instance.SetFixedQueueCount(EditorGUILayout.IntField(ContentProperties.FixedQueueCount, instance.GetFixedQueueCount()));
            }

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.FireEffectProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            WeaponShootingSystem.FireEffectProperties fireEffectProperties = instance.GetFireEffects();
            if (fireEffectProperties.muzzleFlash != null)
            {
                fireEffectProperties.muzzleFlash = (ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.MuzzleFlash, fireEffectProperties.muzzleFlash, typeof(ParticleSystem), true);
            }
            else
            {
                GUILayout.BeginHorizontal();
                fireEffectProperties.muzzleFlash = (ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.MuzzleFlash, fireEffectProperties.muzzleFlash, typeof(ParticleSystem), true);
                if (SearchButton())
                {
                    ParticleSystem muzzleFlash = UEditorInternal.FindMuzzleFlash(instance.transform);
                    if (muzzleFlash != null)
                    {
                        fireEffectProperties.muzzleFlash = muzzleFlash;
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Muzzle Flash not found, try find it manually.");
                    }
                }
                GUILayout.EndHorizontal();
            }

            if (fireEffectProperties.cartridgeEjection != null)
            {
                fireEffectProperties.cartridgeEjection = (ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.CartridgeEjection, fireEffectProperties.cartridgeEjection, typeof(ParticleSystem), true);
            }
            else
            {
                GUILayout.BeginHorizontal();
                fireEffectProperties.cartridgeEjection = (ParticleSystem)EditorGUILayout.ObjectField(ContentProperties.CartridgeEjection, fireEffectProperties.cartridgeEjection, typeof(ParticleSystem), true);
                if (SearchButton())
                {
                    ParticleSystem cartridgeEjection = UEditorInternal.FindCartridgeEjection(instance.transform);
                    if (cartridgeEjection != null)
                    {
                        fireEffectProperties.cartridgeEjection = cartridgeEjection;
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Cartridge Ejection not found, try find it manually.");
                    }
                }
                GUILayout.EndHorizontal();
            }
            instance.SetFireEffects(fireEffectProperties);


            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.SoundProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            BeginSubBox();
            GUILayout.Space(3);
            IncreaseIndentLevel();
            shootSoundsFoldout = EditorGUILayout.Foldout(shootSoundsFoldout, ContentProperties.ShootSound, true);
            if (shootSoundsFoldout)
            {
                if (instance.GetSoundProperties().GetFireSounds() == null || instance.GetSoundProperties().GetFireSoundsCount() == 0)
                {
                    UEditorHelpBoxMessages.Tip("Fire sounds is empty!", "Add new fire sound by click on [Add] button.", true);
                }
                else
                {
                    for (int i = 0; i < instance.GetSoundProperties().GetFireSoundsCount(); i++)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Space(3);
                        GUILayout.Label("Clip " + (i + 1), GUILayout.Width(35));
                        instance.GetSoundProperties().SetFireSound(i, (AudioClip)EditorGUILayout.ObjectField(instance.GetSoundProperties().GetFireSound(i), typeof(AudioClip), true));
                        if (GUILayout.Button("", GUI.skin.GetStyle("OL Minus"), GUILayout.Width(20)))
                        {
                            shootSounds.DeleteArrayElementAtIndex(i);
                        }
                        GUILayout.Space(3);
                        GUILayout.EndHorizontal();
                    }
                }
                GUILayout.Space(3);
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button(" Add "))
                {
                    shootSounds.arraySize++;
                }
                GUILayout.Space(3);
                GUILayout.EndHorizontal();
            }
            GUILayout.Space(3);
            EndSubBox();

            BeginSubBox();
            GUILayout.Space(3);
            emptySoundsFoldout = EditorGUILayout.Foldout(emptySoundsFoldout, ContentProperties.EmptySound, true);
            if (emptySoundsFoldout)
            {
                if (instance.GetSoundProperties().GetEmptySounds() == null || instance.GetSoundProperties().GetEmptySoundsCount() == 0)
                {
                    UEditorHelpBoxMessages.Tip("Empty sounds is empty!", "Add new empty sound by click on [Add] button.", true);
                }
                else
                {
                    for (int i = 0; i < instance.GetSoundProperties().GetEmptySoundsCount(); i++)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Space(3);
                        GUILayout.Label("Clip " + (i + 1), GUILayout.Width(35));
                        instance.GetSoundProperties().SetEmptySound(i, (AudioClip)EditorGUILayout.ObjectField(instance.GetSoundProperties().GetEmptySound(i), typeof(AudioClip), true));
                        if (GUILayout.Button("", GUI.skin.GetStyle("OL Minus"), GUILayout.Width(20)))
                        {
                            emptySounds.DeleteArrayElementAtIndex(i);
                        }
                        GUILayout.Space(3);
                        GUILayout.EndHorizontal();
                    }
                }
                GUILayout.Space(3);
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button(" Add "))
                {
                    emptySounds.arraySize++;
                }
                GUILayout.Space(3);
                GUILayout.EndHorizontal();
            }
            GUILayout.Space(3);
            EndSubBox();

            GUILayout.Space(10);
            GUILayout.Label(ContentProperties.AdditionalSystem, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            BeginSubBox();
            GUILayout.Space(3);
            weaponSpreadSystemFoldout = EditorGUILayout.Foldout(weaponSpreadSystemFoldout, ContentProperties.WeaponSpreadProperties, true);
            if (weaponSpreadSystemFoldout)
            {
                instance.SetSpreadProperties((SpreadProperties)EditorGUILayout.ObjectField(ContentProperties.SpreadProperties, instance.GetSpreadProperties(), typeof(SpreadProperties), true));
                if (instance.GetSpreadProperties() == null)
                {
                    UEditorHelpBoxMessages.Message("Spread properties is empty!\nWeapon won't have a bullet spread and camera shake while shoothing!", MessageType.Warning, true);
                }
            }
            GUILayout.Space(3);
            EndSubBox();
            DecreaseIndentLevel();
            EndBox();
        }
        public override void BaseGUI()
        {
            BeginBox();
            GUILayout.Label(ContentProperties.MainProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            instance.SetPlayer((Transform)EditorGUILayout.ObjectField(ContentProperties.Player, instance.GetPlayer(), typeof(Transform), true));
            if (instance.GetPlayer() == null)
            {
                if (MiniButton("Try find Camera"))
                {
                    Transform player = UEditorInternal.FindPlayer();
                    if (player != null)
                    {
                        instance.SetPlayer(player);
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Player not found, try find it manually.");
                    }
                }
                UEditorHelpBoxMessages.PlayerError();
            }
            instance.SetOriginalYAxis(EditorGUILayout.Slider(ContentProperties.OriginalYAxis, instance.GetOriginalYAxis(), -360.0f, 360.0f));
            instance.SetAnimationEventProperties(ObjectField <AnimationEventProperties>(ContentProperties.EventProperties, instance.GetAnimationEventProperties(), true));

            GUILayout.Space(10);
            GUILayout.Label("Animator", UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(5);

            if (clips != null && clips.Length > 0)
            {
                GUILayout.BeginHorizontal();
                instance.SetTakeTime(EditorGUILayout.FloatField(ContentProperties.TakeTime, instance.GetTakeTime()));
                if (ListButton())
                {
                    GenericMenu menu = new GenericMenu();
                    for (int i = 0, length = clips.Length; i < length; i++)
                    {
                        AnimationClip clip = clips[i];
                        menu.AddItem(new GUIContent(clip.name), UMathf.Approximately(clip.length, instance.GetTakeTime(), 0.01f), (x) => { instance.SetTakeTime(UMathf.AllocatePart((float)x)); }, clip.length);
                    }
                    menu.ShowAsContext();
                }
                GUILayout.EndHorizontal();

                GUILayout.BeginHorizontal();
                instance.SetPutAwayTime(EditorGUILayout.FloatField(ContentProperties.PutAwayTime, instance.GetPutAwayTime()));
                if (ListButton())
                {
                    GenericMenu menu = new GenericMenu();
                    for (int i = 0, length = clips.Length; i < length; i++)
                    {
                        AnimationClip clip = clips[i];
                        menu.AddItem(new GUIContent(clip.name), UMathf.Approximately(clip.length, instance.GetPutAwayTime(), 0.01f), (x) => { instance.SetPutAwayTime(UMathf.AllocatePart((float)x)); }, clip.length);
                    }
                    menu.ShowAsContext();
                }
                GUILayout.EndHorizontal();
            }
            else
            {
                instance.SetTakeTime(EditorGUILayout.FloatField(ContentProperties.TakeTime, instance.GetTakeTime()));
                instance.SetPutAwayTime(EditorGUILayout.FloatField(ContentProperties.PutAwayTime, instance.GetPutAwayTime()));
            }

            GUILayout.Space(10);
            GUILayout.Label("Vector Animations", UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(5);
            BeginSubBox();
            EditorGUI.BeginDisabledGroup(!instance.UseRotationSway());
            IncreaseIndentLevel();
            rotationSwayFoldout = EditorGUILayout.Foldout(rotationSwayFoldout, ContentProperties.RotationSway, true);
            if (rotationSwayFoldout)
            {
                instance.SetPositionSensitivity(EditorGUILayout.FloatField(ContentProperties.PositionSensitivity, instance.GetPositionSensitivity()));
                instance.SetMaxPositionSensitivity(EditorGUILayout.FloatField(ContentProperties.MaxPositionSensitivity, instance.GetMaxPositionSensitivity()));
                instance.SetSmoothPosition(EditorGUILayout.FloatField(ContentProperties.SmoothPosition, instance.GetSmoothPosition()));
                instance.SetSmoothRotation(EditorGUILayout.FloatField(ContentProperties.SmoothRotation, instance.GetSmoothRotation()));
                instance.SetRotationSensitivity(EditorGUILayout.FloatField(ContentProperties.RotationSensitivity, instance.GetRotationSensitivity()));
            }
            string rotationSwayToggleName = instance.UseRotationSway() ? "Rotation Sway Enabled" : "Rotation Sway Disabled";

            EditorGUI.EndDisabledGroup();
            if (rotationSwayFoldout && !instance.UseRotationSway())
            {
                Rect notificationBackgroungRect = GUILayoutUtility.GetLastRect();
                Rect notificationTextRect       = GUILayoutUtility.GetLastRect();

                notificationBackgroungRect.y     -= 75;
                notificationBackgroungRect.height = 93.5f;

                notificationTextRect.y     -= 58.5f;
                notificationTextRect.height = 60;

                Notification("Rotation Sway Disabled", notificationBackgroungRect, notificationTextRect);
            }
            instance.RotationSwayActive(EditorGUILayout.Toggle(rotationSwayToggleName, instance.UseRotationSway()));
            EndSubBox();

            BeginSubBox();
            EditorGUI.BeginDisabledGroup(!instance.UseJumpSway());
            jumpSwayFoldout = EditorGUILayout.Foldout(jumpSwayFoldout, ContentProperties.JumpSway, true);
            if (jumpSwayFoldout)
            {
                instance.SetMaxYPosJump(EditorGUILayout.FloatField(ContentProperties.MaxYPosJump, instance.GetMaxYPosJump()));
                instance.SetSmoothJump(EditorGUILayout.FloatField(ContentProperties.SmoothJump, instance.GetSmoothJump()));
                instance.SetSmoothLand(EditorGUILayout.FloatField(ContentProperties.SmoothLand, instance.GetSmoothLand()));
            }
            string jumpSwayToggleName = instance.UseJumpSway() ? "Jump Sway Enabled" : "Jump Sway Disabled";

            EditorGUI.EndDisabledGroup();
            if (jumpSwayFoldout && !instance.UseJumpSway())
            {
                Rect notificationBackgroungRect = GUILayoutUtility.GetLastRect();
                Rect notificationTextRect       = GUILayoutUtility.GetLastRect();

                notificationBackgroungRect.y     -= 39;
                notificationBackgroungRect.height = 58;

                notificationTextRect.y     -= 36.5f;
                notificationTextRect.height = 50;

                Notification("Jump Sway Disabled", notificationBackgroungRect, notificationTextRect);
            }
            instance.JumpSwayActive(EditorGUILayout.Toggle(jumpSwayToggleName, instance.UseJumpSway()));
            EndSubBox();
            DecreaseIndentLevel();
            EndBox();

            if (GUI.changed)
            {
                clips = UEditorInternal.GetAllClips(instance.GetComponent <Animator>());
            }
        }
        public override void BaseGUI()
        {
            BeginBox();
            GUILayout.Label(ContentProperties.BaseSettings, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);

            if (instance.GetFPCamera() != null)
            {
                instance.SetFPCamera((Transform)EditorGUILayout.ObjectField(ContentProperties.Camera, instance.GetFPCamera(), typeof(Transform), true));
            }
            else
            {
                GUILayout.BeginHorizontal();
                instance.SetFPCamera((Transform)EditorGUILayout.ObjectField(ContentProperties.Camera, instance.GetFPCamera(), typeof(Transform), true));
                if (SearchButton())
                {
                    Camera camera = UEditorInternal.FindFPCamera(instance.transform);
                    if (camera != null)
                    {
                        instance.SetFPCamera(camera.transform);
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Camera not found, try find it manually.");
                    }
                }
                GUILayout.EndHorizontal();
                UEditorHelpBoxMessages.CameraError();
            }
            instance.SetSwitchMode((SwitchWeaponMode)EditorGUILayout.EnumPopup(ContentProperties.Switch, instance.GetSwitchMode()));
            instance.AllowIdenticalWeapons(EditorGUILayout.Toggle(ContentProperties.AllowIdenticalWeapons, instance.AllowIdenticalWeapons()));
            EndBox();

            BeginBox(3);
            IncreaseIndentLevel();
            weaponsEditFoldout = EditorGUILayout.Foldout(weaponsEditFoldout, ContentProperties.Weapons, true);
            if (weaponsEditFoldout)
            {
                GUILayout.Space(5);
                GUILayout.BeginVertical();
                int pos = -1;
                for (int i = 0; i < groupsProperty.arraySize; i++)
                {
                    SerializedProperty inventoryGroup = groupsProperty.GetArrayElementAtIndex(i);

                    GUILayout.Space(5);
                    GUILayout.BeginVertical(GUI.skin.window);
                    Rect groupNameRect = GUILayoutUtility.GetRect(0, 0);
                    groupNameRect.y     -= 19;
                    groupNameRect.height = 15;

                    if (editingGroups)
                    {
                        DecreaseIndentLevel();
                        EditorGUI.PropertyField(groupNameRect, inventoryGroup.FindPropertyRelative("name"), new GUIContent("Group Name"));
                        IncreaseIndentLevel();
                    }
                    else
                    {
                        GUI.Label(groupNameRect, inventoryGroup.FindPropertyRelative("name").stringValue, UEditorStyles.SectionHeaderLabel);
                    }

                    SerializedProperty inventorySlots = inventoryGroup.FindPropertyRelative("inventorySlots");
                    if (inventorySlots.arraySize == 0)
                    {
                        UEditorHelpBoxMessages.Message("Group is empty, add weapon!", MessageType.Warning, true);
                    }

                    for (int j = 0; j < inventorySlots.arraySize; j++)
                    {
                        pos++;
                        SerializedProperty slot     = inventorySlots.GetArrayElementAtIndex(j);
                        InventorySlot      _slot    = instance.GetGroups() [i].GetInventorySlot(j);
                        string             slotName = _slot.GetWeapon() != null?_slot.GetWeapon().name : "Empty Slot " + (j + 1);

                        GUILayout.BeginHorizontal();
                        EditorGUI.BeginDisabledGroup(_slot.GetWeapon() == null || _slot.GetKey() == KeyCode.None);

                        radioToggles[pos] = EditorGUILayout.Toggle(radioToggles[pos], EditorStyles.radioButton, GUILayout.Width(15));
                        if (radioToggles[pos])
                        {
                            int except = !(_slot.GetKey() == KeyCode.None) ? pos : -1;
                            SetToggleValues(except, false);
                            savedGroupIndex = i;
                            savedSlotIndex  = j;
                        }
                        EditorGUI.EndDisabledGroup();
                        GUILayout.Label(slotName, GUILayout.Width(70));
                        EditorGUILayout.PropertyField(slot.FindPropertyRelative("key"), GUIContent.none, GUILayout.MaxWidth(110));
                        EditorGUILayout.PropertyField(slot.FindPropertyRelative("weapon"), GUIContent.none);
                        GUILayout.BeginVertical();
                        GUILayout.Space(0.7f);
                        if (GUILayout.Button("", GUI.skin.GetStyle("OL Minus"), GUILayout.Width(20)))
                        {
                            inventorySlots.DeleteArrayElementAtIndex(j);
                            if (radioToggles[pos])
                            {
                                savedGroupIndex = -1;
                                savedSlotIndex  = -1;
                            }
                            radioToggles.RemoveAt(j);
                            pos--;
                            break;
                        }
                        GUILayout.EndVertical();
                        GUILayout.EndHorizontal();
                    }

                    GUILayout.Space(3);

                    GUILayout.BeginHorizontal();
                    GUILayout.FlexibleSpace();
                    if (GUILayout.Button(ContentProperties.AddWeaponButton, editingGroups ? EditorStyles.miniButtonLeft : EditorStyles.miniButton, GUILayout.Height(17)))
                    {
                        inventorySlots.arraySize++;
                        radioToggles.Add(false);
                    }
                    if (editingGroups && GUILayout.Button(ContentProperties.RemoveGroupButton, EditorStyles.miniButtonRight, GUILayout.Height(17)))
                    {
                        groupsProperty.DeleteArrayElementAtIndex(i);
                        if (savedGroupIndex == i)
                        {
                            savedGroupIndex = -1;
                            savedSlotIndex  = -1;
                        }
                        radioToggles.Clear();
                        if (editingGroups && groupsProperty.arraySize == 0)
                        {
                            editingGroups = false;
                        }
                        radioToggles = CreateRadioToggles();
                    }
                    GUILayout.EndHorizontal();

                    GUILayout.Space(2);
                    GUILayout.EndVertical();
                    GUILayout.Space(5);
                }

                if (groupsProperty.arraySize == 0)
                {
                    UEditorHelpBoxMessages.Tip("Inventory is empty!", "Add new group and weapon.", true);
                }

                GUILayout.BeginHorizontal();

                if ((savedGroupIndex != -1 && savedSlotIndex != -1) && GUILayout.Button("Disable Start Weapon", EditorStyles.miniButton, GUILayout.Height(17)))
                {
                    savedGroupIndex = -1;
                    savedSlotIndex  = -1;
                }

                GUILayout.FlexibleSpace();
                if (GUILayout.Button(ContentProperties.AddGroupButton, groupsProperty.arraySize > 0 ? EditorStyles.miniButtonLeft : EditorStyles.miniButton, GUILayout.Height(17)))
                {
                    if (groupsProperty != null)
                    {
                        instance.GetGroups().Add(new InventoryGroup("New Group " + instance.GetGroups().Count, new List <InventorySlot>()));
                    }
                }
                if (editingGroups && GUILayout.Button(ContentProperties.ApplyChangesButton, EditorStyles.miniButtonRight, GUILayout.Height(17)))
                {
                    editingGroups = false;
                }
                else if (!editingGroups && groupsProperty.arraySize > 0 && GUILayout.Button(ContentProperties.EditGroupButton, EditorStyles.miniButtonRight, GUILayout.Height(17)))
                {
                    editingGroups = true;
                }
                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
                ApplySavedToggle();
            }
            DecreaseIndentLevel();
            EndBox();
        }
        public override void BaseGUI()
        {
            BeginBox();
            GUILayout.Space(5);
            GUILayout.Label(ContentProperties.BaseSettings, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            if (instance.GetAttackPoint() != null)
            {
                instance.SetAttackPoint((Transform)EditorGUILayout.ObjectField(ContentProperties.AttackPoint, instance.GetAttackPoint(), typeof(Transform), true));
            }
            else
            {
                GUILayout.BeginHorizontal();
                instance.SetAttackPoint((Transform)EditorGUILayout.ObjectField(ContentProperties.AttackPoint, instance.GetAttackPoint(), typeof(Transform), true));
                if (SearchButton())
                {
                    Transform attackPoint = UEditorInternal.FindFirePoint(instance.transform.root);
                    if (attackPoint != null)
                    {
                        instance.SetAttackPoint(attackPoint);
                    }
                    else
                    {
                        UDisplayDialogs.Message("Searching", "Attack point not found, try find it manually.");
                    }
                }
                GUILayout.EndHorizontal();
                UEditorHelpBoxMessages.Error("Attack point cannot be empty!", "Add attack point manually or try to use auto search button.");
            }

            instance.SetDecalProperties((DecalProperties)EditorGUILayout.ObjectField(ContentProperties.DecalProperties, instance.GetDecalProperties(), typeof(DecalProperties), true));
            if (instance.GetDecalProperties() == null)
            {
                UEditorHelpBoxMessages.Tip("Decals won't be created.", "For create Decal Properties asset press right mouse button on Project window and select Create > Unreal FPS > Weapon > Decal Properties.");
            }
            GUILayout.Space(10);

            GUILayout.Label(ContentProperties.NormalAttackProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            WeaponMeleeSystem.AttackProperties normalAttackProperties = instance.GetNormalAttackProperties();
            normalAttackProperties.range   = EditorGUILayout.FloatField(ContentProperties.Range, normalAttackProperties.range);
            normalAttackProperties.impulse = EditorGUILayout.FloatField(ContentProperties.Impulse, normalAttackProperties.impulse);
            normalAttackProperties.damage  = EditorGUILayout.IntField(ContentProperties.Damage, normalAttackProperties.damage);
            normalAttackProperties.hitTime = EditorGUILayout.Slider(ContentProperties.HitTime, normalAttackProperties.hitTime, 0, normalAttackProperties.delay);
            normalAttackProperties.delay   = EditorGUILayout.FloatField(ContentProperties.Delay, normalAttackProperties.delay);

            GUILayout.Space(10);

            GUILayout.Label(ContentProperties.SpecialAttackProperties, UEditorStyles.SectionHeaderLabel);
            GUILayout.Space(7);
            WeaponMeleeSystem.AttackProperties specialAttackProperties = instance.GetSpecialAttackProperties();
            instance.SetSpecialAttackKey((KeyCode)EditorGUILayout.EnumPopup(ContentProperties.SpecialKey, instance.GetSpecialAttackKey()));
            specialAttackProperties.range   = EditorGUILayout.FloatField(ContentProperties.Range, specialAttackProperties.range);
            specialAttackProperties.impulse = EditorGUILayout.FloatField(ContentProperties.Impulse, specialAttackProperties.impulse);
            specialAttackProperties.damage  = EditorGUILayout.IntField(ContentProperties.Damage, specialAttackProperties.damage);
            specialAttackProperties.hitTime = EditorGUILayout.Slider(ContentProperties.HitTime, specialAttackProperties.hitTime, 0, specialAttackProperties.delay);
            specialAttackProperties.delay   = EditorGUILayout.FloatField(ContentProperties.Delay, specialAttackProperties.delay);

            instance.SetAttackProperties(normalAttackProperties, specialAttackProperties);
            EndBox();
        }