From 1a57cd3879df033399cdcc9b49bab8ef0ca20491 Mon Sep 17 00:00:00 2001 From: Kyle Johnsen Date: Mon, 3 Jan 2022 23:36:11 -0500 Subject: [PATCH] instantiation working nicely, including when objects join later --- TestVelGameServer/Assets/NetworkObject.cs | 2 +- TestVelGameServer/Assets/Scenes/test.unity | 203 +++++------------- .../Assets/TestNetworkedGameObject.prefab | 145 +++++++++++++ .../TestNetworkedGameObject.prefab.meta | 7 + .../Assets/VelGameServer/NetworkPlayer.cs | 97 +++++++-- .../Assets/VelGameServer/PlayerController.cs | 80 +++++++ .../VelGameServer/PlayerController.cs.meta | 11 + .../Assets/VelGameServer/PlayerPrefab.prefab | 8 +- threaded_server.py | 11 +- 9 files changed, 387 insertions(+), 177 deletions(-) create mode 100644 TestVelGameServer/Assets/TestNetworkedGameObject.prefab create mode 100644 TestVelGameServer/Assets/TestNetworkedGameObject.prefab.meta create mode 100644 TestVelGameServer/Assets/VelGameServer/PlayerController.cs create mode 100644 TestVelGameServer/Assets/VelGameServer/PlayerController.cs.meta diff --git a/TestVelGameServer/Assets/NetworkObject.cs b/TestVelGameServer/Assets/NetworkObject.cs index 64e5a76..cfef9e6 100644 --- a/TestVelGameServer/Assets/NetworkObject.cs +++ b/TestVelGameServer/Assets/NetworkObject.cs @@ -9,7 +9,7 @@ public abstract class NetworkObject: MonoBehaviour, NetworkSyncable { 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 abstract byte[] getSyncMessage(); public abstract void handleSyncMessage(byte[] message); } diff --git a/TestVelGameServer/Assets/Scenes/test.unity b/TestVelGameServer/Assets/Scenes/test.unity index 71e268e..93a496f 100644 --- a/TestVelGameServer/Assets/Scenes/test.unity +++ b/TestVelGameServer/Assets/Scenes/test.unity @@ -1150,101 +1150,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 711524766} m_CullTransparentMesh: 1 ---- !u!1 &720148908 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 720148909} - - component: {fileID: 720148912} - - component: {fileID: 720148911} - - component: {fileID: 720148910} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &720148909 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 720148908} - 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: 1720689858} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &720148910 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 720148908} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &720148911 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 720148908} - 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!33 &720148912 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 720148908} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &720503449 GameObject: m_ObjectHideFlags: 0 @@ -1919,7 +1824,8 @@ MonoBehaviour: userid: -1 room: playerPrefab: {fileID: 6139051692386484099, guid: d4158ab9c4a204cdbba28d3273fc1fb3, type: 3} - prefabs: [] + prefabs: + - {fileID: 8565720275311462452, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} connected: 0 --- !u!1 &1154194181 GameObject: @@ -2750,54 +2656,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1720689856 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1720689858} - - component: {fileID: 1720689857} - m_Layer: 0 - m_Name: TestNetworkedGameObject - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1720689857 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1720689856} - 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!4 &1720689858 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1720689856} - 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: 720148909} - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1760805524 GameObject: m_ObjectHideFlags: 0 @@ -3530,3 +3388,60 @@ CanvasRenderer: 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/Assets/TestNetworkedGameObject.prefab b/TestVelGameServer/Assets/TestNetworkedGameObject.prefab new file mode 100644 index 0000000..bac19d3 --- /dev/null +++ b/TestVelGameServer/Assets/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/Assets/TestNetworkedGameObject.prefab.meta b/TestVelGameServer/Assets/TestNetworkedGameObject.prefab.meta new file mode 100644 index 0000000..0743d13 --- /dev/null +++ b/TestVelGameServer/Assets/TestNetworkedGameObject.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6e4a023f70e01405e8b249a4488fe319 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs b/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs index 5566606..8aa6643 100644 --- a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs +++ b/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs @@ -32,9 +32,13 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer public bool IsTracking => true; bool isMaster = false; - void Awake() + + + void Start() { myObject.owner = this; + this.manager = GameObject.FindObjectOfType(); + manager.onPlayerJoined += handlePlayerJoined; } // Update is called once per frame @@ -58,6 +62,23 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer } + 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(0, "7," + kvp.Value.networkId + "," + kvp.Value.prefabName); + + } + } + } + } + + public void handleMessage(NetworkManager.Message m) { //these are generally things that come from the "owner" and should be enacted locally, where appropriate @@ -133,27 +154,29 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer } case "6": //I'm trying to take ownership of an object { - int objectId = int.Parse(sections[1]); - int creatorId = int.Parse(sections[2]); - string objectKey = creatorId + "-" + objectId; - if (manager.objects.ContainsKey(objectKey)) + string networkId = sections[1]; + + if (manager.objects.ContainsKey(networkId)) { - manager.objects[objectKey].owner = this; - + manager.objects[networkId].owner = this; } break; } - case "7": //I'm trying to instantiate an object (sent to everyone) + case "7": //I'm trying to instantiate an object { - int objectId = int.Parse(sections[1]); + 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 = this.userid + "-" + objectId; - + instance.networkId = networkId; + instance.prefabName = prefabName; instance.owner = this; manager.objects.Add(instance.networkId, instance); } @@ -162,16 +185,12 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer } case "8": //I'm trying to destroy a gameobject I own (I guess this is sent to everyone) { - int objectId = int.Parse(sections[1]); - int creatorId = int.Parse(sections[2]); - string objectKey = creatorId + "-" + objectId; - if (manager.objects.ContainsKey(objectKey)) - { - if (manager.objects[objectKey].owner == this) - { - GameObject.Destroy(manager.objects[objectKey].gameObject); - } - manager.objects.Remove(objectKey); + string networkId = sections[1]; + + if (manager.objects.ContainsKey(networkId) && manager.objects[networkId].owner == this) + { + GameObject.Destroy(manager.objects[networkId].gameObject); + manager.objects.Remove(networkId); } break; } @@ -218,8 +237,42 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer } } - public void instantiateObject(string prefab) + 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(0, "7," + networkId + "," + prefabName); + 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(3, "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(2, "6," + networkId); //must be ordered, so that ownership transfers are not confused } diff --git a/TestVelGameServer/Assets/VelGameServer/PlayerController.cs b/TestVelGameServer/Assets/VelGameServer/PlayerController.cs new file mode 100644 index 0000000..0c1b7e6 --- /dev/null +++ b/TestVelGameServer/Assets/VelGameServer/PlayerController.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PlayerController : NetworkObject +{ + + public Vector3 targetPosition; + public Quaternion targetRotation; + + + public override 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 handleSyncMessage(byte[] 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]; + } + + // Start is called before the first frame update + void Start() + { + StartCoroutine(syncBehavior()); + } + + IEnumerator syncBehavior() + { + while (true) + { + if (owner != null && owner.isLocal) + { + + owner.syncObject(this); + } + 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); + } + else if(owner != null && owner.isLocal) + { + 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"); + } + } + } +} diff --git a/TestVelGameServer/Assets/VelGameServer/PlayerController.cs.meta b/TestVelGameServer/Assets/VelGameServer/PlayerController.cs.meta new file mode 100644 index 0000000..1c49a76 --- /dev/null +++ b/TestVelGameServer/Assets/VelGameServer/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/Assets/VelGameServer/PlayerPrefab.prefab b/TestVelGameServer/Assets/VelGameServer/PlayerPrefab.prefab index b74458b..1c3683f 100644 --- a/TestVelGameServer/Assets/VelGameServer/PlayerPrefab.prefab +++ b/TestVelGameServer/Assets/VelGameServer/PlayerPrefab.prefab @@ -13,7 +13,7 @@ GameObject: - component: {fileID: 6854617867369839} - component: {fileID: 5845716565458182149} - component: {fileID: 5713671764962751473} - - component: {fileID: 2513801069545108573} + - component: {fileID: -4404668399269848200} m_Layer: 0 m_Name: PlayerPrefab m_TagString: Untagged @@ -109,7 +109,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d8d3b6de660834e3e898725928251405, type: 3} m_Name: m_EditorClassIdentifier: - myObject: {fileID: 2513801069545108573} + myObject: {fileID: -4404668399269848200} userid: 0 username: room: @@ -118,7 +118,7 @@ MonoBehaviour: lastObjectId: 0 commsNetwork: {fileID: 0} dissonanceID: ---- !u!114 &2513801069545108573 +--- !u!114 &-4404668399269848200 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -127,7 +127,7 @@ MonoBehaviour: m_GameObject: {fileID: 6139051692386484099} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3f1f9b0bbd93a484a987c51f1107ebe5, type: 3} + m_Script: {fileID: 11500000, guid: 89e3af759df774692a566a166b4bf69b, type: 3} m_Name: m_EditorClassIdentifier: owner: {fileID: 5713671764962751473} diff --git a/threaded_server.py b/threaded_server.py index 9179c2a..cd9bdb9 100644 --- a/threaded_server.py +++ b/threaded_server.py @@ -122,7 +122,7 @@ def decode_message(client,message): masterId = rooms[roomName].master.id else: #create the room and join it as master - rooms[roomName] = types.SimpleNamespace(name=roomName,clients=[client],master=client,room_lock=threading.Lock()) + rooms[roomName] = types.SimpleNamespace(name=roomName,clients=[client],master=client, room_lock=threading.Lock()) masterId = client.id current_clients = rooms[roomName].clients @@ -145,14 +145,13 @@ def decode_message(client,message): if messageType == '3' and len(decodedMessage) > 2: subMessageType = decodedMessage[1] if subMessageType == '0': - #send a message to everyone in the room (not synced) + #send a message to everyone else in the room (not synced) send_room_message(client.room,f"3:{client.id}:{decodedMessage[2]}\n",client) - elif subMessageType == '1': + elif subMessageType == '1': #everyone including the client who sent it send_room_message(client.room,f"3:{client.id}:{decodedMessage[2]}\n") - elif subMessageType == '2': - #send a message to everyone in the room (not synced) + elif subMessageType == '2': #everyone but the client, ensures order within the room send_synced_room_message(client.room,f"3:{client.id}:{decodedMessage[2]}\n",client) - elif subMessageType == '3': + elif subMessageType == '3': #everyone including the client, ensuring order send_synced_room_message(client.room,f"3:{client.id}:{decodedMessage[2]}\n") def client_read_thread(conn, addr, client):