public Actor Spawn(ActorSpawnTag tag, object outer, SpawnParameters spawnArgs) { if (tag.type == null) { throw new Exception("ActorSpawnTag cannot load type: " + tag.typeName); } else { int classID = SerializableObject.StaticClassIDSlow(tag.type); return(InternalSpawn(tag, tag.type, classID, outer, spawnArgs)); } }
Actor InternalSpawn(ActorSpawnTag tag, Type type, int classID, object outer, SpawnParameters spawnArgs) { var actor = _objectFactory.NewObject(classID) as Actor; if ((actor == null) || !type.IsAssignableFrom(actor.GetType())) { throw new ObjectStaticClassMismatchException(type.FullName + " has a bad static class id!"); } if (tag != null) { actor.SetReplicates(tag.replicates); actor.SetSpawnTagID((ushort)tag.spawnID); } actor.SetWorld(this); if (actor.replicates && (this is Server.ServerWorld)) { actor.SetNetID(GetNextNetID()); actor.SetRemoteRole(ERemoteRole.Authority); _replicatedActors.Add(actor.netIDHashCode, actor); _replicatedObjects.Add(actor.netIDHashCode, actor); } _actors.Add(actor); if (spawnArgs.preConstruct != null) { spawnArgs.preConstruct(actor); } actor.PreConstruct(outer); actor.Construct(); actor.PostConstruct(); if (_didLevelStart) { actor.OnLevelStart(); } return(actor); }
public static void DrawSpawnTagInspectorGUI(ActorSpawnTag tag) { GUI.enabled = false; EditorGUILayout.IntField("SpawnId", tag.spawnID); var changed = false; GUI.enabled = !tag.typeIsReadOnly; var typeName = ClassDropDownHelper <T> .ShowClassDropDown("Actor Class", tag.typeName); if (tag.typeName != typeName) { tag.typeName = typeName; changed = true; } GUI.enabled = !tag.replicatesIsReadOnly; var replicates = EditorGUILayout.Toggle("Replicates", tag.replicates); if (tag.replicates != replicates) { tag.replicates = replicates; changed = true; } GUI.enabled = !tag.staticSpawnIsReadOnly; var staticSpawn = EditorGUILayout.Toggle("Static", tag.staticSpawn); if (tag.staticSpawn != staticSpawn) { tag.staticSpawn = staticSpawn; changed = true; } GUI.enabled = true; if (changed) { EditorUtility.SetDirty(tag); } }