From de26857357874193b86351443fad709105b6b0d1 Mon Sep 17 00:00:00 2001 From: Anton Franzluebbers Date: Thu, 13 Jan 2022 01:09:33 -0500 Subject: [PATCH] fixed some more errors related to not cleaning up properly when switching rooms, catch more errors to prevent everything from breaking at once if the user makes an error, added NetworkSerializedObjectStream to avoid needing to initialize binary readers, updated example to include a shared textbox and leave room button --- .../VelNet/1.0.4/Example/NetworkGUI.cs | 5 + .../VelNet/1.0.4/Example/SyncedTextbox.cs | 19 + .../1.0.4/Example/SyncedTextbox.cs.meta | 11 + .../Samples/VelNet/1.0.4/Example/test.unity | 568 +++++++++++++++++- .../VelNetUnity/Runtime/NetworkObject.cs | 21 +- .../Runtime/Util/NetworkSerializedObject.cs | 2 +- .../Util/NetworkSerializedObjectStream.cs | 47 ++ .../NetworkSerializedObjectStream.cs.meta | 3 + .../VelNetUnity/Runtime/VelNetManager.cs | 35 +- .../Packages/VelNetUnity/package.json | 2 +- 10 files changed, 691 insertions(+), 22 deletions(-) create mode 100644 TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs create mode 100644 TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/SyncedTextbox.cs.meta create mode 100644 TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs create mode 100644 TestVelGameServer/Packages/VelNetUnity/Runtime/Util/NetworkSerializedObjectStream.cs.meta 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/test.unity b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/test.unity index 5c5a1e3..a31295b 100644 --- a/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/test.unity +++ b/TestVelGameServer/Assets/Samples/VelNet/1.0.4/Example/test.unity @@ -602,8 +602,10 @@ RectTransform: - {fileID: 1278634767} - {fileID: 626742070} - {fileID: 711524767} + - {fileID: 864104176} - {fileID: 945446556} - {fileID: 1843597586} + - {fileID: 948755938} m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -631,6 +633,85 @@ MonoBehaviour: messages: {fileID: 1894247854} messageBuffer: [] microphones: {fileID: 117638564} +--- !u!1 &359309140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 359309141} + - component: {fileID: 359309143} + - component: {fileID: 359309142} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &359309141 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359309140} + 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: 948755938} + 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.5000038} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &359309142 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359309140} + 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 &359309143 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359309140} + m_CullTransparentMesh: 1 --- !u!1 &440509381 GameObject: m_ObjectHideFlags: 0 @@ -864,7 +945,7 @@ RectTransform: 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_LocalPosition: {x: 0, y: 0, z: -0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 2034439} @@ -874,7 +955,7 @@ RectTransform: 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_AnchoredPosition: {x: 213.2, y: 51} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &626742071 @@ -1045,7 +1126,7 @@ RectTransform: 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_AnchoredPosition: {x: 211.20001, y: 15.5} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &711524768 @@ -1230,6 +1311,139 @@ RectTransform: m_AnchoredPosition: {x: 5, y: -0.5} m_SizeDelta: {x: -30, y: -3} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &864104175 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 864104176} + - component: {fileID: 864104179} + - component: {fileID: 864104178} + - component: {fileID: 864104177} + m_Layer: 5 + m_Name: LeaveRoom + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &864104176 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 864104175} + 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: 1401860307} + 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: 356.07678, y: 15.5} + m_SizeDelta: {x: 125.7535, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &864104177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 864104175} + 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: 864104178} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 244561621} + m_TargetAssemblyTypeName: VelNet.NetworkGUI, Assembly-CSharp + m_MethodName: HandleLeave + 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 &864104178 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 864104175} + 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 &864104179 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 864104175} + m_CullTransparentMesh: 1 --- !u!1 &903768653 GameObject: m_ObjectHideFlags: 0 @@ -1624,7 +1838,7 @@ RectTransform: - {fileID: 1954037272} - {fileID: 1235343401} m_Father: {fileID: 244561620} - m_RootOrder: 6 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1669,6 +1883,184 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 945446554} m_CullTransparentMesh: 1 +--- !u!1 &948755937 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 948755938} + - component: {fileID: 948755943} + - component: {fileID: 948755942} + - component: {fileID: 948755941} + - component: {fileID: 948755940} + - component: {fileID: 948755939} + m_Layer: 5 + m_Name: Synced Textbox + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &948755938 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948755937} + 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: 359309141} + - {fileID: 1840952814} + m_Father: {fileID: 244561620} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -10, y: 10} + m_SizeDelta: {x: 309.08167, y: 65.9} + m_Pivot: {x: 1, y: 0} +--- !u!114 &948755939 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948755937} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0a7b2180d3fffdc459417bfc24b179b8, type: 3} + m_Name: + m_EditorClassIdentifier: + networkObject: {fileID: 948755940} + serializationRateHz: 30 + text: {fileID: 948755941} +--- !u!114 &948755940 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948755937} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5515094c5c544b6b8ed7fd51a86548d4, type: 3} + m_Name: + m_EditorClassIdentifier: + ownershipLocked: 0 + networkId: + prefabName: + isSceneObject: 1 + syncedComponents: + - {fileID: 948755939} +--- !u!114 &948755941 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948755937} + 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: 948755942} + m_TextComponent: {fileID: 1840952815} + m_Placeholder: {fileID: 359309142} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 2 + 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 &948755942 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948755937} + 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 &948755943 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948755937} + m_CullTransparentMesh: 1 --- !u!1 &1047954371 GameObject: m_ObjectHideFlags: 0 @@ -2101,8 +2493,8 @@ RectTransform: 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_AnchoredPosition: {x: 65.39307, y: 15.5} + m_SizeDelta: {x: 130.7862, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1278634768 MonoBehaviour: @@ -2277,6 +2669,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1295274440} m_CullTransparentMesh: 1 +--- !u!1 &1401860306 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1401860307} + - component: {fileID: 1401860309} + - component: {fileID: 1401860308} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1401860307 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401860306} + 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: 864104176} + 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 &1401860308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401860306} + 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: Leave Room +--- !u!222 &1401860309 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401860306} + m_CullTransparentMesh: 1 --- !u!1 &1434745018 GameObject: m_ObjectHideFlags: 0 @@ -2704,8 +3175,8 @@ RectTransform: 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_AnchoredPosition: {x: 67.02789, y: 51} + m_SizeDelta: {x: 130.7862, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1760805526 MonoBehaviour: @@ -2801,6 +3272,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1760805524} m_CullTransparentMesh: 1 +--- !u!1 &1840952813 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1840952814} + - component: {fileID: 1840952816} + - component: {fileID: 1840952815} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1840952814 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840952813} + 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: 948755938} + 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.5000038} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1840952815 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840952813} + 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: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1840952816 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840952813} + m_CullTransparentMesh: 1 --- !u!1 &1843597585 GameObject: m_ObjectHideFlags: 0 @@ -2833,7 +3383,7 @@ RectTransform: m_Children: - {fileID: 1852007163} m_Father: {fileID: 244561620} - m_RootOrder: 7 + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs index aa39b78..b08e041 100644 --- a/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/NetworkObject.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; #if UNITY_EDITOR @@ -42,6 +43,12 @@ namespace VelNet } // send the message and an identifier for which component it belongs to + if (!syncedComponents.Contains(component)) + { + Debug.LogError("Can't send message if this component is not registered with the NetworkObject.", this); + return; + } + int index = syncedComponents.IndexOf(component); owner.SendMessage(this, index.ToString(), message, reliable); } @@ -62,7 +69,19 @@ namespace VelNet public void ReceiveBytes(string identifier, byte[] message) { // send the message to the right component - 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 7fe36d9..71ea086 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,24 +657,32 @@ namespace VelNet } - public static void InstantiateNetworkObject(string prefabName) + public static NetworkObject InstantiateNetworkObject(string prefabName) { VelNetPlayer localPlayer = LocalPlayer; NetworkObject prefab = instance.prefabs.Find(p => p.name == prefabName); if (prefab == null) { Debug.LogError("Couldn't find a prefab with that name: " + prefabName); - return; + 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; } public static void SomebodyInstantiatedNetworkObject(string networkId, string prefabName, VelNetPlayer owner) @@ -690,11 +696,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": [