using RebootKit.Engine.Main; using RebootKit.Engine.Simulation; using TriInspector; using UnityEngine; using UnityEngine.AddressableAssets; using Logger = RebootKit.Engine.Foundation.Logger; namespace RebootReality.jelycho.Actors { public class ActorSpawner : Actor { static readonly Logger s_Logger = new Logger(nameof(ActorSpawner)); [SerializeField] AssetReferenceGameObject m_ActorPrefabReference; [SerializeField, Range(1, 256)] int m_Count = 1; [InfoBox("If empty will use this object transform as spawn point.")] [SerializeField] Transform[] m_SpawnPoints; protected override IActorData CreateActorData() { return new NoActorData(); } protected override void OnActorCommandServer(ulong senderID, ActorCommand actorCommand) { base.OnActorCommandServer(senderID, actorCommand); s_Logger.Info("Received actor command: " + actorCommand.CommandID); ActorSpawnerCommands spawnerCommand = (ActorSpawnerCommands) actorCommand.CommandID; if (spawnerCommand == ActorSpawnerCommands.SpawnActor) { for (int i = 0; i < m_Count; ++i) { (Vector3 spawnPoint, Quaternion spawnRotation) = GetSpawnPoint(); RR.SpawnActor(m_ActorPrefabReference, spawnPoint, spawnRotation); } } } [Button] public void SpawnActor() { if (m_ActorPrefabReference == null) { s_Logger.Error("ActorPrefabReference is not set. Cannot spawn actor."); return; } SendActorCommand((byte) ActorSpawnerCommands.SpawnActor); } (Vector3, Quaternion) GetSpawnPoint() { if (m_SpawnPoints.Length == 0) { return (transform.position, transform.rotation); } int index = Random.Range(0, m_SpawnPoints.Length); return (m_SpawnPoints[index].position, m_SpawnPoints[index].rotation); } } public enum ActorSpawnerCommands : byte { None = 0x00, SpawnActor = 0x01, } }