diff --git a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/NetworkGUI.cs b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/NetworkGUI.cs index 46387bf..f009324 100644 --- a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/NetworkGUI.cs +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/NetworkGUI.cs @@ -41,6 +41,11 @@ namespace VelNet } } + public void HandleLeave() + { + VelNetManager.Leave(); + } + // Start is called before the first frame update private void Start() { diff --git a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs new file mode 100644 index 0000000..73c526b --- /dev/null +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs @@ -0,0 +1,19 @@ +using System.IO; +using UnityEngine.UI; +using VelNet; + +public class SyncedTextbox : NetworkSerializedObjectStream +{ + public InputField text; + + + protected override void SendState(BinaryWriter binaryWriter) + { + binaryWriter.Write(text.text); + } + + protected override void ReceiveState(BinaryReader binaryReader) + { + text.text = binaryReader.ReadString(); + } +} \ No newline at end of file diff --git a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs.meta b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs.meta new file mode 100644 index 0000000..2e95173 --- /dev/null +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a7b2180d3fffdc459417bfc24b179b8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VRPlayerPrefab.prefab b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VRPlayerPrefab.prefab index ef91372..7d37caf 100644 --- a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VRPlayerPrefab.prefab +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VRPlayerPrefab.prefab @@ -115,9 +115,7 @@ MonoBehaviour: m_EditorClassIdentifier: networkObject: {fileID: 1210055141702294256} serializationRateHz: 10 - targetPosition: {x: 0, y: 0, z: 0} - targetRotation: {x: 0, y: 0, z: 0, w: 0} - smoothness: 0.1 + useLocalTransform: 0 --- !u!1 &4288536670273191849 GameObject: m_ObjectHideFlags: 0 @@ -374,9 +372,7 @@ MonoBehaviour: m_EditorClassIdentifier: networkObject: {fileID: 1210055141702294256} serializationRateHz: 10 - targetPosition: {x: 0, y: 0, z: 0} - targetRotation: {x: 0, y: 0, z: 0, w: 0} - smoothness: 0.1 + useLocalTransform: 0 --- !u!114 &7488770076211636178 MonoBehaviour: m_ObjectHideFlags: 0 @@ -443,9 +439,7 @@ MonoBehaviour: m_EditorClassIdentifier: networkObject: {fileID: 1210055141702294256} serializationRateHz: 10 - targetPosition: {x: 0, y: 0, z: 0} - targetRotation: {x: 0, y: 0, z: 0, w: 0} - smoothness: 0.1 + useLocalTransform: 0 --- !u!1 &9019499937923320283 GameObject: m_ObjectHideFlags: 0 @@ -492,9 +486,7 @@ MonoBehaviour: m_EditorClassIdentifier: networkObject: {fileID: 1210055141702294256} serializationRateHz: 10 - targetPosition: {x: 0, y: 0, z: 0} - targetRotation: {x: 0, y: 0, z: 0, w: 0} - smoothness: 0.1 + useLocalTransform: 0 --- !u!1001 &6270683889218452347 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetMan.cs b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetMan.cs index 6b9f7c5..2de58fc 100644 --- a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetMan.cs +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetMan.cs @@ -18,7 +18,7 @@ public class VelNetMan : MonoBehaviour { VelNetManager.OnJoinedRoom += room => { - GameObject created = VelNetManager.InstantiateNetworkObject(playerPrefab.name); + GameObject created = VelNetManager.InstantiateNetworkObject(playerPrefab.name).gameObject; PlayerMan playerMan = created.GetComponent(); if (playerMan) { playerMan.leftHand.hand = leftHand; diff --git a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetSyncHand.cs b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetSyncHand.cs index 37e97cb..a987c99 100644 --- a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetSyncHand.cs +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/VelNetSyncHand.cs @@ -42,16 +42,6 @@ public class VelNetSyncHand : NetworkSerializedObject private void Start() { targets = new Quaternion[toSync.Length]; - InvokeRepeating("NetworkSend", 0, 1 / serializationRateHz); - } - - //TODO: remove when NetworkSerializedObject works - private void NetworkSend() - { - if (IsMine && hand != null && hand.IsDataValid) - { - SendBytes(SendState()); - } } protected override void ReceiveState(byte[] message) @@ -70,7 +60,7 @@ public class VelNetSyncHand : NetworkSerializedObject using BinaryWriter writer = new BinaryWriter(mem); for(int i = 0; i= syncedComponents.Count) - { - Debug.LogError("Got message for NetworkComponent that doesn't exist: " + identifier + " on " + prefabName); - Debug.Log(str_message); - return; - } - syncedComponents[int.Parse(identifier)].ReceiveBytes(message); + + try + { + syncedComponents[int.Parse(identifier)].ReceiveBytes(message); + } + catch (Exception e) + { + Debug.LogError($"Error in handling message:\n{e}", this); + } + } + + public void TakeOwnership() + { + VelNetManager.TakeOwnership(networkId); } } diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObject.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObject.cs index 13037d1..0569eed 100644 --- a/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObject.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObject.cs @@ -9,7 +9,7 @@ namespace VelNet [Tooltip("Send rate of this object. This caps out at the framerate of the game.")] public float serializationRateHz = 30; - private void Awake() + protected virtual void Awake() { StartCoroutine(SendMessageUpdate()); } diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs new file mode 100644 index 0000000..a6929f8 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs @@ -0,0 +1,47 @@ +using System.Collections; +using System.IO; +using UnityEngine; +using UnityEngine.Serialization; + +namespace VelNet +{ + public abstract class NetworkSerializedObjectStream : NetworkComponent + { + [Tooltip("Send rate of this object. This caps out at the framerate of the game.")] + public float serializationRateHz = 30; + + protected virtual void Awake() + { + StartCoroutine(SendMessageUpdate()); + } + + private IEnumerator SendMessageUpdate() + { + while (true) + { + if (IsMine) + { + using MemoryStream mem = new MemoryStream(); + using BinaryWriter writer = new BinaryWriter(mem); + SendState(writer); + SendBytes(mem.ToArray()); + } + + yield return new WaitForSeconds(1f / serializationRateHz); + } + // ReSharper disable once IteratorNeverReturns + } + + public override void ReceiveBytes(byte[] message) + { + using MemoryStream mem = new MemoryStream(message); + using BinaryReader reader = new BinaryReader(mem); + + ReceiveState(reader); + } + + protected abstract void SendState(BinaryWriter binaryWriter); + + protected abstract void ReceiveState(BinaryReader binaryReader); + } +} \ No newline at end of file diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs.meta new file mode 100644 index 0000000..6f4475e --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7da4222cdb03a3e43aceb43ef1e28f7e +timeCreated: 1641514434 \ No newline at end of file diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs index 013edf0..9441dc7 100644 --- a/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs @@ -208,6 +208,9 @@ namespace VelNet .Where(kvp => kvp.Value == null || !kvp.Value.isSceneObject) .Select(o => o.Key) .ToList().ForEach(NetworkDestroy); + + // then remove references to the ones that are left + objects.Clear(); // empty all the groups foreach (string group in instance.groups.Keys) @@ -217,7 +220,6 @@ namespace VelNet instance.groups.Clear(); - Debug.Log("Left VelNet Room: " + oldRoom); try { OnLeftRoom?.Invoke(oldRoom); @@ -328,13 +330,9 @@ namespace VelNet 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; - } + kvp.Value.owner ??= masterPlayer; } break; @@ -659,7 +657,8 @@ namespace VelNet } - public static GameObject InstantiateNetworkObject(string prefabName) + + public static NetworkObject InstantiateNetworkObject(string prefabName) { VelNetPlayer localPlayer = LocalPlayer; NetworkObject prefab = instance.prefabs.Find(p => p.name == prefabName); @@ -669,15 +668,22 @@ namespace VelNet return null; } + string networkId = localPlayer.userid + "-" + localPlayer.lastObjectId++; + if (instance.objects.ContainsKey(networkId)) + { + Debug.LogError("Can't instantiate object. Obj with that network ID was already instantiated.", instance.objects[networkId]); + return null; + } NetworkObject newObject = Instantiate(prefab); - newObject.networkId = localPlayer.userid + "-" + localPlayer.lastObjectId++; + newObject.networkId = networkId; newObject.prefabName = prefabName; newObject.owner = localPlayer; instance.objects.Add(newObject.networkId, newObject); // only sent to others, as I already instantiated this. Nice that it happens immediately. SendTo(MessageType.OTHERS, "7," + newObject.networkId + "," + prefabName); - return newObject.gameObject; + + return newObject; } public static void SomebodyInstantiatedNetworkObject(string networkId, string prefabName, VelNetPlayer owner) @@ -691,11 +697,20 @@ namespace VelNet instance.objects.Add(newObject.networkId, newObject); } + public static void NetworkDestroy(NetworkObject obj) + { + NetworkDestroy(obj.networkId); + } + public static void NetworkDestroy(string networkId) { if (!instance.objects.ContainsKey(networkId)) return; NetworkObject obj = instance.objects[networkId]; - if (obj == null) return; + if (obj == null) + { + instance.objects.Remove(networkId); + return; + } if (obj.isSceneObject) { instance.deletedSceneObjects.Add(networkId); diff --git a/TestVelGameServer/Packages/VelNetUnity/package.json b/TestVelGameServer/Packages/VelNetUnity/package.json index 4f2b772..b846be2 100644 --- a/TestVelGameServer/Packages/VelNetUnity/package.json +++ b/TestVelGameServer/Packages/VelNetUnity/package.json @@ -1,7 +1,7 @@ { "name": "edu.uga.engr.vel.velnet", "displayName": "VelNet", - "version": "1.0.5", + "version": "1.0.6", "unity": "2019.1", "description": "A custom networking library for Unity.", "keywords": [