Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using UnityEngine.AI;
- using System.Collections;
- using System.Collections.Generic;
- using BaseAssets.AI;
- using BaseAssets.Events;
- using BaseAssets.Debugger;
- using Sirenix.OdinInspector;
- namespace BaseAssets.Tools
- {
- [RequireComponent(typeof(AIDataHolder))]
- [RequireComponent(typeof(AIVisualDebugger))]
- public class SpawnManager : MonoBehaviour
- {
- [FoldoutGroup("Tool Settings"), PropertyOrder(0)]
- public bool showGizmoOnSelect = false;
- [FoldoutGroup("Tool Settings"), PropertyOrder(0)]
- public float gizmoScale = 1f;
- [HideInInspector] public bool gizmoInEditMode = false;
- [HideInInspector] public bool gizmoInPlayMode = false;
- [BoxGroup("SETUP"), PropertyOrder(1)]
- public Transform spawnTroopContainer = null;
- [BoxGroup("SETUP"), Required, PropertyOrder(1)]
- public GameObject troopPrefab = null;
- [BoxGroup("SETUP"), PropertyOrder(1)]
- public bool inheritFightingMode = true;
- [BoxGroup("SETUP"), PropertyOrder(2)]
- public List<FormationPlanner> formations = new List<FormationPlanner>();
- [FoldoutGroup("Overwrite"), PropertyOrder(1)]
- public bool OverwriteAIDataHolder = false;
- [FoldoutGroup("Overwrite"), ShowIf("OverwriteAIDataHolder"), PropertyOrder(1)]
- public List<SpawnManager> prioritizationData = new List<SpawnManager>();
- [FoldoutGroup("General Spawn Settings"), PropertyOrder(3)]
- public bool spawnOnStart = true;
- [FoldoutGroup("General Spawn Settings"), PropertyOrder(3)]
- public bool spawnAtTheSpot = false;
- [FoldoutGroup("General Spawn Settings"), PropertyOrder(3)]
- public bool updateWaypointHeight = false;
- [FoldoutGroup("General Spawn Settings"), ShowIf("@ (updateWaypointHeight) || (spawnAtTheSpot)"), PropertyOrder(3)]
- public LayerMask waypointHeightLayerMask;
- [FoldoutGroup("Enums"), PropertyOrder(4)]
- public SpawnType spawnType = SpawnType.SpawnAllAtOnce;
- [FoldoutGroup("Enums"), PropertyOrder(4)]
- public SpawnLocationType spawnLocationType = SpawnLocationType.SpecificLocations;
- [FoldoutGroup("Enums"), PropertyOrder(4)]
- public TargetingType targetingType = TargetingType.SphereCast;
- [FoldoutGroup("Enums"), PropertyOrder(4)]
- public EndlessTargetAxis endlessTargetAxis = EndlessTargetAxis.X_Axis;
- public enum SpawnType { SpawnAllAtOnce, SpawnInBurst, SpawnWithTimer, SpawnEndless }
- public enum SpawnLocationType { SpecificLocations, RandomArea }
- public enum TargetingType { SphereCast, BoxCast }
- public enum EndlessTargetAxis { X_Axis, Z_Axis }
- [TabGroup("Spawns", "Endless Spawn"), ShowIf("spawnType", SpawnType.SpawnEndless), PropertyOrder(5)]
- public int endlessTroopCountPerBurst = 1;
- [TabGroup("Spawns", "Endless Spawn"), ShowIf("spawnType", SpawnType.SpawnEndless), PropertyOrder(5)]
- public float endlessBurstDelay = 1;
- [TabGroup("Spawns", "Endless Spawn"), ShowIf("spawnType", SpawnType.SpawnEndless), PropertyOrder(5)]
- public float endlessBurstDelayInitial = 1;
- [TabGroup("Spawns", "Endless Spawn"), ShowIf("spawnType", SpawnType.SpawnEndless), PropertyOrder(5)]
- public float endlessDestroyTime = 0f;
- [TabGroup("Spawns", "Burst Spawn"), ShowIf("spawnType", SpawnType.SpawnInBurst), PropertyOrder(5)]
- public int burstCount = 1;
- [TabGroup("Spawns", "Burst Spawn"), ShowIf("spawnType", SpawnType.SpawnInBurst), PropertyOrder(5)]
- public float burstDelay = 1f;
- [TabGroup("Spawns", "Burst Spawn"), ShowIf("spawnType", SpawnType.SpawnInBurst), PropertyOrder(5)]
- public float burstSpawnDelayInitial = 0f;
- [TabGroup("Spawns", "Timer Spawn"), ShowIf("spawnType", SpawnType.SpawnWithTimer), PropertyOrder(5)]
- public float spawnDelayInitial = 0f;
- [TabGroup("Spawns", "Timer Spawn"), ShowIf("spawnType", SpawnType.SpawnWithTimer), PropertyOrder(5)]
- public float spawnDelayPerTroop = 0f;
- [TabGroup("Areas", "Endless Target Area"), ShowIf("spawnType", SpawnType.SpawnEndless), PropertyOrder(6)]
- public Vector3 endlessTargetAreaPosition = new Vector3();
- [TabGroup("Areas", "Endless Target Area"), ShowIf("spawnType", SpawnType.SpawnEndless), PropertyOrder(6)]
- public Vector3 endlessTargetAreaDimension = new Vector3();
- [TabGroup("Areas", "Spawn Area"), ShowIf("spawnLocationType", SpawnLocationType.RandomArea), PropertyOrder(6)]
- public Vector3 spawnAreaPosition = new Vector3();
- [TabGroup("Areas", "Spawn Area"), ShowIf("spawnLocationType", SpawnLocationType.RandomArea), PropertyOrder(6)]
- public Vector3 spawnAreaDimension = new Vector3();
- [TabGroup("Areas", "Spawn Area"), ShowIf("spawnLocationType", SpawnLocationType.SpecificLocations), PropertyOrder(6)]
- public List<GameObject> spawnLocations = new List<GameObject>();
- [TabGroup("Areas", "Box Cast Area"), ShowIf("targetingType", TargetingType.BoxCast), PropertyOrder(6)]
- public Vector3 attackTargetAreaPosition = new Vector3();
- [TabGroup("Areas", "Box Cast Area"), ShowIf("targetingType", TargetingType.BoxCast), PropertyOrder(6)]
- public Vector3 attackTargetAreaDimension = new Vector3();
- [FoldoutGroup("Automated Formation Settings"), PropertyOrder(7)]
- public bool automateFormationSwitch = false;
- [FoldoutGroup("Automated Formation Settings"), PropertyOrder(7)]
- public bool loopAutomation = false;
- [FoldoutGroup("Automated Formation Settings"), PropertyOrder(7)]
- public float automatedTime = 0f;
- [FoldoutGroup("Optional Compute Shaders"), PropertyOrder(8)]
- public ComputeShader findClosestCompute = null;
- [HideInInspector] public Transform endlessWaypointContainer = null;
- private Transform waypointContainer = null;
- private int formationIndex = 0;
- private int activeSpawnLocation = 0;
- private Coroutine BurstCoroutine = null;
- private Coroutine TimerCoroutine = null;
- private Coroutine BurstEndlessCoroutine = null;
- private Coroutine AutomatedFormationSwitchCoroutine = null;
- private void Start()
- {
- if (spawnTroopContainer == null)
- {
- spawnTroopContainer = new GameObject($"{transform.name}'s Troop Container").transform;
- DebugManager.SpawnContainerEmpty(gameObject);
- }
- if (spawnType == SpawnManager.SpawnType.SpawnEndless && endlessWaypointContainer == null)
- {
- endlessWaypointContainer = new GameObject($"{transform.name}'s Waypoint Container").transform;
- DebugManager.WaypointContainerEmpty(gameObject);
- }
- if (spawnOnStart)
- {
- Spawn();
- }
- if (automateFormationSwitch)
- {
- AutomatedFormationSwitchCoroutine = StartCoroutine(AutomatedFormationSwitch());
- }
- }
- public void CheckIfAllAtOrigin()
- {
- if (!inheritFightingMode) return;
- AIDataHolder[] datas = new AIDataHolder[spawnTroopContainer.childCount];
- for (int i = 0; i < spawnTroopContainer.childCount; i++)
- {
- AIDataHolder data = spawnTroopContainer.GetChild(i).GetComponent<AIDataHolder>();
- if (data && data.CurrentHealth > 0f)
- {
- datas[i] = data;
- }
- }
- bool isAllAtOrigin = true;
- for (int i = 0; i < datas.Length; i++)
- {
- if (datas[i] && datas[i].AtOrigin == false)
- {
- isAllAtOrigin = false;
- break;
- }
- }
- if (isAllAtOrigin)
- {
- if (!formations[formationIndex].isFormationMoverActive)
- {
- SetFightingMode(formations[formationIndex].fightingModeArrival);
- }
- }
- }
- public void Update()
- {
- if (updateWaypointHeight) UpdateWaypointHeightByRaycast();
- }
- // GIZMO ========================================================================================================================================================
- private void OnDrawGizmos()
- {
- if (DebugManager.DISABLE_GIZMOS) return;
- if (Application.isPlaying && !gizmoInPlayMode) return;
- if (!Application.isPlaying && !gizmoInEditMode) return;
- if (showGizmoOnSelect) return;
- DrawGizmo();
- }
- private void OnDrawGizmosSelected()
- {
- if (DebugManager.DISABLE_GIZMOS) return;
- if (Application.isPlaying && !gizmoInPlayMode) return;
- if (!Application.isPlaying && !gizmoInEditMode) return;
- if (!showGizmoOnSelect) return;
- DrawGizmo();
- }
- private void DrawGizmo()
- {
- if (spawnLocationType == SpawnLocationType.RandomArea)
- {
- Gizmos.color = Color.cyan;
- Gizmos.DrawWireCube(transform.position + spawnAreaPosition, spawnAreaDimension);
- if (spawnType == SpawnType.SpawnEndless)
- {
- Gizmos.color = Color.red;
- Gizmos.DrawWireCube(transform.position + endlessTargetAreaPosition, endlessTargetAreaDimension);
- }
- }
- else
- {
- if (spawnLocations != null && spawnLocations.Count > 0)
- {
- Gizmos.color = Color.cyan;
- for (int i = 0; i < spawnLocations.Count; i++)
- {
- Gizmos.DrawWireSphere(spawnLocations[i].transform.position, gizmoScale);
- }
- if (spawnType == SpawnType.SpawnEndless)
- {
- Gizmos.color = Color.red;
- Gizmos.DrawWireCube(transform.position + endlessTargetAreaPosition, endlessTargetAreaDimension);
- }
- }
- else
- {
- DebugManager.SpawnLocationsEmpty(gameObject);
- }
- }
- if (targetingType == TargetingType.BoxCast)
- {
- Gizmos.color = Color.blue;
- Gizmos.DrawWireCube(transform.position + attackTargetAreaPosition, attackTargetAreaDimension);
- }
- }
- // GIZMO ========================================================================================================================================================
- // FORMATION SWITCH =============================================================================================================================================
- private IEnumerator AutomatedFormationSwitch()
- {
- while (automateFormationSwitch)
- {
- yield return new WaitForSeconds(automatedTime);
- if (formationIndex + 1 >= formations.Count && loopAutomation)
- {
- SwitchToNextFormation();
- }
- else if (formationIndex + 1 < formations.Count)
- {
- SwitchToNextFormation();
- }
- }
- }
- public void SwitchFormation(int _formationIndex)
- {
- if (formations.Count <= 1)
- {
- DebugManager.NoFormationToSwitchTo(gameObject);
- return;
- }
- if (troopPrefab == null)
- {
- DebugManager.NoTroopPrefabSet(gameObject);
- return;
- }
- if (spawnTroopContainer == null)
- {
- DebugManager.NoTroopParentSet(gameObject);
- return;
- }
- DestroyAllWaypoints();
- List<Vector3> spawnPositions = formations[_formationIndex].GetActiveList();
- List<Transform> waypoints = CreateWaypoints(spawnPositions);
- for (int i = 0; i < spawnPositions.Count; i++)
- {
- if (i < spawnTroopContainer.childCount)
- {
- AIDataHolder troop = spawnTroopContainer.GetChild(i).GetComponent<AIDataHolder>();
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- if (inheritFightingMode) troop.fightingMode = formations[_formationIndex].fightingModeTransition;
- }
- else
- {
- AIDataHolder troop = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troop, spawnTroopContainer.GetChild(0).position);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- if (inheritFightingMode) troop.fightingMode = formations[_formationIndex].fightingModeTransition;
- }
- }
- if (EventHandler.onFormationSwitch != null) EventHandler.onFormationSwitch(this, formations[_formationIndex]);
- }
- private void SwitchToNextFormation()
- {
- if (formations.Count <= 1)
- {
- DebugManager.NoFormationToSwitchTo(gameObject);
- return;
- }
- if (troopPrefab == null)
- {
- DebugManager.NoTroopPrefabSet(gameObject);
- return;
- }
- if (spawnTroopContainer == null)
- {
- DebugManager.NoTroopParentSet(gameObject);
- return;
- }
- DestroyAllWaypoints();
- formationIndex++;
- if (formationIndex >= formations.Count)
- {
- formationIndex = 0;
- }
- List<Vector3> spawnPositions = formations[formationIndex].GetActiveList();
- List<Transform> waypoints = CreateWaypoints(spawnPositions);
- for (int i = 0; i < spawnPositions.Count; i++)
- {
- if (i < spawnTroopContainer.childCount)
- {
- AIDataHolder troop = spawnTroopContainer.GetChild(i).GetComponent<AIDataHolder>();
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- if (inheritFightingMode) troop.fightingMode = formations[formationIndex].fightingModeTransition;
- }
- else
- {
- AIDataHolder troop = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troop, spawnTroopContainer.GetChild(0).position);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- if (inheritFightingMode) troop.fightingMode = formations[formationIndex].fightingModeTransition;
- }
- }
- if (formations[formationIndex].pathCreator)
- {
- formations[formationIndex].isFormationMoverActive = true;
- }
- if (EventHandler.onFormationSwitch != null) EventHandler.onFormationSwitch(this, formations[formationIndex]);
- }
- // FORMATION SWITCH =============================================================================================================================================
- // SPAWN TYPES ==================================================================================================================================================
- private void SpawnAllAtOnce()
- {
- if (formations.Count == 0)
- {
- DebugManager.NoFormationAtAll(gameObject);
- return;
- }
- if (formations[formationIndex] == null)
- {
- DebugManager.MissingFormation(gameObject);
- return;
- }
- if (troopPrefab == null)
- {
- DebugManager.NoTroopPrefabSet(gameObject);
- return;
- }
- if (spawnTroopContainer == null)
- {
- DebugManager.NoTroopParentSet(gameObject);
- return;
- }
- List<Transform> waypoints = CreateWaypoints(formations[formationIndex].GetActiveList());
- for (int i = 0; i < formations[formationIndex].GetActiveList().Count; i++)
- {
- AIDataHolder troop = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troop, formations[formationIndex].GetActiveList()[i]);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- if (inheritFightingMode) troop.fightingMode = formations[formationIndex].fightingModeTransition;
- troop.transform.rotation = transform.rotation;
- ActivateNextSpawnLocation();
- if (EventHandler.onTroopSpawn != null) EventHandler.onTroopSpawn(troop);
- }
- if (formations[formationIndex].pathCreator)
- {
- formations[formationIndex].isFormationMoverActive = true;
- }
- if (EventHandler.onAllTroopsSpawned != null) EventHandler.onAllTroopsSpawned(this);
- }
- private IEnumerator SpawnInBurst()
- {
- if (formations.Count == 0)
- {
- DebugManager.NoFormationAtAll(gameObject);
- yield break;
- }
- if (formations[formationIndex] == null)
- {
- DebugManager.MissingFormation(gameObject);
- yield break;
- }
- if (troopPrefab == null)
- {
- DebugManager.NoTroopPrefabSet(gameObject);
- yield break;
- }
- if (spawnTroopContainer == null)
- {
- DebugManager.NoTroopParentSet(gameObject);
- yield break;
- }
- List<Vector3> spawnPositions = formations[formationIndex].GetActiveList();
- List<Transform> waypoints = CreateWaypoints(spawnPositions);
- yield return new WaitForSeconds(burstSpawnDelayInitial);
- int spawnPerBurst = spawnPositions.Count / burstCount;
- int spawnIndex = 0;
- for (int i = 0; i < burstCount; i++)
- {
- for (int k = 0; k < spawnPerBurst; k++)
- {
- AIDataHolder troop = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troop, spawnPositions[spawnIndex]);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[spawnIndex]);
- if (inheritFightingMode) troop.fightingMode = formations[formationIndex].fightingModeTransition;
- troop.transform.rotation = transform.rotation;
- if (EventHandler.onTroopSpawn != null) EventHandler.onTroopSpawn(troop);
- spawnIndex++;
- if (i == burstCount - 1 && k == spawnPerBurst - 1)
- {
- yield return new WaitForSeconds(burstDelay);
- ActivateNextSpawnLocation();
- int remainingTroopCount = spawnPositions.Count - spawnTroopContainer.childCount;
- for (int l = 0; l < remainingTroopCount; l++)
- {
- AIDataHolder troopRemainder = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troopRemainder, spawnPositions[spawnIndex]);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- troopRemainder.Reference.LocalBehaviour.SetupAI(this, waypoints[spawnIndex]);
- if (inheritFightingMode) troopRemainder.fightingMode = formations[formationIndex].fightingModeTransition;
- troopRemainder.transform.rotation = transform.rotation;
- if (EventHandler.onTroopSpawn != null) EventHandler.onTroopSpawn(troopRemainder);
- spawnIndex++;
- }
- }
- }
- yield return new WaitForSeconds(burstDelay);
- ActivateNextSpawnLocation();
- }
- if (formations[formationIndex].pathCreator)
- {
- formations[formationIndex].isFormationMoverActive = true;
- }
- if (EventHandler.onAllTroopsSpawned != null) EventHandler.onAllTroopsSpawned(this);
- }
- private IEnumerator SpawnTroopsWithTimer()
- {
- if (formations.Count == 0)
- {
- DebugManager.NoFormationAtAll(gameObject);
- yield break;
- }
- if (formations[formationIndex] == null)
- {
- DebugManager.MissingFormation(gameObject);
- yield break;
- }
- if (troopPrefab == null)
- {
- DebugManager.NoTroopPrefabSet(gameObject);
- yield break;
- }
- if (spawnTroopContainer == null)
- {
- DebugManager.NoTroopParentSet(gameObject);
- yield break;
- }
- List<Vector3> spawnPositions = formations[formationIndex].GetActiveList();
- List<Transform> waypoints = CreateWaypoints(spawnPositions);
- yield return new WaitForSeconds(spawnDelayInitial);
- for (int i = 0; i < spawnPositions.Count; i++)
- {
- AIDataHolder troop = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troop, spawnPositions[i]);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- if (inheritFightingMode) troop.fightingMode = formations[formationIndex].fightingModeTransition;
- troop.transform.rotation = transform.rotation;
- ActivateNextSpawnLocation();
- if (EventHandler.onTroopSpawn != null) EventHandler.onTroopSpawn(troop);
- yield return new WaitForSeconds(spawnDelayPerTroop);
- }
- if (formations[formationIndex].pathCreator)
- {
- formations[formationIndex].isFormationMoverActive = true;
- }
- if (EventHandler.onAllTroopsSpawned != null) EventHandler.onAllTroopsSpawned(this);
- }
- private IEnumerator SpawnInBurstEndless()
- {
- if (troopPrefab == null)
- {
- DebugManager.NoTroopPrefabSet(gameObject);
- yield break;
- }
- if (spawnTroopContainer == null)
- {
- DebugManager.NoTroopParentSet(gameObject);
- yield break;
- }
- yield return new WaitForSeconds(endlessBurstDelayInitial);
- while (spawnType == SpawnType.SpawnEndless && spawnLocationType == SpawnLocationType.RandomArea)
- {
- for (int i = 0; i < endlessTroopCountPerBurst; i++)
- {
- Transform spawnTransform = new GameObject(i.ToString()).transform;
- spawnTransform.rotation = transform.rotation;
- spawnTransform.SetParent(endlessWaypointContainer);
- AIDataHolder troop = Instantiate(troopPrefab, spawnTroopContainer).GetComponent<AIDataHolder>();
- SetPosition(troop, spawnTransform.position);
- if (OverwriteAIDataHolder) GetComponent<AIDataHolder>().CloneTo(troop);
- if (endlessTargetAxis == EndlessTargetAxis.X_Axis)
- {
- spawnTransform.position = GetTargetPositionByPercentage(troop.transform.position.x);
- }
- else
- {
- spawnTransform.position = GetTargetPositionByPercentage(troop.transform.position.z);
- }
- troop.Reference.LocalBehaviour.SetupAI(this, spawnTransform, true, endlessDestroyTime);
- troop.transform.rotation = transform.rotation;
- if (EventHandler.onTroopSpawn != null) EventHandler.onTroopSpawn(troop);
- }
- ActivateNextSpawnLocation();
- yield return new WaitForSeconds(endlessBurstDelay);
- }
- if (spawnType != SpawnType.SpawnEndless || spawnLocationType != SpawnLocationType.RandomArea)
- {
- DebugManager.EndlessSpawnError(gameObject);
- }
- if (formations[formationIndex].pathCreator)
- {
- formations[formationIndex].isFormationMoverActive = true;
- }
- if (EventHandler.onAllTroopsSpawned != null) EventHandler.onAllTroopsSpawned(this);
- }
- // SPAWN TYPES ==================================================================================================================================================
- // GUI ==========================================================================================================================================================
- [FoldoutGroup("Overwrite"), Button("Transfer Prefab Data"), ShowIf("OverwriteAIDataHolder"), PropertyOrder(1)]
- public void OverwritePrefabData()
- {
- AIDataHolder spawnerAIDataHolder = GetComponent<AIDataHolder>();
- troopPrefab.GetComponent<AIDataHolder>().CloneTo(spawnerAIDataHolder);
- if (prioritizationData.Count > 0)
- {
- spawnerAIDataHolder.OverwritePrioritizationData = true;
- spawnerAIDataHolder.prioritizationData = prioritizationData;
- }
- else
- {
- spawnerAIDataHolder.OverwritePrioritizationData = false;
- spawnerAIDataHolder.prioritizationData.Clear();
- }
- }
- [FoldoutGroup("Overwrite"), Button("Transfer Only Prioritization Data"), ShowIf("OverwriteAIDataHolder"), PropertyOrder(1)]
- public void OverwriteOnlyTargetData()
- {
- AIDataHolder spawnerAIDataHolder = GetComponent<AIDataHolder>();
- if (prioritizationData.Count > 0)
- {
- spawnerAIDataHolder.OverwritePrioritizationData = true;
- spawnerAIDataHolder.prioritizationData = prioritizationData;
- }
- else
- {
- spawnerAIDataHolder.OverwritePrioritizationData = false;
- spawnerAIDataHolder.prioritizationData.Clear();
- }
- }
- [FoldoutGroup("Overwrite"), Button("Transfer Data At Runtime"), ShowIf("OverwriteAIDataHolder"), PropertyOrder(1)]
- public void OverwriteDataAtRuntime()
- {
- if (!Application.isPlaying) return;
- AIDataHolder spawnerAIDataHolder = GetComponent<AIDataHolder>();
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- AIDataHolder target = spawnTroop.GetComponent<AIDataHolder>();
- System.Type type = typeof(AIDataHolder);
- foreach (System.Reflection.FieldInfo sourceField in type.GetFields())
- {
- if (sourceField.Name == "attackerList" || sourceField.Name == "Enemy" || sourceField.Name == "origin"
- || sourceField.Name == "currentMoveTo" || sourceField.Name == "Targeted" || sourceField.Name == "CurrentHealth"
- || sourceField.Name == "AtOrigin") continue;
- System.Reflection.FieldInfo targetField = type.GetField(sourceField.Name);
- targetField.SetValue(target, sourceField.GetValue(spawnerAIDataHolder));
- }
- }
- }
- public void SetFightingMode(AIDataHolder.FightingMode _newFightingMode)
- {
- if (!Application.isPlaying) return;
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- spawnTroop.GetComponent<AIDataHolder>().fightingMode = _newFightingMode;
- }
- }
- [FoldoutGroup("Debug"), Button("Passive"), PropertyOrder(7)]
- public void SetFightingModeToPassive()
- {
- if (!Application.isPlaying) return;
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- spawnTroop.GetComponent<AIDataHolder>().fightingMode = AIDataHolder.FightingMode.Passive;
- }
- }
- [FoldoutGroup("Debug"), Button("Aggressive"), PropertyOrder(7)]
- public void SetFightingModeToAggressive()
- {
- if (!Application.isPlaying) return;
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- spawnTroop.GetComponent<AIDataHolder>().fightingMode = AIDataHolder.FightingMode.Aggressive;
- }
- }
- [FoldoutGroup("Debug"), Button("Passive-Aggressive"), PropertyOrder(7)]
- public void SetFightingModeToPassiveAggressive()
- {
- if (!Application.isPlaying) return;
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- spawnTroop.GetComponent<AIDataHolder>().fightingMode = AIDataHolder.FightingMode.PassiveAggressive;
- }
- }
- [FoldoutGroup("Debug"), Button("Neutral"), PropertyOrder(7)]
- public void SetFightingModeToNeutral()
- {
- if (!Application.isPlaying) return;
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- spawnTroop.GetComponent<AIDataHolder>().fightingMode = AIDataHolder.FightingMode.Neutral;
- }
- }
- [FoldoutGroup("Debug"), Button("Spawn Troops"), PropertyOrder(7)]
- public void SpawnTroops()
- {
- if (!Application.isPlaying) return;
- StopCoroutines();
- DestroyAll();
- ResetValues();
- Spawn();
- }
- [FoldoutGroup("Debug"), Button("Remove Troops"), PropertyOrder(7)]
- public void RemoveTroops()
- {
- if (!Application.isPlaying) return;
- StopCoroutines();
- DestroyAll();
- ResetValues();
- }
- [FoldoutGroup("Debug"), Button("Switch To Next Formation"), PropertyOrder(7)]
- public void NextFormation()
- {
- if (!Application.isPlaying) return;
- if (automateFormationSwitch)
- {
- Debugger.DebugManager.SwitchFormationError(gameObject);
- return;
- }
- SwitchToNextFormation();
- }
- [FoldoutGroup("Debug"), Button("Reset Waypoints"), PropertyOrder(7)]
- public void ResetWaypoints()
- {
- if (!Application.isPlaying) return;
- ResetWaypointsToCurrentFormation();
- }
- // GUI ==========================================================================================================================================================
- // HELPER METHODS ===============================================================================================================================================
- public void SetState(AIStateKeeper.States _newState)
- {
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- spawnTroop.GetComponent<AILocalLogic>().SetState(_newState);
- }
- }
- private void SetPosition(AIDataHolder _data, Vector3 _position)
- {
- if (_data.troopType != AIDataHolder.TroopType.Static)
- _data.GetComponent<NavMeshAgent>().Warp(GetTroopPosition(_position));
- else
- _data.transform.position = GetTroopPosition(_position);
- }
- private void UpdateWaypointHeightByRaycast()
- {
- if (spawnType != SpawnType.SpawnEndless)
- {
- if (formations.Count > 0)
- {
- for (int i = 0; i < formations[formationIndex].GetActiveTroopListCount(); i++)
- {
- RaycastHit hit = new RaycastHit();
- if (Physics.Raycast(formations[formationIndex].GetActiveList()[i], Vector3.down, out hit, Mathf.Infinity, waypointHeightLayerMask))
- {
- waypointContainer.GetChild(i).transform.position = hit.point;
- }
- }
- }
- else
- {
- Debug.Log("No formation added to the formations list");
- }
- }
- else
- {
- for (int i = 0; i < endlessWaypointContainer.childCount; i++)
- {
- RaycastHit hit = new RaycastHit();
- Transform waypoint = endlessWaypointContainer.GetChild(i);
- if (Physics.Raycast(new Vector3(waypoint.position.x, endlessTargetAreaPosition.y, waypoint.position.z), Vector3.down, out hit, Mathf.Infinity, waypointHeightLayerMask))
- {
- waypoint.position = hit.point;
- }
- }
- }
- }
- private int GetActiveSpawnLocation()
- {
- return activeSpawnLocation;
- }
- private void SetActiveSpawnLocation(int _newSpawnLocation)
- {
- activeSpawnLocation = _newSpawnLocation;
- }
- private void ActivateNextSpawnLocation()
- {
- if (GetActiveSpawnLocation() + 1 >= spawnLocations.Count)
- {
- SetActiveSpawnLocation(0);
- }
- else
- {
- SetActiveSpawnLocation(GetActiveSpawnLocation() + 1);
- }
- }
- private Vector3 GetRandomLocationInArea(Vector3 _areaPosition, Vector3 _areaDimension)
- {
- return new Vector3(transform.position.x + _areaPosition.x + Random.Range(-_areaDimension.x / 2f, _areaDimension.x / 2f),
- transform.position.y + _areaPosition.y,
- transform.position.z + _areaPosition.z + Random.Range(-_areaDimension.z / 2f, _areaDimension.z / 2f));
- }
- private Vector3 GetSpawnLocation()
- {
- if (spawnLocationType == SpawnLocationType.RandomArea)
- {
- RaycastHit hit = new RaycastHit();
- if (Physics.Raycast(GetRandomLocationInArea(spawnAreaPosition, spawnAreaDimension), Vector3.down, out hit, Mathf.Infinity))
- {
- return hit.point;
- }
- else
- {
- return GetRandomLocationInArea(spawnAreaPosition, spawnAreaDimension);
- }
- }
- else
- {
- RaycastHit hit = new RaycastHit();
- if (Physics.Raycast(spawnLocations[GetActiveSpawnLocation()].transform.position, Vector3.down, out hit, Mathf.Infinity))
- {
- return hit.point;
- }
- else
- {
- return spawnLocations[GetActiveSpawnLocation()].transform.position;
- }
- }
- }
- private Vector3 GetTargetPositionByPercentage(float _troopPosition)
- {
- // X = ((Y - Z) / I) * 100f; To get the percentage from location
- // (((X / 100) * I) + Z) + targetMinLeft = Y; To get the location from percentage
- float spawnAreaPosition = 0f;
- float spawnAreaDimensionHalf = 0f;
- float targetAreaPosition = 0f;
- float targetAreaDimensionHalf = 0f;
- if (endlessTargetAxis == EndlessTargetAxis.X_Axis)
- {
- spawnAreaPosition = this.spawnAreaPosition.x + transform.position.x;
- spawnAreaDimensionHalf = spawnAreaDimension.x / 2f;
- targetAreaPosition = endlessTargetAreaPosition.x + transform.position.x;
- targetAreaDimensionHalf = endlessTargetAreaDimension.x / 2f;
- }
- else
- {
- spawnAreaPosition = this.spawnAreaPosition.z + transform.position.z;
- spawnAreaDimensionHalf = spawnAreaDimension.z / 2f;
- targetAreaPosition = endlessTargetAreaPosition.z + transform.position.z;
- targetAreaDimensionHalf = endlessTargetAreaDimension.z / 2f;
- }
- float minLeft = spawnAreaPosition - spawnAreaDimensionHalf;
- float maxRight = spawnAreaPosition + spawnAreaDimensionHalf;
- float zeroedRight = maxRight - minLeft;
- float zeroedPosition = _troopPosition - minLeft;
- float result = (zeroedPosition / zeroedRight) * 100f;
- float targetMinLeft = targetAreaPosition - targetAreaDimensionHalf;
- float targetMaxRight = targetAreaPosition + targetAreaDimensionHalf;
- float targetZeroedRight = targetMaxRight - targetMinLeft;
- float targetResult = (((result / 100f) * targetZeroedRight) + targetMinLeft);
- if (endlessTargetAxis == EndlessTargetAxis.X_Axis)
- {
- return new Vector3(targetResult,
- transform.position.y + endlessTargetAreaPosition.y,
- transform.position.z + endlessTargetAreaPosition.z + Random.Range(-endlessTargetAreaDimension.z / 2f, endlessTargetAreaDimension.z / 2f));
- }
- else
- {
- return new Vector3(transform.position.x + endlessTargetAreaPosition.x + Random.Range(-endlessTargetAreaDimension.x / 2f, endlessTargetAreaDimension.x / 2f),
- transform.position.y + endlessTargetAreaPosition.y,
- targetResult);
- }
- }
- private void DestroyAll()
- {
- if (spawnType == SpawnManager.SpawnType.SpawnEndless)
- {
- foreach (Transform waypoint in endlessWaypointContainer)
- {
- Destroy(waypoint.gameObject);
- }
- }
- else
- {
- DestroyAllWaypoints();
- }
- foreach (Transform spawnTroop in spawnTroopContainer)
- {
- Destroy(spawnTroop.gameObject);
- }
- }
- private void ResetValues()
- {
- formationIndex = 0;
- activeSpawnLocation = 0;
- }
- private List<Transform> CreateWaypoints(List<Vector3> _spawnPositions)
- {
- List<Transform> waypoints = new List<Transform>();
- for (int i = 0; i < _spawnPositions.Count; i++)
- {
- Transform waypoint = new GameObject(i.ToString()).transform;
- waypoint.position = _spawnPositions[i];
- if (formations[formationIndex].formationType == FormationPlanner.FormationType.Image ||
- formations[formationIndex].formationType == FormationPlanner.FormationType.Grid)
- {
- waypoint.rotation = Quaternion.LookRotation(formations[formationIndex].GetActiveDirection()[i], Vector3.up);
- }
- else
- {
- waypoint.rotation = formations[formationIndex].transform.rotation;
- }
- if (formations[formationIndex].pathCreator)
- {
- waypoint.SetParent(formations[formationIndex].pathCreator.transform);
- waypointContainer = formations[formationIndex].pathCreator.transform;
- }
- else if (!formations[formationIndex].pathCreator)
- {
- waypoint.SetParent(formations[formationIndex].transform);
- waypointContainer = formations[formationIndex].transform;
- }
- waypoints.Add(waypoint);
- }
- return waypoints;
- }
- private void DestroyAllWaypoints()
- {
- if (formations[formationIndex].pathCreator)
- {
- foreach (Transform waypoint in formations[formationIndex].pathCreator.transform)
- {
- Destroy(waypoint.gameObject);
- }
- }
- else
- {
- foreach (Transform waypoint in formations[formationIndex].transform)
- {
- Destroy(waypoint.gameObject);
- }
- }
- }
- private Vector3 GetTroopPosition(Vector3 _spawnPosition)
- {
- if (spawnAtTheSpot)
- {
- RaycastHit hit = new RaycastHit();
- if (Physics.Raycast(_spawnPosition, Vector3.down, out hit, Mathf.Infinity, waypointHeightLayerMask))
- {
- return hit.point;
- }
- return _spawnPosition;
- }
- else
- {
- return GetSpawnLocation();
- }
- }
- private void ResetWaypointsToCurrentFormation()
- {
- DestroyAllWaypoints();
- List<Vector3> spawnPositions = formations[formationIndex].GetActiveList();
- List<Transform> waypoints = CreateWaypoints(spawnPositions);
- for (int i = 0; i < spawnPositions.Count; i++)
- {
- if (i < spawnTroopContainer.childCount)
- {
- AIDataHolder troop = spawnTroopContainer.GetChild(i).GetComponent<AIDataHolder>();
- troop.Reference.LocalBehaviour.SetupAI(this, waypoints[i]);
- }
- }
- }
- public void SetReturnToOrigin(bool _returnToOrigin)
- {
- for (int i = 0; i < spawnTroopContainer.childCount; i++)
- {
- AIDataHolder troop = spawnTroopContainer.GetChild(i).GetComponent<AIDataHolder>();
- troop.ReturnToOrigin = _returnToOrigin;
- }
- }
- private void Spawn()
- {
- if (spawnType == SpawnType.SpawnAllAtOnce)
- {
- SpawnAllAtOnce();
- }
- else if (spawnType == SpawnType.SpawnInBurst)
- {
- BurstCoroutine = StartCoroutine(SpawnInBurst());
- }
- else if (spawnType == SpawnType.SpawnWithTimer)
- {
- TimerCoroutine = StartCoroutine(SpawnTroopsWithTimer());
- }
- else if (spawnType == SpawnType.SpawnEndless)
- {
- BurstEndlessCoroutine = StartCoroutine(SpawnInBurstEndless());
- }
- }
- private void StopCoroutines()
- {
- if (BurstCoroutine != null) StopCoroutine(BurstCoroutine);
- if (TimerCoroutine != null) StopCoroutine(TimerCoroutine);
- if (BurstEndlessCoroutine != null) StopCoroutine(BurstEndlessCoroutine);
- if (AutomatedFormationSwitchCoroutine != null) StopCoroutine(AutomatedFormationSwitchCoroutine);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement