From a6384f587ea97ec5a68e9e0bea72af70e78f7f23 Mon Sep 17 00:00:00 2001 From: James Frowen Date: Sat, 30 Apr 2022 15:24:50 +0100 Subject: [PATCH] refactor: adding sample code for custom character spawning --- Assets/Mirage/Samples~/SpawnCustomPlayer.meta | 8 ++ .../CreateMMOCharacterMessage.cs | 21 ++++ .../CreateMMOCharacterMessage.cs.meta | 11 ++ .../CustomCharacterSpawner.cs | 111 ++++++++++++++++++ .../CustomCharacterSpawner.cs.meta | 11 ++ .../Samples~/SpawnCustomPlayer/README.txt | 4 + 6 files changed, 166 insertions(+) create mode 100644 Assets/Mirage/Samples~/SpawnCustomPlayer.meta create mode 100644 Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs create mode 100644 Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs.meta create mode 100644 Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs create mode 100644 Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs.meta create mode 100644 Assets/Mirage/Samples~/SpawnCustomPlayer/README.txt diff --git a/Assets/Mirage/Samples~/SpawnCustomPlayer.meta b/Assets/Mirage/Samples~/SpawnCustomPlayer.meta new file mode 100644 index 00000000000..f6a53047d13 --- /dev/null +++ b/Assets/Mirage/Samples~/SpawnCustomPlayer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0e8104799e8a1dd44835f547c126915e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs b/Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs new file mode 100644 index 00000000000..8c85a65a899 --- /dev/null +++ b/Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs @@ -0,0 +1,21 @@ +using Mirage; +using UnityEngine; + +namespace Example.CustomCharacter +{ + [NetworkMessage] + public struct CreateMMOCharacterMessage + { + public Race race; + public string name; + public Color hairColor; + public Color eyeColor; + } + + public enum Race + { + Human, + Elvish, + Dwarvish, + } +} diff --git a/Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs.meta b/Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs.meta new file mode 100644 index 00000000000..1a8fd5d263f --- /dev/null +++ b/Assets/Mirage/Samples~/SpawnCustomPlayer/CreateMMOCharacterMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 140bd10938d80914fbc27023c951964c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs b/Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs new file mode 100644 index 00000000000..01523dc44ae --- /dev/null +++ b/Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs @@ -0,0 +1,111 @@ +using System.ComponentModel; +using Mirage; +using UnityEngine; + +namespace Example.CustomCharacter +{ + public class CustomCharacterSpawner : MonoBehaviour + { + [Header("References")] + public NetworkClient Client; + public NetworkServer Server; + public ClientObjectManager ClientObjectManager; + public ServerObjectManager ServerObjectManager; + + [Header("Prefabs")] + // different prefabs based on the Race the player picks + public CustomCharacter HumanPrefab; + public CustomCharacter ElvishPrefab; + public CustomCharacter DwarvishPrefab; + + public void Start() + { + Client.Started.AddListener(OnClientStarted); + Client.Authenticated.AddListener(OnClientAuthenticated); + Server.Started.AddListener(OnServerStarted); + } + + void OnClientStarted() + { + // make sure all prefabs are Register so mirage can spawn the character for this client and for other players + ClientObjectManager.RegisterPrefab(HumanPrefab.Identity); + ClientObjectManager.RegisterPrefab(ElvishPrefab.Identity); + ClientObjectManager.RegisterPrefab(DwarvishPrefab.Identity); + } + + // you can send the message here if you already know + // everything about the character at the time of player + // or at a later time when the user submits his preferences + void OnClientAuthenticated(INetworkPlayer player) + { + var mmoCharacter = new CreateMMOCharacterMessage + { + // populate the message with your data + name = "player name", + race = Race.Human, + eyeColor = Color.red, + hairColor = Color.black, + }; + player.Send(mmoCharacter); + } + + void OnServerStarted() + { + // wait for client to send us an AddPlayerMessage + Server.MessageHandler.RegisterHandler(OnCreateCharacter); + } + + void OnCreateCharacter(INetworkPlayer player, CreateMMOCharacterMessage msg) + { + CustomCharacter prefab = GetPrefab(msg); + + // create your character object + // use the data in msg to configure it + CustomCharacter character = Instantiate(prefab); + + // set syncVars before telling mirage to spawn character + // this will cause them to be sent to client in the spawn message + character.PlayerName = msg.name; + character.hairColor = msg.hairColor; + character.eyeColor = msg.eyeColor; + + // spawn it as the character object + ServerObjectManager.AddCharacter(player, character.Identity); + } + + CustomCharacter GetPrefab(CreateMMOCharacterMessage msg) + { + // get prefab based on race + CustomCharacter prefab; + switch (msg.race) + { + case Race.Human: prefab = HumanPrefab; break; + case Race.Elvish: prefab = ElvishPrefab; break; + case Race.Dwarvish: prefab = DwarvishPrefab; break; + // default case to check that client sent valid race. + // the only reason it should be invalid is if the client's code was modified by an attacker + // throw will cause the client to be kicked + default: throw new InvalidEnumArgumentException("Invalid race given"); + } + + return prefab; + } + } + public class CustomCharacter : NetworkBehaviour + { + [SyncVar] public string PlayerName; + [SyncVar] public Color hairColor; + [SyncVar] public Color eyeColor; + + private void Awake() + { + Identity.OnStartClient.AddListener(OnStartClient); + + } + + private void OnStartClient() + { + // use name and color syncvars to modify renderer settings + } + } +} diff --git a/Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs.meta b/Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs.meta new file mode 100644 index 00000000000..01043d7a755 --- /dev/null +++ b/Assets/Mirage/Samples~/SpawnCustomPlayer/CustomCharacterSpawner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4749a1afc6f213340a9ed469e3510fed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirage/Samples~/SpawnCustomPlayer/README.txt b/Assets/Mirage/Samples~/SpawnCustomPlayer/README.txt new file mode 100644 index 00000000000..3f83e921f5e --- /dev/null +++ b/Assets/Mirage/Samples~/SpawnCustomPlayer/README.txt @@ -0,0 +1,4 @@ +This Sample contains full scripts for the Custom Character Spawning guide. + +See the guide here: +https://miragenet.github.io/Mirage/Articles/Guides/GameObjects/SpawnPlayerCustom.html \ No newline at end of file