diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..503cd9e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,19 @@ +name: CI +on: + push: + branches: + - main +jobs: + split-upm: + name: split upm branch + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: split upm branch + run: | + git subtree split -P "$PKG_ROOT" -b upm + git push -u origin upm + env: + PKG_ROOT: TestVelGameServer\Packages\VelNetUnity \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5b430f0 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# VelNetUnity +Custom networking package for Unity + +![VelNet Logo](velnet_logo.png) +--- + +See [VelNetServer](https://github.com/velaboratory/VelNetServer) for description of the server. + +By contrast to the server, the Unity side is pretty complex. + +### NetworkManager +Deals with instantiating NetworkPlayers, and dealing with join, left, new master client events. Also manages the list of NetworkObjects. It maintains a list of prefabs that can be instantiated, as well as the prefab to use for players. + +### NetworkPlayer +One of these will be instantiated for each player that joins the "room". Most application communication happens by calling methods on this object. Voice comms are also handled within this object. Only one NetworkPlayer "isLocal". The others are remote. The local network player is the one that can modify it's "owned" network objects. It also has a special networkobject representing itself (setup within the prefab, not part of the networkmanager list). This is where most of the user behavior is going to go (e.g. an avatar). + +### NetworkObject +Something that can be owned by a network player, who is responsible for updating it. Only the owner network player can/should modify a network object, whether locally or in response to a received message from the local version. NetworkObjects are delineated by an session-unique id, which consists of the creator's userid + "-" + an increasing number designated by the creator. Only local NetworkPlayers should send instantiate message, which contain this id. This class should be extended to sync and send messages. Scenes are basically built from NetworkObjects. Scene's can also start with network objects. Those are known by all, and start with "-1-increasing". That should happen the same on all clients, and is done locally at the start of the networkmanager. An example of a NetworkObject is SyncTransform, which is a simple one that keeps an object's position and orientation synchronized. + +### Ownership +Ownership of objects changes regularly. Any local networkplayer can send a message to take ownership of a networkid. That client immediately assumes ownership. The message is sent to the network, and will be ordered with any other ownership messages. So, if two clients try to get ownership at the same time, both will assume ownership, but one will happen after the other. This means that the one who was first will quickly lose ownership. + +### Joining +An interesting problem is what to do when new clients join. This is partially left up to the developer. Any objects that are instantiated (or scene objects that are deleted) will be automatically handled. + +### Message Groups +Clients can manage network traffic using messaging groups. This is especially useful for audio, where you can maintain a list of people close enough to you to hear audio + + + diff --git a/README.txt b/README.txt deleted file mode 100644 index 3704a41..0000000 --- a/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -See VelNet for description of the server. - -By contrast to the server, the Unity side is pretty complex. - -NetworkManager - Deals with instantiating NetworkPlayers, and dealing with join, left, new master client events. Also manages the list of NetworkObjects. It maintains a list of prefabs that can be instantiated, as well as the prefab to use for players. - -NetworkPlayer - One of these will be instantiated for each player that joins the "room". Most application communication happens by calling methods on this object. Voice comms are also handled within this object. Only one NetworkPlayer "isLocal". The others are remote. The local network player is the one that can modify it's "owned" network objects. It also has a special networkobject representing itself (setup within the prefab, not part of the networkmanager list). This is where most of the user behavior is going to go (e.g. an avatar). - -NetworkObject - Something that can be owned by a network player, who is responsible for updating it. Only the owner network player can/should modify a network object, whether locally or in response to a received message from the local version. NetworkObjects are delineated by an session-unique id, which consists of the creator's userid + "-" + an increasing number designated by the creator. Only local NetworkPlayers should send instantiate message, which contain this id. This class should be extended to sync and send messages. Scenes are basically built from NetworkObjects. Scene's can also start with network objects. Those are known by all, and start with "-1-increasing". That should happen the same on all clients, and is done locally at the start of the networkmanager. An example of a NetworkObject is SyncTransform, which is a simple one that keeps an object's position and orientation synchronized. - -Ownership of objects changes regularly. Any local networkplayer can send a message to take ownership of a networkid. That client immediately assumes ownership. The message is sent to the network, and will be ordered with any other ownership messages. So, if two clients try to get ownership at the same time, both will assume ownership, but one will happen after the other. This means that the one who was first will quickly lose ownership. - -An interesting problem is what to do when new clients join. This is partially left up to the developer. Any objects that are instantiated (or scene objects that are deleted) will be automatically handled. - -Clients can manage network traffic using messaging groups. This is especially useful for audio, where you can maintain a list of people close enough to you to hear audio - - - diff --git a/TestVelGameServer/.gitignore b/TestVelGameServer/.gitignore index 7a5cd83..4a412d2 100644 --- a/TestVelGameServer/.gitignore +++ b/TestVelGameServer/.gitignore @@ -69,4 +69,6 @@ crashlytics-build.properties # Temporary auto-generated Android Assets /[Aa]ssets/[Ss]treamingAssets/aa.meta -/[Aa]ssets/[Ss]treamingAssets/aa/* \ No newline at end of file +/[Aa]ssets/[Ss]treamingAssets/aa/* + +.idea/ diff --git a/TestVelGameServer/Assets/Scenes.meta b/TestVelGameServer/Assets/Samples.meta similarity index 77% rename from TestVelGameServer/Assets/Scenes.meta rename to TestVelGameServer/Assets/Samples.meta index 524fd07..5c27ab4 100644 --- a/TestVelGameServer/Assets/Scenes.meta +++ b/TestVelGameServer/Assets/Samples.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 867c77c74f84b41acb49da778488a75f +guid: b52a74ceb5dcd9d498e95617f4247a27 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/TestVelGameServer/Assets/VelGameServer.meta b/TestVelGameServer/Assets/Samples/VelNetUnity.meta similarity index 77% rename from TestVelGameServer/Assets/VelGameServer.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity.meta index 7596b48..1c140ce 100644 --- a/TestVelGameServer/Assets/VelGameServer.meta +++ b/TestVelGameServer/Assets/Samples/VelNetUnity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 09c6fdabe05be4c86917b1c585ed4a40 +guid: 8b822dd2b9e99144097e61694b8dab65 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0.meta similarity index 77% rename from TestVelGameServer/Assets/VelGameServer/DissonanceIntegration.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0.meta index da5ee29..e3997f7 100644 --- a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration.meta +++ b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 21c2212b420fd48a1b3552af8d219f80 +guid: 14a35ccfe945cc54292ca4e8940b53b9 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration.meta new file mode 100644 index 0000000..a13368f --- /dev/null +++ b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c506b9118efc2de4ea5f2b2f26a52b9d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelAudioMixer.mixer b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelAudioMixer.mixer similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelAudioMixer.mixer rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelAudioMixer.mixer diff --git a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelAudioMixer.mixer.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelAudioMixer.mixer.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelAudioMixer.mixer.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelAudioMixer.mixer.meta diff --git a/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelCommsNetwork.cs b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelCommsNetwork.cs new file mode 100644 index 0000000..a862aa6 --- /dev/null +++ b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelCommsNetwork.cs @@ -0,0 +1,94 @@ +using System; +using Dissonance; +using Dissonance.Networking; +using UnityEngine; + + +namespace VelNetUnity +{ + public class VelCommsNetwork : MonoBehaviour, ICommsNetwork + { + public ConnectionStatus Status => manager.connected ? ConnectionStatus.Connected : ConnectionStatus.Disconnected; + public NetworkMode Mode => NetworkMode.Client; + + public event Action ModeChanged; + public event Action PlayerJoined; + public event Action PlayerLeft; + public event Action VoicePacketReceived; + public event Action TextPacketReceived; + public event Action PlayerStartedSpeaking; + public event Action PlayerStoppedSpeaking; + public event Action PlayerEnteredRoom; + public event Action PlayerExitedRoom; + + ConnectionStatus _status = ConnectionStatus.Disconnected; + CodecSettings initSettings; + public string dissonanceId; + public DissonanceComms comms; + public NetworkManager manager; + + public Action> voiceQueued = delegate { }; //listen to this if you want to send voice + + public void Initialize(string playerName, Rooms rooms, PlayerChannels playerChannels, RoomChannels roomChannels, CodecSettings codecSettings) + { + dissonanceId = playerName; + initSettings = codecSettings; + comms.ResetMicrophoneCapture(); + } + + public void voiceReceived(string sender, byte[] data) + { + uint sequenceNumber = BitConverter.ToUInt32(data, 0); + VoicePacket vp = new VoicePacket(sender, ChannelPriority.Default, 1, true, new ArraySegment(data, 4, data.Length - 4), sequenceNumber); + VoicePacketReceived(vp); + } + + public void SendText(string data, ChannelType recipientType, string recipientId) + { + Debug.Log("sending text"); + } + + public void SendVoice(ArraySegment data) + { + voiceQueued(data); + } + + // Start is called before the first frame update + void Start() + { + _status = ConnectionStatus.Connected; + comms = GetComponent(); + } + + public void playerJoined(string id) + { + Debug.Log("dissonance player joined"); + PlayerJoined(id, initSettings); + RoomEvent re = new RoomEvent(); + re.Joined = true; + re.Room = "Global"; + re.PlayerName = id; + PlayerEnteredRoom(re); + } + + public void playerLeft(string id) + { + RoomEvent re = new RoomEvent(); + re.Joined = false; + re.Room = "Global"; + re.PlayerName = id; + PlayerExitedRoom(re); + PlayerLeft(id); + } + + public void playerStartedSpeaking(string id) + { + PlayerStartedSpeaking(id); + } + + public void playerStoppedSpeaking(string id) + { + PlayerStoppedSpeaking(id); + } + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelCommsNetwork.cs.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelCommsNetwork.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelCommsNetwork.cs.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Dissonance Integration/VelCommsNetwork.cs.meta diff --git a/TestVelGameServer/Assets/VelGameServer/Example.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example.meta similarity index 77% rename from TestVelGameServer/Assets/VelGameServer/Example.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example.meta index 5de344a..43f3286 100644 --- a/TestVelGameServer/Assets/VelGameServer/Example.meta +++ b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2fc687ece57d64c7082cd32261ac438b +guid: 07900994db5c50c4794e338da120f31b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/NetworkGUI.cs b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/NetworkGUI.cs new file mode 100644 index 0000000..c781ba4 --- /dev/null +++ b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/NetworkGUI.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace VelNetUnity +{ + public class NetworkGUI : MonoBehaviour + { + public NetworkManager networkManager; + public InputField userInput; + public InputField sendInput; + public InputField roomInput; + public Text messages; + public List messageBuffer; + public Dropdown microphones; + Dissonance.DissonanceComms comms; + + public void handleSend() + { + if (sendInput.text != "") + { + networkManager.sendTo(NetworkManager.MessageType.OTHERS, sendInput.text); + } + } + + public void handleLogin() + { + if (userInput.text != "") + { + networkManager.login(userInput.text, "nopass"); + } + } + + public void handleJoin() + { + if (roomInput.text != "") + { + networkManager.join(roomInput.text); + } + } + + // Start is called before the first frame update + void Start() + { + comms = FindObjectOfType(); + microphones.AddOptions(new List(Microphone.devices)); + networkManager.messageReceived += (m) => + { + string s = m.type + ":" + m.sender + ":" + m.text; + messageBuffer.Add(s); + messages.text = ""; + + + if (messageBuffer.Count > 10) + { + messageBuffer.RemoveAt(0); + } + + for (int i = 0; i < messageBuffer.Count; i++) + { + messages.text = messages.text + messageBuffer[i] + "\n"; + } + }; + } + + public void handleMicrophoneSelection() + { + comms.MicrophoneName = microphones.options[microphones.value].text; + } + + // Update is called once per frame + void Update() + { + } + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/Example/NetworkGUI.cs.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/NetworkGUI.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/NetworkGUI.cs.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/NetworkGUI.cs.meta diff --git a/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerController.cs b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerController.cs new file mode 100644 index 0000000..5574949 --- /dev/null +++ b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerController.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Dissonance; +using System.Text; + +namespace VelNetUnity +{ + public class PlayerController : NetworkObject, IDissonancePlayer + { + VelCommsNetwork comms; + bool isSpeaking = false; + uint lastAudioId = 0; + + public string dissonanceID = ""; + + //required by dissonance for spatial audio + public string PlayerId => dissonanceID; + public Vector3 Position => transform.position; + public Quaternion Rotation => transform.rotation; + public NetworkPlayerType Type => owner.isLocal ? NetworkPlayerType.Local : NetworkPlayerType.Remote; + public bool IsTracking => true; + + public Vector3 targetPosition; + public Quaternion targetRotation; + + public List closePlayers = new List(); + + + public byte[] getSyncMessage() + { + float[] data = new float[7]; + for (int i = 0; i < 3; i++) + { + data[i] = transform.position[i]; + data[i + 3] = transform.rotation[i]; + } + + data[6] = transform.rotation[3]; + + byte[] toReturn = new byte[sizeof(float) * data.Length]; + Buffer.BlockCopy(data, 0, toReturn, 0, toReturn.Length); + return toReturn; + } + + public override void handleMessage(string identifier, byte[] message) + { + switch (identifier) + { + case "s": //sync message + float[] data = new float[7]; + Buffer.BlockCopy(message, 0, data, 0, message.Length); + for (int i = 0; i < 3; i++) + { + targetPosition[i] = data[i]; + targetRotation[i] = data[i + 3]; + } + + targetRotation[3] = data[6]; + break; + case "a": //audio data + { + if (isSpeaking) + { + comms.voiceReceived(dissonanceID, message); + } + + break; + } + case "d": //dissonance id (player joined) + { + if (dissonanceID == "") //I don't have this yet + { + dissonanceID = Encoding.UTF8.GetString(message); + //tell the comms network that this player joined the channel + comms.playerJoined(dissonanceID); //tell dissonance + comms.comms.TrackPlayerPosition(this); //tell dissonance to track the remote player + } + + break; + } + case "x": //speaking state + { + if (message[0] == 0) + { + comms.playerStoppedSpeaking(dissonanceID); + isSpeaking = false; + } + else + { + comms.playerStartedSpeaking(dissonanceID); + isSpeaking = true; + } + + break; + } + } + } + + // Start is called before the first frame update + void Start() + { + //handle dissonance stuff + comms = FindObjectOfType(); + if (comms != null) + { + if (owner.isLocal) + { + setDissonanceID(comms.dissonanceId); + comms.voiceQueued += sendVoiceData; + + //we also need to know when other players join, so we can send the dissonance ID again + + owner.manager.onPlayerJoined += (player) => + { + byte[] b = Encoding.UTF8.GetBytes(dissonanceID); + owner.sendMessage(this, "d", b); + }; + owner.manager.setupMessageGroup("close", closePlayers.ToArray()); + } + } + + if (owner.isLocal) + { + StartCoroutine(syncBehavior()); + } + } + + void sendVoiceData(ArraySegment data) + { + //need to send it + if (owner != null && owner.isLocal) + { + byte[] toSend = new byte[data.Count + 4]; + byte[] lastAudioIdBytes = BitConverter.GetBytes(lastAudioId++); + Buffer.BlockCopy(lastAudioIdBytes, 0, toSend, 0, 4); + Buffer.BlockCopy(data.Array, data.Offset, toSend, 4, data.Count); + owner.sendGroupMessage(this, "close", "a", toSend, false); //send voice data unreliably + } + } + + public void setDissonanceID(string id) //this sort of all initializes dissonance + { + dissonanceID = id; + byte[] b = Encoding.UTF8.GetBytes(dissonanceID); + owner.sendMessage(this, "d", b); + comms.comms.TrackPlayerPosition(this); + } + + void voiceInitialized(string id) + { + dissonanceID = id; + } + + void OnDestroy() + { + comms.playerLeft(dissonanceID); + } + + + IEnumerator syncBehavior() + { + while (true) + { + owner.sendMessage(this, "s", getSyncMessage()); + yield return new WaitForSeconds(.1f); + } + } + + // Update is called once per frame + void Update() + { + if (owner != null && owner.isLocal) + { + PlayerController[] players = FindObjectsOfType(); + bool shouldUpdate = false; + for (int i = 0; i < players.Length; i++) + { + if (players[i] == this) + { + continue; + } + + float dist = Vector3.Distance(players[i].transform.position, transform.position); + if (dist < 2 && !closePlayers.Contains(players[i].owner.userid)) + { + closePlayers.Add(players[i].owner.userid); + shouldUpdate = true; + } + else if (dist >= 2 && closePlayers.Contains(players[i].owner.userid)) + { + closePlayers.Remove(players[i].owner.userid); + shouldUpdate = true; + } + } + + if (shouldUpdate) + { + owner.manager.setupMessageGroup("close", closePlayers.ToArray()); + } + } + + + if (owner != null && !owner.isLocal) + { + transform.position = Vector3.Lerp(transform.position, targetPosition, .1f); + transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, .1f); + } + else if (owner != null && owner.isLocal) + { + //handle dissonance comms + + //if we're not speaking, and the comms say we are, send a speaking event, which will be received on other network players and sent to their comms accordingly + if (comms.comms.FindPlayer(dissonanceID).IsSpeaking != isSpeaking) //unfortunately, there does not seem to be an event for this + { + isSpeaking = !isSpeaking; + byte[] toSend = new byte[1]; + toSend[0] = isSpeaking ? (byte)1 : (byte)0; + owner.sendMessage(this, "x", toSend); + + if (!isSpeaking) + { + lastAudioId = 0; + } + } + + + Vector3 movement = new Vector3(); + movement.x += Input.GetAxis("Horizontal"); + movement.y += Input.GetAxis("Vertical"); + movement.z = 0; + transform.Translate(movement * Time.deltaTime); + + if (Input.GetKeyDown(KeyCode.Space)) + { + owner.networkInstantiate("TestNetworkedGameObject"); + } + + if (Input.GetKeyDown(KeyCode.BackQuote)) + { + foreach (KeyValuePair kvp in owner.manager.objects) + { + owner.takeOwnership(kvp.Key); + } + } + + if (Input.GetKeyDown(KeyCode.Backspace)) + { + foreach (KeyValuePair kvp in owner.manager.objects) + { + owner.networkDestroy(kvp.Key); + } + } + } + } + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerController.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerController.cs.meta diff --git a/TestVelGameServer/Assets/VelGameServer/Example/PlayerPrefab.prefab b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerPrefab.prefab similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/PlayerPrefab.prefab rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerPrefab.prefab diff --git a/TestVelGameServer/Assets/VelGameServer/Example/PlayerPrefab.prefab.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerPrefab.prefab.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/PlayerPrefab.prefab.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/PlayerPrefab.prefab.meta diff --git a/TestVelGameServer/Assets/VelGameServer/Example/TestNetworkedGameObject.prefab b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/TestNetworkedGameObject.prefab similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/TestNetworkedGameObject.prefab rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/TestNetworkedGameObject.prefab diff --git a/TestVelGameServer/Assets/VelGameServer/Example/TestNetworkedGameObject.prefab.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/TestNetworkedGameObject.prefab.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/TestNetworkedGameObject.prefab.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/TestNetworkedGameObject.prefab.meta diff --git a/TestVelGameServer/Assets/VelGameServer/Example/test.unity b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/test.unity similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/test.unity rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/test.unity diff --git a/TestVelGameServer/Assets/VelGameServer/Example/test.unity.meta b/TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/test.unity.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/test.unity.meta rename to TestVelGameServer/Assets/Samples/VelNetUnity/1.0.0/Example/test.unity.meta diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs b/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs deleted file mode 100644 index aeab512..0000000 --- a/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs +++ /dev/null @@ -1,505 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Text; -using System.Threading; -using UnityEngine; -using Dissonance; -using System.Net; - -public class NetworkManager : MonoBehaviour -{ - public enum MessageType { OTHERS=0,ALL=1,OTHERS_ORDERED=2,ALL_ORDERED=3}; - public string host; - public int port; - #region private members - private TcpClient socketConnection; - private Socket udpSocket; - public bool udpConnected = false; - IPEndPoint RemoteEndPoint; - private Thread clientReceiveThread; - private Thread clientReceiveThreadUDP; - public int userid = -1; - public string room; - int messagesReceived = 0; - - public GameObject playerPrefab; - public Dictionary players = new Dictionary(); - - public Action onJoinedRoom = delegate { }; - public Action onPlayerJoined = delegate { }; - public Action onPlayerLeft = delegate { }; - - public List prefabs = new List(); - public NetworkObject[] sceneObjects; - public List deletedSceneObjects = new List(); - public Dictionary objects = new Dictionary(); //maintains a list of all known objects on the server (ones that have ids) - NetworkPlayer masterPlayer = null; - #endregion - // Use this for initialization - public class Message - { - public int type; - public string text; - public int sender; - } - public List receivedMessages = new List(); - void Start() - { - ConnectToTcpServer(); - sceneObjects = GameObject.FindObjectsOfType(); //add all local network objects - - } - - - - private void addMessage(Message m) - { - lock (receivedMessages) - { - //Debug.Log(messagesReceived++); - receivedMessages.Add(m); - } - } - private void Update() - { - lock(receivedMessages) { //the main thread, which can do Unity stuff - foreach(Message m in receivedMessages) - { - if(m.type == 0) //when you join the server - { - this.userid = m.sender; - Debug.Log("joined server"); - - //start the udp thread - clientReceiveThreadUDP = new Thread(new ThreadStart(ListenForDataUDP)); - clientReceiveThreadUDP.IsBackground = true; - clientReceiveThreadUDP.Start(); - } - - if (m.type == 2) - { - //if this message is for me, that means I joined a new room... - if (this.userid == m.sender) - { - foreach (KeyValuePair kvp in players) - { - Destroy(kvp.Value.gameObject); - } - players.Clear(); //we clear the list, but will recreate as we get messages from people in our room - - if (m.text != "") - { - NetworkPlayer player = GameObject.Instantiate(playerPrefab).GetComponent(); - - player.isLocal = true; - player.userid = m.sender; - players.Add(userid, player); - player.room = m.text; - player.manager = this; - onJoinedRoom(player); - - - } - } - else //not for me, a player is joining or leaving - { - NetworkPlayer me = players[userid]; - - if (me.room != m.text) - { - - //we got a left message, kill it - //change ownership of all objects to master - - foreach (KeyValuePair kvp in objects) - { - if (kvp.Value.owner == players[m.sender]) //the owner is the player that left - { - if (me.isLocal && me == masterPlayer) //I'm the local master player, so can take ownership immediately - { - me.takeOwnership(kvp.Key); - } - else if (players[m.sender] == masterPlayer) //the master player left, so everyone should set the owner null (we should get a new master shortly) - { - kvp.Value.owner = null; - } - } - } - - Destroy(players[m.sender].gameObject); - players.Remove(m.sender); - } - else - { - //we got a join mesage, create it - NetworkPlayer player = GameObject.Instantiate(playerPrefab).GetComponent(); - player.isLocal = false; - player.room = m.text; - player.userid = m.sender; - player.manager = this; - players.Add(m.sender, player); - onPlayerJoined(player); - - } - } - } - if(m.type == 3) //generic message - { - - players[m.sender]?.handleMessage(m); - - } - if(m.type == 4) //change master player (this should only happen when the first player joins or if the master player leaves) - { - if (masterPlayer == null) - { - masterPlayer = players[m.sender]; - - //no master player yet, add the scene objects - - for (int i = 0; i < sceneObjects.Length; i++) - { - sceneObjects[i].networkId = -1 + "-" + i; - sceneObjects[i].owner = masterPlayer; - sceneObjects[i].isSceneObject = true; //needed for special handling when deleted - objects.Add(sceneObjects[i].networkId,sceneObjects[i]); - } - - } - else - { - masterPlayer = players[m.sender]; - } - - masterPlayer.setAsMasterPlayer(); - - //master player should take over any objects that do not have an owner - - foreach(KeyValuePair kvp in objects) - { - if (kvp.Value.owner == null) - { - kvp.Value.owner = masterPlayer; - } - } - - } - - messageReceived(m); - } - receivedMessages.Clear(); - } - } - private void OnApplicationQuit() - { - socketConnection.Close(); - } - - public Action joinedRoom = delegate { }; - public Action messageReceived = delegate { }; - public Action loggedIn = delegate { }; - public Action roomsReceived = delegate { }; - - public bool connected = false; - /// - /// Setup socket connection. - /// - private void ConnectToTcpServer() - { - try - { - clientReceiveThread = new Thread(new ThreadStart(ListenForData)); - clientReceiveThread.IsBackground = true; - clientReceiveThread.Start(); - - - - } - catch (Exception e) - { - Debug.Log("On client connect exception " + e); - } - } - void handleMessage(string s) //this parses messages from the server, and adds them to a queue to be processed on the main thread - { - Message m = new Message(); - string[] sections = s.Split(':'); - if (sections.Length > 0) - { - int type = int.Parse(sections[0]); - - switch (type) - { - case 0://logged in message - { - if(sections.Length > 1) - { - - m.type = type; - m.sender = int.Parse(sections[1]); - m.text = ""; - addMessage(m); - } - break; - } - case 1://room info message - { - - - break; - } - case 2: //joined room message - { - if(sections.Length > 2) - { - m.type = 2; - int user_id = int.Parse(sections[1]); - m.sender = user_id; - string new_room = sections[2]; - m.text = new_room; - - addMessage(m); - } - break; - } - case 3: //text message - { - if(sections.Length > 2) - { - m.type = 3; - m.sender = int.Parse(sections[1]); - m.text = sections[2]; - addMessage(m); - } - break; - } - case 4: //change master client - { - if(sections.Length > 1) - { - m.type = 4; - m.sender = int.Parse(sections[1]); - addMessage(m); - } - break; - } - - } - } - } - /// - /// Runs in background clientReceiveThread; Listens for incomming data. - /// - private void ListenForData() - { - - connected = true; - try - { - socketConnection = new TcpClient(host, port); - socketConnection.NoDelay = true; - Byte[] bytes = new Byte[1024]; - string partialMessage = ""; - while (true) - { - // Get a stream object for reading - using (NetworkStream stream = socketConnection.GetStream()) - { - int length; - // Read incomming stream into byte arrary. - while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) - { - var incommingData = new byte[length]; - Array.Copy(bytes, 0, incommingData, 0, length); - // Convert byte array to string message. - string serverMessage = Encoding.ASCII.GetString(incommingData); - string[] sections = serverMessage.Split('\n'); - if(sections.Length > 1) - { - lock(receivedMessages){ - for (int i = 0; i < sections.Length - 1; i++) - { - if (i == 0) - { - handleMessage(partialMessage + sections[0]); - partialMessage = ""; - } - else - { - handleMessage(sections[i]); - } - } - } - - } - partialMessage = partialMessage + sections[sections.Length - 1]; - } - } - } - } - - - catch (Exception socketException) - { - Debug.Log("Socket exception: " + socketException); - - } - connected = false; - } - - private void ListenForDataUDP() - { - //I don't yet have a UDP connection - try - { - var addresses = Dns.GetHostAddresses(host); - Debug.Assert(addresses.Length > 0); - RemoteEndPoint = new IPEndPoint(addresses[0], port); - - - udpSocket = new Socket(AddressFamily.InterNetwork, - SocketType.Dgram, ProtocolType.Udp); - - - udpConnected = false; - byte[] buffer = new byte[1024]; - while (true) - { - - string welcome = userid + ":0:Hello"; - byte[] data = Encoding.ASCII.GetBytes(welcome); - udpSocket.SendTo(data, data.Length, SocketFlags.None, RemoteEndPoint); - - if(udpSocket.Available == 0) - { - Thread.Sleep(100); - Debug.Log("Waiting for UDP response"); - } - else - { - break; - } - - - } - udpConnected = true; - while (true) { - int numReceived = udpSocket.Receive(buffer); - - string message = Encoding.UTF8.GetString(buffer, 0, numReceived); - - string[] sections = message.Split(':'); - if(sections[0] == "0") - { - Debug.Log("UDP connected"); - } - if(sections[0] == "3") - { - handleMessage(message); - } - } - - } catch(Exception socketException) - { - Debug.Log("Socket exception: " + socketException); - } - } - - private void SendUdpMessage(string message) - { - - if (udpSocket == null || !udpConnected) - { - return; - } - byte[] data = Encoding.UTF8.GetBytes(message); - //Debug.Log("Attempting to send: " + message); - udpSocket.SendTo(data, data.Length, SocketFlags.None, RemoteEndPoint); - } - - /// - /// Send message to server using socket connection. - /// - private void SendNetworkMessage(string clientMessage) - { - if (socketConnection == null) - { - return; - } - try - { - // Get a stream object for writing. - NetworkStream stream = socketConnection.GetStream(); - if (stream.CanWrite) - { - // Convert string message to byte array. - clientMessage = clientMessage + "\n"; //append a new line to delineate the message - byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage); - // Write byte array to socketConnection stream. - stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length); - - } - } - catch (SocketException socketException) - { - Debug.Log("Socket exception: " + socketException); - } - } - - public void login(string username, string password) - { - SendNetworkMessage("0:" + username + ":" + password); - } - public void join(string roomname) - { - SendNetworkMessage("2:" + roomname); - } - public void leave() - { - SendNetworkMessage("2:-1"); - } - public void sendTo(MessageType type, string message, bool reliable=true) - { - if (reliable) - { - SendNetworkMessage("3:" + (int)type + ":" + message); - } - else - { - SendUdpMessage(userid + ":3:" + (int)type + ":" + message); - } - } - public void sendToGroup(string group, string message, bool reliable=true) - { - if (reliable) - { - SendNetworkMessage("4:" + group + ":" + message); - } - else - { - SendUdpMessage(userid + ":4:" + group + ":" + message); - } - } - - //changes the designated group that sendto(4) will go to - public void setupMessageGroup(string groupname, int[] userids) - { - SendNetworkMessage("5:" + groupname + ":" + String.Join(":", userids)); - } - public void deleteNetworkObject(string networkId) - { - if (objects.ContainsKey(networkId)) - { - NetworkObject obj = objects[networkId]; - if (obj.isSceneObject) - { - deletedSceneObjects.Add(networkId); - } - GameObject.Destroy(obj.gameObject); - objects.Remove(networkId); - } - - } -} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkObject.cs b/TestVelGameServer/Assets/VelGameServer/NetworkObject.cs deleted file mode 100644 index 96b5739..0000000 --- a/TestVelGameServer/Assets/VelGameServer/NetworkObject.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -/// -/// This is a base class for all objects that a player can instantiated/owned -/// -public abstract class NetworkObject: MonoBehaviour -{ - public NetworkPlayer owner; - public string networkId; //this is forged from the combination of the creator's id (-1 in the case of a scene object) and an object id, so it's always unique for a room - public string prefabName; //this may be empty if it's not a prefab (scene object) - public bool isSceneObject=false; - public abstract void handleMessage(string identifier, byte[] message); -} diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs b/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs deleted file mode 100644 index bc9ae80..0000000 --- a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs +++ /dev/null @@ -1,233 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using System.Text; -using System; - - -[RequireComponent(typeof(NetworkObject))] -public class NetworkPlayer : MonoBehaviour -{ - - public NetworkObject myObject; - public int userid; - public string username; - - public string room; - public NetworkManager manager; - - public bool isLocal = false; - - public int lastObjectId=0; //for instantiation - - - bool isMaster = false; - - void Start() - { - myObject.owner = this; - this.manager = GameObject.FindObjectOfType(); - manager.onPlayerJoined += handlePlayerJoined; - } - - // Update is called once per frame - void Update() - { - - - - } - - public void handlePlayerJoined(NetworkPlayer player) - { - //if this is the local player, go through the objects that I own, and send instantiation messages for the ones that have prefab names - if (this.isLocal) - { - foreach(KeyValuePair kvp in manager.objects) - { - if(kvp.Value.owner == this && kvp.Value.prefabName != "") - { - manager.sendTo(NetworkManager.MessageType.OTHERS, "7," + kvp.Value.networkId + "," + kvp.Value.prefabName); - - } - } - - if (isMaster) - { - //send a list of scene object ids when someone joins - sendSceneUpdate(); - } - } - } - - - public void handleMessage(NetworkManager.Message m) - { - //these are generally things that come from the "owner" and should be enacted locally, where appropriate - //we need to parse the message - - //types of messages - string[] messages = m.text.Split(';'); //messages are split by ; - for(int i = 0; i < messages.Length; i++) - { - //individual message parameters separated by comma - string[] sections = messages[i].Split(','); - - switch (sections[0]) - { - case "1": //update my object's data - { - string identifier = sections[1]; - byte[] message = Convert.FromBase64String(sections[2]); - myObject.handleMessage(identifier, message); - break; - } - case "5": //sync update for an object I may own - { - - string objectKey = sections[1]; - string identifier = sections[2]; - string syncMessage = sections[3]; - byte[] messageBytes = Convert.FromBase64String(syncMessage); - if (manager.objects.ContainsKey(objectKey)) - { - if(manager.objects[objectKey].owner == this) - { - manager.objects[objectKey].handleMessage(identifier, messageBytes); - } - } - - break; - } - case "6": //I'm trying to take ownership of an object - { - string networkId = sections[1]; - - if (manager.objects.ContainsKey(networkId)) - { - manager.objects[networkId].owner = this; - } - - break; - } - case "7": //I'm trying to instantiate an object - { - string networkId = sections[1]; - string prefabName = sections[2]; - if (manager.objects.ContainsKey(networkId)) - { - break; //we already have this one, ignore - } - NetworkObject temp = manager.prefabs.Find((prefab) => prefab.name == prefabName); - if (temp != null) - { - NetworkObject instance = GameObject.Instantiate(temp); - instance.networkId = networkId; - instance.prefabName = prefabName; - instance.owner = this; - manager.objects.Add(instance.networkId, instance); - } - - break; - } - case "8": //I'm trying to destroy a gameobject I own - { - string networkId = sections[1]; - - manager.deleteNetworkObject(networkId); - break; - } - case "9": //deleted scene objects - { - - for (int k = 1; k < sections.Length; k++) - { - manager.deleteNetworkObject(sections[k]); - } - - break; - } - } - } - - } - - public void setAsMasterPlayer() - { - isMaster = true; - //if I'm master, I'm now responsible for updating all scene objects - //FindObjectsOfType(); - } - - public void sendGroupMessage(NetworkObject obj, string group, string identifier, byte[] data, bool reliable=true) - { - if (obj == myObject) - { - manager.sendToGroup(group, "1," + identifier + "," + Convert.ToBase64String(data), reliable); - } - else - { - manager.sendToGroup(group, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data), reliable); - } - } - public void sendMessage(NetworkObject obj, string identifier, byte[] data, bool reliable=true) - { - if (obj == myObject) - { - manager.sendTo(NetworkManager.MessageType.OTHERS, "1," + identifier +"," + Convert.ToBase64String(data), reliable); - } - else - { - - manager.sendTo(NetworkManager.MessageType.OTHERS, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data), reliable); - } - } - - public NetworkObject networkInstantiate(string prefabName) - { - if (!isLocal) - { - return null; //must be the local player to call instantiate - } - string networkId = this.userid + "-" + lastObjectId++; - - - NetworkObject temp = manager.prefabs.Find((prefab) => prefab.name == prefabName); - if (temp != null) - { - NetworkObject instance = GameObject.Instantiate(temp); - instance.networkId = networkId; - instance.prefabName = prefabName; - instance.owner = this; - manager.objects.Add(instance.networkId, instance); - - manager.sendTo(NetworkManager.MessageType.OTHERS, "7," + networkId + "," + prefabName); //only sent to others, as I already instantiated this. Nice that it happens immediately. - return instance; - } - return null; - } - - public void networkDestroy(string networkId) - { - if (!manager.objects.ContainsKey(networkId) || manager.objects[networkId].owner != this || !isLocal) return; //must be the local owner of the object to destroy it - manager.sendTo(NetworkManager.MessageType.ALL_ORDERED, "8," + networkId); //send to all, which will make me delete as well - - } - - public void takeOwnership(string networkId) - { - if (!manager.objects.ContainsKey(networkId) || !isLocal) return; //must exist and be the the local player - - manager.objects[networkId].owner = this; //immediately successful - manager.sendTo(NetworkManager.MessageType.ALL_ORDERED, "6," + networkId); //must be ordered, so that ownership transfers are not confused. Also sent to all players, so that multiple simultaneous requests will result in the same outcome. - - } - - public void sendSceneUpdate() - { - - manager.sendTo(NetworkManager.MessageType.OTHERS, "9," + string.Join(",", manager.deletedSceneObjects)); - } - - -} diff --git a/TestVelGameServer/Assets/VelGameServer/Util/SyncTransform.cs b/TestVelGameServer/Assets/VelGameServer/Util/SyncTransform.cs deleted file mode 100644 index 77d2274..0000000 --- a/TestVelGameServer/Assets/VelGameServer/Util/SyncTransform.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Formatters.Binary; -using UnityEngine; - -/// -/// A simple class that will sync the position and rotation of a network object -/// -public class SyncTransform : NetworkObject -{ - - public Vector3 targetPosition; - public Quaternion targetRotation; - - - public byte[] getSyncMessage() - { - float[] data = new float[7]; - for(int i = 0; i < 3; i++) - { - data[i] = transform.position[i]; - data[i + 3] = transform.rotation[i]; - } - data[6] = transform.rotation[3]; - - byte[] toReturn = new byte[sizeof(float) * data.Length]; - Buffer.BlockCopy(data, 0, toReturn,0, toReturn.Length); - return toReturn; - } - - public override void handleMessage(string identifier, byte[] message) - { - switch (identifier) - { - case "s": - float[] data = new float[7]; - Buffer.BlockCopy(message, 0, data, 0, message.Length); - for (int i = 0; i < 3; i++) - { - targetPosition[i] = data[i]; - targetRotation[i] = data[i + 3]; - } - targetRotation[3] = data[6]; - break; - } - - } - - // Start is called before the first frame update - void Start() - { - StartCoroutine(syncBehavior()); - } - - IEnumerator syncBehavior() - { - while (true) - { - if (owner != null && owner.isLocal) - { - - owner.sendMessage(this, "s", getSyncMessage()); - } - yield return new WaitForSeconds(.1f); - } - } - // Update is called once per frame - void Update() - { - if (owner != null && !owner.isLocal) - { - transform.position = Vector3.Lerp(transform.position, targetPosition, .1f); - transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, .1f); - } - } - -} diff --git a/TestVelGameServer/Packages/VelNetUnity/Editor.meta b/TestVelGameServer/Packages/VelNetUnity/Editor.meta new file mode 100644 index 0000000..e34903b --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 453f243ca8f3d8b4db4a1db0d9f9d300 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime.meta new file mode 100644 index 0000000..bbf4f4e --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63ae5231117a1484198ba0a8f681612b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkManager.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkManager.cs new file mode 100644 index 0000000..d75611e --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkManager.cs @@ -0,0 +1,522 @@ +using System; +using System.Collections.Generic; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using UnityEngine; +using System.Net; + +namespace VelNetUnity +{ + public class NetworkManager : MonoBehaviour + { + public enum MessageType + { + OTHERS = 0, + ALL = 1, + OTHERS_ORDERED = 2, + ALL_ORDERED = 3 + }; + + public string host; + public int port; + + #region private members + + private TcpClient socketConnection; + private Socket udpSocket; + public bool udpConnected = false; + IPEndPoint RemoteEndPoint; + private Thread clientReceiveThread; + private Thread clientReceiveThreadUDP; + public int userid = -1; + public string room; + int messagesReceived = 0; + + public GameObject playerPrefab; + public Dictionary players = new Dictionary(); + + public Action onJoinedRoom = delegate { }; + public Action onPlayerJoined = delegate { }; + public Action onPlayerLeft = delegate { }; + + public List prefabs = new List(); + public NetworkObject[] sceneObjects; + public List deletedSceneObjects = new List(); + public Dictionary objects = new Dictionary(); //maintains a list of all known objects on the server (ones that have ids) + NetworkPlayer masterPlayer = null; + + #endregion + + // Use this for initialization + public class Message + { + public int type; + public string text; + public int sender; + } + + public List receivedMessages = new List(); + + void Start() + { + ConnectToTcpServer(); + sceneObjects = FindObjectsOfType(); //add all local network objects + } + + + private void addMessage(Message m) + { + lock (receivedMessages) + { + //Debug.Log(messagesReceived++); + receivedMessages.Add(m); + } + } + + private void Update() + { + lock (receivedMessages) + { + //the main thread, which can do Unity stuff + foreach (Message m in receivedMessages) + { + if (m.type == 0) //when you join the server + { + userid = m.sender; + Debug.Log("joined server"); + + //start the udp thread + clientReceiveThreadUDP = new Thread(new ThreadStart(ListenForDataUDP)); + clientReceiveThreadUDP.IsBackground = true; + clientReceiveThreadUDP.Start(); + } + + if (m.type == 2) + { + //if this message is for me, that means I joined a new room... + if (userid == m.sender) + { + foreach (KeyValuePair kvp in players) + { + Destroy(kvp.Value.gameObject); + } + + players.Clear(); //we clear the list, but will recreate as we get messages from people in our room + + if (m.text != "") + { + NetworkPlayer player = Instantiate(playerPrefab).GetComponent(); + + player.isLocal = true; + player.userid = m.sender; + players.Add(userid, player); + player.room = m.text; + player.manager = this; + onJoinedRoom(player); + } + } + else //not for me, a player is joining or leaving + { + NetworkPlayer me = players[userid]; + + if (me.room != m.text) + { + //we got a left message, kill it + //change ownership of all objects to master + + foreach (KeyValuePair kvp in objects) + { + if (kvp.Value.owner == players[m.sender]) //the owner is the player that left + { + if (me.isLocal && me == masterPlayer) //I'm the local master player, so can take ownership immediately + { + me.takeOwnership(kvp.Key); + } + else if (players[m.sender] == masterPlayer) //the master player left, so everyone should set the owner null (we should get a new master shortly) + { + kvp.Value.owner = null; + } + } + } + + Destroy(players[m.sender].gameObject); + players.Remove(m.sender); + } + else + { + //we got a join mesage, create it + NetworkPlayer player = Instantiate(playerPrefab).GetComponent(); + player.isLocal = false; + player.room = m.text; + player.userid = m.sender; + player.manager = this; + players.Add(m.sender, player); + onPlayerJoined(player); + } + } + } + + if (m.type == 3) //generic message + { + players[m.sender]?.handleMessage(m); + } + + if (m.type == 4) //change master player (this should only happen when the first player joins or if the master player leaves) + { + if (masterPlayer == null) + { + masterPlayer = players[m.sender]; + + //no master player yet, add the scene objects + + for (int i = 0; i < sceneObjects.Length; i++) + { + sceneObjects[i].networkId = -1 + "-" + i; + sceneObjects[i].owner = masterPlayer; + sceneObjects[i].isSceneObject = true; //needed for special handling when deleted + objects.Add(sceneObjects[i].networkId, sceneObjects[i]); + } + } + else + { + masterPlayer = players[m.sender]; + } + + masterPlayer.setAsMasterPlayer(); + + //master player should take over any objects that do not have an owner + + foreach (KeyValuePair kvp in objects) + { + if (kvp.Value.owner == null) + { + kvp.Value.owner = masterPlayer; + } + } + } + + messageReceived(m); + } + + receivedMessages.Clear(); + } + } + + private void OnApplicationQuit() + { + socketConnection.Close(); + } + + public Action joinedRoom = delegate { }; + public Action messageReceived = delegate { }; + public Action loggedIn = delegate { }; + public Action roomsReceived = delegate { }; + + public bool connected = false; + + /// + /// Setup socket connection. + /// + private void ConnectToTcpServer() + { + try + { + clientReceiveThread = new Thread(new ThreadStart(ListenForData)); + clientReceiveThread.IsBackground = true; + clientReceiveThread.Start(); + } + catch (Exception e) + { + Debug.Log("On client connect exception " + e); + } + } + + void handleMessage(string s) //this parses messages from the server, and adds them to a queue to be processed on the main thread + { + Message m = new Message(); + string[] sections = s.Split(':'); + if (sections.Length > 0) + { + int type = int.Parse(sections[0]); + + switch (type) + { + case 0: //logged in message + { + if (sections.Length > 1) + { + m.type = type; + m.sender = int.Parse(sections[1]); + m.text = ""; + addMessage(m); + } + + break; + } + case 1: //room info message + { + break; + } + case 2: //joined room message + { + if (sections.Length > 2) + { + m.type = 2; + int user_id = int.Parse(sections[1]); + m.sender = user_id; + string new_room = sections[2]; + m.text = new_room; + + addMessage(m); + } + + break; + } + case 3: //text message + { + if (sections.Length > 2) + { + m.type = 3; + m.sender = int.Parse(sections[1]); + m.text = sections[2]; + addMessage(m); + } + + break; + } + case 4: //change master client + { + if (sections.Length > 1) + { + m.type = 4; + m.sender = int.Parse(sections[1]); + addMessage(m); + } + + break; + } + } + } + } + + /// + /// Runs in background clientReceiveThread; Listens for incomming data. + /// + private void ListenForData() + { + connected = true; + try + { + socketConnection = new TcpClient(host, port); + socketConnection.NoDelay = true; + Byte[] bytes = new Byte[1024]; + string partialMessage = ""; + while (true) + { + // Get a stream object for reading + using (NetworkStream stream = socketConnection.GetStream()) + { + int length; + // Read incomming stream into byte arrary. + while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) + { + var incommingData = new byte[length]; + Array.Copy(bytes, 0, incommingData, 0, length); + // Convert byte array to string message. + string serverMessage = Encoding.ASCII.GetString(incommingData); + string[] sections = serverMessage.Split('\n'); + if (sections.Length > 1) + { + lock (receivedMessages) + { + for (int i = 0; i < sections.Length - 1; i++) + { + if (i == 0) + { + handleMessage(partialMessage + sections[0]); + partialMessage = ""; + } + else + { + handleMessage(sections[i]); + } + } + } + } + + partialMessage = partialMessage + sections[sections.Length - 1]; + } + } + } + } + + + catch (Exception socketException) + { + Debug.Log("Socket exception: " + socketException); + } + + connected = false; + } + + private void ListenForDataUDP() + { + //I don't yet have a UDP connection + try + { + var addresses = Dns.GetHostAddresses(host); + Debug.Assert(addresses.Length > 0); + RemoteEndPoint = new IPEndPoint(addresses[0], port); + + + udpSocket = new Socket(AddressFamily.InterNetwork, + SocketType.Dgram, ProtocolType.Udp); + + + udpConnected = false; + byte[] buffer = new byte[1024]; + while (true) + { + string welcome = userid + ":0:Hello"; + byte[] data = Encoding.ASCII.GetBytes(welcome); + udpSocket.SendTo(data, data.Length, SocketFlags.None, RemoteEndPoint); + + if (udpSocket.Available == 0) + { + Thread.Sleep(100); + Debug.Log("Waiting for UDP response"); + } + else + { + break; + } + } + + udpConnected = true; + while (true) + { + int numReceived = udpSocket.Receive(buffer); + + string message = Encoding.UTF8.GetString(buffer, 0, numReceived); + + string[] sections = message.Split(':'); + if (sections[0] == "0") + { + Debug.Log("UDP connected"); + } + + if (sections[0] == "3") + { + handleMessage(message); + } + } + } + catch (Exception socketException) + { + Debug.Log("Socket exception: " + socketException); + } + } + + private void SendUdpMessage(string message) + { + if (udpSocket == null || !udpConnected) + { + return; + } + + byte[] data = Encoding.UTF8.GetBytes(message); + //Debug.Log("Attempting to send: " + message); + udpSocket.SendTo(data, data.Length, SocketFlags.None, RemoteEndPoint); + } + + /// + /// Send message to server using socket connection. + /// + private void SendNetworkMessage(string clientMessage) + { + if (socketConnection == null) + { + return; + } + + try + { + // Get a stream object for writing. + NetworkStream stream = socketConnection.GetStream(); + if (stream.CanWrite) + { + // Convert string message to byte array. + clientMessage = clientMessage + "\n"; //append a new line to delineate the message + byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage); + // Write byte array to socketConnection stream. + stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length); + } + } + catch (SocketException socketException) + { + Debug.Log("Socket exception: " + socketException); + } + } + + public void login(string username, string password) + { + SendNetworkMessage("0:" + username + ":" + password); + } + + public void join(string roomname) + { + SendNetworkMessage("2:" + roomname); + } + + public void leave() + { + SendNetworkMessage("2:-1"); + } + + public void sendTo(MessageType type, string message, bool reliable = true) + { + if (reliable) + { + SendNetworkMessage("3:" + (int)type + ":" + message); + } + else + { + SendUdpMessage(userid + ":3:" + (int)type + ":" + message); + } + } + + public void sendToGroup(string group, string message, bool reliable = true) + { + if (reliable) + { + SendNetworkMessage("4:" + group + ":" + message); + } + else + { + SendUdpMessage(userid + ":4:" + group + ":" + message); + } + } + + //changes the designated group that sendto(4) will go to + public void setupMessageGroup(string groupname, int[] userids) + { + SendNetworkMessage("5:" + groupname + ":" + String.Join(":", userids)); + } + + public void deleteNetworkObject(string networkId) + { + if (objects.ContainsKey(networkId)) + { + NetworkObject obj = objects[networkId]; + if (obj.isSceneObject) + { + deletedSceneObjects.Add(networkId); + } + + Destroy(obj.gameObject); + objects.Remove(networkId); + } + } + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkManager.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/NetworkManager.cs.meta rename to TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkManager.cs.meta diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs new file mode 100644 index 0000000..3a43a9f --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +namespace VelNetUnity +{ + /// + /// This is a base class for all objects that a player can instantiated/owned + /// + public abstract class NetworkObject : MonoBehaviour + { + public NetworkPlayer owner; + public string networkId; //this is forged from the combination of the creator's id (-1 in the case of a scene object) and an object id, so it's always unique for a room + public string prefabName; //this may be empty if it's not a prefab (scene object) + public bool isSceneObject = false; + public abstract void handleMessage(string identifier, byte[] message); + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkObject.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/NetworkObject.cs.meta rename to TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs.meta diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkPlayer.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkPlayer.cs new file mode 100644 index 0000000..13d6b61 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkPlayer.cs @@ -0,0 +1,219 @@ +using System.Collections.Generic; +using UnityEngine; +using System; + + +namespace VelNetUnity +{ + [RequireComponent(typeof(NetworkObject))] + public class NetworkPlayer : MonoBehaviour + { + public NetworkObject myObject; + public int userid; + public string username; + + public string room; + public NetworkManager manager; + + public bool isLocal = false; + + public int lastObjectId = 0; //for instantiation + + + private bool isMaster = false; + + private void Start() + { + myObject.owner = this; + manager = FindObjectOfType(); + manager.onPlayerJoined += handlePlayerJoined; + } + + public void handlePlayerJoined(NetworkPlayer player) + { + //if this is the local player, go through the objects that I own, and send instantiation messages for the ones that have prefab names + if (isLocal) + { + foreach (KeyValuePair kvp in manager.objects) + { + if (kvp.Value.owner == this && kvp.Value.prefabName != "") + { + manager.sendTo(NetworkManager.MessageType.OTHERS, "7," + kvp.Value.networkId + "," + kvp.Value.prefabName); + } + } + + if (isMaster) + { + //send a list of scene object ids when someone joins + sendSceneUpdate(); + } + } + } + + + public void handleMessage(NetworkManager.Message m) + { + //these are generally things that come from the "owner" and should be enacted locally, where appropriate + //we need to parse the message + + //types of messages + string[] messages = m.text.Split(';'); //messages are split by ; + for (int i = 0; i < messages.Length; i++) + { + //individual message parameters separated by comma + string[] sections = messages[i].Split(','); + + switch (sections[0]) + { + case "1": //update my object's data + { + string identifier = sections[1]; + byte[] message = Convert.FromBase64String(sections[2]); + myObject.handleMessage(identifier, message); + break; + } + case "5": //sync update for an object I may own + { + string objectKey = sections[1]; + string identifier = sections[2]; + string syncMessage = sections[3]; + byte[] messageBytes = Convert.FromBase64String(syncMessage); + if (manager.objects.ContainsKey(objectKey)) + { + if (manager.objects[objectKey].owner == this) + { + manager.objects[objectKey].handleMessage(identifier, messageBytes); + } + } + + break; + } + case "6": //I'm trying to take ownership of an object + { + string networkId = sections[1]; + + if (manager.objects.ContainsKey(networkId)) + { + manager.objects[networkId].owner = this; + } + + break; + } + case "7": //I'm trying to instantiate an object + { + string networkId = sections[1]; + string prefabName = sections[2]; + if (manager.objects.ContainsKey(networkId)) + { + break; //we already have this one, ignore + } + + NetworkObject temp = manager.prefabs.Find((prefab) => prefab.name == prefabName); + if (temp != null) + { + NetworkObject instance = Instantiate(temp); + instance.networkId = networkId; + instance.prefabName = prefabName; + instance.owner = this; + manager.objects.Add(instance.networkId, instance); + } + + break; + } + case "8": //I'm trying to destroy a gameobject I own + { + string networkId = sections[1]; + + manager.deleteNetworkObject(networkId); + break; + } + case "9": //deleted scene objects + { + for (int k = 1; k < sections.Length; k++) + { + manager.deleteNetworkObject(sections[k]); + } + + break; + } + } + } + } + + public void setAsMasterPlayer() + { + isMaster = true; + //if I'm master, I'm now responsible for updating all scene objects + //FindObjectsOfType(); + } + + public void sendGroupMessage(NetworkObject obj, string group, string identifier, byte[] data, bool reliable = true) + { + if (obj == myObject) + { + manager.sendToGroup(group, "1," + identifier + "," + Convert.ToBase64String(data), reliable); + } + else + { + manager.sendToGroup(group, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data), reliable); + } + } + + public void sendMessage(NetworkObject obj, string identifier, byte[] data, bool reliable = true) + { + if (obj == myObject) + { + manager.sendTo(NetworkManager.MessageType.OTHERS, "1," + identifier + "," + Convert.ToBase64String(data), reliable); + } + else + { + manager.sendTo(NetworkManager.MessageType.OTHERS, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data), reliable); + } + } + + public NetworkObject networkInstantiate(string prefabName) + { + if (!isLocal) + { + return null; //must be the local player to call instantiate + } + + string networkId = userid + "-" + lastObjectId++; + + + NetworkObject temp = manager.prefabs.Find((prefab) => prefab.name == prefabName); + if (temp != null) + { + NetworkObject instance = Instantiate(temp); + instance.networkId = networkId; + instance.prefabName = prefabName; + instance.owner = this; + manager.objects.Add(instance.networkId, instance); + + manager.sendTo(NetworkManager.MessageType.OTHERS, "7," + networkId + "," + prefabName); //only sent to others, as I already instantiated this. Nice that it happens immediately. + return instance; + } + + return null; + } + + public void networkDestroy(string networkId) + { + if (!manager.objects.ContainsKey(networkId) || manager.objects[networkId].owner != this || !isLocal) return; //must be the local owner of the object to destroy it + manager.sendTo(NetworkManager.MessageType.ALL_ORDERED, "8," + networkId); //send to all, which will make me delete as well + } + + public void takeOwnership(string networkId) + { + if (!manager.objects.ContainsKey(networkId) || !isLocal) return; //must exist and be the the local player + + manager.objects[networkId].owner = this; //immediately successful + manager.sendTo(NetworkManager.MessageType.ALL_ORDERED, "6," + networkId); //must be ordered, so that ownership transfers are not confused. Also sent to all players, so that multiple simultaneous requests will result in the same outcome. + } + + public void sendSceneUpdate() + { + manager.sendTo(NetworkManager.MessageType.OTHERS, "9," + string.Join(",", manager.deletedSceneObjects)); + } + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkPlayer.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs.meta rename to TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkPlayer.cs.meta diff --git a/TestVelGameServer/Assets/VelGameServer/Util.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util.meta similarity index 77% rename from TestVelGameServer/Assets/VelGameServer/Util.meta rename to TestVelGameServer/Packages/VelNetUnity/Runtime/Util.meta index 5835bd6..4ece4ae 100644 --- a/TestVelGameServer/Assets/VelGameServer/Util.meta +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: feb473f59814842848dd4183ddeb6d9e +guid: cd6bc3db2c19417498a737fbb79e8c7d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/SyncTransform.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/SyncTransform.cs new file mode 100644 index 0000000..3557b80 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/SyncTransform.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections; +using UnityEngine; + + +namespace VelNetUnity +{ + /// + /// A simple class that will sync the position and rotation of a network object + /// + public class SyncTransform : NetworkObject + { + public Vector3 targetPosition; + public Quaternion targetRotation; + + + public byte[] getSyncMessage() + { + float[] data = new float[7]; + for (int i = 0; i < 3; i++) + { + data[i] = transform.position[i]; + data[i + 3] = transform.rotation[i]; + } + + data[6] = transform.rotation[3]; + + byte[] toReturn = new byte[sizeof(float) * data.Length]; + Buffer.BlockCopy(data, 0, toReturn, 0, toReturn.Length); + return toReturn; + } + + public override void handleMessage(string identifier, byte[] message) + { + switch (identifier) + { + case "s": + float[] data = new float[7]; + Buffer.BlockCopy(message, 0, data, 0, message.Length); + for (int i = 0; i < 3; i++) + { + targetPosition[i] = data[i]; + targetRotation[i] = data[i + 3]; + } + + targetRotation[3] = data[6]; + break; + } + } + + // Start is called before the first frame update + void Start() + { + StartCoroutine(syncBehavior()); + } + + IEnumerator syncBehavior() + { + while (true) + { + if (owner != null && owner.isLocal) + { + owner.sendMessage(this, "s", getSyncMessage()); + } + + yield return new WaitForSeconds(.1f); + } + } + + // Update is called once per frame + private void Update() + { + if (owner != null && !owner.isLocal) + { + transform.position = Vector3.Lerp(transform.position, targetPosition, .1f); + transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, .1f); + } + } + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/VelGameServer/Util/SyncTransform.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/SyncTransform.cs.meta similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Util/SyncTransform.cs.meta rename to TestVelGameServer/Packages/VelNetUnity/Runtime/Util/SyncTransform.cs.meta diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelAudioMixer.mixer b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelAudioMixer.mixer new file mode 100644 index 0000000..b2ae0ea --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelAudioMixer.mixer @@ -0,0 +1,83 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!244 &-1719467165466355418 +AudioMixerEffectController: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_EffectID: 6362d3ceb713f4c3fa42448a3e29217e + m_EffectName: Dissonance Echo Cancellation + m_MixLevel: a240a2d1f057e4cf9bbc59f6cfbec367 + m_Parameters: [] + m_SendTarget: {fileID: 0} + m_EnableWetMix: 0 + m_Bypass: 0 +--- !u!241 &24100000 +AudioMixerController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: VelAudioMixer + m_OutputGroup: {fileID: 0} + m_MasterGroup: {fileID: 24300002} + m_Snapshots: + - {fileID: 24500006} + m_StartSnapshot: {fileID: 24500006} + m_SuspendThreshold: -80 + m_EnableSuspend: 1 + m_UpdateMode: 1 + m_ExposedParameters: [] + m_AudioMixerGroupViews: + - guids: + - b8e40716c8c1442ab9ef14e149b2423c + name: View + m_CurrentViewIndex: 0 + m_TargetSnapshot: {fileID: 24500006} +--- !u!243 &24300002 +AudioMixerGroupController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Master + m_AudioMixer: {fileID: 24100000} + m_GroupID: b8e40716c8c1442ab9ef14e149b2423c + m_Children: [] + m_Volume: 3d9590ea0314643bd94e1616b88508ef + m_Pitch: 31f1ddadf3a5d47caab0e64b81ced2ae + m_Send: 00000000000000000000000000000000 + m_Effects: + - {fileID: 24400004} + - {fileID: -1719467165466355418} + m_UserColorIndex: 0 + m_Mute: 0 + m_Solo: 0 + m_BypassEffects: 0 +--- !u!244 &24400004 +AudioMixerEffectController: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_EffectID: f79719d1f394d4b4783ede937d403602 + m_EffectName: Attenuation + m_MixLevel: 8d97d9fd1e8d446eb9244b5dead78e90 + m_Parameters: [] + m_SendTarget: {fileID: 0} + m_EnableWetMix: 0 + m_Bypass: 0 +--- !u!245 &24500006 +AudioMixerSnapshotController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Snapshot + m_AudioMixer: {fileID: 24100000} + m_SnapshotID: 86ea5b9fedb76448594a5ab2119e34a1 + m_FloatValues: {} + m_TransitionOverrides: {} diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelAudioMixer.mixer.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelAudioMixer.mixer.meta new file mode 100644 index 0000000..4db7f93 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelAudioMixer.mixer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa1da19d935e241119cdd522ceae772c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 24100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelCommsNetwork.cs b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelCommsNetwork.cs similarity index 99% rename from TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelCommsNetwork.cs rename to TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelCommsNetwork.cs index 52613c8..b6d7d8d 100644 --- a/TestVelGameServer/Assets/VelGameServer/DissonanceIntegration/VelCommsNetwork.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelCommsNetwork.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using Dissonance; diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelCommsNetwork.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelCommsNetwork.cs.meta new file mode 100644 index 0000000..f086eda --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/DissonanceIntegration/VelCommsNetwork.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d2009d8e264649749c0315d48765749 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Assets/VelGameServer/Example/NetworkGUI.cs b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/NetworkGUI.cs similarity index 100% rename from TestVelGameServer/Assets/VelGameServer/Example/NetworkGUI.cs rename to TestVelGameServer/Packages/VelNetUnity/Samples~/Example/NetworkGUI.cs diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/NetworkGUI.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/NetworkGUI.cs.meta new file mode 100644 index 0000000..c4289bb --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/NetworkGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a7db5bc792cd471dbd8039664359eee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerController.cs similarity index 99% rename from TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs rename to TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerController.cs index 3646aa6..0cfce96 100644 --- a/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerController.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using UnityEngine; diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerController.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerController.cs.meta new file mode 100644 index 0000000..1c49a76 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89e3af759df774692a566a166b4bf69b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerPrefab.prefab b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerPrefab.prefab new file mode 100644 index 0000000..1c3683f --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerPrefab.prefab @@ -0,0 +1,136 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6139051692386484099 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3076416102083120807} + - component: {fileID: 8527011532923434593} + - component: {fileID: 6854617867369839} + - component: {fileID: 5845716565458182149} + - component: {fileID: 5713671764962751473} + - component: {fileID: -4404668399269848200} + m_Layer: 0 + m_Name: PlayerPrefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3076416102083120807 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6139051692386484099} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8527011532923434593 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6139051692386484099} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6854617867369839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6139051692386484099} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &5845716565458182149 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6139051692386484099} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &5713671764962751473 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6139051692386484099} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d8d3b6de660834e3e898725928251405, type: 3} + m_Name: + m_EditorClassIdentifier: + myObject: {fileID: -4404668399269848200} + userid: 0 + username: + room: + manager: {fileID: 0} + isLocal: 0 + lastObjectId: 0 + commsNetwork: {fileID: 0} + dissonanceID: +--- !u!114 &-4404668399269848200 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6139051692386484099} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 89e3af759df774692a566a166b4bf69b, type: 3} + m_Name: + m_EditorClassIdentifier: + owner: {fileID: 5713671764962751473} + networkId: + targetPosition: {x: 0, y: 0, z: 0} + targetRotation: {x: 0, y: 0, z: 0, w: 0} diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerPrefab.prefab.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerPrefab.prefab.meta new file mode 100644 index 0000000..7899882 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/PlayerPrefab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d4158ab9c4a204cdbba28d3273fc1fb3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/TestNetworkedGameObject.prefab b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/TestNetworkedGameObject.prefab new file mode 100644 index 0000000..bac19d3 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/TestNetworkedGameObject.prefab @@ -0,0 +1,145 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8565720275311462453 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8565720275311462455} + - component: {fileID: 8565720275311462452} + m_Layer: 0 + m_Name: TestNetworkedGameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8565720275311462455 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8565720275311462453} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8565720276181857624} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8565720275311462452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8565720275311462453} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3f1f9b0bbd93a484a987c51f1107ebe5, type: 3} + m_Name: + m_EditorClassIdentifier: + owner: {fileID: 0} + networkId: + targetPosition: {x: 0, y: 0, z: 0} + targetRotation: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &8565720276181857625 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8565720276181857624} + - component: {fileID: 8565720276181857605} + - component: {fileID: 8565720276181857626} + - component: {fileID: 8565720276181857627} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8565720276181857624 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8565720276181857625} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8565720275311462455} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8565720276181857605 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8565720276181857625} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8565720276181857626 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8565720276181857625} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &8565720276181857627 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8565720276181857625} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/TestNetworkedGameObject.prefab.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/TestNetworkedGameObject.prefab.meta new file mode 100644 index 0000000..0743d13 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/TestNetworkedGameObject.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6e4a023f70e01405e8b249a4488fe319 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/test.unity b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/test.unity new file mode 100644 index 0000000..7e44ef7 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/test.unity @@ -0,0 +1,3431 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641275, b: 0.5748172, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &2034436 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2034439} + - component: {fileID: 2034438} + - component: {fileID: 2034437} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2034437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034436} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: User Name +--- !u!222 &2034438 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034436} + m_CullTransparentMesh: 1 +--- !u!224 &2034439 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034436} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 626742070} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &117638563 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 117638565} + - component: {fileID: 117638567} + - component: {fileID: 117638566} + - component: {fileID: 117638564} + m_Layer: 5 + m_Name: Dropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &117638564 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 117638563} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 117638566} + m_Template: {fileID: 927188573} + m_CaptionText: {fileID: 138032021} + m_CaptionImage: {fileID: 0} + m_ItemText: {fileID: 720503450} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 244561621} + m_TargetAssemblyTypeName: NetworkGUI, Assembly-CSharp + m_MethodName: handleMicrophoneSelection + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_AlphaFadeSpeed: 0.15 +--- !u!224 &117638565 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 117638563} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 138032023} + - {fileID: 1557879931} + - {fileID: 927188573} + m_Father: {fileID: 244561620} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 98, y: 138} + m_SizeDelta: {x: 160, y: 38.7538} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &117638566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 117638563} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &117638567 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 117638563} + m_CullTransparentMesh: 1 +--- !u!1 &138032020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 138032023} + - component: {fileID: 138032022} + - component: {fileID: 138032021} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &138032021 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138032020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &138032022 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138032020} + m_CullTransparentMesh: 1 +--- !u!224 &138032023 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138032020} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 117638565} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &162005663 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 162005664} + - component: {fileID: 162005666} + - component: {fileID: 162005665} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &162005664 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162005663} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 711524767} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &162005665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162005663} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Room Name +--- !u!222 &162005666 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162005663} + m_CullTransparentMesh: 1 +--- !u!1 &244561616 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 244561620} + - component: {fileID: 244561619} + - component: {fileID: 244561618} + - component: {fileID: 244561617} + - component: {fileID: 244561621} + m_Layer: 5 + m_Name: NetworkGUI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &244561617 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244561616} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &244561618 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244561616} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &244561619 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244561616} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &244561620 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244561616} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1278634767} + - {fileID: 711524767} + - {fileID: 1894247853} + - {fileID: 626742070} + - {fileID: 1760805525} + - {fileID: 945446556} + - {fileID: 1843597586} + - {fileID: 117638565} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &244561621 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244561616} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a7db5bc792cd471dbd8039664359eee, type: 3} + m_Name: + m_EditorClassIdentifier: + networkManager: {fileID: 1099803616} + userInput: {fileID: 626742069} + sendInput: {fileID: 945446555} + roomInput: {fileID: 711524768} + messages: {fileID: 1894247854} + messageBuffer: [] + microphones: {fileID: 117638564} +--- !u!1 &440509381 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 440509384} + - component: {fileID: 440509383} + - component: {fileID: 440509382} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &440509382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440509381} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &440509383 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440509381} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &440509384 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440509381} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &615558651 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 615558652} + - component: {fileID: 615558654} + - component: {fileID: 615558653} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &615558652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 615558651} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1047954372} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &615558653 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 615558651} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &615558654 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 615558651} + m_CullTransparentMesh: 1 +--- !u!1 &626742068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 626742070} + - component: {fileID: 626742072} + - component: {fileID: 626742071} + - component: {fileID: 626742069} + m_Layer: 5 + m_Name: UserInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &626742069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 626742068} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 626742071} + m_TextComponent: {fileID: 1560686266} + m_Placeholder: {fileID: 2034437} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!224 &626742070 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 626742068} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2034439} + - {fileID: 1560686264} + m_Father: {fileID: 244561620} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 242.09998, y: 51} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &626742071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 626742068} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &626742072 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 626742068} + m_CullTransparentMesh: 1 +--- !u!1 &652307109 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 652307111} + - component: {fileID: 652307110} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &652307110 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652307109} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &652307111 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652307109} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &711524766 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 711524767} + - component: {fileID: 711524770} + - component: {fileID: 711524769} + - component: {fileID: 711524768} + m_Layer: 5 + m_Name: RoomInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &711524767 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 711524766} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 162005664} + - {fileID: 1484033256} + m_Father: {fileID: 244561620} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 240.09998, y: 15.5} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &711524768 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 711524766} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 711524769} + m_TextComponent: {fileID: 1484033257} + m_Placeholder: {fileID: 162005665} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &711524769 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 711524766} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &711524770 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 711524766} + m_CullTransparentMesh: 1 +--- !u!1 &720503449 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 720503452} + - component: {fileID: 720503451} + - component: {fileID: 720503450} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &720503450 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 720503449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &720503451 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 720503449} + m_CullTransparentMesh: 1 +--- !u!224 &720503452 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 720503449} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1047954372} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &903768653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 903768657} + - component: {fileID: 903768656} + - component: {fileID: 903768655} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &903768655 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903768653} + m_Enabled: 1 +--- !u!20 &903768656 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903768653} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &903768657 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903768653} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &912887455 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 912887456} + - component: {fileID: 912887459} + - component: {fileID: 912887458} + - component: {fileID: 912887457} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &912887456 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 912887455} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1055818112} + m_Father: {fileID: 927188573} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -18, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &912887457 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 912887455} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &912887458 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 912887455} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &912887459 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 912887455} + m_CullTransparentMesh: 1 +--- !u!1 &927188572 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 927188573} + - component: {fileID: 927188576} + - component: {fileID: 927188575} + - component: {fileID: 927188574} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &927188573 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927188572} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 912887456} + - {fileID: 1154194182} + m_Father: {fileID: 117638565} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &927188574 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927188572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1055818112} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 912887456} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1154194183} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &927188575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927188572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &927188576 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927188572} + m_CullTransparentMesh: 1 +--- !u!1 &945446554 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 945446556} + - component: {fileID: 945446558} + - component: {fileID: 945446557} + - component: {fileID: 945446555} + m_Layer: 5 + m_Name: Message + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &945446555 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 945446554} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 945446557} + m_TextComponent: {fileID: 1235343403} + m_Placeholder: {fileID: 1954037270} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!224 &945446556 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 945446554} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1954037272} + - {fileID: 1235343401} + m_Father: {fileID: 244561620} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 112.91498, y: 88} + m_SizeDelta: {x: 215.83, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &945446557 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 945446554} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &945446558 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 945446554} + m_CullTransparentMesh: 1 +--- !u!1 &1047954371 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1047954372} + - component: {fileID: 1047954373} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1047954372 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1047954371} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2144436500} + - {fileID: 615558652} + - {fileID: 720503452} + m_Father: {fileID: 1055818112} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1047954373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1047954371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2144436501} + toggleTransition: 1 + graphic: {fileID: 615558653} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1055818111 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1055818112} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1055818112 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1055818111} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1047954372} + m_Father: {fileID: 912887456} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &1099803612 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1099803615} + - component: {fileID: 1099803616} + m_Layer: 0 + m_Name: NetworkManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1099803615 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1099803612} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1099803616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1099803612} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 03a4d4e1a7fd74c7ab2eccca4ce168db, type: 3} + m_Name: + m_EditorClassIdentifier: + host: neko.ugavel.com + port: 3290 + udpConnected: 0 + userid: -1 + room: + playerPrefab: {fileID: 6139051692386484099, guid: d4158ab9c4a204cdbba28d3273fc1fb3, type: 3} + prefabs: + - {fileID: 8565720275311462452, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + sceneObjects: [] + deletedSceneObjects: [] + connected: 0 +--- !u!1 &1154194181 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1154194182} + - component: {fileID: 1154194185} + - component: {fileID: 1154194184} + - component: {fileID: 1154194183} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1154194182 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154194181} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1679565284} + m_Father: {fileID: 927188573} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1154194183 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154194181} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2033163678} + m_HandleRect: {fileID: 2033163677} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1154194184 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154194181} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1154194185 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154194181} + m_CullTransparentMesh: 1 +--- !u!1 &1235343400 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1235343401} + - component: {fileID: 1235343402} + - component: {fileID: 1235343403} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1235343401 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235343400} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 945446556} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1235343402 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235343400} + m_CullTransparentMesh: 1 +--- !u!114 &1235343403 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235343400} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &1278634766 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1278634767} + - component: {fileID: 1278634770} + - component: {fileID: 1278634769} + - component: {fileID: 1278634768} + m_Layer: 5 + m_Name: JoinRoom + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1278634767 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278634766} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1295274441} + m_Father: {fileID: 244561620} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 80, y: 15.5} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1278634768 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278634766} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1278634769} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 244561621} + m_TargetAssemblyTypeName: NetworkGUI, Assembly-CSharp + m_MethodName: handleJoin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1278634769 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278634766} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1278634770 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278634766} + m_CullTransparentMesh: 1 +--- !u!1 &1295274440 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1295274441} + - component: {fileID: 1295274443} + - component: {fileID: 1295274442} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1295274441 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1295274440} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1278634767} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1295274442 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1295274440} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Join Room +--- !u!222 &1295274443 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1295274440} + m_CullTransparentMesh: 1 +--- !u!1 &1434745018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1434745020} + - component: {fileID: 1434745021} + - component: {fileID: 1434745019} + - component: {fileID: 1434745022} + - component: {fileID: 1434745023} + m_Layer: 0 + m_Name: Dissonance + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1434745019 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434745018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d2009d8e264649749c0315d48765749, type: 3} + m_Name: + m_EditorClassIdentifier: + dissonanceId: + comms: {fileID: 1434745021} + manager: {fileID: 1099803616} +--- !u!4 &1434745020 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434745018} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 818.5, y: 223, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1434745021 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434745018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8cb4dc319de88dc4cb76c47aafb46b1c, type: 3} + m_Name: + m_EditorClassIdentifier: + _lastPrefabError: + _isMuted: 0 + _isDeafened: 0 + _oneMinusBaseRemoteVoiceVolume: 0 + _playbackPrefab: {fileID: 0} + _playbackPrefab2: {fileID: 1041743830464418, guid: 1d5da08daf134aa41a83590aea0e4caa, type: 3} + _micName: + _playerPriority: 0 + _tokens: + _tokens: [] +--- !u!114 &1434745022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434745018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6a066ddbf125f9546bcadc947418566b, type: 3} + m_Name: + m_EditorClassIdentifier: + _tokens: + _tokens: [] + _channelTypeExpanded: 1 + _metadataExpanded: 1 + _activationModeExpanded: 1 + _tokensExpanded: 1 + _ampExpanded: 0 + _activationFaderSettings: + _volume: 1 + _fadeInTicks: 0 + _fadeOutTicks: 1500000 + _triggerFaderSettings: + _volume: 1 + _fadeInTicks: 7500000 + _fadeOutTicks: 11500000 + _broadcastPosition: 1 + _channelType: 0 + _inputName: + _mode: 1 + _muted: 0 + _playerId: + _useTrigger: 0 + _roomName: Global + _priority: 0 +--- !u!114 &1434745023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434745018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3737438748cf23f448d18cd2c6192e95, type: 3} + m_Name: + m_EditorClassIdentifier: + _tokens: + _tokens: [] + _roomName: Global + _useTrigger: 0 +--- !u!1 &1484033255 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1484033256} + - component: {fileID: 1484033258} + - component: {fileID: 1484033257} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1484033256 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1484033255} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 711524767} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1484033257 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1484033255} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1484033258 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1484033255} + m_CullTransparentMesh: 1 +--- !u!1 &1557879930 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1557879931} + - component: {fileID: 1557879933} + - component: {fileID: 1557879932} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1557879931 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557879930} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 117638565} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1557879932 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557879930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1557879933 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557879930} + m_CullTransparentMesh: 1 +--- !u!1 &1560686263 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1560686264} + - component: {fileID: 1560686265} + - component: {fileID: 1560686266} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1560686264 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560686263} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 626742070} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1560686265 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560686263} + m_CullTransparentMesh: 1 +--- !u!114 &1560686266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560686263} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &1679565283 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1679565284} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1679565284 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679565283} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2033163677} + m_Father: {fileID: 1154194182} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1760805524 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1760805525} + - component: {fileID: 1760805528} + - component: {fileID: 1760805527} + - component: {fileID: 1760805526} + m_Layer: 5 + m_Name: JoinServer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1760805525 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1760805524} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2118429759} + m_Father: {fileID: 244561620} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 82, y: 51} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1760805526 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1760805524} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1760805527} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 244561621} + m_TargetAssemblyTypeName: NetworkGUI, Assembly-CSharp + m_MethodName: handleLogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1760805527 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1760805524} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1760805528 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1760805524} + m_CullTransparentMesh: 1 +--- !u!1 &1843597585 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1843597586} + - component: {fileID: 1843597589} + - component: {fileID: 1843597588} + - component: {fileID: 1843597587} + m_Layer: 5 + m_Name: Send + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1843597586 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843597585} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1852007163} + m_Father: {fileID: 244561620} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 273.05, y: 88} + m_SizeDelta: {x: 94.1, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1843597587 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843597585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1843597588} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 244561621} + m_TargetAssemblyTypeName: NetworkGUI, Assembly-CSharp + m_MethodName: handleSend + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1843597588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843597585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1843597589 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843597585} + m_CullTransparentMesh: 1 +--- !u!1 &1852007162 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1852007163} + - component: {fileID: 1852007165} + - component: {fileID: 1852007164} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1852007163 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852007162} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1843597586} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1852007164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852007162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Send +--- !u!222 &1852007165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852007162} + m_CullTransparentMesh: 1 +--- !u!1 &1894247852 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1894247853} + - component: {fileID: 1894247855} + - component: {fileID: 1894247854} + m_Layer: 5 + m_Name: Received + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1894247853 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894247852} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 244561620} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 162.54999, y: 16.098999} + m_SizeDelta: {x: 315.1, y: -47.802124} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1894247854 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894247852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: New Text +--- !u!222 &1894247855 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1894247852} + m_CullTransparentMesh: 1 +--- !u!1 &1954037269 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1954037272} + - component: {fileID: 1954037271} + - component: {fileID: 1954037270} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1954037270 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954037269} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enter text... +--- !u!222 &1954037271 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954037269} + m_CullTransparentMesh: 1 +--- !u!224 &1954037272 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954037269} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 945446556} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2033163676 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2033163677} + - component: {fileID: 2033163679} + - component: {fileID: 2033163678} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2033163677 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033163676} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1679565284} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2033163678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033163676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2033163679 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033163676} + m_CullTransparentMesh: 1 +--- !u!1 &2118429758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2118429759} + - component: {fileID: 2118429761} + - component: {fileID: 2118429760} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2118429759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2118429758} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1760805525} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2118429760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2118429758} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Join Server +--- !u!222 &2118429761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2118429758} + m_CullTransparentMesh: 1 +--- !u!1 &2144436499 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2144436500} + - component: {fileID: 2144436502} + - component: {fileID: 2144436501} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2144436500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144436499} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1047954372} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2144436501 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144436499} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2144436502 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144436499} + m_CullTransparentMesh: 1 +--- !u!1001 &8565720276829121781 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 8565720275311462453, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_Name + value: TestNetworkedGameObject + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8565720275311462455, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} diff --git a/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/test.unity.meta b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/test.unity.meta new file mode 100644 index 0000000..775a312 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Samples~/Example/test.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e4e43899246c941c78acfc59ce2f664a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/VelNetUnity.asmdef b/TestVelGameServer/Packages/VelNetUnity/VelNetUnity.asmdef new file mode 100644 index 0000000..3422459 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/VelNetUnity.asmdef @@ -0,0 +1,14 @@ +{ + "name": "VelNetUnity", + "rootNamespace": "VelNetUnity", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/TestVelGameServer/Packages/VelNetUnity/VelNetUnity.asmdef.meta b/TestVelGameServer/Packages/VelNetUnity/VelNetUnity.asmdef.meta new file mode 100644 index 0000000..5203378 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/VelNetUnity.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1e55e2c4387020247a1ae212bbcbd381 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/package.json b/TestVelGameServer/Packages/VelNetUnity/package.json new file mode 100644 index 0000000..b3016a0 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/package.json @@ -0,0 +1,31 @@ +{ + "name": "edu.uga.engr.vel.velnetunity", + "displayName": "VelNetUnity", + "version": "1.0.0", + "unity": "2019.1", + "description": "A custom networking library for Unity.", + "keywords": [ + "networking", + "self-hosted" + ], + "author": { + "name": "Kyle Johnsen", + "email": "kjohnsen@uga.edu", + "url": "https://vel.engr.uga.edu" + }, + "samples": [ + { + "displayName": "Dissonance Integration", + "description": "Includes support for Dissonance Voice, available separately from the Unity Asset Store.", + "path": "Samples~/DissonanceIntegration" + }, + { + "displayName": "Example", + "description": "Example Scene", + "path": "Samples~/Example" + } + ], + "dependencies": { + } + } + \ No newline at end of file diff --git a/TestVelGameServer/Packages/VelNetUnity/package.json.meta b/TestVelGameServer/Packages/VelNetUnity/package.json.meta new file mode 100644 index 0000000..6b49770 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 525b0bfd38079f24f86b406a8da0b3c7 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/manifest.json b/TestVelGameServer/Packages/manifest.json index 269f819..960f904 100644 --- a/TestVelGameServer/Packages/manifest.json +++ b/TestVelGameServer/Packages/manifest.json @@ -1,10 +1,10 @@ { "dependencies": { - "com.unity.collab-proxy": "1.7.1", + "com.unity.collab-proxy": "1.15.7", "com.unity.ide.rider": "2.0.7", - "com.unity.ide.visualstudio": "2.0.11", - "com.unity.ide.vscode": "1.2.3", - "com.unity.test-framework": "1.1.27", + "com.unity.ide.visualstudio": "2.0.12", + "com.unity.ide.vscode": "1.2.4", + "com.unity.test-framework": "1.1.30", "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.4.8", "com.unity.ugui": "1.0.0", diff --git a/TestVelGameServer/Packages/packages-lock.json b/TestVelGameServer/Packages/packages-lock.json index 6f39b82..29bc8f6 100644 --- a/TestVelGameServer/Packages/packages-lock.json +++ b/TestVelGameServer/Packages/packages-lock.json @@ -1,11 +1,12 @@ { "dependencies": { "com.unity.collab-proxy": { - "version": "1.7.1", + "version": "1.15.7", "depth": 0, "source": "registry", "dependencies": { - "com.unity.nuget.newtonsoft-json": "2.0.0" + "com.unity.nuget.newtonsoft-json": "2.0.0", + "com.unity.services.core": "1.0.1" }, "url": "https://packages.unity.com" }, @@ -26,7 +27,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.11", + "version": "2.0.12", "depth": 0, "source": "registry", "dependencies": { @@ -35,7 +36,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.vscode": { - "version": "1.2.3", + "version": "1.2.4", "depth": 0, "source": "registry", "dependencies": {}, @@ -48,8 +49,17 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.services.core": { + "version": "1.0.1", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.test-framework": { - "version": "1.1.27", + "version": "1.1.30", "depth": 0, "source": "registry", "dependencies": { @@ -89,6 +99,12 @@ "com.unity.modules.imgui": "1.0.0" } }, + "edu.uga.engr.vel.velnetunity": { + "version": "file:VelNetUnity", + "depth": 0, + "source": "embedded", + "dependencies": {} + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/TestVelGameServer/ProjectSettings/TimelineSettings.asset b/TestVelGameServer/ProjectSettings/TimelineSettings.asset new file mode 100644 index 0000000..b4fbdb0 --- /dev/null +++ b/TestVelGameServer/ProjectSettings/TimelineSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3} + m_Name: + m_EditorClassIdentifier: + assetDefaultFramerate: 60 diff --git a/velnet_logo.png b/velnet_logo.png new file mode 100644 index 0000000..6b4b16d Binary files /dev/null and b/velnet_logo.png differ