using UnityEngine; namespace Passer.Humanoid { /// /// Component for spawning humanoids /// public class HumanoidSpawner : Spawner { protected HumanoidControl[] spawnedHumanoids; protected static int nHumanoids; protected override void Start() { if (spawnAtStart) SpawnHumanoid(); } /// /// Spawn one humanoid using the HumanoidSpawner settings. /// /// The HumanoidControl of the spawned humanoid. Will be null when the humanoid could be not spawned. public override GameObject SpawnObject() { HumanoidControl humanoidPrefab = prefab.GetComponent(); if (humanoidPrefab == null) { Debug.LogError("The prefab is not an Humanoid."); return null; } HumanoidControl humanoid = Spawn(humanoidPrefab, spawnPoints, spawnMethod); if (humanoid == null) return null; return humanoid.gameObject; } /// /// Spawn one humanoid using the HumanoidSpawner settings. /// /// The HumanoidControl of the spawned humanoid. Will be null when the humanoid could be not spawned. public virtual HumanoidControl SpawnHumanoid() { HumanoidControl humanoid = prefab.GetComponent(); if (humanoid == null) { Debug.LogError("The prefab is not an Humanoid."); return null; } return Spawn(humanoid, spawnPoints, spawnMethod); } /// /// Spawn a humanoid /// /// The humanoid prefab to spawn. /// The HumanoidControl of the spawned humanoid. Will be null when the humanoid could be not spawned. public virtual HumanoidControl Spawn(HumanoidControl humanoidPrefab) { return Spawn(humanoidPrefab, spawnPoints, spawnMethod); } /// /// Spawn a humanoid. /// /// The humanoid prefab to spawn. /// The array of possible spawn points. /// The SpawnMethod to use for spawning. /// The HumanoidControl of the spawned humanoid. Will be null when the humanoid could be not spawned. public HumanoidControl Spawn(HumanoidControl humanoidPrefab, SpawnPoint[] spawnPoints, SpawnMethod spawnMethod = SpawnMethod.RoundRobin) { if (humanoidPrefab == null || (spawnMethod == SpawnMethod.SinglePlayer && nHumanoids > 0)) return null; GameObject newPlayer = null; SpawnPoint spawnPoint = ChooseSpawnPoint(spawnPoints, spawnMethod); if (spawnPoint == null) { Debug.Log("Could not find an empty SpawnPoint"); return null; } else { // No need to check for networking, this is handles by HumanoidNetworking newPlayer = Instantiate(humanoidPrefab.gameObject, spawnPoint.transform.position, spawnPoint.transform.rotation); } HumanoidControl humanoid = newPlayer.GetComponent(); if (humanoid == null) { humanoid = AddHumanoidToAvatar(newPlayer); if (humanoid == null) { Debug.LogError("Avatar is not a Humanoid!"); return null; } } return humanoid; } protected int FindSpawnPointIndex() { for (int i = 0; i < spawnPoints.Length; i++) { int spawnPointIndex = GetSpawnPointIndex(); if (spawnPoints[spawnPointIndex] is HumanoidSpawnPoint) { if (((HumanoidSpawnPoint)spawnPoints[spawnPointIndex]).isFree) return spawnPointIndex; } else return spawnPointIndex; } return -1; } private int GetSpawnPointIndex() { if (spawnPoints.Length <= 0) return -1; switch (spawnMethod) { case SpawnMethod.RoundRobin: return spawnIndex++ & spawnPoints.Length; case SpawnMethod.Random: default: return Random.Range(0, spawnPoints.Length - 1); } } protected void DestroyHumanoid(HumanoidControl humanoid) { Destroy(humanoid.gameObject); } protected static HumanoidControl AddHumanoidToAvatar(GameObject avatar) { Animator animator = avatar.GetComponent(); if (animator == null || !animator.isHuman) return null; HumanoidControl humanoid = avatar.AddComponent(); return humanoid; } } }