public override void InitializeProperties() { Transform player = UEditorInternal.FindPlayer(); if (player != null) { inventory = UEditorInternal.FindComponent <AdvancedInventory>(player); } }
private static GameObject CreatePhysicsBullet(PhysicsBulletProperties properties) { // Initialize gameobjects. GameObject bullet = new GameObject(properties.GetModel()); GameObject bulletModel = GameObject.Instantiate(properties.GetBullet(), Vector3.zero, Quaternion.identity, bullet.transform); ParticleSystem explosionEffect = null; if (properties.GetBulletType() == PhysicsBullet.BulletType.Rocket || properties.GetExplosionEffect() != null) { explosionEffect = GameObject.Instantiate(properties.GetExplosionEffect(), Vector3.zero, Quaternion.identity, bullet.transform); } // Initialize components BoxCollider boxCollider = UEditorInternal.AddComponent <BoxCollider>(bullet); PhysicsBullet physicsBulletComponent = UEditorInternal.AddComponent <PhysicsBullet>(bullet); Rigidbody rigidbody = UEditorInternal.AddComponent <Rigidbody>(bullet); AudioSource audioSource = UEditorInternal.AddComponent <AudioSource>(bullet); // Setup PhysicsBullet component. physicsBulletComponent.SetBulletType(properties.GetBulletType()); physicsBulletComponent.SetBullet(properties.GetBullet()); physicsBulletComponent.SetModel(properties.GetModel()); physicsBulletComponent.SetDamage(properties.GetDamage()); physicsBulletComponent.SetVariance(properties.GetVariance()); physicsBulletComponent.SetNumberBullet(properties.GetNumberBullet()); physicsBulletComponent.SetExplosionRadius(properties.GetExplosionRadius()); physicsBulletComponent.SetExplosionPower(properties.GetExplosionPower()); if (properties.GetBulletType() == PhysicsBullet.BulletType.Rocket || explosionEffect != null) { physicsBulletComponent.SetExplosionEffect(explosionEffect); } physicsBulletProperties.SetExplosionSound(properties.GetExplosionSound()); physicsBulletComponent.SetDecalProperties(properties.GetDecalProperties()); // Setup BoxCollider component. Renderer renderer = bulletModel.GetComponent <Renderer>(); if (renderer != null) { boxCollider.center = renderer.bounds.center; boxCollider.size = renderer.bounds.size; } // Apply components position. UEditorInternal.MoveComponentBottom <PhysicsBullet>(bullet.transform); UEditorInternal.MoveComponentBottom <Rigidbody>(bullet.transform); UEditorInternal.MoveComponentBottom <BoxCollider>(bullet.transform); UEditorInternal.MoveComponentBottom <AudioSource>(bullet.transform); return(bullet); }
/// <summary> /// Create new weapon by properties. /// </summary> private static GameObject CreatePickableWeapon(WeaponProperties properties) { // Initialize gameobjects. GameObject weponObject = new GameObject(properties.GetName()); GameObject weapon = GameObject.Instantiate(properties.GetClearWeapon(), Vector3.zero, Quaternion.identity, weponObject.transform); // Initialize weapon components. PickableItem pickupItem = UEditorInternal.AddComponent <PickableItem>(weponObject); Rigidbody physicsRigidbody = UEditorInternal.AddComponent <Rigidbody>(weponObject); AudioSource audioSource = UEditorInternal.AddComponent <AudioSource>(weponObject); SphereCollider triggerCollider = UEditorInternal.AddComponent <SphereCollider>(weponObject); BoxCollider physicsCollider = UEditorInternal.AddComponent <BoxCollider>(weponObject); // Setup PickableItem component. pickupItem.SetProcessingType(properties.GetProcessingType()); pickupItem.SetObjectType(properties.GetObjectType()); pickupItem.SetPickUpKey(properties.GetPickUpKey()); pickupItem.SetItem(weapon.transform); pickupItem.SetWeapon(properties.GetWeaponID()); pickupItem.SetValue(properties.GetValue()); pickupItem.SetReusableDelay(properties.GetReusableDelay()); pickupItem.IsReusable(properties.IsReusable()); pickupItem.DestroyAfterUse(properties.DestroyAfterUse()); pickupItem.SetPickUpMessage(properties.GetPickUpMessage()); pickupItem.SetSoundEffect(properties.GetSoundEffect()); // Setup SphereCollider component. triggerCollider.isTrigger = true; triggerCollider.radius = 1.25f; // Setup BoxCollider component. Renderer renderer = weapon.GetComponentInChildren <Renderer>(); if (renderer != null) { physicsCollider.center = renderer.bounds.center; physicsCollider.size = renderer.bounds.size; } // Apply components position. UEditorInternal.MoveComponentBottom <PickableItem>(weponObject.transform); UEditorInternal.MoveComponentBottom <Rigidbody>(weponObject.transform); UEditorInternal.MoveComponentBottom <SphereCollider>(weponObject.transform); UEditorInternal.MoveComponentBottom <BoxCollider>(weponObject.transform); UEditorInternal.MoveComponentBottom <AudioSource>(weponObject.transform); return(weponObject); }
/// <summary> /// This function is called when the window becomes enabled and active. /// </summary> public static void OnEnable() { properties = new WeaponProperties(); delay = new EditorDelay(0.1f); toolbarItems = new string[] { "First Person Weapon", "Pickable Weapon" }; Transform player = UEditorInternal.FindPlayer(); if (player != null) { inventory = UEditorInternal.FindComponent <AdvancedInventory>(player); } additionalComponents = new List <AdditionalComponents>() { new AdditionalComponents { name = "Crosshair", component = typeof(Crosshair), isActive = true }, new AdditionalComponents { name = "Camera Zoom", component = typeof(FPCameraZoom), isActive = true } }; additionalComponentsRL = new ReorderableList(additionalComponents, typeof(AdditionalComponents), true, true, false, false) { drawHeaderCallback = (rect) => { EditorGUI.LabelField(new Rect(rect.x, rect.y + 1, 200, EditorGUIUtility.singleLineHeight), "Additional Components"); }, drawElementCallback = (rect, index, isActive, isFocused) => { AdditionalComponents additionalSystem = additionalComponents[index]; EditorGUI.LabelField(new Rect(rect.x, rect.y + 2, 100, EditorGUIUtility.singleLineHeight), additionalSystem.name); additionalSystem.isActive = EditorGUI.Toggle(new Rect(rect.width + 10, rect.y + 2, 30, EditorGUIUtility.singleLineHeight), additionalSystem.isActive); additionalComponents[index] = additionalSystem; } }; }
public static void OnEnable() { weaponID = ScriptableObject.CreateInstance <WeaponID>(); if (weaponID != null) { weaponID.SetID(WeaponID.GenerateID()); weaponID.SetDisplayName("Write weapon name here..."); } Transform player = UEditorInternal.FindPlayer(); if (player != null) { inventory = UEditorInternal.FindComponent <AdvancedInventory>(player); } weaponIDs = UEditorInternal.FindAssetsByType <WeaponID>(); toolbarItems = new string[2] { "New", "List" }; }
private static GameObject CreateGreanade(GrenadeProperties properties) { // Initialize gameobjects. GameObject grenade = new GameObject(properties.GetModel()); GameObject grenadeModel = GameObject.Instantiate(properties.GetGrenadeObject(), Vector3.zero, Quaternion.identity, grenade.transform); // Initialize components Grenade grenadeComponent = UEditorInternal.AddComponent <Grenade>(grenade); Rigidbody rigidbody = UEditorInternal.AddComponent <Rigidbody>(grenade); SphereCollider sphereCollider = UEditorInternal.AddComponent <SphereCollider>(grenade); AudioSource audioSource = UEditorInternal.AddComponent <AudioSource>(grenade); // Setup Grenade component. grenadeComponent.SetGrenadeObject(properties.GetGrenadeObject()); grenadeComponent.SetRadius(properties.GetRadius()); grenadeComponent.SetExplosionEffect(properties.GetExplosionEffect()); grenadeComponent.SetExplosionSound(properties.GetExplosionSound()); grenadeComponent.SetExplosionProperties(properties.GetExplosionProperties()); grenadeComponent.SetDecalProperties(properties.GetDecalProperties()); grenadeComponent.SetDelay(properties.GetDelay()); // Setup SphereCollider component. Renderer renderer = grenadeModel.GetComponent <Renderer>(); if (renderer != null) { sphereCollider.center = renderer.bounds.center; sphereCollider.radius = renderer.bounds.size.x; } // Apply components position. UEditorInternal.MoveComponentBottom <Grenade>(grenade.transform); UEditorInternal.MoveComponentBottom <Rigidbody>(grenade.transform); UEditorInternal.MoveComponentBottom <SphereCollider>(grenade.transform); UEditorInternal.MoveComponentBottom <AudioSource>(grenade.transform); return(grenade); }
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(); }
public override void BaseGUI() { BeginBox(); GUILayout.BeginVertical(); GUILayout.Label(ContentProperties.AmmoProperties, UEditorStyles.SectionHeaderLabel); GUILayout.Space(5); instance.SetBulletCount(EditorGUILayout.IntSlider(ContentProperties.BulletCount, instance.GetBulletCount(), 0, instance.GetMaxBulletCount())); instance.SetClipCount(EditorGUILayout.IntSlider(ContentProperties.ClipCount, instance.GetClipCount(), 0, instance.GetMaxClipCount())); instance.SetMaxBulletCount(EditorGUILayout.IntField(ContentProperties.MaxBulletCount, instance.GetMaxBulletCount())); instance.SetMaxClipCount(EditorGUILayout.IntField(ContentProperties.MaxClipCount, instance.GetMaxClipCount())); GUILayout.Space(10); GUILayout.Label(ContentProperties.ReloadProperties, UEditorStyles.SectionHeaderLabel); GUILayout.Space(7); instance.SetReloadType((WeaponReloadSystem.ReloadType)EditorGUILayout.EnumPopup(ContentProperties.ReloadType, instance.GetReloadType())); instance.SetReloadMode((WeaponReloadSystem.ReloadMode)EditorGUILayout.EnumPopup(ContentProperties.ReloadMode, instance.GetReloadMode())); switch (instance.GetReloadMode()) { case WeaponReloadSystem.ReloadMode.Default: if (clips != null && clips.Length > 0) { GUILayout.BeginHorizontal(); instance.SetReloadTime(EditorGUILayout.FloatField(ContentProperties.ReloadTime, instance.GetReloadTime())); 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.GetReloadTime(), 0.01f), (x) => { instance.SetReloadTime(UMathf.AllocatePart((float)x)); }, clip.length); } menu.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); instance.SetEmptyReloadTime(EditorGUILayout.FloatField(ContentProperties.EmptyReloadTime, instance.GetEmptyReloadTime())); 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.GetEmptyReloadTime(), 0.01f), (x) => { instance.SetEmptyReloadTime(UMathf.AllocatePart((float)x)); }, clip.length); } menu.ShowAsContext(); } GUILayout.EndHorizontal(); } else { instance.SetReloadTime(EditorGUILayout.FloatField(ContentProperties.ReloadTime, instance.GetReloadTime())); instance.SetEmptyReloadTime(EditorGUILayout.FloatField(ContentProperties.EmptyReloadTime, instance.GetEmptyReloadTime())); } break; case WeaponReloadSystem.ReloadMode.Sequential: if (clips != null && clips.Length > 0) { GUILayout.BeginHorizontal(); instance.SetStartTime(EditorGUILayout.FloatField(ContentProperties.StartTime, instance.GetStartTime())); 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.GetStartTime(), 0.01f), (x) => { instance.SetStartTime(UMathf.AllocatePart((float)x)); }, clip.length); } menu.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); instance.SetIterationTime(EditorGUILayout.FloatField(ContentProperties.IterationTime, instance.GetIterationTime())); 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.GetIterationTime(), 0.01f), (x) => { instance.SetIterationTime(UMathf.AllocatePart((float)x)); }, clip.length); } menu.ShowAsContext(); } GUILayout.EndHorizontal(); } else { instance.SetStartTime(EditorGUILayout.FloatField(ContentProperties.StartTime, instance.GetStartTime())); instance.SetIterationTime(EditorGUILayout.FloatField(ContentProperties.IterationTime, instance.GetIterationTime())); } break; default: UEditorHelpBoxMessages.Message("Select some one ReloadType...", MessageType.Warning, true); break; } GUILayout.EndVertical(); EndBox(); if (GUI.changed) { clips = UEditorInternal.GetAllClips(instance.GetComponent <Animator>()); } }
public override void InitializeProperties() { clips = UEditorInternal.GetAllClips(instance.GetComponent <Animator>()); }
/// <summary> /// Create new weapon by properties. /// </summary> private static GameObject CreateFPWeapon(WeaponProperties properties) { // Initialize gameobjects. GameObject weapon = GameObject.Instantiate <GameObject>(properties.GetWeapon(), Vector3.zero, Quaternion.identity); weapon.name = properties.GetName(); weapon.tag = TNC.WEAPON; weapon.layer = LayerMask.NameToLayer(LNC.WEAPON); for (int i = 0, length = weapon.transform.childCount; i < length; i++) { weapon.transform.GetChild(i).gameObject.layer = LayerMask.NameToLayer(LNC.WEAPON); } // Initialize weapon components. Animator animator = UEditorInternal.AddComponent <Animator>(weapon); WeaponIdentifier weaponIdentifier = UEditorInternal.AddComponent <WeaponIdentifier>(weapon); WeaponAnimationSystem weaponAnimationSystem = UEditorInternal.AddComponent <WeaponAnimationSystem>(weapon); switch (properties.GetWeaponType()) { case WeaponProperties.Type.Gun: { WeaponShootingSystem weaponShootingSystem = UEditorInternal.AddComponent <WeaponShootingSystem>(weapon); WeaponReloadSystem weaponReloadSystem = UEditorInternal.AddComponent <WeaponReloadSystem>(weapon); break; } case WeaponProperties.Type.Melee: { WeaponMeleeSystem weaponMeleeSystem = UEditorInternal.AddComponent <WeaponMeleeSystem>(weapon); break; } case WeaponProperties.Type.Throw: { ThrowingWeaponSystem throwingWeaponSystem = UEditorInternal.AddComponent <ThrowingWeaponSystem>(weapon); WeaponReloadSystem weaponReloadSystem = UEditorInternal.AddComponent <WeaponReloadSystem>(weapon); break; } } AudioSource audioSource = UEditorInternal.AddComponent <AudioSource>(weapon); // Setup Animator component. if (properties.GetController() != null) { animator.runtimeAnimatorController = properties.GetController(); } // Setup WeaponID component. if (properties.GetWeaponID() != null) { weaponIdentifier.SetWeapon(properties.GetWeaponID()); } // Apply components position. UEditorInternal.MoveComponentBottom <Animator>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponIdentifier>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponAnimationSystem>(weapon.transform); switch (properties.GetWeaponType()) { case WeaponProperties.Type.Gun: { UEditorInternal.MoveComponentBottom <WeaponShootingSystem>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponReloadSystem>(weapon.transform); break; } case WeaponProperties.Type.Melee: { UEditorInternal.MoveComponentBottom <WeaponMeleeSystem>(weapon.transform); break; } case WeaponProperties.Type.Throw: { UEditorInternal.MoveComponentBottom <ThrowingWeaponSystem>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponReloadSystem>(weapon.transform); break; } } for (int i = 0, length = additionalComponents.Count; i < length; i++) { AdditionalComponents component = additionalComponents[i]; if (component.isActive) { weapon.AddComponent(component.component); } } UEditorInternal.MoveComponentBottom <AudioSource>(weapon.transform); return(weapon); }
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() { 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(); }
private static GameObject CreateAI(AIProperties properties) { // Instantiate AI object GameObject ai = GameObject.Instantiate(properties.GetModel(), Vector3.zero, Quaternion.identity); // Set tag and layer ai.name = properties.GetName(); ai.tag = TNC.AI; switch (properties.GetAIType()) { case AIProperties.AIType.AgainstAll: ai.layer = LayerMask.NameToLayer(LNC.AI); break; case AIProperties.AIType.Friendly: ai.layer = LayerMask.NameToLayer(LNC.AI_FRIENDLY); break; case AIProperties.AIType.Enemy: ai.layer = LayerMask.NameToLayer(LNC.AI_ENEMY); break; } // Set components Animator animator = ai.GetComponent <Animator>(); if (animator == null) { animator = ai.AddComponent <Animator>(); } if (properties.GetController() != null) { animator.runtimeAnimatorController = properties.GetController(); } AIController controller = ai.GetComponent <AIController>(); if (controller == null) { controller = ai.AddComponent <AIController>(); } AIHealth health = ai.GetComponent <AIHealth>(); if (health == null) { health = ai.AddComponent <AIHealth>(); } AIFieldOfView fieldOfView = ai.GetComponent <AIFieldOfView>(); if (fieldOfView == null) { fieldOfView = ai.AddComponent <AIFieldOfView>(); } AIAttackSystem attackSystem = ai.GetComponent <AIAttackSystem>(); if (attackSystem == null) { attackSystem = ai.AddComponent <AIAttackSystem>(); } AIReloadSystem reloadSystem = ai.GetComponent <AIReloadSystem>(); if (reloadSystem == null) { reloadSystem = ai.AddComponent <AIReloadSystem>(); } AIAnimatorHandler animatorHandler = ai.GetComponent <AIAnimatorHandler>(); if (animatorHandler == null) { animatorHandler = ai.AddComponent <AIAnimatorHandler>(); } CharacterRagdollSystem ragdollSystem = ai.GetComponent <CharacterRagdollSystem>(); if (ragdollSystem == null) { ragdollSystem = ai.AddComponent <CharacterRagdollSystem>(); } NavMeshAgent navMeshAgent = ai.GetComponent <NavMeshAgent>(); if (navMeshAgent == null) { navMeshAgent = ai.AddComponent <NavMeshAgent>(); } CapsuleCollider capsuleCollider = ai.GetComponent <CapsuleCollider>(); if (capsuleCollider == null) { capsuleCollider = ai.AddComponent <CapsuleCollider>(); } AudioSource audioSource = ai.GetComponent <AudioSource>(); if (audioSource == null) { audioSource = ai.AddComponent <AudioSource>(); } // Set component positions UEditorInternal.MoveComponentBottom <Animator>(ai.transform); UEditorInternal.MoveComponentBottom <AIController>(ai.transform); UEditorInternal.MoveComponentBottom <AIHealth>(ai.transform); UEditorInternal.MoveComponentBottom <AIFieldOfView>(ai.transform); UEditorInternal.MoveComponentBottom <AIAttackSystem>(ai.transform); UEditorInternal.MoveComponentBottom <AIReloadSystem>(ai.transform); UEditorInternal.MoveComponentBottom <AIAnimatorHandler>(ai.transform); UEditorInternal.MoveComponentBottom <CharacterRagdollSystem>(ai.transform); UEditorInternal.MoveComponentBottom <NavMeshAgent>(ai.transform); UEditorInternal.MoveComponentBottom <CapsuleCollider>(ai.transform); UEditorInternal.MoveComponentBottom <AudioSource>(ai.transform); // Set properties settings fieldOfView.SetTargetMask(properties.GetTargets()); fieldOfView.SetObstacleMask(properties.GetObstacles()); return(ai); }