示例#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
        private static void WeaponIDsListGUI()
        {
            if (weaponIDs != null && weaponIDs.Count > 0)
            {
                GUILayout.BeginVertical(EditorStyles.helpBox);
                GUILayout.Space(3);

                for (int i = 0; i < weaponIDs.Count; i++)
                {
                    if (i >= weaponIDs.Count)
                    {
                        break;
                    }

                    Object _weaponID = weaponIDs[i];
                    if (_weaponID == null)
                    {
                        OnEnable();
                        continue;
                    }

                    GUILayout.BeginHorizontal();
                    GUILayout.Space(3);
                    GUILayout.Label(_weaponID.name, EditorStyles.boldLabel);

                    GUI.color = new Color32(70, 150, 255, 255);
                    if (GUILayout.Button("Open", "ButtonLeft", GUILayout.Width(70)))
                    {
                        Selection.activeObject = _weaponID;
                    }

#if UNITY_EDITOR_OSX
                    EditorGUI.BeginDisabledGroup(true);
#endif

                    GUI.color = new Color32(70, 220, 70, 255);
                    if (GUILayout.Button("Duplicate", "ButtonMid", GUILayout.Width(70)))
                    {
                        string path = AssetDatabase.GetAssetPath(_weaponID);
                        string name = _weaponID.name;
                        path = path.Replace(_weaponID.name + ".asset", "");
                        AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(_weaponID), path + name + ".asset");
                        AssetDatabase.Refresh();
                        OnEnable();
                    }

#if UNITY_EDITOR_OSX
                    EditorGUI.EndDisabledGroup();
#endif

                    GUI.color = new Color32(255, 55, 55, 255);
                    if (GUILayout.Button("Delete", "ButtonRight", GUILayout.Width(70)))
                    {
                        if (UDisplayDialogs.Confirmation("Are you really want to delete \"" + _weaponID.name + "\" asset?"))
                        {
                            string path = AssetDatabase.GetAssetPath(_weaponID);
                            AssetDatabase.DeleteAsset(path);
                            AssetDatabase.Refresh();
                            OnEnable();
                            break;
                        }
                    }
                    GUI.color = Color.white;
                    GUILayout.Space(3);
                    GUILayout.EndHorizontal();

                    if (weaponIDs.Count > 1 && i < weaponIDs.Count - 1)
                    {
                        GUILayout.Space(3);
                        UEditor.HorizontalLine();
                        GUILayout.Space(3);
                    }
                    else
                    {
                        GUILayout.Space(3);
                    }
                }
                GUILayout.Space(3);
                GUILayout.EndVertical();
            }
            else
            {
                UEditorHelpBoxMessages.Message("WeaponID's not found...\n" + "Create new property or reload properties", MessageType.Warning);
            }

            GUILayout.Space(5);

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button(" Refresh Assets ", GUILayout.Width(105.5f)))
            {
                weaponIDs = UEditorInternal.FindAssetsByType <WeaponID>();
            }
            GUILayout.Space(8);
            GUILayout.EndHorizontal();
        }
        public override void BaseGUI()
        {
            GUILayout.Space(5);
            GUILayout.BeginHorizontal();
            GUILayout.Space(5);
            animatorController = ObjectField <RuntimeAnimatorController>(ContentProperties.Animator, animatorController, true);
            if (animatorController != null)
            {
                clips = animatorController.animationClips;
            }
            GUILayout.Space(5);
            GUILayout.EndHorizontal();
            GUILayout.Space(5);

            IncreaseIndentLevel();
            for (int i = 0, length = instance.GetLength(); i < length; i++)
            {
                BeginBox();
                AnimationEventProperty animationEventProperty = instance.GetProperty(i);
                bool          foldout = propertiesFoldout[i];
                string        name    = animationEventProperty.GetAnimationName().AddSpaces();
                AnimationClip clip    = null;
                if (animatorController != null && clips != null)
                {
                    for (int c = 0, c_length = clips.Length; c < c_length; c++)
                    {
                        AnimationClip _clip = clips[c];
                        if (_clip.name == animationEventProperty.GetAnimationName())
                        {
                            clip = _clip;
                            break;
                        }
                    }
                }

                Rect animationRemoveButtonRect = GUILayoutUtility.GetRect(0, 0);
                animationRemoveButtonRect.x      = animationRemoveButtonRect.width + 5;
                animationRemoveButtonRect.y     += 1;
                animationRemoveButtonRect.width  = 16.5f;
                animationRemoveButtonRect.height = 16.5f;
                if (GUI.Button(animationRemoveButtonRect, GUIContent.none, GUI.skin.GetStyle("OL Minus")))
                {
                    properties.DeleteArrayElementAtIndex(i);
                    propertiesFoldout.RemoveAt(i);
                    eventsFoldout.Remove(i);
                    break;
                }

                foldout = EditorGUILayout.Foldout(foldout, name, true);
                if (foldout)
                {
                    GUILayout.Space(3);
                    if (animatorController != null && clips != null)
                    {
                        GUILayout.BeginHorizontal();
                        animationEventProperty.SetAnimationName(EditorGUILayout.TextField(ContentProperties.AnimationName, animationEventProperty.GetAnimationName()));
                        if (ListButton())
                        {
                            GenericMenu menu = new GenericMenu();
                            for (int c = 0, c_length = clips.Length; c < c_length; c++)
                            {
                                AnimationClip _clip       = clips[c];
                                string        sendMessage = i + "," + _clip.name;
                                menu.AddItem(new GUIContent(_clip.name), _clip.name == animationEventProperty.GetAnimationName(), (_object) =>
                                {
                                    string message        = (string)_object as string;
                                    string[] parseMessage = message.Split(',');
                                    int index             = int.Parse(parseMessage[0]);
                                    AnimationEventProperty _animationEventProperty = instance.GetProperty(index);
                                    _animationEventProperty.SetAnimationName(parseMessage[1]);
                                    instance.SetProperty(index, _animationEventProperty);
                                }, sendMessage);
                            }
                            menu.ShowAsContext();
                        }
                        GUILayout.EndHorizontal();
                    }
                    else
                    {
                        animationEventProperty.SetAnimationName(EditorGUILayout.TextField(ContentProperties.AnimationName, animationEventProperty.GetAnimationName()));
                    }

                    AnimationEventProperty.EventProperty[] eventProperties = animationEventProperty.GetEventProperties();
                    SerializedProperty serializedEventProperties           = properties.GetArrayElementAtIndex(i).FindPropertyRelative("eventProperties");
                    for (int j = 0, _length = eventProperties.Length; j < _length; j++)
                    {
                        if (!eventsFoldout.ContainsKey(i) || eventsFoldout[i].Count == 0 || j >= eventsFoldout[i].Count)
                        {
                            break;
                        }

                        BeginSubBox();
                        bool eventFoldout = eventsFoldout[i][j];

                        Rect eventRemoveButtonRect = GUILayoutUtility.GetRect(0, 0);
                        eventRemoveButtonRect.x      = eventRemoveButtonRect.width + 15;
                        eventRemoveButtonRect.y     += 1;
                        eventRemoveButtonRect.width  = 16.5f;
                        eventRemoveButtonRect.height = 16.5f;
                        if (GUI.Button(eventRemoveButtonRect, GUIContent.none, GUI.skin.GetStyle("OL Minus")))
                        {
                            serializedEventProperties.DeleteArrayElementAtIndex(j);
                            eventsFoldout[i].RemoveAt(j);
                            break;
                        }

                        eventFoldout = EditorGUILayout.Foldout(eventFoldout, "Event " + (j + 1), true);
                        if (eventFoldout)
                        {
                            GUILayout.Space(3);
                            AnimationEventProperty.EventProperty eventProperty = eventProperties[j];
                            if (animatorController != null && clips != null && clip != null)
                            {
                                eventProperty.SetAnimationTime(EditorGUILayout.Slider(ContentProperties.AnimationTime, eventProperty.GetAnimationTime(), 0, clip.length));
                            }
                            else
                            {
                                eventProperty.SetAnimationTime(EditorGUILayout.FloatField(ContentProperties.AnimationTime, eventProperty.GetAnimationTime()));
                            }

                            GUILayout.Space(10);
                            GUILayout.Label(ContentProperties.SoundEffect, UEditorStyles.SectionHeaderLabel);
                            GUILayout.Space(5);
                            eventProperty.SetSoundEffect(ObjectField <AudioClip>(ContentProperties.SoundEffect, eventProperty.GetSoundEffect(), false));

                            GUILayout.Space(10);
                            GUILayout.Label(ContentProperties.CameraShake, UEditorStyles.SectionHeaderLabel);
                            GUILayout.Space(5);
                            ShakeCamera.ShakeProperties shakeProperties = eventProperty.GetShakeProperties();
                            shakeProperties.SetTarget((ShakeCamera.ShakeEvent.Target)EditorGUILayout.EnumPopup("Target", shakeProperties.GetTarget()));
                            EditorGUI.BeginDisabledGroup(shakeProperties.GetTarget() == ShakeCamera.ShakeEvent.Target.None);
                            shakeProperties.SetAmplitude(EditorGUILayout.FloatField("Amplitude", shakeProperties.GetAmplitude()));
                            shakeProperties.SetFrequency(EditorGUILayout.FloatField("Frequency", shakeProperties.GetFrequency()));
                            shakeProperties.SetDuration(EditorGUILayout.FloatField("Duration", shakeProperties.GetDuration()));
                            shakeProperties.SetBlendOverLifetime(EditorGUILayout.CurveField("Blend Over Life time", shakeProperties.GetBlendOverLifetime()));
                            EditorGUI.EndDisabledGroup();
                            eventProperty.SetShakeProperties(shakeProperties);
                            eventProperties[j] = eventProperty;
                            GUILayout.Space(3);
                        }
                        eventsFoldout[i][j] = eventFoldout;
                        EndSubBox();
                    }
                    animationEventProperty.SetEventProperties(eventProperties);

                    GUILayout.Space(3);

                    GUILayout.BeginHorizontal();
                    GUILayout.FlexibleSpace();

                    bool clipContains = (animatorController != null && clips != null && clip != null && (clip.events != null && clip.events.Length > 0));

                    if (GUILayout.Button(" Add Event ", clipContains ? "ButtonLeft" : "Button"))
                    {
                        serializedEventProperties.arraySize++;
                        eventsFoldout[i].Add(false);
                        break;
                    }

                    if (clipContains)
                    {
                        if (GUILayout.Button(new GUIContent(" Parse Event ", "Current clip contains event.\nPress \"Parse events\" to read and add this events here."), "ButtonRight"))
                        {
                            AnimationEvent[] unityAnimationEvents = clip.events;
                            for (int e = 0, e_length = unityAnimationEvents.Length; e < e_length; e++)
                            {
                                serializedEventProperties.arraySize++;
                                eventsFoldout[i].Add(false);
                                AnimationEvent     unityAnimationEvent = unityAnimationEvents[e];
                                SerializedProperty animationTime       = serializedEventProperties.GetArrayElementAtIndex(serializedEventProperties.arraySize - 1).FindPropertyRelative("animationTime");
                                SerializedProperty soundEffect         = serializedEventProperties.GetArrayElementAtIndex(serializedEventProperties.arraySize - 1).FindPropertyRelative("soundEffect");
                                soundEffect.objectReferenceValue = unityAnimationEvent.objectReferenceParameter;
                                animationTime.floatValue         = unityAnimationEvent.time;
                            }
                            break;
                        }
                    }
                    GUILayout.EndHorizontal();
                    GUILayout.Space(3);
                }
                propertiesFoldout[i] = foldout;
                instance.SetProperty(i, animationEventProperty);
                EndBox();
            }
            DecreaseIndentLevel();

            GUILayout.Space(3);

            if (instance.GetLength() == 0)
            {
                UEditorHelpBoxMessages.Tip("Properties is empty!", "Add new properties.");
            }

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Add Animation", "ButtonLeft", GUILayout.Width(120)))
            {
                properties.arraySize++;
                properties.GetArrayElementAtIndex(properties.arraySize - 1).FindPropertyRelative("animationName").stringValue = "Empty " + properties.arraySize;
                properties.GetArrayElementAtIndex(properties.arraySize - 1).FindPropertyRelative("eventProperties").arraySize = 0;
                propertiesFoldout.Add(false);
                eventsFoldout.Add(properties.arraySize - 1, new List <bool>());
            }

            if (GUILayout.Button("Clear All Animation", "ButtonRight", GUILayout.Width(120)))
            {
                if (UDisplayDialogs.Confirmation(string.Format("Are you sure want clear camera shake properites:[{0}]", properties.arraySize)))
                {
                    properties.arraySize = 0;
                    propertiesFoldout.Clear();
                    eventsFoldout.Clear();
                }
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
        }
示例#9
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();
        }
示例#10
0
        public override void BaseGUI()
        {
            if (instance == null)
            {
                return;
            }

            for (int i = 0; i < instance.GetLength(); i++)
            {
                BeginBox();
                IncreaseIndentLevel();
                ClimbstepProperty  property           = instance.GetProperty(i);
                SerializedProperty serializedProperty = properties.GetArrayElementAtIndex(i);
                string             propertyName       = "New Property " + (i + 1);
                if (property.GetPhysicMaterial() != null)
                {
                    propertyName = property.GetPhysicMaterial().name;
                }

                Rect removeButtonRect = GUILayoutUtility.GetRect(0, 0);
                removeButtonRect.x      = removeButtonRect.width + 5;
                removeButtonRect.y     += 1;
                removeButtonRect.width  = 16.5f;
                removeButtonRect.height = 16.5f;
                if (GUI.Button(removeButtonRect, GUIContent.none, GUI.skin.GetStyle("OL Minus")))
                {
                    properties.DeleteArrayElementAtIndex(i);
                    propertiesFoldout.RemoveAt(i);
                    break;
                }

                propertiesFoldout[i] = EditorGUILayout.Foldout(propertiesFoldout[i], propertyName, true);
                if (propertiesFoldout[i])
                {
                    GUILayout.Space(3);
                    GUILayout.Label("Surface", UEditorStyles.SectionHeaderLabel);
                    GUILayout.Space(5);
                    property.SetPhysicMaterial((PhysicMaterial)EditorGUILayout.ObjectField("Physic Material", property.GetPhysicMaterial(), typeof(PhysicMaterial), true));
                    if (property.GetPhysicMaterial() == null)
                    {
                        UEditorHelpBoxMessages.Tip("Add Physic Material for handle surface.", "For create Physic Material press right mouse button Create > Physic Material.", true);
                    }

                    GUILayout.Space(10);
                    GUILayout.Label("Sounds", UEditorStyles.SectionHeaderLabel);
                    GUILayout.Space(5);
                    BeginSubBox();
                    GUILayout.Space(3);
                    climbFoldout = EditorGUILayout.Foldout(climbFoldout, "Climb ounds", true);
                    if (climbFoldout)
                    {
                        if (property.GetSoundsLength() == 0)
                        {
                            UEditorHelpBoxMessages.Tip("Climb sounds is empty!", "Add new climb sound by click on [Add] button.", true);
                        }
                        for (int s = 0; s < property.GetSoundsLength(); s++)
                        {
                            string clipName = property.GetSound(i) != null?property.GetSound(i).name : "Clip " + (i + 1);

                            GUILayout.BeginHorizontal();
                            GUILayout.Space(3);
                            GUILayout.Label(clipName, GUILayout.Width(35));
                            property.SetSound(i, (AudioClip)EditorGUILayout.ObjectField(property.GetSound(i), typeof(AudioClip), true));
                            if (GUILayout.Button("", GUI.skin.GetStyle("OL Minus"), GUILayout.Width(20)))
                            {
                                serializedProperty.FindPropertyRelative("sounds").DeleteArrayElementAtIndex(s);
                            }
                            GUILayout.Space(3);
                            GUILayout.EndHorizontal();
                        }
                        GUILayout.Space(3);
                        GUILayout.BeginHorizontal();
                        GUILayout.FlexibleSpace();
                        if (GUILayout.Button(" Add "))
                        {
                            serializedProperty.FindPropertyRelative("sounds").arraySize++;
                        }
                        GUILayout.EndHorizontal();
                    }
                    GUILayout.Space(3);
                    EndSubBox();

                    GUILayout.Space(3);
                    instance.SetProperty(i, property);
                }
                DecreaseIndentLevel();
                EndBox();
            }

            if (instance.GetLength() == 0)
            {
                UEditorHelpBoxMessages.Tip("Properties is empty!", "Add new properties.");
            }

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button(" Add Property ", "ButtonLeft", GUILayout.Width(120)))
            {
                properties.arraySize++;
                propertiesFoldout.Add(false);
            }

            if (GUILayout.Button(" Clear All Properties ", "ButtonRight", GUILayout.Width(120)))
            {
                if (UDisplayDialogs.Confirmation("Are you really want to remove all properties from this Climbstep Properties asset?"))
                {
                    properties.ClearArray();
                }
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
        }
        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();
        }