From e34164b31d92fcb9e1549c960e9e04c53eedaaef Mon Sep 17 00:00:00 2001 From: MrGadget1024 Date: Sun, 9 Jan 2022 05:33:40 -0500 Subject: [PATCH 01/27] Delete Tests folder --- Assets/Mirror/Tests.meta | 8 - Assets/Mirror/Tests/Common.meta | 8 - Assets/Mirror/Tests/Common/Castle.Core.dll | Bin 442368 -> 0 bytes .../Mirror/Tests/Common/Castle.Core.dll.meta | 112 - .../Tests/Common/ClientSceneTestsBase.cs | 62 - .../Tests/Common/ClientSceneTestsBase.cs.meta | 11 - .../ClientSceneTests_RegisterPrefabBase.cs | 212 - ...lientSceneTests_RegisterPrefabBase.cs.meta | 11 - .../Tests/Common/FakeNetworkConnection.cs | 12 - .../Common/FakeNetworkConnection.cs.meta | 11 - Assets/Mirror/Tests/Common/MemoryTransport.cs | 208 - .../Tests/Common/MemoryTransport.cs.meta | 11 - .../Tests/Common/Mirror.Tests.Common.asmdef | 16 - .../Common/Mirror.Tests.Common.asmdef.meta | 7 - .../Mirror/Tests/Common/MirrorEditModeTest.cs | 14 - .../Tests/Common/MirrorEditModeTest.cs.meta | 11 - .../Mirror/Tests/Common/MirrorPlayModeTest.cs | 27 - .../Tests/Common/MirrorPlayModeTest.cs.meta | 11 - Assets/Mirror/Tests/Common/MirrorTest.cs | 557 -- Assets/Mirror/Tests/Common/MirrorTest.cs.meta | 11 - Assets/Mirror/Tests/Common/NSubstitute.dll | Bin 148480 -> 0 bytes .../Mirror/Tests/Common/NSubstitute.dll.meta | 112 - .../System.Threading.Tasks.Extensions.dll | Bin 25864 -> 0 bytes ...System.Threading.Tasks.Extensions.dll.meta | 117 - Assets/Mirror/Tests/Editor.meta | 8 - Assets/Mirror/Tests/Editor/Batching.meta | 3 - .../Tests/Editor/Batching/BatcherTests.cs | 230 - .../Editor/Batching/BatcherTests.cs.meta | 11 - .../Tests/Editor/Batching/UnbatcherTests.cs | 138 - .../Editor/Batching/UnbatcherTests.cs.meta | 3 - .../Tests/Editor/ClientRpcOverrideTest.cs | 134 - .../Editor/ClientRpcOverrideTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/ClientRpcTest.cs | 127 - .../Mirror/Tests/Editor/ClientRpcTest.cs.meta | 11 - .../Editor/ClientSceneTests_ClearSpawners.cs | 58 - .../ClientSceneTests_ClearSpawners.cs.meta | 11 - .../Editor/ClientSceneTests_GetPrefab.cs | 62 - .../Editor/ClientSceneTests_GetPrefab.cs.meta | 11 - .../Tests/Editor/ClientSceneTests_OnSpawn.cs | 736 -- .../Editor/ClientSceneTests_OnSpawn.cs.meta | 11 - ...ntSceneTests_PrepareToSpawnSceneObjects.cs | 104 - ...neTests_PrepareToSpawnSceneObjects.cs.meta | 11 - .../Editor/ClientSceneTests_RegisterPrefab.cs | 300 - .../ClientSceneTests_RegisterPrefab.cs.meta | 11 - .../ClientSceneTests_RegisterSpawnHandler.cs | 224 - ...entSceneTests_RegisterSpawnHandler.cs.meta | 11 - .../ClientSceneTests_UnregisterPrefab.cs | 48 - .../ClientSceneTests_UnregisterPrefab.cs.meta | 11 - ...ClientSceneTests_UnregisterSpawnHandler.cs | 33 - ...tSceneTests_UnregisterSpawnHandler.cs.meta | 11 - .../Tests/Editor/CommandOverrideTest.cs | 182 - .../Tests/Editor/CommandOverrideTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/CommandTest.cs | 218 - .../Mirror/Tests/Editor/CommandTest.cs.meta | 11 - .../Mirror/Tests/Editor/CompressionTests.cs | 257 - .../Tests/Editor/CompressionTests.cs.meta | 3 - Assets/Mirror/Tests/Editor/CustomRWTest.cs | 53 - .../Mirror/Tests/Editor/CustomRWTest.cs.meta | 11 - .../Mirror/Tests/Editor/EnumReadWriteTests.cs | 91 - .../Tests/Editor/EnumReadWriteTests.cs.meta | 11 - .../Editor/ExponentialMovingAverageTest.cs | 42 - .../ExponentialMovingAverageTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/ExtensionsTest.cs | 26 - .../Tests/Editor/ExtensionsTest.cs.meta | 3 - .../Tests/Editor/FieldsInBaseClasses.cs | 56 - .../Tests/Editor/FieldsInBaseClasses.cs.meta | 11 - Assets/Mirror/Tests/Editor/Generated.meta | 8 - .../Editor/Generated/AttritubeTest.gen.cs | 5946 ----------------- .../Generated/AttritubeTest.gen.cs.meta | 11 - .../Generated/CollectionWriterTests.gen.cs | 1049 --- .../CollectionWriterTests.gen.cs.meta | 11 - Assets/Mirror/Tests/Editor/Grid2DTests.cs | 58 - .../Mirror/Tests/Editor/Grid2DTests.cs.meta | 3 - .../Editor/InterestManagementTests_Common.cs | 95 - .../InterestManagementTests_Common.cs.meta | 3 - .../Editor/InterestManagementTests_Default.cs | 62 - .../InterestManagementTests_Default.cs.meta | 3 - .../InterestManagementTests_Distance.cs | 142 - .../InterestManagementTests_Distance.cs.meta | 3 - .../InterestManagementTests_SpatialHashing.cs | 154 - ...restManagementTests_SpatialHashing.cs.meta | 3 - .../Tests/Editor/LocalConnectionTest.cs | 71 - .../Tests/Editor/LocalConnectionTest.cs.meta | 11 - .../Tests/Editor/MessageInheritanceTest.cs | 125 - .../Editor/MessageInheritanceTest.cs.meta | 11 - .../Mirror/Tests/Editor/MessagePackingTest.cs | 143 - .../Tests/Editor/MessagePackingTest.cs.meta | 11 - .../Tests/Editor/MiddlewareTransportTest.cs | 386 -- .../Editor/MiddlewareTransportTest.cs.meta | 11 - .../Mirror/Tests/Editor/Mirror.Tests.asmdef | 33 - .../Tests/Editor/Mirror.Tests.asmdef.meta | 7 - Assets/Mirror/Tests/Editor/MultiplexTest.cs | 180 - .../Mirror/Tests/Editor/MultiplexTest.cs.meta | 11 - .../Editor/NetworkBehaviourDirtyBitsTests.cs | 184 - .../NetworkBehaviourDirtyBitsTests.cs.meta | 3 - .../Editor/NetworkBehaviourSerializeTest.cs | 341 - .../NetworkBehaviourSerializeTest.cs.meta | 11 - .../Tests/Editor/NetworkBehaviourTests.cs | 884 --- .../Editor/NetworkBehaviourTests.cs.meta | 11 - .../Mirror/Tests/Editor/NetworkClientTests.cs | 128 - .../Tests/Editor/NetworkClientTests.cs.meta | 11 - .../Editor/NetworkConnectionToClientTests.cs | 90 - .../NetworkConnectionToClientTests.cs.meta | 3 - .../NetworkIdentitySerializationTests.cs | 180 - .../NetworkIdentitySerializationTests.cs.meta | 3 - .../Tests/Editor/NetworkIdentityTests.cs | 967 --- .../Tests/Editor/NetworkIdentityTests.cs.meta | 11 - .../Mirror/Tests/Editor/NetworkLoopTests.cs | 110 - .../Tests/Editor/NetworkLoopTests.cs.meta | 3 - ...rkManagerStopHostOnServerDisconnectTest.cs | 39 - ...agerStopHostOnServerDisconnectTest.cs.meta | 11 - .../Mirror/Tests/Editor/NetworkManagerTest.cs | 148 - .../Tests/Editor/NetworkManagerTest.cs.meta | 11 - .../Tests/Editor/NetworkMessageTests.cs | 65 - .../Tests/Editor/NetworkMessageTests.cs.meta | 11 - .../Mirror/Tests/Editor/NetworkReaderTest.cs | 84 - .../Tests/Editor/NetworkReaderTest.cs.meta | 11 - .../Tests/Editor/NetworkReaderWriterTest.cs | 31 - .../Editor/NetworkReaderWriterTest.cs.meta | 11 - .../Mirror/Tests/Editor/NetworkServerTest.cs | 1323 ---- .../Tests/Editor/NetworkServerTest.cs.meta | 11 - .../Tests/Editor/NetworkTransform2kTests.cs | 362 - .../Editor/NetworkTransform2kTests.cs.meta | 3 - .../Editor/NetworkWriterCollectionTest.cs | 67 - .../NetworkWriterCollectionTest.cs.meta | 11 - .../Mirror/Tests/Editor/NetworkWriterTest.cs | 1374 ---- .../Tests/Editor/NetworkWriterTest.cs.meta | 11 - .../Mirror/Tests/Editor/OverloadMethodTest.cs | 53 - .../Tests/Editor/OverloadMethodTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/PoolTests.cs | 45 - Assets/Mirror/Tests/Editor/PoolTests.cs.meta | 11 - Assets/Mirror/Tests/Editor/RemoteTestBase.cs | 15 - .../Tests/Editor/RemoteTestBase.cs.meta | 11 - .../Tests/Editor/RpcNetworkIdentityTest.cs | 114 - .../Editor/RpcNetworkIdentityTest.cs.meta | 11 - .../Editor/ScriptableObjectWriterTest.cs | 43 - .../Editor/ScriptableObjectWriterTest.cs.meta | 11 - .../Editor/SnapshotInterpolationTests.cs | 724 -- .../Editor/SnapshotInterpolationTests.cs.meta | 11 - .../Tests/Editor/StructMessagesTests.cs | 36 - .../Tests/Editor/StructMessagesTests.cs.meta | 11 - .../Mirror/Tests/Editor/SyncDictionaryTest.cs | 353 - .../Tests/Editor/SyncDictionaryTest.cs.meta | 11 - .../Mirror/Tests/Editor/SyncListClassTest.cs | 78 - .../Tests/Editor/SyncListClassTest.cs.meta | 11 - .../Mirror/Tests/Editor/SyncListStructTest.cs | 73 - .../Tests/Editor/SyncListStructTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/SyncListTest.cs | 434 -- .../Mirror/Tests/Editor/SyncListTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/SyncSetTest.cs | 322 - .../Mirror/Tests/Editor/SyncSetTest.cs.meta | 11 - .../Tests/Editor/SyncVarAttributeHookTest.cs | 426 -- .../Editor/SyncVarAttributeHookTest.cs.meta | 11 - .../Tests/Editor/SyncVarAttributeTest.cs | 438 -- .../Tests/Editor/SyncVarAttributeTest.cs.meta | 11 - .../Tests/Editor/SyncVarAttributeTestBase.cs | 37 - .../Editor/SyncVarAttributeTestBase.cs.meta | 11 - .../Tests/Editor/SyncVarGameObjectTests.cs | 169 - .../Editor/SyncVarGameObjectTests.cs.meta | 3 - .../SyncVarNetworkBehaviourAbstractTests.cs | 190 - ...ncVarNetworkBehaviourAbstractTests.cs.meta | 3 - .../SyncVarNetworkBehaviourInheritedTests.cs | 187 - ...cVarNetworkBehaviourInheritedTests.cs.meta | 3 - .../Editor/SyncVarNetworkIdentityTests.cs | 166 - .../SyncVarNetworkIdentityTests.cs.meta | 3 - Assets/Mirror/Tests/Editor/SyncVarTests.cs | 254 - .../Mirror/Tests/Editor/SyncVarTests.cs.meta | 3 - .../Tests/Editor/TargetRpcOverrideTest.cs | 138 - .../Editor/TargetRpcOverrideTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/TargetRpcTest.cs | 153 - .../Mirror/Tests/Editor/TargetRpcTest.cs.meta | 11 - Assets/Mirror/Tests/Editor/TestPrefabs.meta | 8 - .../PrefabWithChildrenForClientScene.prefab | 97 - ...efabWithChildrenForClientScene.prefab.meta | 7 - .../ValidPrefabForClientScene.prefab | 49 - .../ValidPrefabForClientScene.prefab.meta | 7 - .../invalidPrefabForClientScene.prefab | 32 - .../invalidPrefabForClientScene.prefab.meta | 7 - Assets/Mirror/Tests/Editor/UtilsTests.cs | 31 - Assets/Mirror/Tests/Editor/UtilsTests.cs.meta | 11 - Assets/Mirror/Tests/Editor/Weaver.meta | 8 - .../Tests/Editor/Weaver/.WeaverTests.csproj | 280 - .../Tests/Editor/Weaver/ExtraAssembly.meta | 8 - .../Weaver/ExtraAssembly/ComplexClass.cs | 14 - .../Weaver/ExtraAssembly/ComplexClass.cs.meta | 11 - .../Editor/Weaver/ExtraAssembly/README.md | 3 - .../Weaver/ExtraAssembly/README.md.meta | 7 - .../Editor/Weaver/ExtraAssembly/SomeData.cs | 7 - .../Weaver/ExtraAssembly/SomeData.cs.meta | 11 - .../Weaver/ExtraAssembly/SomeDataClass.cs | 7 - .../ExtraAssembly/SomeDataClass.cs.meta | 11 - .../SomeDataClassWithConstructor.cs | 12 - .../SomeDataClassWithConstructor.cs.meta | 11 - .../ExtraAssembly/SomeDataWithWriter.cs | 19 - .../ExtraAssembly/SomeDataWithWriter.cs.meta | 11 - .../WeaverTestExtraAssembly.asmdef | 16 - .../WeaverTestExtraAssembly.asmdef.meta | 7 - .../Tests/Editor/Weaver/WeaverAssembler.cs | 180 - .../Editor/Weaver/WeaverAssembler.cs.meta | 11 - .../Editor/Weaver/WeaverClientRpcTests.cs | 58 - .../Weaver/WeaverClientRpcTests.cs.meta | 11 - .../AbstractClientRpc.cs | 10 - .../BehaviourCanBeSentInRpc.cs | 13 - .../ClientRpcCantBeStatic.cs | 10 - .../ClientRpcThatExcludesOwner.cs | 13 - .../WeaverClientRpcTests~/ClientRpcValid.cs | 10 - .../OverrideAbstractClientRpc.cs | 20 - .../OverrideVirtualClientRpc.cs | 23 - .../WeaverClientRpcTests~/VirtualClientRpc.cs | 13 - .../WeaverClientServerAttributeTests.cs | 130 - .../WeaverClientServerAttributeTests.cs.meta | 11 - .../ClientAttributeOnAbstractMethod.cs | 10 - .../ClientAttributeOnOverrideMethod.cs | 21 - .../ClientAttributeOnVirutalMethod.cs | 13 - .../MonoBehaviourClient.cs | 11 - .../MonoBehaviourServer.cs | 11 - .../NetworkBehaviourClient.cs | 13 - .../NetworkBehaviourServer.cs | 13 - .../RegularClassClient.cs | 10 - .../RegularClassServer.cs | 10 - .../ServerAttributeOnAbstractMethod.cs | 10 - .../ServerAttributeOnOverrideMethod.cs | 21 - .../ServerAttributeOnVirutalMethod.cs | 13 - .../StaticClassClient.cs | 10 - .../StaticClassServer.cs | 10 - .../Tests/Editor/Weaver/WeaverCommandTests.cs | 102 - .../Editor/Weaver/WeaverCommandTests.cs.meta | 11 - .../WeaverCommandTests~/AbstractCommand.cs | 11 - .../CommandCantBeStatic.cs | 10 - .../CommandThatIgnoresAuthority.cs | 13 - ...hatIgnoresAuthorityWithSenderConnection.cs | 13 - .../WeaverCommandTests~/CommandValid.cs | 10 - .../CommandWithArguments.cs | 13 - ...CommandWithSenderConnectionAndOtherArgs.cs | 13 - ...workConnectionThatIsNotSenderConnection.cs | 14 - ...workConnectionThatIsNotSenderConnection.cs | 13 - .../OverrideAbstractCommand.cs | 20 - .../OverrideVirtualCallBaseCommand.cs | 23 - ...CallsBaseCommandWithMultipleBaseClasses.cs | 27 - ...rideVirtualCallsBaseCommandWithOverride.cs | 34 - .../OverrideVirtualCommand.cs | 22 - .../WeaverCommandTests~/VirtualCommand.cs | 14 - .../Tests/Editor/Weaver/WeaverGeneralTests.cs | 19 - .../Editor/Weaver/WeaverGeneralTests.cs.meta | 11 - .../WeaverGeneralTests~/RecursionCount.cs | 22 - ...stingScriptableObjectArraySerialization.cs | 40 - ...neratedReaderWriterAnotherAssemblyTests.cs | 43 - ...edReaderWriterAnotherAssemblyTests.cs.meta | 11 - ...eadWriteForTypesFromDifferentAssemblies.cs | 14 - .../CreatesForClassFromDifferentAssemblies.cs | 14 - ...DifferentAssembliesWithValidConstructor.cs | 14 - ...esForComplexTypeFromDifferentAssemblies.cs | 14 - ...CreatesForStructFromDifferentAssemblies.cs | 14 - ...eatesForTypeThatUsesDifferentAssemblies.cs | 19 - .../WeaverGeneratedReaderWriterTests.cs | 218 - .../WeaverGeneratedReaderWriterTests.cs.meta | 11 - .../CanUseCustomReadWriteForAbstractClass.cs | 62 - .../CanUseCustomReadWriteForInterfaces.cs | 44 - .../CreatesForArraySegment.cs | 14 - .../CreatesForClass.cs | 18 - .../CreatesForClassInherited.cs | 23 - .../CreatesForClassWithValidConstructor.cs | 23 - .../CreatesForEnums.cs | 21 - ...CreatesForInheritedFromScriptableObject.cs | 19 - .../CreatesForList.cs | 14 - .../CreatesForStructArraySegment.cs | 21 - .../CreatesForStructList.cs | 22 - .../CreatesForStructs.cs | 18 - .../ExcludesNonSerializedFields.cs | 20 - ...ivesErrorForClassWithNoValidConstructor.cs | 23 - .../GivesErrorForInvalidArraySegmentType.cs | 15 - .../GivesErrorForInvalidArrayType.cs | 14 - .../GivesErrorForInvalidListType.cs | 15 - .../GivesErrorForJaggedArray.cs | 13 - .../GivesErrorForMultidimensionalArray.cs | 13 - .../GivesErrorWhenUsingAbstractClass.cs | 19 - .../GivesErrorWhenUsingInterface.cs | 15 - .../GivesErrorWhenUsingMonoBehaviour.cs | 14 - .../GivesErrorWhenUsingObject.cs | 14 - .../GivesErrorWhenUsingScriptableObject.cs | 14 - ...WhenUsingTypeInheritedFromMonoBehaviour.cs | 19 - .../GivesErrorWhenUsingUnityAsset.cs | 14 - ...gWhenRegisteringExistingExtensionMethod.cs | 32 - .../Tests/Editor/Weaver/WeaverMessageTests.cs | 60 - .../Editor/Weaver/WeaverMessageTests.cs.meta | 11 - .../AbstractMessageMethods.cs | 20 - .../MessageMemberGeneric.cs | 18 - .../MessageMemberInterface.cs | 18 - .../MessageNestedInheritance.cs | 17 - .../MessageSelfReferencing.cs | 16 - .../WeaverMessageTests~/MessageValid.cs | 15 - .../MessageWithBaseClass.cs | 20 - .../Editor/Weaver/WeaverMonoBehaviourTests.cs | 72 - .../Weaver/WeaverMonoBehaviourTests.cs.meta | 11 - .../MonoBehaviourClient.cs | 11 - .../MonoBehaviourClientCallback.cs | 11 - .../MonoBehaviourClientRpc.cs | 11 - .../MonoBehaviourCommand.cs | 11 - .../MonoBehaviourServer.cs | 11 - .../MonoBehaviourServerCallback.cs | 11 - .../MonoBehaviourSyncList.cs | 10 - .../MonoBehaviourSyncVar.cs | 11 - .../MonoBehaviourTargetRpc.cs | 11 - .../MonoBehaviourValid.cs | 9 - .../Weaver/WeaverNetworkBehaviourTests.cs | 282 - .../WeaverNetworkBehaviourTests.cs.meta | 11 - .../NetworkBehaviourAbstractBaseValid.cs | 18 - .../NetworkBehaviourClientRpcCoroutine.cs | 14 - .../NetworkBehaviourClientRpcDuplicateName.cs | 13 - .../NetworkBehaviourClientRpcGenericParam.cs | 10 - .../NetworkBehaviourClientRpcParamAbstract.cs | 15 - ...NetworkBehaviourClientRpcParamComponent.cs | 15 - ...ehaviourClientRpcParamNetworkConnection.cs | 10 - .../NetworkBehaviourClientRpcParamOptional.cs | 10 - .../NetworkBehaviourClientRpcParamOut.cs | 13 - .../NetworkBehaviourClientRpcParamRef.cs | 10 - .../NetworkBehaviourClientRpcVoidReturn.cs | 13 - .../NetworkBehaviourCmdCoroutine.cs | 14 - .../NetworkBehaviourCmdDuplicateName.cs | 13 - .../NetworkBehaviourCmdGenericParam.cs | 10 - .../NetworkBehaviourCmdParamAbstract.cs | 15 - .../NetworkBehaviourCmdParamComponent.cs | 15 - ...tworkBehaviourCmdParamNetworkConnection.cs | 10 - .../NetworkBehaviourCmdParamOptional.cs | 10 - .../NetworkBehaviourCmdParamOut.cs | 13 - .../NetworkBehaviourCmdParamRef.cs | 10 - .../NetworkBehaviourCmdVoidReturn.cs | 13 - .../NetworkBehaviourGeneric.cs | 9 - .../NetworkBehaviourTargetRpcCoroutine.cs | 14 - .../NetworkBehaviourTargetRpcDuplicateName.cs | 13 - .../NetworkBehaviourTargetRpcGenericParam.cs | 10 - .../NetworkBehaviourTargetRpcParamAbstract.cs | 15 - ...NetworkBehaviourTargetRpcParamComponent.cs | 15 - ...ehaviourTargetRpcParamNetworkConnection.cs | 10 - ...TargetRpcParamNetworkConnectionNotFirst.cs | 10 - .../NetworkBehaviourTargetRpcParamOptional.cs | 10 - .../NetworkBehaviourTargetRpcParamOut.cs | 13 - .../NetworkBehaviourTargetRpcParamRef.cs | 10 - .../NetworkBehaviourTargetRpcVoidReturn.cs | 13 - .../NetworkBehaviourValid.cs | 10 - .../Weaver/WeaverSyncDictionaryTests.cs | 80 - .../Weaver/WeaverSyncDictionaryTests.cs.meta | 11 - .../GenericSyncDictionaryCanBeUsed.cs | 11 - .../SyncDictionary.cs | 13 - ...SyncDictionaryErrorForGenericStructItem.cs | 17 - .../SyncDictionaryErrorForGenericStructKey.cs | 16 - ...yncDictionaryGenericAbstractInheritance.cs | 13 - .../SyncDictionaryGenericInheritance.cs | 13 - ...onaryGenericStructItemWithCustomMethods.cs | 27 - ...ionaryGenericStructKeyWithCustomMethods.cs | 27 - .../SyncDictionaryInheritance.cs | 17 - .../SyncDictionaryStructItem.cs | 17 - .../SyncDictionaryStructKey.cs | 17 - .../Editor/Weaver/WeaverSyncListTests.cs | 140 - .../Editor/Weaver/WeaverSyncListTests.cs.meta | 11 - .../GenericSyncListCanBeUsed.cs | 12 - .../Weaver/WeaverSyncListTests~/SyncList.cs | 9 - .../WeaverSyncListTests~/SyncListByteValid.cs | 11 - .../SyncListErrorForGenericStruct.cs | 17 - .../SyncListErrorForInterface.cs | 14 - .../SyncListGenericAbstractInheritance.cs | 14 - .../SyncListGenericInheritance.cs | 14 - ...stGenericInheritanceWithMultipleGeneric.cs | 17 - .../SyncListGenericStructWithCustomMethods.cs | 27 - .../SyncListInheritance.cs | 15 - .../SyncListInterfaceWithCustomMethods.cs | 31 - .../SyncListMissingParamlessCtor.cs | 14 - ...MissingParamlessCtorManuallyInitialized.cs | 14 - .../SyncListNestedInAbstractClass.cs | 20 - ...yncListNestedInAbstractClassWithInvalid.cs | 20 - .../SyncListNestedInStruct.cs | 15 - .../SyncListNestedInStructWithInvalid.cs | 18 - .../SyncListNestedStruct.cs | 17 - .../WeaverSyncListTests~/SyncListStruct.cs | 17 - .../Editor/Weaver/WeaverSyncObjectsTests.cs | 27 - .../Weaver/WeaverSyncObjectsTests.cs.meta | 3 - .../RecommendsReadonly.cs | 10 - .../RecommendsReadonly.cs.meta | 3 - .../SyncObjectsExactlyMax.cs | 80 - .../SyncObjectsExactlyMax.cs.meta | 3 - .../SyncObjectsMoreThanMax.cs | 81 - .../SyncObjectsMoreThanMax.cs.meta | 3 - .../Tests/Editor/Weaver/WeaverSyncSetTests.cs | 44 - .../Editor/Weaver/WeaverSyncSetTests.cs.meta | 11 - .../Weaver/WeaverSyncSetTests~/SyncSet.cs | 9 - .../WeaverSyncSetTests~/SyncSetByteValid.cs | 11 - .../SyncSetGenericAbstractInheritance.cs | 13 - .../SyncSetGenericInheritance.cs | 13 - .../WeaverSyncSetTests~/SyncSetInheritance.cs | 13 - .../WeaverSyncSetTests~/SyncSetStruct.cs | 17 - .../Weaver/WeaverSyncVarAttributeHookTests.cs | 82 - .../WeaverSyncVarAttributeHookTests.cs.meta | 11 - .../ErrorForWrongTypeNewParameter.cs | 15 - .../ErrorForWrongTypeOldParameter.cs | 15 - .../ErrorWhenNoHookFound.cs | 10 - ...rorWhenNoHookWithCorrectParametersFound.cs | 20 - .../FindsHookWithGameObjects.cs | 16 - .../FindsHookWithNetworkIdentity.cs | 16 - .../FindsHookWithOtherOverloadsInOrder.cs | 21 - ...ndsHookWithOtherOverloadsInReverseOrder.cs | 21 - .../FindsPrivateHook.cs | 15 - .../FindsPublicHook.cs | 15 - .../FindsStaticHook.cs | 15 - .../Weaver/WeaverSyncVarAttributeTests.cs | 89 - .../WeaverSyncVarAttributeTests.cs.meta | 11 - .../SyncVarsCantBeArray.cs | 10 - .../SyncVarsDerivedNetworkBehaviour.cs | 14 - .../SyncVarsExactlyMax.cs | 74 - .../SyncVarsExactlyMax.cs.meta | 3 - .../SyncVarsGenericParam.cs | 15 - .../SyncVarsInterface.cs | 14 - .../SyncVarsMoreThanMax.cs | 74 - .../SyncVarsStatic.cs | 10 - .../SyncVarsSyncList.cs | 25 - .../SyncVarsUnityComponent.cs | 11 - .../SyncVarsValid.cs | 86 - .../Editor/Weaver/WeaverTargetRpcTests.cs | 65 - .../Weaver/WeaverTargetRpcTests.cs.meta | 11 - .../AbstractTargetRpc.cs | 11 - ...NetworkConnectionIsNotTheFirstParameter.cs | 10 - .../ErrorWhenTargetRpcIsStatic.cs | 10 - .../OverrideAbstractTargetRpc.cs | 20 - .../OverrideVirtualTargetRpc.cs | 23 - ...ParametersWhileSkipingNetworkConnection.cs | 10 - .../TargetRpcCanSkipNetworkConnection.cs | 10 - .../WeaverTargetRpcTests~/TargetRpcValid.cs | 10 - .../WeaverTargetRpcTests~/VirtualTargetRpc.cs | 14 - .../Mirror/Tests/Editor/Weaver/WeaverTests.cs | 77 - .../Tests/Editor/Weaver/WeaverTests.cs.meta | 11 - .../Weaver/WeaverTestsBuildFromTestName.cs | 37 - .../WeaverTestsBuildFromTestName.cs.meta | 3 - Assets/Mirror/Tests/Runtime.meta | 8 - ...lientSceneTests_DestroyAllClientObjects.cs | 174 - ...SceneTests_DestroyAllClientObjects.cs.meta | 11 - .../Runtime/ClientSceneTests_LocalPlayer.cs | 68 - .../ClientSceneTests_LocalPlayer.cs.meta | 11 - .../ClientSceneTests_LocalPlayer_AsHost.cs | 48 - ...lientSceneTests_LocalPlayer_AsHost.cs.meta | 3 - ...ClientSceneTests_Runtime_RegisterPrefab.cs | 72 - ...tSceneTests_Runtime_RegisterPrefab.cs.meta | 11 - .../Tests/Runtime/Mirror.Tests.Runtime.asmdef | 22 - .../Runtime/Mirror.Tests.Runtime.asmdef.meta | 7 - .../Tests/Runtime/NetworkIdentityTests.cs | 79 - .../Runtime/NetworkIdentityTests.cs.meta | 11 - .../Tests/Runtime/NetworkManagerTests.cs | 45 - .../Tests/Runtime/NetworkManagerTests.cs.meta | 11 - .../Tests/Runtime/NetworkServerRuntimeTest.cs | 112 - .../Runtime/NetworkServerRuntimeTest.cs.meta | 11 - Assets/Mirror/Tests/Runtime/Scenes.meta | 8 - .../SceneObjectSpawningTestsScene.unity | 381 -- .../SceneObjectSpawningTestsScene.unity.meta | 7 - .../Runtime/Scenes/TestNetworkManager.prefab | 114 - .../Scenes/TestNetworkManager.prefab.meta | 7 - .../Tests/Runtime/Scenes/TestPlayer.prefab | 48 - .../Runtime/Scenes/TestPlayer.prefab.meta | 7 - 455 files changed, 31848 deletions(-) delete mode 100644 Assets/Mirror/Tests.meta delete mode 100644 Assets/Mirror/Tests/Common.meta delete mode 100755 Assets/Mirror/Tests/Common/Castle.Core.dll delete mode 100644 Assets/Mirror/Tests/Common/Castle.Core.dll.meta delete mode 100644 Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs delete mode 100644 Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs.meta delete mode 100644 Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs delete mode 100644 Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs.meta delete mode 100644 Assets/Mirror/Tests/Common/FakeNetworkConnection.cs delete mode 100644 Assets/Mirror/Tests/Common/FakeNetworkConnection.cs.meta delete mode 100644 Assets/Mirror/Tests/Common/MemoryTransport.cs delete mode 100644 Assets/Mirror/Tests/Common/MemoryTransport.cs.meta delete mode 100644 Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef delete mode 100644 Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef.meta delete mode 100644 Assets/Mirror/Tests/Common/MirrorEditModeTest.cs delete mode 100644 Assets/Mirror/Tests/Common/MirrorEditModeTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs delete mode 100644 Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Common/MirrorTest.cs delete mode 100644 Assets/Mirror/Tests/Common/MirrorTest.cs.meta delete mode 100755 Assets/Mirror/Tests/Common/NSubstitute.dll delete mode 100644 Assets/Mirror/Tests/Common/NSubstitute.dll.meta delete mode 100755 Assets/Mirror/Tests/Common/System.Threading.Tasks.Extensions.dll delete mode 100644 Assets/Mirror/Tests/Common/System.Threading.Tasks.Extensions.dll.meta delete mode 100644 Assets/Mirror/Tests/Editor.meta delete mode 100644 Assets/Mirror/Tests/Editor/Batching.meta delete mode 100644 Assets/Mirror/Tests/Editor/Batching/BatcherTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Batching/BatcherTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientRpcTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientRpcTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs delete mode 100644 Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/CommandOverrideTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/CommandOverrideTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/CommandTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/CommandTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/CompressionTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/CompressionTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/CustomRWTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/CustomRWTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ExtensionsTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/ExtensionsTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs delete mode 100644 Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Generated.meta delete mode 100644 Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs delete mode 100644 Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs delete mode 100644 Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Grid2DTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Grid2DTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs delete mode 100644 Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/LocalConnectionTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/LocalConnectionTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/MessagePackingTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/MessagePackingTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef delete mode 100644 Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef.meta delete mode 100644 Assets/Mirror/Tests/Editor/MultiplexTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/MultiplexTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkClientTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkClientTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkLoopTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkLoopTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkManagerTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkManagerTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkMessageTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkMessageTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkReaderTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkReaderTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkServerTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkServerTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/NetworkWriterTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/NetworkWriterTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/OverloadMethodTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/OverloadMethodTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/PoolTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/PoolTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/RemoteTestBase.cs delete mode 100644 Assets/Mirror/Tests/Editor/RemoteTestBase.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/StructMessagesTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/StructMessagesTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncListClassTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncListClassTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncListStructTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncListStructTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncListTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncListTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncSetTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncSetTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/SyncVarTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/TargetRpcTest.cs delete mode 100644 Assets/Mirror/Tests/Editor/TargetRpcTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs.meta delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab.meta delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab.meta delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab delete mode 100644 Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab.meta delete mode 100644 Assets/Mirror/Tests/Editor/UtilsTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/UtilsTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/AbstractClientRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/BehaviourCanBeSentInRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcCantBeStatic.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcThatExcludesOwner.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideAbstractClientRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideVirtualClientRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/VirtualClientRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnAbstractMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnOverrideMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnVirutalMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourClient.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourServer.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourClient.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourServer.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassClient.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassServer.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnAbstractMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnOverrideMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnVirutalMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassClient.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassServer.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/AbstractCommand.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandCantBeStatic.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthority.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthorityWithSenderConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithArguments.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithSenderConnectionAndOtherArgs.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForNetworkConnectionThatIsNotSenderConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForOptionalNetworkConnectionThatIsNotSenderConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideAbstractCommand.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/VirtualCommand.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/RecursionCount.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/TestingScriptableObjectArraySerialization.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CanUseCustomReadWriteForTypesFromDifferentAssemblies.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssemblies.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssembliesWithValidConstructor.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForComplexTypeFromDifferentAssemblies.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForStructFromDifferentAssemblies.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForTypeThatUsesDifferentAssemblies.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForAbstractClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForInterfaces.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForArraySegment.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassInherited.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassWithValidConstructor.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForEnums.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForInheritedFromScriptableObject.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForList.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructArraySegment.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructList.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructs.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/ExcludesNonSerializedFields.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForClassWithNoValidConstructor.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArraySegmentType.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArrayType.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidListType.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForJaggedArray.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForMultidimensionalArray.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingAbstractClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingInterface.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingMonoBehaviour.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingObject.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingScriptableObject.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingTypeInheritedFromMonoBehaviour.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingUnityAsset.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesWarningWhenRegisteringExistingExtensionMethod.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/AbstractMessageMethods.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberGeneric.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberInterface.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageNestedInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageSelfReferencing.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageWithBaseClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClient.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientCallback.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourCommand.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServer.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServerCallback.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncList.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncVar.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourTargetRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourAbstractBaseValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcCoroutine.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcDuplicateName.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcGenericParam.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamAbstract.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamComponent.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamNetworkConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOptional.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOut.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamRef.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcVoidReturn.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdCoroutine.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdDuplicateName.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdGenericParam.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamAbstract.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamComponent.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamNetworkConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOptional.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOut.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamRef.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdVoidReturn.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourGeneric.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcCoroutine.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcDuplicateName.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcGenericParam.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamAbstract.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamComponent.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnectionNotFirst.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOptional.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOut.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamRef.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcVoidReturn.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/GenericSyncDictionaryCanBeUsed.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionary.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructItem.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructKey.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericAbstractInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructItemWithCustomMethods.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructKeyWithCustomMethods.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructItem.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructKey.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/GenericSyncListCanBeUsed.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncList.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListByteValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForGenericStruct.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForInterface.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericAbstractInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritanceWithMultipleGeneric.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericStructWithCustomMethods.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInterfaceWithCustomMethods.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtor.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtorManuallyInitialized.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClass.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClassWithInvalid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStruct.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStructWithInvalid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedStruct.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListStruct.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSet.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetByteValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericAbstractInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetInheritance.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetStruct.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeNewParameter.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeOldParameter.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookFound.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookWithCorrectParametersFound.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithGameObjects.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithNetworkIdentity.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInOrder.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInReverseOrder.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPrivateHook.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPublicHook.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsStaticHook.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsCantBeArray.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsDerivedNetworkBehaviour.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsGenericParam.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsInterface.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsMoreThanMax.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsStatic.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsSyncList.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsUnityComponent.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/AbstractTargetRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenNetworkConnectionIsNotTheFirstParameter.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenTargetRpcIsStatic.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideAbstractTargetRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideVirtualTargetRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanSkipNetworkConnection.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcValid.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/VirtualTargetRpc.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs delete mode 100644 Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime.meta delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs delete mode 100644 Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef delete mode 100644 Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef.meta delete mode 100644 Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs delete mode 100644 Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs delete mode 100644 Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs delete mode 100644 Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs.meta delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes.meta delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity.meta delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab.meta delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab delete mode 100644 Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab.meta diff --git a/Assets/Mirror/Tests.meta b/Assets/Mirror/Tests.meta deleted file mode 100644 index a519cf7ae..000000000 --- a/Assets/Mirror/Tests.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4de157ac7e1594c758ce6dc401674f5c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common.meta b/Assets/Mirror/Tests/Common.meta deleted file mode 100644 index cb52e9878..000000000 --- a/Assets/Mirror/Tests/Common.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dd4f310377c5a4ad39bd31546c95c2a2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/Castle.Core.dll b/Assets/Mirror/Tests/Common/Castle.Core.dll deleted file mode 100755 index dbc4b29deda4bd4392eba36352344c7ddde2db77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442368 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�X zvNVKvKJ8N%b2mg@1KR!kZZscD&+0weT+b)cqvsRpp>g|Rujcx2>A3{sKl$HN zNcU$oDP5!oM@x?$&#_Ly{VM!C`o5%(^8>2%`;M5e#C%WW6J7p|Y?Pr##R_$l92zP1oaF>1`XM;u0yU)!?v?-nC z8RhCe=np}w*k2v{YgYYfid72a&c+bEuHP7)k=zduC zsAlf3%^~`_tChoR4Wa$L2YT6jU&r<=#`VPoqk=s;zrmhwkuQuZo*|v-I-`T{{{?#} zpYuj-=l;8k>v0#yzg@+T@yA2yUjcV~{pgvZ%C$YD9sP5&yIrMYifj*=kMV1=*dIb) zZMoFDKZO2Oe)FjPA+&GY1V%qV`-b~N-v5Ty2gSVqR?PcU`$NuyI|*}rT~aLd`mUJw z(~9{%SuyX|74yDaG4E#`Qt6=gimpH?yGC{J_+*FDICictI8={I!J&GbvO{%#B0}~0 zQ1AQSlo=bU_iYoEKfGth``O7}Js#WqTtq#wTV|%xSITs?|AO~+e7gSfe5at^YI@}P zCSsl@>h_eY{7I1;Iv(o=yblzr$Mf9KG0-QAJhsmZ)%(nOp}IWt*j-+zF6UrgcL(!& zc^_YQ@8j$4eSF=$&s=wNxcMAzlfU+Ew9nB^{w8LF;xsi5ojTg*`Snw3e?HHS63rEA z{PB7EVO|Y``3&^eOW^K&un7Db*H2_V3j1i&pw}SZGr>rdADI)$ymyq=-^TUbkB-lC zHNqwP)63jA-WxVMTb1)M6W2b#zL;O&Vnqq^Xc54cw(q1 zabJS-O7{ZD#qOISm%494ko&z9@;6=zr`SjCFZYqjbRWev!$+}TCk`%W`>GLs zf&Y};P*La~2YI>wcF5`edm(4|--E;+2V|u`{*+L$*xwKG4*xXBYX1z#d;D8YLE3^S zmgFFcWk}HN2y;eID{M=G_CU@K`W9|32qW8qFiJyV7^R^&jM8v9}3v(c6gatu9 z8Wsk*HY^hI>9AQ+jg1Wk^pUSPM>K zb98NGUdHC-Y+l29BQs8Fe_6~z<|L59En_{$()nlu$s8Y7RFuqkW&%k0O|miPixKmP z?~2*;D!?yASOswu%B2Z>1L5oesXTMsnib65AjPu>d_nZDAW}He(dO~Y1XOLRJgcG> zq;P~!+h>6t!I- zCz0x*hIJz8&7caet7Z{M)nX5rc$8Kgjn~Uz) zvxj*cNcLIGLS`{Y;gqpn!)#=30ag8DjYqUWa^K8sXC}sQdYD^4YG-?XM@qLVmhv&Y zlBn_lQg}sdP9*bUHm_iFBAG7%sXx@RIg!lkKniCIn-j@=4@l{7;o48d3zE4FlKTWU zCz5#%>qOFvSSONR36j4Wa1U4uQuy?xRw`dtPhC!lAh|1IeGfCC7xnMED{~Y#S5_!~ zR#~g~TjdtT?hE!P-d*X6BloEb5)?07kfT_>ph)qv$_i$!;>rbE6zdka;>q9U1qq6X zPw}(LBFzOAirp8~Dh4my!uERL9yIV~heZ)ZJsur@CO$-J5MtRcEx5h-8Apz;rryTlZ&=YXW=vR=V@ zCF`p}>c>sYb~cwowRs#!<1mrpiD&a{W-&0Lfhw+c&fQZq{Y04%Y_BUp(vC z%wjfgVtqHWoy}cXn^S(`K}z=|W)Yj0vt9{O_^VlOV(wemn5)5yEX-G|?_tUjoDOC@Gl7}IoWv|*RxoRs zTbQnqI=nb$7Bh!g#H?VhX4W#Bm|K{;nR}Qrozu&VXC^SSnK{f!%pztvvx2#rS%iO};!*q@2{4x`m*~}c~BxVt_oLK=<`&`X>6LSlj?`C}u({&=}6HJw^ zMLDcjFl(7xn0uJ6leE7gkm4(2y@u(^;&7Qc%pztvvw~U6Y-Da>wlViGMYaxCGF{9# zW&$&dS;#D7RxoRrwahKdHs)^T9;P^1$LnI+AdN3^tYH3$qQR@n;X~u2Z%D1ZEDih*`m`Wo}`*PGf(}9A@$9 zI^WIA!ZWnHGUo1aT5mjC&%Z=9Z=9pe#U;G%04beW%o>o!^G0UPrK~e|7iwKj(kz^& zS;nlJq0?1)jb=NuY!hQ!SE@x&Ivk+AAGuzm_akF;c29mvak^O_DXMt2-h2VGM zmog&hWy~67o>@*L^G2pxf)yQu+HIIR@l4dq#HalJFkm^I9- z?QGACdtd8WOtC}jam+$y8B=_~_RKP7jWOTJ;V~PTZOp=tw0#+~hS_M$Ki2j&%r>U@ z2gl3IVzx2GC)&P|*~Y}{PO87eF|(M3%tmG#Q+&$qnOV$2W*M`_@H39r@C&WCF>Cg* zJ+qA|{>kw$vzYB5jhDG!YL9EO%r<5_NdAymojztRsPfHBJjCIHl#fDY8MB7j$ZTV_gDU**IecaoGZ!TL zLe|TeHOxA;Z)ClVnfQbD*9KC0#E+U;KXLk)#UO=W#(FdBiHEg$9kUIj@u2u$+Ps;W z_%pj>7I&~cGw~O;XBPj;_RPfJ*q&J|q)JaSGf`^2j#+H6Ju?ya98^6pD{(J}^cqmL zUuGM#o$ZB3+h;LzK~>JImoaOYjm&0{+_kYTygHmXW)`!MSqYN+c4jWV@kM$wv(nG@ z%-kThXI2KYJu^3i?U|LKY|qT?#P-a}Ft%srhO<4hv8zsh8&kw`ewbPDcxOa(yD94g zZC=PMPS)Yn4Akb0%(B5+uVE&pXm@cVw0RaYE|bE&?55moPR}^a!t9D{E46(iGwT6%&n#osFdLa|Oi`oV$1$^*h0HQ$O`UdE^AN`e z)>3EtMrIpRyvY8TZA{U~{+VUW z8fGK2&FD?qeH%0DCHBuOW7aSmjlM;@Yh=bXYdwou$Sh;lFvT0%T^zHJS;nkkHZt3o zqLuwI3z=oi8fGK2jT!eA_4{XU5^uAAW*M`F*=Y3lxSxHX-HV-?h0HQ$4YQHiX1I&} zeXNJ-r^|IaVoFgX@OGEA-u0o&vP10o z_KEJX?)%+a+;6$RaR1`&;tY09c2+o-d-i$;c~iX;yq9|ydSCT^=>5Xm$+yh+fbS{a z^S*a|U-)wT#s2mF=lzZTfBL`m4-d)k5m z>Bdgab$X|hH>^w831O*Wv%*Tl?hShfpLlS>JBP=GpBr8leslO8;mgBUhOY^KA-pNP zCA@#Uv7o!mf+D)^%OqwWaI3 zT|e#mYgb>lxNgI`&FD6}TUobTyWQRGg>J8O+ukib>f)%Yqh?1fh*}!8I_jyY^-)`* zwncpu^=Z^sQQt?oyPws4Quph+-`IUi_pROE@BVA|&e3tveWO#NM?_~uUle^q^vdXU z(QVORM*kEY9g`h%NzCk+#WAL zV|pa^7}VpU9y5E?_Sn#4WY655`8^Nx{I#d6*ZI9J?zODfzFw}lL2;+Yjf-0z_eR{i zabLtuk6#kMGQKYUx%kcTt?@hK`}R)lo!&dE_o=KoCwSKsWuMSbh~w)WlI z_m{q|69)7f*6)ITm-n09Z*jjn`#sigeZTkm*wEOa{f7=2ddAS}hn5XpI`p2QPY&HYblcD!L)(V#AL>r+mO4B&D|Jlj zS*e$%R;F%B{WSIKR41)dT2$KLwDD%y%{wbPiOo+qcP)^jCV73X0&JgGvmjME~9#k8a(QfQBRM0 zWmIrxZsr-8<1<%hKAPE(`C8_;nZIU6j!qq&F?!tS^GDAa-9<_fC0+Qx5gY#p;)qkF z2mkZo#s75p@Lr~0TrY$0-RNL3SB8iM_Cl9}F_^zHFu#jo*p*W#Mz|e7)^5agMkGF0RBAl2?oK@gF@C#kH_46_<+nqEM9Msf(M$Oi>}` ziUl}ZC~g*u#8R=2gxMY!Z| z!p389ZfQ#gKRg~PeUN_0U>PJsWGDQ0Nf>_NG6Me$5+%FH?)b-%zOtK4ftD_#<%#(J zoGjT(o-F&w9NAx}AcDN!E>WkX0r}SmpRnn+p5~$O3tiwNQ@5KW3a~-6qesZkHEYcgO;~ z!*H>6r@X{kCNH(BWg-53W0G~3oNV1Ai>!NPv9(HGX5A;JTKCIo)&ueiYqgwiJt(iV z>f}|{Lvn`ou$*Z}x`JK>8;-(&-=aNWUNZPQl>w z=inJPumE}__}aVpHVHTm*M(&NTZ%SEM^XCK?+FnH^Zb=~mkWIJKHUEWo5$cA&!Dk4 z;h1<#I3^wwz6sZ)<0)L9QhH9x*Xarj-{>bJ{^4*J^*o*z0=vJCZ!UqZu}C}VbCE`{ z$BB6716-ejXL`YIr{LXSu)>mxZ?Jg^n?K0rF*o2@LAcvpk7vEXuW+4B>2h8Y;s)@7 zD3meS74hB-2Bzx{l=E#cr*c^ansPAtH~BrDxe4#VR=kr8|2HFFRKBx0f61sf%16OR zI{xG7Pu_!frQq(7EqIO#6c6FqSug@L=1)QY7WGg0F!ki(_V6I~_bHw=S=xRs@uW!S<7vRNc_xr(3y|KRs{;~q^>Vu}8 zu0y?(|CKQR4ZP`IyhDCH(v9*80-Mg(;eL<&le<9kK)wDZxQD;QQD~Fks9{3%1pmxD z5$05W{XvR91vKeRggyd#VED&N$Df5i8vd{R8P5iTXWyaAt8gXW?SS5CB)<6uemGy} z>z~8%?iKWL+~0OTjkXOv1d|2j+q6T&!1^-v`1o^pw*mg%M)^$xuRo~ApOJ&~cthoJ zHOx)@?Mcw_zkvFrapozmcgoKkxJ&;4?=XQkHEUjUg?8^M$A3}4eAN!TiwSPpf_M1A zk^{+Ss?biQMM)amG*r^{{q zDqU`qOSJtPcj3h#69^?PtO@Cnd1(usB&*PQfUzM9Fr@(mpQ*?XDnyMM751yyX-^70_k9Y5Jzy22M z(E{ZAZ#>T&n5fImwAa7w(EeY3L-QAq%J2MIe5?0&ImHTCf-E?cf5@< z1>XRdfmFWtgH+yYz$A>j4In-PCN_hnpVjd=aON*M-r-kh-pTD~2G3VF9Mb0N+cXo{ z-6ij9{i*jflNM_ZyIS)xZoe{klN=~Fc0(G`ylm8TDKdT_HKB* zbPQRd!;hb#dB-fxyLxMW#qrL&O~-4>;rtrh=SRGzJWP7VaKCneG#{GuwBDe@Gww|| z!KkOt5RM7&UGA^etk_ssF(GHsxUI#gzYwUOFEiyoNai`8D}A0JIx%5*p;Uit<|H0&3?fPMphG+vKG zG+xv9MQOYy{xV$Cgj;`>PRFuwnm-|K8o#$8{=sm6%ZnKQK#B4{5u|ksT&&!jhTqYmecEt-MlXWF-E2c}&I_6y_B(3D^E9v$wUOEtga@sauwmG7n-HFtil z>uvG#xVA%j@7k%yS5wY`;Xd;%-qC}*E7NqiU3pz<=3UbsO!)?eZ^F%d8Q;o8I7T<+ zXX?ZFH{t!a`7z4AA1+(7O*FC zI_ir0V_KF@w^`SiayRw6c(}H|JV%r2nZkP+{c<5VoB1i)-BRc#zR7p#_y*je<1y{d zT#wQ7FO;u-sBdaFrrra~^NIiEay8{?%J+EfT(p8{gpZZ58H= z`w;%t3$Skknszre4|4)^Yyzut>)A~+upQF-Q`A1p_)@~|pFE)3)lF=_=R{n4BfQb8 zv2O!@S);jlk`8ywcFM ztq7m4Z|FLP@=c`v@_Xiefo}uD9hLW=T~9Z`p4M9?UxB*mkCD7S`~u_kuHWU$%n!z$ zSvPm(aynkP-yvRVU&fy1?Y+?HI`lix%p)r*@GU^-XJFi?`px)3*JnP$Kbmgb;qh3w zgE9_M-(&HLvphCT&W0p2xA2N*Jq}EsgS2qx#RHS;yk3}G4{1U3;h639!(nEd zVDdbqg?l`aFc}im6(%W=mgt5b?p;B8#h4(v8#ETu!X2RQFj*KB4UZ)C=-V5f3>|BtV{pyGIu8{G0$e9(Rx|+yNQ@d9D};U-^(0 z?gtHqoP;|~^hSOP&Wmuj3Evcew8RuK4Cj|YTKG=H2*??@2PJWrC>`h5Abv~ShnOvK zzc>kU4emu*;xXKbvc%)!6v(G=H_F1jp)rv4xFcoZ{?M6_>ySDNcaO$H;{O^E=If9a z-e96{8ni-M;!WJ8lHx5$3s zUrvQQPfmlJAg_SDP+kdnk-QqRK+c4mD`z2u8z3!wYw}v0&x5qYe0e?OYgp`AVw=1H z@;x~Z@_l(DM1kw_r)^f;B*4;1(gG3v%R^YrdB-)9!5;DrV53;-U0A#ea8ZySJ zg^aZxg6v^E0@>4A1DR+&4%x?g0`ut!ptZk5YTkk^N zW4#A?pS1(>erqS>GuB6t>#UC(nKkC2~QhavY^KSS=fet|q-{Ra7!C8Z_4w_LbG`~##V zezDv*{}s~0f1`UK`@4LQXSjl3j(_*V`D9lJ&Wj)|aigmfWQ8jnveMNBa-Ay@whfRN zbL?(7w;(Oyvb#gtb_}H3?g1HL_ktW|$3u>=6Cg+0eIRq}6Ch8ulORvC2SA=~4}=_J z4~86Try$HTAW=tlD&(2=FvxNC2*^wAbl4U`qUYM9ASc_SA*b6X!Td@{OI&4VLtbs? zK+dpFft+cd206-WFBZPQJOZ0Znf$ZzP0rCX*Jjj0T z8zGb2<&cBi6_A773m}KM7eS`Dmp~46-vXKHz7=ws`*wu(H%Lodfq#TXyLB&vyxYAT z@*elykSp9PAn$drgk0&q5AtF61CWonS3^GPu7zCVehBh0_al&xyVpRjbw3XIg!>7| zC*4m$dht)rmhd_2ApOpI$ROug$Ue>n$Ry_l$P{N2WQOx155VjOTJb|N=G zTH*!Ah4YP&mS}X`IB$ZqM6=_;`OA=KGma1EuR~hmEhh-)Z$nz*BPRssyC5y`vC|3X z|4{M^CmbgGoh~pr0Eu?xMB@A#NJ|`ay5am=NDE&^>5lWCATgdhF*yGX67}fmfpZ@u z>e15+=RuGdw>|MV?*xf;f+qpz;gDDlc>3VH3naz?&j~n>gv3bhNrH^>41nzJ83-BU z84TN4NQ~Z|6v$*xD&#=VFqjX5M62+OzoB z%<`UW$O2CeOfH5*JMo+Xd8y|#$U@H;$jP2FAQyYigqtOh=)az`aDEFUMtIM7oZkv* ziQ7Eq;{0|?37 zuJTNRe9%(_^IAwt)On`h{2@s6GS5_;KLUwf=9z}`HIV3Ko-1(vI3#+R=SrME0f}Db zp}pp(AhFW;f3&>`e4JIeKmNXxKqi?vc^ zbm(Lz%sXitalw_V{;!IP%T=#>m5T`K^|~U0h~f%ZSwv7!^s)%D3YSgo@B2K@+1{CH z30(jEbe^2&InP<%^PcmZ=RD^*=WVzU@S27YlA)65kI9zl%EblXxBA*W!l& z{&&0q@ayqLz;DD8fZvQa1707W0(e8b4e$r?4!|4Zhhz2iLqPPO_>q9Wh))CjUHmA( z`{FYJAI4X~W8R)%A>Ix6V!Q|NrFbvk-{Knq{~k{P{v*B# zaDRLYpx4+3=r^7T7;EeYtZUo>m~5omqnZIB!5UwS@DxDEoW^qjPis6Ma7*JL;MT@8 zV9=NWys$9i8@L%_E;jsw1HC0#O+Nq}Y5F1H&Ze6Hb4@=1yrAi4fNyX51>ifHZUKB}(=P$v)$}XC zk2l>8_=%=F0spP(F2GMU-Hj4I4G6uW>9>GaH{A>P<)+^Qey8bv!0$Hw3Gjxd2LNwt zdI<3LrauGT(ex;N4A60p8Q}SHM3sJq!3?({q52HN61% zRMSg<^@+a&9+KD(I5pwdW1dRX0Unn)1n~F-K4IXUkZ1&4m`DJgm}mxEo|po-BGCr8 zGSLCJDsedADTyNiS0|dd z|0c!(pG)ikd_FM&*qXcuus!)^z*)(+0?tmp4e;pXI{@b--vu}~c?sY#$@c)xOTG_q ze)3-dk4=66r7QqMPe@*h@bQ4?3CRxw_9ZU^+?MbL^7DXaCoe}1=K#jM*Cww(_;rAoUy@e>{!8*I!1pA-4EVw1R{<|gehu(L$*%)` zJo!z)Pb9w$_?hH2fL};n3wUMnI>4_azYqA|$sYiIGxO}@cib(0bk#IB;a84G{8?a9|idD%`*WnZ=MZ!Me`iMtD27iyt;Wl;62R? z0DsqfJm3S(3jrT$UIh4T^GSfuH7^FNYv}?!q-7akd&>&I!&+7W&S_Z5b@dI50~0l<~kH}QUrXi*E&!-Vn!4sn9gW0e=+V1Nh_k1mI8O7Xkh}{${|N<8KALHU2j5 z8gFgmyS$%z&o^G*^i%J}#v1_t)_5b}KN^43bhEd->0RDE-t~!h!EgF|$@c;NH2JT9 zw9+4tcURYkli-|GTYy@Xr5U z>!$&)Z~YA54XvL8ys`E3fOoWB4*2WVD*%7fdL`gJtycm5uJy}+_qBc%@DHtD1N>v_ z*8%^h^_zeXwtgG%;nr&aA8EzyU;gv0*8#rR`hCEEwEh4v*7ifdL)!wtrnXIhhqc`V zIJNC3fV0|u=B@NkX!};%8UAnDZo!#>d)j^p_`9}W0p8bk1>hgrt_1vJ+f{)7)AnV+ z2iv|1_;B0T03T_)9q=!0cLF}%b{F82ZFd7c-S%6+XWH%s{NJ|U13uq&Kj4dPe**kl z+vR}&X!{JH*Zyh1SbHB}ef#GC4{iTEU{m`K09)FB2-w~p03Ol432;XHb%3+lzYjRK z{VS;XvF#5ad_wy}fSv7s23*_`&vT06*0J0^mp5uLb;Q z`%5@yacleE0dH&H5BTf$>)X!s+i@u4O#iTsI(WIirsK&e1OB>>`qlw|d&eIU9_Tm% z;j=oX0*-ZD-!|aCrDHn67kA76e0#^N)*b$*I{tIo4*!cC-vazn$JNu$^6%(~x1Qzy zx}&KzFz@wJd;K%O`3HY^#yfC4@4vzSg#Qij zKjD9C#wCE?0sj;JcftRJ|GgRS0lXgkPx?24^GW|l;C#~mF*u*}e+teg{hx#LN&jYW zKIz{I&cFKi&FBOC9}Yh}x%(e4g>2K|as;&(F9F@I~bFjQ=;} z^OC=2<|bI@KREL=zz@yr2K?yEPXK;=W-s8s&D;q1shPN2H1_Y{Y>w>%XLIZ}a5l&8 zn0X1{uff?I`wci-WB-HL*4TrHZH+xL^ANu^_7}vq#vbR`CucT*@-*^U8GCrvX@HN+ z>IQs#)+K;X&gunxde%noSnSHY4(D{<0e89&<7~|rysIJUuk&t#6#pYm$2{%55|X+U-7TSDUx6Lzx5ySVR4H!;iSaW*qqqT*jQ|D?BdwJ#6A$a zBKB3Bp!j+0w%8wH567O0y%?*jOV%A;H>++z-N|*U>ekh5s_U;iw=PqcuN$v>OWk|w zK2-O~x-Zn-Ph7khdzAh-w$nTIJTj$VZ7nX4O8Mr#An7Ii$51%*_dh^Y@BF(XVZ_H_BF*4QxYAC zC5dw4-HBf(7ACurW66o+_me+QE^NN2`TFL;miM*X((>z;-?z-1GJne2DYIKsZTYs{ zZFjZ(q3zFYPqn?!=C?PsceJ0_;an|9dT!xkPk?}%kb zTz$k1N8EkHvqwxlvhT=qj?5idH#Ir+@Ts$=E|_}q)WozSrp=wUXxhqYJ<~ot?Z2ko zJMFL2veVx?{i^9VO#kWhyQUv^)Z(M&%ov(+{fxSqQ)Uj$ykO=BXMTLCTojrH?3u^D?$~!9d)cvx1v3_m zEqMQeA1}Cl!F>xJUGVn>O~*|=?uWnC!Pl!y1vo%)2?52-QD$%u49+3UOKewEz2%hcIC3KE&J87`<6Yp z?CE9umo+T!Sbp^KgC^Ae$(<>mfyYn z!R3!He{p%kiYY6OT5;TplUJ-=(YNBYD{?E|xZ<5F{&mI2R(x*7*H+xP;^q~{*#zIkxhmm6xpi@XF7uym#e8EC0H3|H{Ty9jj)px@6UT ztDawV*eN}yY(C}hr_`@btX{Bs)#}q%Z(V)K>JP5|!s>6W-naVLH7Bn*Wld?#2iAOi z%?)erTJz|dAJXaSDRFZ6D}?+5;g-i`SE&|l>J$nW%S@=x}DjNecE#n}5? z;r+~C-`45yYain{}1oC`2Ehm0&~HY-hKG}-v2sggl~BF```5bh~J<5Yq6Vpt@i+a5BfKF z58?MPet*XA5&y^Dqxk*BzuS8ZzsK==!oLsF|32?2|9*5Ur4_%+}ck4^O( zW7GVm*kV5sTj3}1YmPw|iw*cw@N13j@Y`Z%`|bF3;CEQ;Je<9Iy?+FLN5%&Isj)Zs z(_(3VI(|pRhWr_^tUogr__Oevjo;C+z5X1W*P9!AvwuwN?fyLc=Hqv4>|_1{oTobu zzvE+H_fNoYA$}*~w+O#Z{7%B}Wc(K6w*J7V}|~Xnb1eQ2mVNudha3c zq$Lvivk5(GLeH7deiQP2oubZ!ruZMfO>${7p*bdWj0$<)8~i-HmZ^Sk@K1yv75&Tl zQonliT%GexCUm<4F4Y4D+oNxATDis{xZn9!IBl}xB?Lc2}qjVAOK6S~-h{>6me zXF~5cp%0qShhjskr8PbjYk}_-{riZC{iq3j+=Tv(QxM;$OxjPWw5{IfV&8im#o<(q zN%7s--@Yicn+@$&6WV7&x0w+3>Q%2hu}+5uOz12VIl#coq3J4AkKJ_Lo5t$(TYacr+JL^{r9+RZ zP(5}xbbik!bm%z~dclNVGNHel(0&tYNb0nWCe&;~Q%q=~3e|geHb1a~TBzRZY0+sn znNXhz^_$QR6Uvy-?Iv_LhiEk3-SQFjwtj0u_Zq(YO(>Y6%l*t0-BwpATD^CTiM`H* zerQ5JF`)-c=+7qfm1vBPxe+#_`8 z11988rIAAa=1kYIDHGacLg$;%Acs=^SbYIL76tfLT!!#<{@bvpen!K7|FaEsv3)S# z?Q3XBeyK5u-!-u_8m`0dy|GIZ?~PrK-&gS)tAB6osl=&uS0+>bmB}r2XEaRIeW>}Z zb^98w^Y=A8Qvb{52kY-_{yO7h^$*v7q;)@dQYa&y+}H5g*o_@q5O?Px`#{@=a=$oj zzklttx>&jXe-k%$%x<``<3;>^2EV`Im-27y_y_(zpIAC`A>tO{*M;AH|KXXN8jhKj z@;hgpkQ}Su@3+pWi*?P}@9&s1yJ2|F9nBxW@3J`?e`(_L z@gwJ*8Gq-z*$wZUcTdZE=iP=puZfSrb0srB<>%&~8UM-r{r>Of&u(}a;S7Gc`Ja!U zaO`JWbMv!P#_F?Ea`O|7=P#&>y=}pM|1%5P8ZS-k_itUWrS8(i?8dSB9mwk%wDErb z!3BTf@?LY?=i?iWI}^Xp$2a5eX8hfbzuWPb^3KfvZ0l=|yEK0N32$whu`uP&SU9_J z#==YEV++rl-h1M3$JzLue`2;HgI^xMas1wb-zE5c5Wi0#{=M^V?l@=B%^k1DFN@!u z%{O;kfWKq-?Z)p-_`QA6dDGv&==J!WH~k~{`w{&8G5*qTto|>DU3k*#r(c>l55Lo= z-`H`+^gk{>Z~DH5*W-6O!lzH)za-^f(RQr9t7Xb5*ZEUUxxFQ}=FIqOj;o8k2G9PcH9PP-GyWd@ zzOv>ohb=nw5cvHyc&)fuV=a9CJ^_!vu|v+l-%a?Pjo&%=y%xW7@jDN{^YMEdt0!U9 z3=VD&hJ#X2z?1Z(!*V|8DVBmaN#f$zMBjM1yO0IXwsa{y8sMQrN|XxMO@JtT+?b11 zW9q7(mCla`+%_DuZakMq!;}ZorIDcAyLYSdmB|#9x;EvCm$D^2HkK=lU@S>bpkYbrIiC6l@YLv7KA=GploY$m zQDd}n;!fRt7^|!a6RFm{rIH%rOQ}lsjVxxoGToAz)GnfK&SnNv5>4$wx#0n7RF9)f z^%SOSD;ZS2R?3V!_c98dUCNb%-a@ulnuR+wM^x6fOQ=*G4sFPfhdcT8)MOVXDu<(M z*Pf$NVRvDI-pz(madbx^%#9R+Y&Y!C_<%2 zv5ApzeKErVm7j`Z>?^F9QB7jk3f;m>In%e&^5CbBDMS~)ADG%?y^i~{HPKY851j+ zn>qvsQiW`;1bLR9=t)DcWouN1`FbxLPv=?A*wWUe!(jPRdP}+k_pDEs(~7{)hiMdD zt~;9^qmdq%$o`$h@qD&>cTw6I={0+QP~fK5S)RQU10x*6G_3MflQ<@^tR=>oWGximt)Kp=2F#~;~=+gU!%IRDI!h0_d4fk20e3Z(O*5;>x z@_^p+MqM>EuFJVHO{UTGB}hp{;eJ;RMinY^x~Y9}OKxwD=TY4%s1auK5E(cVzfO!f zeW0iiBa@I4vbiUn*%>H_%WqR>2stkb2=SH6VCx$SgVJtN2HY2193`pklD4P!D6}7~ z7Y^rw>^hbg$Vt?V&Yt4vSg}AVQs?>{>nQ2cgz6NXDNE`>&HKyH(1MW(BpTD%a3l7Q zL#)%wq^kB7s72jsR8ggi_2h$e$yF2R`ASfi&>zt`L!~7R6xF24uUhimoXre*9AM%yK|({Wijt9=DyflfKU_d z6T}sZF}dUl*}>Fe6rciXy4j-Rb|58;vk7+kQS(%lp^YJAMVR2#Dw|@5>V=Ry3WUN>zeH+SrFT)<3V93FM&$^-MCVwc z#3%-ir{|WjViH10PzhZPqZ-1MqlgD`xw2Rx zQ6$H?B3Sa%{n{$xBu8Bd6y>W}Yf$Z}Yf}%DztY7ekr8d&i5I`27PSl14daCj{&Yi2 z#GkF0`_ou89QV}AF$#f|fa>kH@knWWI*(E5{K?%7bZ{pza z*+F{OreMOMq_~4XEIKr^@~aW&)Ktl06cK3&OXf*8m$9PSMpb8{XAa4(KS#QLe^8Qn zk)C56jw6qMe5=P3c zP!LECtebO%T|rhMidSL1umw>6Q)tSmI1=jED3y3^7g-++jgOp_3-*8? zd3R@M+J>PaO^bsG5JT870*tM-D+UMm;7u>~(xNRb_Imo~ty#Nra1dh?GZpcS4i0X} zVcN=1plcO(U>56I;$fksLJ+S!CI%&9plBE*kP4SCT_<)DGGdT=FA-`gTB4_-C2Dfo zu>^%e{=oi#5G0tEI2Dpa;)#X(bY@@Qo>OPvK6=EF2b3ujVrfRXcMM_7?0>fej zHjPwaC%RcV4NJ$`Wl)U0H5ZZ$P~n~Fa6Qdr+*3kD%oN9=&ImKrA8G8Izz9z}Y7E1) zf)>~dYm=xCG`&-$NHGBO+Tp>$?n1FJF-O$yXFkM<5C*N=e^KZa277znIbzhUKyt|eVP%U3R4 z+_iLR_o^kUR`xFMUA}5bZ%ULY{ zLATgF2m&?icFll*YCnm9b!R2@N$O-TH`2khrI;OuP1Reot(4mh!EM&_yl`BP1#S+j zWUqkfrrX<9DDL6KWVbhjrSgtauG=dPUC{02F-3GU(>lwvPBX0|rghA;&fD1IQJ>zp zBemXJ-@BoE$L4{-4XMq&gIl||^cqTce}C_mb(>!+R7%j>w}BI~d5~7mJGQ4hUbN&< z?Fe)$%Jg8r1n^f>%YJVi zOzHVB0A*bXmTC&f*dYQCwN!M4NvE0r!%i~1L*|B^qE2-84|u!D{5&|Qio~Dcd^U|g zA^**#WdyQGf}4VD6VwEmfI~gwVYxVJx;WG5sd%l;*eI>KIn=uwOT7N#cqtR`iVC_P z)3e&XP^7ll7?fplku<0=*;EE<#7Wr@y)}|>wW9R1Fsltuq=u;w)8oP@kD*7&Bau1{ zlqL`jJ%mg#S!$0_9RTAXQ9Y}XF}gjta2ysQmBxemq=Pmm4+@p0LI>#&GQ|Sq;)JG+ zm2#sFx>w5ga(aUW8x~ZuELN3fsp=y0EQ)f;c5ZU1Dhysun>CgOMn|cH(J)gi<#R(` zvD9B4AL4G&lP(|$qgdiGDHU!F(5186#)n|HQzV6`&aV2Y?)z4c52e?dWLRxLQ}uG8 z3XGtgQ{j#RkqDB#t2@MGEd5xwqn)R831$Np_$UeMmY+Gi6tVbf3q;hI_YY;$% z@cPHGdcj{T#i0dD5IdyB(x^t2Sr>-MkpkHXHGNx=*F>Cz_9n?#;9(6%9oySlg!K&4 zO>H%);ij>4Hakcr+Sk-*} zu$>r$C%xVRtz>mPuS=t(4VVwGZ{u>Eoh}uk6xi8|Q3_khToO-~p{AU(EnVKZ71mIg zZZU0cfP$nd0SS`{XwQM4&SE4gu`pq61aVH-OxDo8Mv+cw<_g0GmfEfA=e;XWdLx#{ z(0U^AMuJHr!T)}!_{NJ*we-JB_2e^NF|OHg(# ztIgL?xO^H?or zFmYjdmK~&-g;=qW1Vwf4D6x;GKFh;(5%nJ_QsG7zxhX9g2QP6u6ha`AvgyB!j6p@= z`!Lze9Qz81C~9L)Y-SlH?Vy|o`A*kJV|gc4>xzQp)l9yy2tVF%|M=LL)RbaGrBK6D zAq7@5bf?$?!S>H--|Z|Ur5j-Kru`_>0}L*bjVxn^MABbzo5tl;5k@XlZ*(p(;^}Tr z52+1%HRo>!8}Hi5bcpADR6p_*G1PL@mk-o z?Ma6$IPxVVp5T;g*cTv2<~z!0%}A*@PEHcxT1$gvcQk^l3Bt07f-H)pWCRt?MMZW= zls2sg3PokgD!j%_ENgcSVi}j&g{r8U897`XB~qrE-j~mkRh2hntMbzu0@cZ&Wvk7C z>Np7Fy%W^_)lsx2t)`+Cu;j=?>#2@o6Gv6Wc+MpEuG-ODgW6GOBJO@@&+5WNnXM{q zdr%%PQ8Jh#t0Ff9<;>1%vR!?ba@Db?7mK^9smdHq3(x9Evqt2pxH=wPMx5WOqoBdD zTU>R_M(WDdgfIe!y!%HVpXlxk3}~Rr>YqCwL_-R z8Q=<6E3LI#SLdq~0CLf)%GqchHR1+#=4wz$_>%)1D}S_cMIy9D#)U$WR){qt?NS^& z$yIftW$nQ^^nOW=#Hr!lz0j&_#6Ucbrpq;pgN^~O33l(Rj)w?1P?VYo!!6_aa&B|5 zJIK@4Np%(wUum#ZN091KO~pE7IJdW&jz!Z!qN@2Zp7||J)QBnu&=;YPVyutUh}YX{ zTK*lFQ_JoH<%CKgu~K`rB3oS{yU47LQ=3ZF5n8paj)4L!&V&bMA)^xwR`d%aGFdoQ z=f>ktZIM*Pss>PlS7sZw0A&L5eieeuzwV6HH^zfQNbGwc(-7B1l7=pSHQgyhac&IC zPJYsB-8@`MnY+8h4)f&AhDK#)gt>;yjrc>b8~e1-xp%@37CId-qXm&?*AcXUm9RW+ zsvsEYe*;A~ycx@H%ef&}(x|XH1gxmZ7!>X-qHOejSijI^dka__aIO@>0tx#us4T2$ z99U2LsG`=u%mZa#!fcMBg#s_kES4rS71Ozqu@A`z$y8#Nhh$ZV9jUo7JleaaNIXeC zco|Qi3jG^fosLp@U?rdVs3|v50vH{syK)#Ncm6vdCP`MlRWM{DC9Gs@L836ybROM;7Y%*q`~jpa7a7BT%+8(!8M(L<*xm2%lY<*e6;G~b918Lv1! z9+2cYw@Y*8Tm(IiH@wLaUFXDl=oZY3F#fPiNmsI9hr5y_ifu&}wC43PDnCZhl$icO zDo2Zx^^i&qrU+i*#gdAoH!ckgl{iu!sZ>Kym2EB+luVR?HZ4^**k&B-$+uQzK%+2= z`P8CPD?<_ALlsT+Ld6v(UC81HSp*qdL^!o{xAYO@2gXQ#76+e25VA-#KTAh`DzDIl zjJl~}s4t9ZHZjf^X&tGEvP-J@OhrMck?)Is6h+O9N=Fb1&d!y0%A{Z;r6ml`Qz8kT$@13XGc6`YNy(EZ zAXCodB&k&sR9ljtBWBr7{%bRXk5oy#8MtN8A$cuq8FHpECMChG-3N77UQ(TEDufA& zr$iQ!W^KcQ)ncfDMP$@l94}53yS`yd+>CY5_?X49tkfHoT#`~MqeSafEW3mbjuK#; z+8sEgROleoNwC_?>|(2`vt711Hyo5FAu6h9%*a2BMt>1Ib7%h``!46BSf&_tX3>_F&{wiU<5 zX_MPBiD0$3T{T%6Ju7NROSZmYOXf3B79AolZi`ZL!K@YJ9UA%1SPmG1(s_&KqbPeP z+gQquTfmYaO)E)KsAb88Hk=X_#uE5_R}xdo>EE*bU*D~4EZh7rF<4}yJ`-k1cm|QD zmL!U{#g%bjpxCX>*F~a2C;v1Z0JO0sr*qKijmMgp)gCWa<26~b&gj6gWVD>kN zbbW(%55epKw?eEUgY;+>*$^PRupy1aWo*zHsxHtFO1eyC4E0qeA!frCM84S_t zSwllpvy{PW*t(VG)>-9LOFIzA^VOwQ1<81f<|FF7TJ7qlWb;A@dFYm?Bg2}pJC!At zTaqX9zA5HxL5tvQlB(zj_4UL z!O<3G6&ToL4ZJZ2Hy)15@T`HAAlVjF>10&2>I)M`Abg9Sdzb zKE<(UAe#)TYC%xaT2+uT+zNjSlbJzM;ee)#eG`J4x2JW^wrbS%GE|!a0nAz3u)xM@ zMY;N^{gB?h?D*$FRAu|ehaeQtY;1hd7^+LI?)~ZEK&{=?HZ7cEh(?t~BU0tNM|iB7 z_p^f*ZzK`OTvtJ*WNLZmZNYA@4r4u8#1SxF_rdK*{*q2W2TVOJL(%ZEhTUhUtndJ5;Vc2CAeo-u9T+@yPM8;=xEG>R zG40j?R00wmg_YB=gLLo4E96`-xJA?2nv)|Q-1yM8HCoUCekirIBkH|I;9jctd~|9Z zMMKN(2*EkZFgoW*pbd)bw5LemxCD{I2S~{2nYPi@L-V#hPs~i9T4C=TlOwzIqi^nl zbShhdk~0p4Mw&2-Fai6PaUqPVziNY?HB3_sD_x92Ax zFCgb-71|Epf6RQm7Lna>Pmx5YiPC7iD+j5o%lxjC4F37gteTtKj-=3ahQ5epunt3hfglGdQP&;+T) zi^z*Oy7T$s9^RgTyNEYR`!p1g#Nu+R6hO6KAdb+mn9}*!D2)<93Dq7vij%W)wm7m5 zot8`_>ohH!<1s95Jc>^=Y=ux?7zyCRIe|*Dc5x=9=lXJh#vKPFQu|9W2|e8Gf16ZV z|E-Rp)9e#bayULR!k!zPoOcB{l-9;u#$3B16CBeL30P;be}+dWVNe6Wc9>8eNJ^Wwu9oqwIvwrstqk5l0iS!>Ux2%|-SmgA14Z zJwO?{g}5K_%AKo7jbbqwm*X(RTN-9_@<*|R-U4Z87B8SFEVehyQA1h+nncw!N~iX; zT&848LPCp>$G*k#WNP60(~F~C%m{iv|J|$pLOV^5G6fb{?8O&2oGIqVMyP;+7wasn!22j&1qsKE?U*nF&(m3a~0XZXxZh_ z1k+c5?#EkhIMxUfT`R&NN)3-E4rBHhqFAV7SX71bM)%}G+D!t5D`)&^#AagA9C@-U zUmH5TsDtuIShRSwdcY#1AI_Z-MPi6DLv=Yq?qmT(CQE}b~%#L#qwnnIf!grCR3 z(Y_{5`(BWjfgx_gJt>k8bR>Asic5xO#X3+Tv5u5LKSV1(0i?4IQlSuS=!O!7!DGTw z|B#aqAB|*gI}VUa%>n8MOO$m%V(b+^aKaWO32xbbMwE8pbfKj1?w27cTRVNU;ft35Tgi8Qd*TCP>S2ke*jN zVR&LD;^s3nZ2TAZs42)0H$p@z&kY25jNlk?ot49`^BkGaC%=ZHam%-clqX(Y zVrQIpQvdir)xgaFvq2iphi0iB1e+2F!PqS@Z> zz^L(Lka*5asY1+% z&CPOP2E-%=;~7^N?@pXhqGXXWYWLZ+K#v?a_UJw7FlQin5g9#2$Ef4Ud=iPwaC+ZL ztk{qToG(cU-W9AJP0ysnl1eZlLP}w>!3duzzEMeX+{-&DxF(ToyG)W@6I7Kknx7S2 z{iRZ5M~fLEh8Kqp)etvHL6=p@WWM7hL%2Rs^2~~qV=B)_&_J*vXB_1!O_@6;wqTF%myei&1Ixk>ffilkrdnG+t zIhAh`9TLK8RC(dJ7j4in##?n9;=Hjg>&3Z4iKA!HqMTXKSZo4kM8(QIT*?qnZAn8} zmUBp}a6ZhV!qN}z-Zv+}V_0q!qj-6qEK`n58|2_93>+MQ;h)-1+n~L(aoI!w`#M`- ztn3HP>?a|NQ6YODbm=CzBc@oUk)fHK;}}uHM$eN>Lvx#HlnLlvJOwg>XNe$qFm5$V zM0$vhQ~}3%#^9xIt3j7gkbq*El&m@zQ^Z9F0tIUYoD9M0lF68)p}}#G_El&L!=bMW zuqdKNQidpxPJCgtjLip_Dn<%vNIGR$!lD@l$wIjYom&%Cm(-*I(qTN2+Z==dBwdZe zM)Tkk)}D1eP*R7PWY0sVMYYPPFQe3>;G9nPsifFH1FwPJ5N-^^UzTb5O*)2U++fB> zwXm?6;CG7@urVTq>K_nG+kCJ;YV7=_r880kz=AkcTyXinCm(MBpEx?5jKh5LhGmwI8{ z!;lDyOzTjzg2Jk*qFna80j*eiS@A(OxZdHE_io52T12PW>o-wSmOZc*3AN>>j`lEBT#xdMgq=V@&y?kRB~h zgF{G4N7n0Xq!>YufZ0AvvkWv7_Uu<+1OMhq}2VNHiba#Cuu?tzYbXRS-W^}FqEg=jWqyqQf4IY`8p1yqtlKoq9veRE)I4e zS~<%{L0a)N;^b5@jB0KNcBkD#wipj?crc0>dG5&(etJF_ytLTo z2Y`*&9`UqM>e!kka0%F6w3NQWdiLzL6cU@z+4%YnOI2Q9mS6^!CGmR>ERLL%$-&ZO z4MjRwdcf433+&Q6r2LRV2cNtUL! zLM%la0|#(ft5dragc}`3;%=zy<2DhRgtQ7v*eKeaB~YXB6k|yuu`G^5_}GjoJGtE|ViugWYGQ#lcbLf2N%(C$du&4;y4W#JP0cINkr-^ZN4+D56Gp}8|Jema3gB1%93@#bW(!udXE&0(@HRw zhPcm^kIUIqcyM}mm|rYSPsaA%QX3~P+TwgL&!X&WXi>FJ6x**QQ%ANJnp%35a%H0^ z3EG1;TH(8CM3_yXkD=MPEl`biqTk>^in^^>$#IK^EY~frd)9W`zvLtn(SzA>+@)^F zr$-zn_QTM(-r6j44vV$}W2!W^VJDhaI`D&_HwOhVy_Z8yJUX;$P=~0`*x3@Lw$P2x z!7NpG56pB~oLjUJkRuksTvDLp)(%N0q@xC<+{jKRDtgq;$z^jtui8lOwp3JKDgKs5 zY`k)`B(Tvcz!GHgP4U{mQdw|8R65rq(}ae-3v4i1HtDZ)#L3d6f#|9ZOH;GdK#`9- zS-PaJAR1;`mQ?aaY1D7cQ9;Y91q$i;_-O+(@Nx{<|J4 zSlp5bwNw61W_^LSa6M7v(27Fn-r8%o)d!UWxdx&mndSb9LO@CWh1>}g<>+qT2j(buJDf)1ZV#wun}u* z*C}17;-szn9OgihnzBrlAP-y#(rUzXCLtkHnf3&wyCUd32Ud=nAhk9GX!e-abTn<$ z3nM(nBrrk_nJS3q5QC`T)J86j!d(<%&_$^gU{02#J9S_(9Xav_$gx-QFcutbVK&!# zx%ZXpZZA@+;(Do0X>OID&X{VdW(tYPI$IjX&}j^uXmG4|3aVD9o_QzQ>L`ZJ;w!)e-KFjugqT zY7|+SgaoLYMTr-RwK|owR0@uTdvRknt_rHjWZyn6@;Nvwsc*b1`Era-o>YC8eP|p` zVepMaZ6?)#%7%l^M;0q`JHd${32J))+J-Li+9bvz7@7w6Kr^sGuPBvx9 z%_T*P5U9vD8dvVgEh0GLE)NsZ!zm}^)Ua~(A=6IZum~xvs1d}WwDBPv7pKE)Kt$-# zG85KY6{~|f4x0v=giF?NhX|T(U zDxwL}#rC+=l#XsG0V`qJ(323{O$rkdR8}tf><97p4G()&_bd%7`yc5(up7|kunLM* z!WtrJfvC!a;Q;Oe*qWH!TeKob?K0H5JrPO|soSJPQBXCanEHqyt8OJ@Fu%fCkjOaj zC;`*ut#zKSbkma;`=U?^8P#Un%+PDyIY|5_mfU&IPwn-mUAN{^S{L3Xob~Bc@!NJc`>is8Dh;r#-CYOJxd%LwN+{y#p1c zR^#O5;)&n;nd7*~PsNJ&xl3^*Bvp=zQoLBEDLW5b6cr7RpgUzZ-P=f|fTludMio+* ztSO8QUd#(uZ=BemR9k3^0Dp~!i_7-;Qa4&=u(uu}X(xO%P=0-C0BbB4>JYv85}d6x zj-g1cK)I{FqhBOV=}hOF5ZPuyT$AdnFCz(Ln{?8-9ca*DK5*(isUfG5OzI&jip2}F z18(v~*Ge|2;$Nl>S>vL|r^O~sfE1>}uv6)24+0N^xB$mziqU?;NqabNkDkvv#G(8hgwrZapCzy1o z-`#(goap`lWfmPTk!LFB+Kq3J^7s67H)VSYSrhbzkQ|2OJeW*%;Q((oiz6oE=>F{C z$Os)55O#KnhV}>}Dig>d+CjN7z)Zq~Hn*u}CACIke!Xmx!bx^GWDI_s zOtwU^8RNbv%7%*G2w|ebXfz$>zj#vqOHS?_z=yU}vduwZ1VL&G6~y_1Vu1_}+z-kj z2U$Fa&v?3hTo)Lm^ER0YqF7KdbLMMo@&&Tm@O&YHY6U?Q+P zCJD%+Y!`jOi5*ZNo`BI2#|XhH6I*c)SO6A!<2ci?ixxDn!vrPg&?l*v9EYp?%C+b^ zO@z@Pd@hyKZ!PwXIq8|!pU>eEfpnJDhe!=9h03)UUL4;-POrW=4p$A*u{b3js}B{= zV!ysR5|upd^VR?kGw;$0g);X-W7<2>2}A-R80bCI zjh-w`IFRB<1j2;gwfUVIFifTg6hgTwG4(94b=^?TZ1xf zMPrn+>oh1hD1#e`M-jp>)^ub=i_aLrBcg*c*UKIsHmqwE=6lDXE+ zE8)fYQFe4PRgtE)}K0c?#mL;uzM72#i zcZbX7fo3lfqt|9tFCtWh&74YM+lFRJCNmzWgf`&Z@(eCOjDxOx`F9%Dxg~x;~5`A?8t)R)sca3q(+z0i#)F_YSPzJg-WvU-`GfxQ9HAp{!$VLa1hWE5{lRs`B4cu$6`bfiKE4yu zx|kcJmp@9-A4<+}9it$12o)R`ihT|os-W&b-%i1$Ty$5ED5RnV;PNT*f-6B8<*JI_ zpa_(0gpdIrFPDiOh8r9P)U1+4wAcd)N8T%TnwqLun^*e0@NdS53#69l{CJWeyCFT= zx1BeZb#8VMWw#fct(JpZ>&XSDRz}LoN3jD3;!y)`@>^p3Xa_CuU>vWwIF=a)EzWR= z79v)lEI%)=Jz4D)TsWZe@SY~K@V2yKMot_;uj`SmHjVZd(qrLHIABvva<)1=JaB;7 zs4}E-LC*t#-IF(f$w!XXOUBcbJUvu1gd72}j&Vv>EJlZkIUSBt=idRVtbEst#8BTb z-I<{TDhFXR!oUmC1)4o|aG=O{0l`~=s3trT6gcSsl-`2e`l(eBA<2;8okAgO&X$>% zUMMeFu=}XYvj*iyHyAr88BEN#2F=hKhq9pj))&bspCy0_;>fECae49r6y=N}cp+>| zh0z);YFwfag0V!3_}A6bQTD>!6j z4PdG5kWr?twnOE?;ovfJIRxsk4mt*<*xYx^eaMNV`c~3J*|l1%!>$@bPk`7kklO?Y ziVl+);T;0ajy*+uHzy>ghCb|pkk6;Xz-CqR7Muvvt`3dcbUS%v4HP#A!{y2-qT%WX zVsN6QQl$DiM5QxAVR49fM(RE;iLWZ6vo=cSaJVT7&A=;?>R9#`!|A-^-G_suHu~H_RH(|zP?H}dOQXvlxI!44EE=H2uDUAZx%{u-M+WLC-!L7H~7>7#OZ!enB;&g-PW8^(VYDGrra9&nY1 zOmwLFibIE#Gb>dx$tu^_W_;;XqUqGehlBN*mn44PUzIXa3*qgTq;{e`xQ`EgV)*_ba5 zks&=o)Vm>ir#un~RUQ5`>gFiUO0{dmm=Wcm0|+o_+WQ36r;R<_Pf2ZyZh|q(LFb!4 z=!5FYU^;)NgR0_?GU~7|y(qnGg+fk8a2x`vYkH|ej=Zp14Ai>Z3lEgYq4VKL@^Ya4 z28WJ9LUo6gL&al38kHx|B<%f-lTo(*+;wpIm3bh=4L>Z0D4IVXVsxmce;-ViSpNmJ zU(Gi_>zkmR+;}_1!Qo%yU~2!)p=4~GCsmP(ohJIMmfWsF9bytPESlie6iICz&1DkB zRwtqtAI(PYfTZWZ7}xIqv{y;j?it**ni=A-I)W){WW0R(K0LG!(hb#BX)KuNCKKdO zwLvda7_U_grh2cAl=X{p8MbLMhJT~F>O+5+0NNd!+Eg)-J4l>3n~an)CxQ*um^jq> zq#_o{Xcx)hr)SZh6=Hd55O}X(G#V61S@kvqN~ucWWip*bH<7gQhrJ^8y&`EbSq~VR zvMj=tMr(*Tt!!e)bW%}f)Ok;9B&H8m8UY#rY+=dNWz4&&C{Ij>mY4cKssQJw!Bk{q)i5(1oO-O|G7ZpBRimx(;i9X#x?~=z z%%F8x@Jg#PmCT165WP%#Em$C@OjsRYci1Gz8;?f+Fxg4_Fd7*fOo?bxOwp@EuGi=g zU1N)&k%f$<)?0Xj4{e+PmW%RnBRP@UHKuR?)_ z_-qco7lZi9`*AeQ+)1J`Q6gNA5;$axk>bb75`{n&S zK?-0r60A1*N6Ta0`tdQIefS(6PjC{l8X0D6z5zh!BlICXJ@9Z(+l8KdHS&VN!2!Hl z_oI=91gU^;Mp{(0o}m~8=itNG8B#C^mUJa*4Qpp)vD-REFDD^eKg_2ks6BficsS^O zH$xG&_E1+*2rLeza)e?ccfu~hT=YRK+8VRM=!laD%I$7;G)lPe<@+ zu*iK_qY|dhLUjij{TPmEbW^q>sHtCJBD^fG3Sl%LhOgY`T<9Ke6$L8gOGQ92L@3RW zZrr6Wgh1x(rmJ_Dp^}!u6Jv5QJi}2G{m!OUR|UvNH8et{iu`gZycv$0W~f++bt#UJ zaLE}v8@gn>7{&&>%9B}LCNrt2+s`zkcpYgBTZ?c>(pUknScmB`NUCbw%3Mt;yRlLE zs#)aKX^i)&HR5QiMtOF6bv#~s1Q#a(9ZQu$ioGT~Xxnr{dxW-)PCi4T@z>ccD{{67WyG`Kkg6Bo z!>5r9U(#XKpl8T|Vh6;+LRLJ^V8XjcWPRqb`giFlJ zAAPLVE0$q0w0aF>27UIvM5-%$H`B0W^NHK)Mt=1FMp_cU`E3Zafzt3 zrpG*jyOy&&gw_3LbSoH-w_0)3!$|qy@2ej;6%^h`BxVAT$b?SfK^KJK#|3Fzt-fKA z$3?FLJ8{5XzWMI)dd^^~_eBg+aG1fe$ScyPl*lNm?ytjls8Is87I)x!SebJun{){X zk9E_f3>kgU=xjVQYksBiSw^|i&)_ng%ymzOu1plFRFTRi5}E2XxS`2}ZBSWY8B{&J z!K*&jV*NF=lF2n-ZyOvWF$qz$bRCD5(GN>g{V)RC8H< z7^RVyBXoS;dD9G9=4^yVoyyrL+Xps%($^r^#Egw5olL#3>IiFHCL>k0ngIo7_%Kg( z6cn{;qSlS7W2Dz>+fro>**aUD2)3eXVz%n}(yDpr6_e5gDJR!*u$YfhUs-mIlPKvY?gm_cKQV|rUC8?r1FQ+1A1a-&sOnKE{QZZm6hEVaPHq)6g zT@xJ^DWtJcHj8LXzaM&BO~W9BM0P1O0W03HzWpVsbCqI_2% zN~4E%D53;71Y{)LyMm^VTykmA?}RHZ%wU6Q<)0%KgI7wgj-z8w~!f>iZ=QDaD5i3}F%i-*rQ)crTrD zVBvI}>^C{WJix|ILvUWJp$!E))A;rvVTF;oOa)=Cu?QzLxl787{23502+CcCuEFKK8Whn~lEJAgi@@E(Amo^4 z5U!Hh-!o+N2>X;SRSmuxkti?vCQUM`iN2#ox3`U?BRx%)t0cSUUWaTXisbLlEUGLDtSDV)J^l=DWFq@`rDZ^;1Qb~!5#x*kOWbXu zGbMP#f=&9FxspeExkU>YH6zT3hsJbH`Yk0R`D8It3N1!-R%jY3qdAi96IK11c%jfwklCQeBh!01_96=a!}yEqg}ud*D~9YmR)L>{^;p^wm&GY4-rXCzcG?+Tn%iaTPQ3chR5ZE#pXU$<@Jt>iKCg|@n&81u38irnO5 zqsWLf`8{d63R!*f-sXt9R#!sh$D)hQY>8|$<=E8Phm;f|OReb$7G+_@t(wT&^=tf;=_U|s!yvDNAMup3Etn?>aC7K8^0Ue3|7=(edK+rlmD zh};;AeAsdk_Q8N7QkZQN_yiAp%Z0*9!#ch^MKa-l_%oto;wh<{(p4_#7)O_1euJy`^-k?bdUqX~f+x57t4s#Ue5bA(w z`bzNuCDwj~M z2c4^4Kkdr)~00P z7$SBQCm^tYq!$LxmJ&}!Vn!Kn~6E!Zd(;tN|r!EdK}eLjSd|zW$1yRsWb+3SpL#f zpegzlX`Hy}%&Eq$5Z9E5;3ljIk%W#K~vz#N4 zqqHRDeb~_3nGPLHtN?WVu|tg9O%Zz3pHyP9#L~q*x^;91)voqj1AJ;wHC|;jNi{e% znZ_mmmuPd7h~7J4(vQkhhkT$+8p4>}Li0rmOk@GB0i}~bav%z?3p>?V4H-*mh!31p zY)W)GK0hc`Ip&MskCRi$W~$a@dQX}<1%Gi;&ya>7T9+luvF#B09DO2y)+3lt<#BkM ziS$=Nk;b9GU22!aVMtmgQ6XWsp;WxH1#P#$7#@UNt+!zl7saSg8bG>K;CP|*t@{ve zP4wKd4;uvec>b`Mi^>BdJ&6{utU=FJ$1>Pin$eeDXJq8^awceYwj) z19bNYA?wDv@{Cl@5z3beB9F-avLR)nD29T0U)gS$rr>HqDV2Uh+iyA}G!H!mp`>;> zC>0|&*;Np=_kcsjej+`${yZw>Mq|Xq*%a&~;X1;aOj?|+0~IPqR~#Z1C!-Fk1dl^O zUJiy{jIqAgCCQ1uN-9iTY|(YnvKV*pFRN9B?zqJQ9mug!yXkvJ zc(4#RzmOwZKYhPCBtttKG$IGpS;oj}PlDi4wi+2ShN?HVg#hV>-BbBWu1uA5@3Ebga6X++9?2f65z(-3C8129C%s9BVdb3RUpi5cFKSYy#7gkgg|=Y0GV zjYaof7(W4F!UR-;P@>ZhxOYg?^aM^bozQ5xBcT!W4zzi0fvtB0b_!faqgh3v^coT z+YSNM#=$|od_=c);z$l1IFfA0{OX((su3KDC|eGJ1-OHc&}%n(ffHes1&1j0C%c$K zG@ahQdpefva8Mx?hEeq6Y_^Jq2dJWDqV9;H`cj>fy|&mHdmS&H9fs&Wll-l%rcC}C+oRsbE&av#i&Z}kst z$H$C@IlAK5fP4hNX#Q$ML2tB25F88c!Ly=9;62*VVKUlYVN~iH{??`ARpa z+SY}yIss}WeVeNUabunLDyuMaHocIn_?nMjm|+P?B~ zz>rVrR8xuHd^s$$3oA!RGE#1M`Aqsn^kz9J6cSZkoh2ob4(*U|5J*gDE-~XU9BkB9 z`qa@Wda+jPwTXxMtw~meV zvo|UGyGqL_8A>xQOIf1Ax|`$gt{V#c0x@dQQS&&45b`Ao=t@EpR~-AyLX`zcB^7!200w-Y0^bO^l5 z;^251l;aT8G9Rlgb!gp*vv0s5!X8j6;u1ApdOLJv>uT5NtI^4m6TgUQ7`AS-5Csqz7$#%iaKPS%gh9m+bBB7Z85RvTg^hFD9EEluNk$<#E@Phrw*mmEjfA!7_Q1m;y`65+Xr}9zAi}+dr(q zNW`$(8-rqFCUbr^O&{f>RJDZ^H!f`)hMme|F~smT2ZpFxQNc>9BzAqoVu^bXq?5r> zUG=3=rGV=r0lbRVHgXxsHY%4NWjBAxk8}ho6a94@FLE>x&v-V2U{_A{hHZN17_$Yw ztwz3f)iFGsRFkRyY5`Rp+nv1t%L2rQSQ^6oI8cN&yqc|se|hN9npbo~r+(aN?VcB8 zwOIt135?gC=tyG|I3$jxJtUKp13!m@qnRBH**O@kJduY(0XG~Ig1ruD%(fnS3fseA zmPT9C64;~N2k|qPH-Ze9PVI)mIIQfFkqM6*DcYCF!yl@s{s@EQXBWpPjKoZYK&7A! zUB6A?sv@GgQ7$%CMKYt^HEo(eVL2C}g0$0_lwdKeAT6TDHwGt;dnlK~P_~UNDuyMC z8_TsNku0zny={xZ?&DxE46u#8YY98-?#{^Z=qH29vF{Q3Gvs7;iQf4M&ZlZv`@-SlL{qFt(ajdohugwoDF5p zIY342A7@8Cz9Vow87cY7RtPBd*DSwfr-c`4xJZ?RfLg-ydIH8hbjR{2Ad7K|=XZd; zG}?p8h!fTtGAc^FvFH&)6F-HLTb5WMENujuxQdy2XcZAh@bpeX)+VRH zM0QMvM9Xsr#S2z>NuP1k@)T1^rum5OMMElR_LZ@)Rpv$t>u5KUzBprZ!>Xx*G8ARN zlX7#C1+$2w`FbDPW&sW|(e)tO5=pj4DU?x!g&M)h+NO;bY3b;nm}R&gmI!9qPKuB$ z!V~9&#m7itv1rXZ@f&@@Zp-z9CtYyOYTwt(pEW zxlnT*C?^wFX)+K=&B>~xw7yy^hOaQ99A(o z9e||6x*11I@bQLH00;STwl+&(kMpwiSueZRoU~02YTrL6BYGari~?Ayb9fi!4r^R@ z8LJjLEQ5fYnn3_610dQF#&ec(GF-SZR1mf)>})B7_W$T=Htf*y_WPQ}GHf~zoH?4mP-Zm)uTut0@}r8s_Bq4p;t!!)nt2W4vTl=`GF{!~YxrVZM5 zqK|mvK2xK#=qNlo8I#r(asR$bo1%~D&=Nu6>aKQ{go;FUvBnog%oR4m%MJ<}ZJ+Y# zTNOm{v?^B^X2asBjS*qoSFn`Sjsow$;PDj^nh1UL8SWXy!o(=LprWH1Dg-SQqe>xo zsdRCr!tnl8h^IiEfFzv?7p2DGxcn6j1G6J(r}QYKL18bqkaadb&~ALH*uz0g?EZrR z6cNDm0S7#?HiqHia&$bPY8_3VwZ;TS<_dScuSjN*IG?QQSH)qTLb^s( ze9a!G3MOTXOenBg7x(lPwiXq=VoMnB!Ko=!Ern4-TWqJHL%?x2Lgf{wreI*$oK(p4 zBkCu{|LvgN_TXI6e6VEK1<4zQu%P4n(3mi8ouMZ^U&!jCbP|SVX-8~rxb~Rmam}jC*@J?EQx-s_UKy@ z9HgG5Zn_hzH(Sm*3OOApic%pH!=}UXxfLm5623@kcZ!~e_83@Hah}HZ7u7HweusHd zZck29DvBQ96%`jvKuu$lJ9?1Ro(zBbg+fhGc4Ic0(K{eBgU3z9A)2#cZQvVq;bg$? z=j9s@vrE+hA{dT4m4c#I^gNCWq>$Ed2Ge<%IqB7A;LdZD2esD!xgu^R)ZjY9jpAd` zhtI_D&NXR2tSMOvU(jOFtYS=c(=H(?^m$Sd`426g*_ftsGk zkfsN&R)`F3u)9RxeZjGcJVgLg_Ed+cFXj^GH5!VtDi?eMUE*kI-PzrIoxEb{DUy97 zl0eRMYZ9gp_X{OT4C+`>i#4W{eNm`}H5Gk92l3FvgBu4mMUrTYUQ8cdN#YW4tE{Rl zUI(r2*?UstrH-M5>x&t-Ik+@@BcV(?-I|6RTvWXMATAAqYMz0j+{B{_HdMOpP3Ogl zX%ysxy_!b#P`BV}60~i0sG*6Q<)ps0kv{`vqr{Y8al4;lX+}|WEe1APZV|CK?w_-W zKR_UmcpL%%X?q<5GerXseeBq11 z(Q8bYT9vznq1YE^NC&Vf(HK^XU;XS}#U@_FVpJJPb}wT;B9j~JJtiZ}v)tu8eb`n$ zLc=%y@Rb6hhx33?OJUh$gm?c09;{VJ-c3X68Ys4t^*?0;6?2k+dkqLhjb{wi{iPX00p-Hsk%#TOv; z3nn_2t`O_=8AEIVDfy@98pWDc2YH>Qku__V3=U>g8lD`L`hkyaYKKZpHDriaQ?F+^?oEc1WFUS(cf;Bt+(4D$-;3 zHGORlwXH|Xe=@8y0x1zXA@kBW(tUVtzwXd6QSiN`@C#yAd~=HO=6*%jK{CeI;Bct7 zkf-Pr{D>6S>9~j!UZmFBbKL}!b`pJnmrR_Sgof#&Y{uaVBBg{nL^dT@&BPR~!sKQ{ zG^|$phEs(x1al0xq<00h^5P!O0eMF-lo&EO$bbW?ad%mV4Y4M z?GLS(;G{)mhcIuq<;BuRRr0odtO7#hUb_I=Pls79LXaDwGYKMuof-^PI4yIOuf@GF z`z`Yj@ynMygE5EX%x~^;wfLita^aMhnMmHpqHnkY`0Ds$S2G!q{_KZ9b93w^v2jm? zPRb)@Us%|Y=VX5@lR!2@R6%dUn&W3G75{K&RF<0?o;+1na+>S(xMgv#T zSyOp&MWeDUup28x{Iqr__txW$@8{it>spqjCBGrjoCW$!eI|Lhmu!>vxKAk^s`_}S z)K5*R@>Pru!h2b$smo$i&G)Jj;5}(#uicL8k&i=OpVwahD!|GX*C8u`l~_UM#rKmt zo<7AyNRIM&f+z-ec!Y7KVf{K@sASl6Cy(J9VY_GQxa%ViIv!jT^UMmyX=lEuYbF@1Sa1k?bV2q*(8y~$+N7yUbs9L}E zz~r=_i_@k^rTGSrLSHM6e_d}f{pi+#!-_W8ejZ;=dSW}cSx_p7ht{v2 z0!(V}s-|JuFjbO+w7Snq4I~pv!LRdA81|bIeb2}e5ba6K6k;Qm*}%w_Hm5V7GZ!9l zw7Va=k(8;|lB4eJBq~=kvtY8jR2tRP`DHWRANiP$+2{k0`RZr7y=)l)kT~p{2H-yY zkd$eur7$e46KxHcvn8|XI*QpSG__yfzp`U&KY^eb%`HOkp&>sor9RPSS(dPDBbCXv ze_HIPj~4ISF9#+b&4iJyf$*!*Es6Yy^whp-EcB*yNDWxYrJ;?SgzWR=+;@1&ud8m9 z)k>=ofyt8l?)N{^NIXJ`9ebybuoT(XNc6ji8&T1L`%Mi-R=LgNX+)>=Bgr;pqeR$* z=y(WZ8$!_GptTRXuQ(CY1zwnlX-ayGi79hAUz9F9{b>E*5&9UF5{>Y&>H_|U)k}T= z{38$M3PSD*NOMYk48(oRiVfs_%=(7F53lP;Y$@mBQe)M95kbh_T5Nb!^z(84BcEiO z=H_!4#Jx_IBz}3;iENkYEYh|;%Jbt%IB7nzR>(>$zRWl{%?EK`FNU9eumnsVgObBa zei=_@m7k_@Dk{mx(-*<9k4NF{WC{<(z zOeQJ`m5C-&GLv%W^zOq`lbHltc7i~g!W;md-pPPa*shpK)9GB;=qKV{|lBUEd zR<;NAVat(B^1U1angoOKSi@GUE zM><=JVLh;pZA}ewv^8D#ri2cXWps$rkbdDKMA^eW)`%p(_Yv|?9IS=YSn*&8CqGBh zh;D8A{gIFy4mZx9YpzTG`H)b-J8VwNTnyEm5n69f&1mlA1G>=oo`f2rOsWzS?d?Bk zDq<;HR-kP_x@vFE)cNn`l&ySMFdgxWIUaCVuci5t!;|+HAM-%UFdi>j(TVYc;}h6F z(Sd^vb4lTC`-_QX6qH{$c^HZ6{7xyYsGe`X;%+`5S1e1w!`X~XoL@gXwvQs=hcoQ^HI@H39g54E8o7#2=hRWc!9WZ}7{c)eU!}}S+UCQ29EzF1=Zi;# zK>W;Tv+4cV))QXKoF|vh)~*; zU9!iW-A{sN(ay2R?T=BFt#kz4xt|kPIwbFX9kd>!DEi_zqi;ro(L{7KIuIQubPNB! z84X1zqnijFjK)cQG&<7A8760tekRwB6geTrIVI)W-cNb=9hH zCXx=5fX&oN^&2y&a9B>qP;z)to*E0~E>MYvYPOwU-it)5md? z7}rEwiRg3Ll7rD>jKS+2<1L6XWy=>dC)@SD+E$^-&C(Hz1+I-z+V zwbiE>PUsJe7SQhVBCxRF@Ejpo$CJY zUHY&zAfJnm(umLI-AO6u6A@TVYYwEq`iv4n#H+`QSAD2~a01I~ikt^P+h5SGc-m)- zTA#9EOhtc5j>;CJxsXNM?`Fs@1H|J&4g@kw0%(>`+S5f@nAP09#z;jvi9yZ4Xd-QG zu8<6D;1Xt^vBZ3R3b9w{qx5dti3E?MNsS*hdhH|4(KN`mp&Ak*b{qE|u@cSm#wEVy zpQtHRIRMVHLWpFzcz?B_!BG=Pt9j($N~lN|%!lSH52>y6FK(lgZD1Yi_N6F^c* z5&{wm>Ezc0k9tjAcTH@<7QPdVy-u~znHS2aT3^gQ>zDx(x=;QSRpj>a#&GH!4wCdvyx!nArEAy0T%M|ojIBUP?2DqM+cilhh*O%#QSl-77A zN%Ndy(%S~>QMeS3jal#O#n4~d##C`BA)UPsrvEc|RMNmD%oeMxGiGRaL8=|Jf_iS$Phwr&)OglnRthNz$2+CxS3YxZ$TO)U6r`CqDd${ebb?h2NS|mFn=vF#?bqLa2a+Nn}9n3|TjHDDK{A+d{#B{5ZCEe(S!Uu;04iUf(`t!pG%2dP0M5(IbyTCzrsbA?#9RR~3; zSMH;OakGGAMQdFhns9CxpHEuzLPA&vYF4=IB)eEGxJZzs8jRGYN*^;O^L6!nt+@rS zc0&Ct^^P@m-EBal1&zzuxh7In8FRMvsmUofK+(7z-(f8&apZGNiv$-hnswy`LQn{ zUB8tERZ)b$ydHK|@~I?*OU8Y@NmI|qI4Swld6TX=!t?};2fhLnSMI&pVo3-8AuZqM zEq@eCvcPf>6pR zcw3{zS(O((q;-eN>`WlLoqGJPnvGtPA{aI)WNVl`%}j6)vqiigT$hv4SBT4eic0_7 z$>EbpLPy99>uHzSj}i}FyL9qo!Bm}8Nx8F0bH&?BL34x%?35sPBdr5*j+jjr9TMVw zs%oIEo*L&mC!+}6YHs%)VGaZ{xbrBrBv9i^E2Or zLbTf7nj7_tDYIr(^tA^d=rLLnlZu4{i#vXujnh^|A3>pZg3aq#cIS-yW9hqzd4oMO z*M%BgrU8hYP%xo|kCLB%KS4t>QE%8d$RVd*maTHc~f*|X$rQMSs-mcWSL!Yhd(n#ZQ z<0io70^gnc&1yz`oOMutfo09jw5*!@qW=Ve_@B3;Ewxi5Yz_kaM|U)e3Bwd{qWJEZ z$dl@!InKp}X>ZZSR1mdJr4JE9rGFDtZra>@Gb^=197N5Pu-p^3rTaZuygM+WkL+%j z>#jHE(;C6#5>H6#$Wm&RlBv{yH%j0A==5j?HS7t=RG9!kiBGo=L=#_Ph(2Obf#S?B zcTEtn!HwLC_se)Z25y5#f@^vUAx(j>_KrR!C3qB}l5R)@)fBDvyn89(K6&ZvzXWDS z=yuZOJXS6O_j;8Jwu6Y}V!TBxe|9T5!Cw9|+ESa72)&F@zs~#JOuO0X;ia|96Maft zdNg_n+oHJ)aC|!CebvhN9#N+55?3aIO9YRuN!c)qh3GnshwmC&ddRf2)=LQ5)EzIZ z$k@;_w6(6FJ7W0{MVEoj+*6vm@>b-gcKXmx+4rrEhH~1x^aJ?ay>2OWaLE4 zAA)YJc4V|tsp9cw7Gt7=e>*hZGlIchTv2FXwtk~DA~>6=1Kl_hA!5S zplHyPA0ws7yS|@MN=t#5cG~8BsCoAAqMy6IAT`5^wCUbu)x}wG2qDV82 zv}}laaayws31CQ4Xee4nia%0=O%l*WzW{J#OIFN})RaR~f!&JCu<{lX2N}9JA*HoY z8mKK%-|#5@;{yNj0KFUyT7X`d+Dg%9)9{+cifK*LkfYC~?FO6ovSq(?^<~%0GnJ#^ zE7g}Jca*hHmLSnmP4vf_1z_cyG9P?e_)~`7<<`6-?1clcNXFhaLA?xXK zD0P}jCbxFh0;Oc-_^SUO_xREvi=nU$7pw|jVq~R6R%~hPqNgyI#i|6J>Ud5NvRQ6H zCRA*5$?*B6$#s^ZCjC7&Z(f{9{-!XtXT*rOe}^TEhANXFiFERMvfT=9`}* zT3E3sSPW6=hgV*(&QCCD<8VkQHD9!>P4#Ek^lg@D&i>kHku=cOS@vL}q_H1DRIMH4 z`o@|hh1f3~Kk~W8ocgO^S*1{T4`E5K7E@K0Le~sc^C%??(xXl;C4X(h@ z?ifFM6|uFSu59FL)YQApq@xs4RQk79MtEvQNEEsEK{F%W+|(?&T0~zCz0PBoSAAE9 z{J$CClu9er-Gxn}%-*MR?*s~fO}8Wg4E@`SPB{C=Og)YP7S zGlM!)|I<=4I<^BcxkKo~7fN$|c0tF;_(?t5iUq=pO~eW^lx41H2Q_-&qxC9HC)^5a zZVsr2pqM>fQj?aK`(ZyV`MCNeEWwrwnmG%_@sRHuFLTdCT;93mt`@Oz@b3#Yr=KtT zbgOP^7weiIHfqCRxI1(<%(gW)nfa2r^l#d0ExIQ{+T!hCtS$ zh%92u^%)pQ^3*p|wBT@S)Gh0q>X_qW2!v)zTUC@&A zt(U`0ktA(Bb}U2%SKZw8_?4C%E|>R!93eLKE{84RxxAZ_By4+&AnC$EN=I`|CjMMV zl_oXpb>)gn7b2UDL?KU%G*^hHJneA!fmlf^Nj(?$X_+s9;_c}+)_lA<7eq&o zHZq&H$z06oeDRgg`BK<(ldSWtQdtXu`+Q*{d8CQxUY+^&lAP~arJ@KVRh?3BKL64` z6+gSqo68XHY4?+9fw#5Wn1xcvn>K?)d!qB1k}^RxFTxDaoRcF|WA;sVXZE}6yGL7@w+0!97<2P(CMm8VH6SuB~UHThvwr|LU-G~FK~mbMW*xq%Vp zN5LFx`b*L-0qtu4N~E3Z9f`(o2a<3WC&+FmSC%-bSPg9I(plq~U;O$xO^~=atBs;- z=GQ{e@@zXnu}8}{F}7CKAALH7EGzsQwMu^z{FwqTY@Y;x)5_u_p)BmbIk9x$T10cD zGnWj(W^yU)<6U7 zNEP;6if09dyj3zE#j9a2E%4f)?V-4JB6P`m@$+FRQks#N&eKp<>>>61v z!H*|PXuhrBVC1@K>ySyTyEy;&mJNO~aE|Bgi-)53g=7jIOw6@+<`m@>60XDAD0_Mii zkI%NAfx6fFZz{7e90bDfUZP1HR0i?V54IB3jBuUV%AR67hJ;;k7nKV6X`x2^Oy%?1AN2i<9u9%5>SZ|(q| zXf6;2AW0=MiEMs=&SRpG<9?fAFeo@JBwU@!shv_Gu%yz0I&5|j>5RA5^tQ@umu~;B zv;2EInbN>+bZdqOzjdo$$%S|G_fL{ZUop9mJ@Tv6u=dit5i_J~ndZ;-#4tK)qYwB1 zZebdW#x=Jt2hFVs+=BiQb}!R5vXG>3%!QKPKK%_^(SAhm^Gg+_ZDkK>Wu2Qx*iUo$ zphH@IE`L91QR#acuFtaO3L2&_0^P)L3I>fTkuCaP{zFgKq;gt`6J$b#cHI7x=^c6u zUv`RM5_Z0e>NaQ~q6pFuFztYT!xm1Qp;bdhwG+Wu5{5YQovF*dkUm1Zfd@ z8@-C#W&0VP=;VkA+izc-H&r!KaUIQR`^EDjTUFyXRiB!h>!5j4$rcbmjC2kmlplxm=g?)Z~X^@v*QBzqPDC<}h0$Xjd zosHQ&H&?2<^;De9Wk-3C7TF#&%~NE$S)tN$cuH+)1tu%VrI99O*e;H4xRV1NTcdmV zmf$Ybl#n`Xe|G+*EZd-g(O>g?ehf9>BkZ z^L@ENfY(IRo`ASZvd>Fv=!fU*3W~mNd5GGYK!N+`PPz1yz2u995VM>rCzGPu<-}w?#uIF zKMMQG34)~+o07mXJi__#pxoql3v^Ulas&ld4R+q#wnB}t&6m!$AW$7HKZ59KSE9YX zz||MD8h5%kkkUACQP?feL^uwf%o)5iYp*3|X1=N26L)U3D*m~Xw0ZAF3nbYUqGT&q z%r618|DJK${uA}>Vnj0|m3nJ{v8nH#u>BL=xYZ2nljG)RJU%2U{rJf|T){#u{_sol7hyz3PiBb6tAb z1Jt2^&^~+{OqXu?NJDBi45DWS7QS>3eIX-MYT!kvkfU}NVF?=_s%2{Xml?#_zt zfOpj&B(fOwZlu#~^d|g7Yn!2vg)euHG{|M)xIyz>^pL*D;w|fl2VN@|Oyet+%Ub$= z6T?oR&{wkixsxF{x1uj?2D0q=TE~(knp+TpTAn~rd+tIwTB>r*23d5=Hp*rVxIm$R zF=5JAK687EzIdhFHD;eUHs`6!cS`93IqGq}4%YZcAj=ocv~&|swrum~p}z6qm$Rfi zqcON%p_16nXS{^y~>gL9=sI?E=E5t+w1ha>pGFA@ZjhN4eqgF&x8v{=^x zY&YX&f;1n7Z2tIKW~yqdW*CLSbKwujy8IZzqz+JpE#>(~;*QT|XhRDUIO*{{5i;Fe zb{}>#4g*UBN3hoT+BriJl)m>*LnQHm+;on5x1oJCqale?-0V?EQu=ZL&(EdN(uZut ztTl$LTAj>{HcL8)pVjM{#%Y1zquoMkaDQnYYxphx+4kd6)IJ?WOEvehZObe3gRJlg z1$0X3Ht?^)zPZ1hclw!!R7q;!w>tJj&)^skCyEq4owa!R=m$V`G}e`pp@cP^%}yC6^|LudRc7Nl*y1Q*%KR zJA^%$|5$)Tb~fL)qXjGkpW`rhxzpq@f53Sn$QubwsRo%RqOIG$Sua_tbUZJ+Bb6@p zB3#Op(^D&wY8tyu7Y_Ob!tLJOT=U8hfL8mG78j& z-x#rz*l|V?Eon~YEAZB?Deuk|i6gV)1J9#nv&mj#Eyo zKTjr|E)G&yyFL#hPYwf37AMG=#<`}skhPY+T398N+(L;K`;1NYoq9f>z!fc4nII#h z(!Y}Iy1a=XgvqQ6zToVMOh4NRQxpxiIsZ8OjLuIgL#p%Lt|`6H91G%SP9?5@4H&O^LAZ5k4DY z_iP11v7B~ZT5HHckf?30(`uhI`{ASeG~2Vwf%|B8%Dkf*r!>1HjApn`D@_4eA`-k( zp>7z4;|MOSqwX(6pXYzgey2mU_Vy%nWvn!@aDVFvBT{s%gP$ifw%ePTZ1Wk6t@Y>P zLeM7=u52yc=wp3={c0wK%w)$#G<=_N&_@{Y=UdB4Ah~|^g^>7JqQ_f~KAoNXnkkz6 z()fNWRon2D^CdpQHKpI=Qnr&(+j0q@M@*aO<3Qhxhz`l7kk}HAe8Rga2lV#hb}kv%hmA3d@vSVlFY@BFgB+4 zo9;`Hp_eX0?#kdWS|V-;<3gw}k$wMIirYVzbHSHH!tJBXuap8;qsT5t12lHenxwU8 zNi&2|xxLwpkl^qMt*Pyva=kV6B@kT3i|F!+D@7h=rAmK>wV`TwE5YL`JsQ@!fuw`f z2!hhL?Ih%U-8X;x!E=?i4{*#H)~CGss=<54OHxsWs=LUa$OQ+b+_8m zpwpQb+V=UB-trqQb`}+Sur9AzWqmh))^{Uw(_#K>B1xlfO3tPW6kk#bdTrhcYDvW` zTL;rGW%?BHzASNj#BVT5TMkyTS`%x-obA^E&o&70XF#B7g6w!ugm(Ekcd9wbTt9@q zQZ^M!IJ}OvxlA2>DLWnJW7B4~-)wA>+WvA5rqk)e>-(gTC5T&g{YR_YV7V`bkW1?A z#!=(oFQl(w3tfHeYe?Liz~Lcq>|a7l8)&uUtFi1w3{j8PRJy_->XB9Iq0mD(7U?UV z^jJ-FjTQp3P-LrQ(rwy^Z|)^G>`^~LJnELWhGz>S<8ob81=8AGRe|dij)WJUL#9*gsN1 zasX~7By92%m5eR=;$9#*N;$VcA4AhVMlX+X9qk(MAP3^-xyaUc`#%ppHFgO(tkrw3 zzV0yP@8`qTyP#&UkH-zb?WpiA>6|Ab+x3FxyaJgP9v}cG^WPEnkTf=jW!Vn_rhzi(pCaa-?Lpws|ljEN6i6bGnv{hEc= zx!NeR94-yfVN$aZITAQuL+ViJ-;p7MN2$=JMft%O5%-rr6H2P$rbBMYS9ZDV=Hzrh>>I|LK2_u1+^{rKfcMP8N~t z9%1}2^Taif$9(%A%*(HJ&RbsBJR&%D4Mw1p+&l)2=ANj}YIn0&p*yi#Oee!X- zyIZq5FW5X{<1DW_pJlg$G`{&YoZBVtjZA&$=@QhxAC5{-1pvZw!U_K2r>1-Xl$uW3 zaFp_R6m*J__SuO(Z%t_;r`%Nw~k4yD>;?zDP3M_JYr@&uVQqKiFBntHM-QOZQbns zc$keEV&O_XJD+HzzOXxbg^2*I%-fNQZ5NmGd30R(rI5FXtb4u!FAgT=Z;D&tRQPq} zH&-9shDq{OgLTdny6rw_GM|{1>6LDC2IqbdrM~1#rr`sD=dVVP`s|X4;Ck-zeSo(c zwgFwXhKv>Q-9BokhCsBswOq(cOfTQx?=!=AOTFQX({gPB{r=;|0A<^Hw zv$}(({1|q+UXz|mN#m1V(|*{Zbk@}IRZZ%;_Gx%H zIn$(RC~t|3f^9s%N?2@qH+97$n`xn$+PXB>t*QA%uhZ4VM2l-WivG8k|Nhfo`#I?fzLE7-;JlY-`JR^5|c#V6PrIi(hZg2fCKW$J*i*yh`P^Lib=Uw=`NB zk(XZ@b*Wx?rN4?Q9~Wsf*G=Jt8C@@I^@WfNV^=RAD2)Nn?mPQ&0@G0|MQVn)eY5ixkx+w(i zTtI;z=i*|2r8A^WhQPiMI8H#rs64L#;8&hsEO?j4mDh!YwoZ^yu(6dB5aQCCfDpx% zTLi)rxn3cRyrpe=2%cFU*ZXKj&Hdcp)#d&M4C}r2D=!ui z%@4No z5Lp&DMxZ`PiUO809RepqmIBJE-y8y4LSU1Ib}0d5$lvgF{X7Lgr3YqShJ(gcg+O&1 zEI9LhSTLU1t5Sli=EdWgqamP_ybY$ki<#85v~58*gZ3mkt%}QgaJ_jbNuf}OFbJP% zHZTEub8tu0-WyjA^$v)@i>y&=%!8fX?Y+Is{wOYXN6eK6<6>8o>!q~Prn(22YXhW- z;Z!6i&^6ifDqifb{vsaiYKu#!2MPo6v>qo13XA*N+6J!Glz$gGv@d8YbS!9#r}a3w zxm!#M8&2D+;E|IaiAyiUrEfPfpkC>fxb)pZJRPfq;xE|5Q+=`R8RH){cT(J1dcmIG zUZ7c4{X11>(2amK@QMa@$VM_9Puu%sd@`-^La3pDcWI5D=8353?55T45$-SjV4%B) zXI%PWd@?TmZCrXoav)UFOehrcQI13;oTf+tq=CRgadBl|TYHX@!cY1t6T7Cn!&*qD zfAT6ITU|s*wnFH3@25~$(JfI1oXr*T`32qT;KxW6O(hHDm=xXZkTWkTL-+y`CnCPk z%7R{KtHN-ly_M3@4LcYH-s_G!RHxA0-5!@NB&ioV#V@^GYN+&{WYNzU@_Q%~2E1Zv zUt2CS(4PT9t`j~ey(bCT8<&1*qNMce{?c!6>0U~0XjwFPWW-a9$HbRpyNy1C8||VOxi~# z$5Xw_G6XY{iB@9hDOxP|)1AvDf~F;rV~fDj4gn!-F5&&NoYBb8|H;097Up$e17YXd zwnYmvc1Q@(bNvd4|)|R^Yj~4IOGPe@Y`OPh!~0=tUvK zQ}tEocQ!_^qtKq}fZvMzit%aJE-g}z*mSijcKAH~`Vi)ga+UT<8!J}!OG8AWkz`J%ygi@w)iTPcGi z*NaY|f!^NS!a-W1q_PZx<-Il$--9}B1{8{GKzv!g9&ttomOt~p_z@;3o$Y00mFIk9 zi%f+O6QMuR-OkW&v@%W~3dcnQw{!tMhfxRMvRnuJ{iL(VjaIX#QO{D*;A)RlLh2FN z;$koS9hX=4_LqmndobpTuEAV^9vC50NK(|t@_}(^K?r|X7%Z67TmfQHi88phGNo;9 zAoXaQFycfLgBdO^BH5V`ep(v!cc-QM%iCAvbD$-s2~Vt}i-(5DOVOxpMIqO%;Kb$4n&VT#%3YnbdRIY&pZQe~ zG#7G&jAbw6mJFirma4U%87Yh(9?a#ssE5457Gov@J|ggtM*xh-DiL@PemqS)u5G2r zK!0tUikuYe5}CcUQGS%BotqdZ7`P5WOzJ>qT&hc+ks`gxq)Kmp`@ z9{it*STo3m|5=Uz{9%;0U|)APrTBj;KOlVo@8tR`*PB5jmYwRM={!cswNWn<-mrL5 z7(EGHc#7~g9+ZRBqq=mYT7qd!l4K7lPf!C>)Q+6%uRYk;-Khpn#^rCv<(J~}E1C?Y zUm5`q!NpMiP1y#Ct~k^SFm55CFIgsOC#D+TnrE(x$azdRB`!bT0vokMr-emOXjidH##b-!po|E8-QPr~G)2WO3;S(vvTgcn z(+ebSzn3S}yC~`u(0TpClwbywP7^uZBW&3`5kY98ya~X25oen6r~1$pMjz84ns-d& zp6(8MHKRjy&N?lZ5n}CA{sHD`>0(?Q>n0{$S$Wpq#kjmEE^nX*;xK*rT=FOL0L!HE zY+QNKnTxOjmZ*T09_?mbpx{(o*%Vi{5J?aRF#J(FuFQHhIL9GOrjc07j0aj4QwFZ| zRRwK2_Dg4nyR|^`PVS5=cQth~Zx0)+#=PTXeBRi6Lw$CoS%!`A>`c450_v{Nq)}Cj z@;(z9^u7;M56IBe{3_%YqM$3Yj+HMND(8dw9C%C#l!ZP+rDtvOu7cp#AjT>s$3M(Y zc{e(ZiBGPd2Q|>&`hXRh_#oT-YO9wJ7o>ap#vrqCR$oo5OMwo&x~Yy+9$qSK&e+Ejn}jm5!gFV#^o$xQG7 zSVbe*qRpHsEZ)j;rsyqaO8F)N<{(j^Bc#aCK#8~8;=n98At;X?MS>P`VNyuKN)7R&*z^&0unyNIxAkC^S7OIExY5mJnQDU1vWhr;4dx-^1 z-kgOp191hNZGkfJ_v7;GAWf-Gstydm92!6s(5a{UyE_f3;FaRP6YX50LnW|Mej8~n zzGt;$%LhC-mVOh~gtUSjHd;j#3cjk64@P!}D$sCZb;%plNIcV6Qz3L0G4h0A%kndc z>&yF$nw#u-r_uV|g$Urv0K&At{H|I84w|fQ57(GKL zXP7Hz^4(b7aG-hD$`6>{DnAgHAAlNkipnN?0Gp1Y{pG*&o(ZU*#e0%9z)M_dxY;w zPm;Gdd9zHjvWpA>i>=J!PY?FQm449hCiH4RM<4;v*%+f4+qt8V%NesHU`a62zGsX8 zE&_AUO*~f2r|2z#hIjucs#dE z@&}Q^-^Iq?N+mvSe_`SvO!&K~UeS!@b78WaW9TwH6Q|h}V-c6^(t8T#*UFdoBrJ9| z?{H3M0}Ov`F6(@8&Im01~0dYTMQhJEUOU^F5P z8G&n0VKlN9L&bC^GmmjF%cESrw|6ml6)eWeBB4l&zNwrIcQOpuV*5g@$AuCk@MXkV zw29LuER@%OBd`d;8~fk2Xs z4<+gCEF_@#v!Qfo#YP^5YZt_CK`XJpg3sJXp;VAd1R@F<$UFJ&44uaVI@Ml9?!%M< zko-46d!PFxHk{Nrv*CUIytVQ<+Qw2qjh|#$iu|bfW(mF)jOQc*kaCeAk#br#G2<#f z0=zsb)&gh}bHc@yWC3qhRWHt>1ZX_A=Klq8(^A-sV_NPMmZRcA&@`PxMGk0j8CNzc z$W}}Tj+S0@4HK*upTZ>ECN7LC_eeAn^Hq9fTf?BLY$H_-(vJt|D5+I@&k(d7)V1}R zXNFb31Q@Tl@}OpU>B4~AKIoFk|kN*?^~>RFkKk27Ojn z{&)=`*W2DMFA?gtqZgk+FAGlQ2bd!@->w39-v-;-&490rqYVlSvnvmm+%wRgr*bsV zZf)CQ@znDc{+2yo6d3hR2je@I^s=569H(*x_E&ew^sM(A{!A$`4jc)Q{HRo>_VO+^ zZ9pw_?XNs)TB(yye8OR#lGRWq23*G7HBRjiSKRLkeD)xH$& zl54fU_9!oAD+oD5D34dg{a}h2e_3hE6j0}wm$@!8ujKXC0#+_;%PFi(P$Nkx&@_Sl zy^M0HcR6XNKlLLgDQb>l-c87!3u8c4*(fL12!!$v|Qz@`yJ@fSmw zPJyBT8wC=gY>JQ|8DKemM%f;`OYit!Vo6os(aflx*NVRS7V?I$P112DX%iDCD&+vP#&E zuXH1)E3cSm5YPGIZg#!EcKIod$C`M>G+L+qysm1Gvc&k*C4*&5 z&)K}Su_6#^MQ$NdPlJ~cYmFVmXmdT2UnaRS5Z9j9#4rM@FZ>IrPd581?+RF!h5e^~ zlkB2}Xl|kClH`TX&KGPPz$uyigCx1~gRowwna_1E#J2e^_RY zdOL~zB4F*Tll?57gWg73uVM16ZJIJ@^FYroveN^yjA~~W^tA;omSCuM7J-hJi9E?P zqvu)WS@}TWvx2Q|evGyrm8-J0jH&t(L%0~%b`jK`kAli8FE_kg z?;C_mh5glt1&rwAS@>f2LKdGmS7MU{Ha+BOkgNeZiIe-0L$qhQN*PWX0>X!vb$6aJ z6LJyK!XZ>=V#ee*cDwuT<%590C#$*yS@;S!PMH&x0P1YbR3j&e{NGMKtBiLRl%U0zN196lz*#D&6L-RShMd|BOj<$C>riz-1#Kz?s>` z{$NqjaE5^>drP+NykZlS`;?Y-wHFPNf<1wUbP`X1LrXCO4XaEA&77;<5AH42M*-1J z!V(6p{%*O6LlP9`w2X)Tw69(34}@2cVOB3#aPY5WC=&GAT)d#YwYGPXww7BYsTJC8 z&Fx(*O%if@6LV2=(;=|Kcg$`PgE`sTv498DA=L2ng3{TWwV8#zAWYbNVz(lkHp6xa zsVp4Wz*SbS?~PN~VMt?=N+VBEt z8wQS!run$*I$`IhFlDQvCWJx-nGvj6^6eaLqTkt3B{7t`j^4@LRDKGW%1>xC{nZ;W zy>mGzgU7ScfItCi(<^@~qx)^@kyHh(*Hce+!Y}OIN81=PWK@2k6`>j==BU43h#l)z z{urw=_TH;)9Q*);YQO)fK)-m6r)*CVt1cHkF~GOs*>OA{b2yoY;`T9FfIOeXoP5#9 zg$yOgrN2}sdN_ZHbg)wdI!58!dzk}=!q8&z#2IFBU3Nb0(1BJZIYwv@ua2ww6U3_x z;?)MRCEO=m7UJrC2;}6*qE;>SKS@l95OU8+QeugEEUQN^CV82Oiew^Z8z`|i`B>PE z;)|jVtd8nEIIH^vs7?e5qS~%S<``owiB^+ZMZ%*N>N}M?yFt(TK^cDag9VMO{(4-0 zji&}xKZvh^XHI7V%uuR7Y3ZfB)X>SeUbDcVxPIIM$3kE_uAfj!{pPs-v<0?=z$OB@ zYulvj>N^p7rolw$qliG5W@*IsNL+u_AloVHX7*-gF;Te5mK!(X>x=62Fa z{tp~D5@$YW&v89#H`{ZQJ(uZOx0L!83vUw0_45kP)a-eDdEzL*B+-19dX8tF^x5yb zlrzWsXC_hLUJoj)7C$GXI%fjhG$`6Z*~i4<#@;J zom%5*+yqr_c8kirtEl5c0q9XAhb0$A$d;Thy$I=O0*Z!}#}?6L2k(OTg)%`__0Qf_ z2tD8B%SVzvnFxJ?P{#&LP-S!Bga(nk{)zp>bVJ=@?>`81gV(GFjj|E2FsMsf%2*XD z=0=-BfCHX9;0+o-z1E{mOD2F6UI(2P=(VuCJ0I7z9;?5G?eaj`DDngfg>DZ=dIh2jyemLS@E^O_@qsY&FX9>>f+ECUYwBkbRyyU>(3+0=&k;2M#6b2 za;&~rkJt2gok#7ULc8Eis|HY@;&sy;rfM)8k_IIq$-<~lQe5JCuJltoHD4=8H<*0k zyrUW@H8NGIqtbmDnZ)zp`L zh|w@U8$lmM$%R-1+NatYjEwe#kXk3K%6<@4x8$hnOx;+!VWpPr^bDCne zm~PunT{cFmx8SkpuWlBPSGQBz0=Ez_JyMRVb^fF=;%Yf3x37#kj*{yf6CC=J{@IfM znT6(u&Bbt)aRakvj8M~{NRh$wl=UDNjX0_D5_|6~J;q_X*;?M1$QzMVf?ujnsGlm{ z*Kr#Q+qo<#$Nf)Pm6ym>R^=rPtTL{F@qWqw%#Ek8x}B+!uYolhYlHy@1k;oO`HW6} zR-ba$GRo>D#Vaonw@ttCoPZVh0z_bX`!qZ2PbF?34F^okkD`c?5vF|(!8=cFlBVW{TtUWB@&>136ilU zwgk^HxIAdnn>@i)zvRaxIkE1m7BaDOy(RQg{gT_^7ED^NZu8cw+OSZQ)onsZ{r8$G z)#une=m0qO4%ESniIZn&U0~NQQNY;YIdv^uCE$6F&!|Uh%%Gzz@Q`R@gje&UB3OHMglgt~#GWm? zOva=j>Zn#(Ok2v}w6gho`Zo$hF| zy_ZOP@YS??rFIq2!5<2Ar~nx7x*cAiLj}4#txE;ELV+$X(4_))DCTF#J0d24Gz1BI z;IiZ23%rE|DzG55Agh)F3)DiV7wA+0jxRV2onD|*1x&U7EZ409-JyU?1X}1;fgZ2a zqXIplfbdFz9u-*V1s1Bn!cbtL7g(qQi@d-h6<8DsEb;=2RA8|eSgZnzLjl?Pbg`J} z1ZAdWYjOOv&Y4y2edFZ`%7U~MB;ZB032H@8deM_;le zbb7_O`n}KuL2rUU!xJ~NH}Mzv=8EPMqH*S}R29w~Z!9Wij+2b{RLVkOxm!b6I+hQh z&=6_y+K8QMP)3baFQvVNM|EW1(zTgHfPeAKvjW>Icwb(_`|_~+@KnRiK@aJpEEa&a zNu%wfg3VY9*_KkWAI)lZY1F5$`*hHpv-+%VC2FcaqU;fxQ`R(%v`ByT zZ%qu=Ev0TLZ-Y$S2?#!A&DsX+tZl%~+S+FJHB0}#JYDhD=hu@66G_OTy~ZpM5Hb?WG}(mMx$u_eMMi6U zYD1EGS6q2DP2Gh4r6{LkY|N*2ux?e|l8QWU6?bVbf~48Fa?}#`CS_hs%N%7gGX#lL z;MNppA6O0q8JX=}1Dq*B##);4UY8KJ6or&>j<+PEw&Lsw!_EHOMq^n1<+YB2WKYf) zCQIGVDgJ`3bWk+eVG99Rm=qXI?obtjc^lhJ8q4ha>RisATvt1mcV$f8v&t(v6rj0g zPD~t+*Sn|k$E=`ReU-N7V_z8MdfZ9LUd~FOHGrs#Us+R$fc_;D$wKydjE9mE5R|3S zB7s(3J;-r6)iKoK_@hC*&Yl2s)Lu_yN$rF?t$&a5l(R*%q4s*hOCGS|968IO!)@FJ zn=-#+@0s12r}*LlR}>hR*9TqBk{_?H#k9h7hn;(W%;^WAt-`s_toC^#2zy8Zzf3|Y;=cn_pe(9mV>i_YAFOaGcl^)G zZu~Fq{;wuJ^~t|~@7tgL`+t4=;q%Y__RCT4EhEeBefuXbcWwV)-}|4of97-lS^0zQ zcb|Xc`t^$s{%PlHr#8HG<2(Q5s^9)MhyV1wm;T4x|Jm{H+W_!?0I-g>K|R`XQO79J zf0q4vehXi=r?-IW+JlPb#(El{OfE}{xQ8iao42`bAPGl z7P~xfgv-MG5gZ9k;>dwsN? zOD)IvF~bdnhNv?XZQ*17E!<$M|F_cLM$$$Iue0>cTx_rsVDX+d!FHsj2W5{=c2@t^7Yi2|>IbnAZ|sZ!L~ebCmj{lol-O zZG@w|Rev41TY0Y~q%>Wk^%C~pg4g+}OKB}QpsBc;|^iCf9rOp4l5 zXpHCW7T;`T*U`cVZH!v&+pVQr4c;O0*OId~X4Hm7?@_IZI$P}NI2vP=;uYay13lbEOB*RM#8a(qpaqRVI8i;Fl_(CLqoJXNnALaq|`dv6C{f3sekHC*iw%g zopLmOT@9j}cQpGZ__u*l!=&xu|8+k^`Eb4Fra$(k&IQN0 zhQ}{^{X%nFSGt>Xh?@n|il2{i$D=#{vF>#3@(Vs&Ms_7==D#V_+L?;JdiA54zn!`F z*XDIS%rWTtiEtlZde@Nd_38EGaCK!8-I?63)6pj?4(hQUx~EZ7BAc3)I<3O7*T}8O5q2ardh< z$2Bm0?4#YYYA~)osp=Q0^{|?d6KVyK9sJwEznl2CNy{*+av?|bB*uEDD*c*|J4(Mz z+GCNyXGTd2YPft(j}8@lU!gno;qwpmctejj4LsI427mdusxn3nzbAo?5Xh?stt>fl zIYmpA`_hW_uF6l8&|H|vH?oyP#JyaEDD$@-NS57Lf zM|rBJi{n&wg4LFNqM^k#)M`l&p{V+@9zW9Kt)v+_2#MG8@R}{UULjVyUt6)+LurN_ zHl-@xCHs_t`DVg4wX+&vIH?5NPTL?UTns3!&8pG!dK?wnYtJY2)AplMpVdS2qgFFC zhOWiQiO zqmd#dXP#DZVWuXeS0A9A`gfFee}X9OJSxbdSDS0fx=V!w|IA)RUnM%bgV5|w4cs@* z8le-7kjODR8E{iQ*~nmC#PwMoGtW2Dgp~ThM%2K3E5QQ?V<@}GF!p2fGF7){Be$sT zPxLse2OP%EfvV64PJKev=M;^Udr5t`XFP}gnGQWffa*3q&hV&h zQrf5TSjdK}CQ0RNf#H}cIK4^Yh?H{^;PmG%e*9-Hsc>k5;G~}tN2fORE8D0$fI^wARC^XKyc1b zlQr8B=q!%X8Pr@Tz`5B3@oaw5$j+pZL^{o`u!AY!Dx5$J6>;_$TDVwDJq-3Ipa(Zm z^>?2j1==I#nhx6~1=AC4LhJ0GBv5d$jR|Q}#JJwQH-X!HCb$d7(sbBC6tA2~qFnW* z=I+;HmmVVf>|Q2Z)p{b_|xXo@_phsZZ;Y0oP3ydK}u<3%;0lBBQRaAo$*YGw9D)#Lfrpg0 zWXO(1DX1@6biYhnyi*NT?*d%>)OQK=o!YbZ&rafpfi8rL@x#d|l6#QkCoXDJ0`UNF zIN$Ecj1NM^U`-fRz!VlS^z9M2|>o9Asun%P{hMT*tchUP3Q!z3R&tR z3vo}AN?Z;|hD`LI|w z0`ziVlh3cg>qSM3@)wP4PcG8;Ai>D)hUN63D5HgC&LYbquBlN$E@&dJyga9u6u=-` zk4EyczNRAW0>ERWA{ffUM!YQ|lRa*-_)P|~S?$W%;k7qg-X^{bXIy-1BAmnzFEMm_ z3g}`_K+LZr13rAhX^jNsVqhAuSQlRsaJN-H(m8mL(!n=xe3M2S1>>*s17wl+K%ch2 zu(co1L4DJdsH-Iry_K(T#Hk3Ig9{$um|M)+3M?ly0HEzMw&9*0=AHIIqIO_pnB0id z2cPr}6c(|0#=P=0`YVw2sYu^^)5W_KEK_irg1o3xSjbPgDTDS7Q8$Fkr@I7nG1tj~ zdOn$Da4UoydKNzx77cbL_(P5?CgR*Kslw#qY6ez4dTTm)fS^@A2^V=INdohbZDtB` z*99SKpS1^wp#B0}vJe0(9t4whh(Ah$&LQ9cc%Ek67Y%X64#3sdoZt{jK>CM`<`2ir zXS%SPTrm3;>T?1oF%p)DsWvd{9SKF@oVAX<${Tc$pv=DghQ(@%TVU*4opW|zhZys$ zd=6P;S+;mk`Arn$4k*y7g{nW}LG@oco3S(KLSOtaKQTkp6w=F%A$hPzH7wDDoi2=G zcC9cr)~qD1L)!$ofu?lPnql}>WBH(XRi&~;m~>!OQ`AVux`!2YTzVfyXB>~K|2_b+ z*?6u`U}(=* zKzxG!(nV7f(An`Q!m>qIy79KYph>Pk5_CnL=aOqmJcT$*sddgSJX0K?VIvQ12uy3q{RnPTb;4h{Ll?X-Z}^H^pMm^P-G!t(jZgU+ zT}*?yz`;Z-^oAFD!=~Dl7wTAv7RWT~7_-k`toh?!3|{ij2yk(v!HzVjv%x^^XPH+5SR=XzoJX(&5(YT|ml5QTu#cE+$@>jWFdKi)U`CHd42dCO6%3#vBjLmN zWx6W^q(Dss#x9y+id@6Eni7+AYw(y8_---16p;R|abPlXx zw0M9!43iKaBH2ellN5c!=7nWVQX00hnuNKclJZ_=%E}+7{F_$Bdfp`Ug!<_ik`Pvy zj#5&d190`s*u<=ysJAyrmu@Sc;jKx$8Y56B(C|$i==v}ytVFv=%z}0m!|5I|fF|38 zhT)r3Ik8kUZ%)!Vr=$Y6i6x=s5$m_rttA^% z>^-JFgS8ne+*C$QDwl_x7>3DTbFWVMw^&yK@=RR*^|DCP_Y5pjUQIXdn9C%7&`88; z5C$9ZSWK@mvkXh>^_nvGHUI=cts0scDtD$of(0$gtv5!(Mn{b%;__WS!_K&>mg0d( zT=Rm_7jd&oCr{je_S|I(%Le!c2Biky;HGr!Z*WnztV^z%5>_@C-+Yj8z-dPxTIPF3 zDVTxpVQpBU1%otge%Rs-tgr5mkgKb`YtQomT+jeSkPEWOgov~aXW$I~3q>}h6L4Cf z{30`lK#lZ+&p^951n%?hchb0^4J)%rXgSx9MbLn(QX!aT~f7 zs^kTqSPN22Law-M24!Ut;JMpkI^JS~;VK*gd|{4ZyCr4L)8b)zm*oOD!n#@Y;v+C1 z^U@fL1*up14GjJ5D#)oQjyiGk4DctPZ}VBcSx@0J)xtv6FcDQr zE|lR?7$EWI14iu!xDtkb<0_vGkY_i=zzGd@xsHfc`nf}wye=8uDwlu`j9tgEcYDXA zFn;bhpfr@Zq&}+1h)c@1fb@M_-C|OcH2gCE`u?emVU|Y z1{Sgl=}pa)e#wS}?v>FwNjOBG1@2Pw)+K{i5~}+;Fsa^?AbbNv?D+sEm^dk5s=K%j z#-J(_w!mou-R3f2TJSb{=_8vY@lZDLP@WRFzfAwKb7U?nSpAUoQGQ0Z7~ncXzEOsA zo@grzCodR~b8vX7#q(lcmKb5{$>Jag50Jb$yrsP;jfV@M*q)M`OPo+G86HbEWvVhs z*`UI)N6wQBiD%5UCN}72gacykuBkjFH=3ey17ddB2ZZ57VJ}6Uk?okP9or3g*6ok% z`4(USRfe~#Qe0g9(JO|iavom{bzT>~Thuu49d_mnHU%8Eaq=nfbBf~&Jy__IaNs+y z6O-y5`oiGIJx@WaIQ0R@M1+4wPxV}tC6P>IF?%c2gyQZx~K3d{#^LA(nqdn73 zVfBb?S7YbJy+ZjIe^$Tpimf9v19M*^`Bb470wS?K-^NpXZ6rr4+*27#;y%v%4e(v| zB+RGVaFOtH-hWC&0mmf1`v`s)0DUe}o-nzaloYaT&axfp0KS=IbGeJR$hU21!c&(h zY4`sV?1q*#T$+v5L+z}?rI+x^i!pnoZwBSopd3OT=mZw&t_QrqNC_p-w#ZW-E z6R+-xpchG4DiH`J#BWK2MDB4=Hm>^eg(ZpbS zMu<|GF(%h4!1!v*&6+Vmt380D^5WWlc8`Rig^bQZs>)mBs7H8VuGgLi7wF^K^X|I@ zg_KK9+Iz$*J?oX8waAkm(WicF6?>$X5_Hy6W^L_KdtQw*2-_!KW@{I3*9k^%g-Et| zOJb<8YB0~hk!c0mc`<3r%Q9d}Y5zm_Y4~tnOosC!w;8BaU4Erq2I?}M3gTuc#>BGu zw-{bacYlHpT+yC-B<>5*W#8H-_}%obASF{q33bN4G$T z@HuGBQp|1Z+EFo=XEKdA-QQQx9cKk@$2Z=vgnkA()%wh^zFL zMG2D`C1C303wMoT=4l(ts}?qg69?4Qo4$Q!^!oe-iKtg!JX2#7tcw&;BF0S7%YtwOj7pnw9-!KcDXBf^##1+6wKJ+rxNgI4o|+I3oAC!!UixN#Ice&fh-m;l ze8*V-4u3hYs-TzpJ=EtuhS$w(sh=g04=B!yr+6W483P|ZI>Y0p;d9W};+fgFewG$& zW_(|MUd@Kz$1^89-Fy7Kcd*l6Kl0aG63NxmaUGi$#;LIwVL;O8y*-gJNN=B(CBi%* zKoxL?l|^D$(#WgZ8=+ekCk=XfQ|uOSpoaM)oN>URPs2F%eM>Qd&oKAN_+W@;p8 zX&*l8wq-saX^+z{VV;niXg-4V^clA381w0~F!~gKOm4|yv7G2A@EuA9d{!u|KBr_} zhEG=$$tTj)txDtjUKQYrW+727qa>wz#xiEKBf`lkdWPOmjN#5cNpP`fXCdTWghgRd z(^&T1U8CfsM#)Rap-Y&Gs@Dfh`6L)x<(vn#1Ob0G#%*!+1sgM;G;7Snw-L9HysaW^ z%7iA>s%KmR(MYxKb5^0`j)C8U7it;aXia!CX;go$mkxyR2BQ$MuIsORiPvr0XJ!(q zR#3+hN^GM$6c&+0im-h6tqyAHV`5(VlDHe#XOL5j9o?Ww<3YZZoOM^8dPYYWxBH5S z4>pahIW@&0Gjb?mrF!U6XAD#xWbpx|S$9%DnpY}cTNni!tG=T*LYe^|W8HztWn*%~ zye_3_7{_MedKocSZI=*@Vy*4+oLxjT8X06FPHmUC5E*Tw!fR0ED1d%tMfHgC>v
  • +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 diff --git a/Assets/Mirror/Tests/Common/Castle.Core.dll.meta b/Assets/Mirror/Tests/Common/Castle.Core.dll.meta deleted file mode 100644 index 5189874d6..000000000 --- a/Assets/Mirror/Tests/Common/Castle.Core.dll.meta +++ /dev/null @@ -1,112 +0,0 @@ -fileFormatVersion: 2 -guid: 739a02265856e4e4b8a3ae587a908479 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 0 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 1 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 1 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: - AddToEmbeddedBinaries: false - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs b/Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs deleted file mode 100644 index 2d4a1634e..000000000 --- a/Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEditor; -using UnityEngine; - -namespace Mirror.Tests -{ - - /// - /// Used by both runtime and edit time tests - /// - [TestFixture] - public abstract class ClientSceneTestsBase : MirrorEditModeTest - { - // use guid to find asset so that the path does not matter - protected const string ValidPrefabAssetGuid = "33169286da0313d45ab5bfccc6cf3775"; - protected const string PrefabWithChildrenAssetGuid = "a78e009e3f2dee44e8859516974ede43"; - protected const string InvalidPrefabAssetGuid = "78f0a3f755d35324e959f3ecdd993fb0"; - // random guid, not used anywhere - protected const string AnotherGuidString = "5794128cdfda04542985151f82990d05"; - - protected GameObject validPrefab; - protected NetworkIdentity validPrefabNetworkIdentity; - protected GameObject prefabWithChildren; - protected GameObject invalidPrefab; - protected Guid validPrefabGuid; - protected Guid anotherGuid; - - static GameObject LoadPrefab(string guid) - { - return AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); - } - - [OneTimeSetUp] - public void OneTimeSetUp() - { - validPrefab = LoadPrefab(ValidPrefabAssetGuid); - validPrefabNetworkIdentity = validPrefab.GetComponent(); - prefabWithChildren = LoadPrefab(PrefabWithChildrenAssetGuid); - invalidPrefab = LoadPrefab(InvalidPrefabAssetGuid); - validPrefabGuid = new Guid(ValidPrefabAssetGuid); - anotherGuid = new Guid(AnotherGuidString); - } - - [TearDown] - public override void TearDown() - { - // reset asset id in case they are changed by tests - validPrefabNetworkIdentity.assetId = validPrefabGuid; - - base.TearDown(); - } - - [OneTimeTearDown] - public void OneTimeTearDown() - { - validPrefab = null; - prefabWithChildren = null; - invalidPrefab = null; - } - } -} diff --git a/Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs.meta b/Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs.meta deleted file mode 100644 index 9be790649..000000000 --- a/Assets/Mirror/Tests/Common/ClientSceneTestsBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bf741fb5970e5e048aea5ff3e396d24c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs b/Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs deleted file mode 100644 index cd7131049..000000000 --- a/Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - /// - /// Used by both runtime and edit time tests - /// - [TestFixture] - public abstract class ClientSceneTests_RegisterPrefabBase : ClientSceneTestsBase - { - [Test] - [TestCase(RegisterPrefabOverload.Prefab, false)] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId, true)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate, false)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId, true)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate, false)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId, true)] - public void CheckOverloadWithAssetId(RegisterPrefabOverload overload, bool expected) - { - // test to make sure OverloadWithAssetId correctly works with flags - Assert.That(OverloadWithAssetId(overload), Is.EqualTo(expected)); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab, false)] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId, false)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate, true)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId, true)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate, true)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId, true)] - public void CheckOverloadWithHandler(RegisterPrefabOverload overload, bool expected) - { - // test to make sure OverloadWithHandler correctly works with flags - Assert.That(OverloadWithHandler(overload), Is.EqualTo(expected)); - } - - /// - /// Allows TestCases to call different overloads for RegisterPrefab. - /// Without this we would need duplicate tests for each overload - /// - [Flags] - public enum RegisterPrefabOverload - { - Prefab = 1, - Prefab_NewAssetId = 2, - Prefab_SpawnDelegate = 4, - Prefab_SpawnDelegate_NewAssetId = 8, - Prefab_SpawnHandlerDelegate = 16, - Prefab_SpawnHandlerDelegate_NewAssetId = 32, - - WithAssetId = Prefab_NewAssetId | Prefab_SpawnDelegate_NewAssetId | Prefab_SpawnHandlerDelegate_NewAssetId, - WithHandler = Prefab_SpawnDelegate | Prefab_SpawnDelegate_NewAssetId | Prefab_SpawnHandlerDelegate | Prefab_SpawnHandlerDelegate_NewAssetId - } - - protected static bool OverloadWithAssetId(RegisterPrefabOverload overload) - { - return (overload & RegisterPrefabOverload.WithAssetId) != 0; - } - - protected static bool OverloadWithHandler(RegisterPrefabOverload overload) - { - return (overload & RegisterPrefabOverload.WithHandler) != 0; - } - - protected void CallRegisterPrefab(GameObject prefab, RegisterPrefabOverload overload) - { - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - SpawnHandlerDelegate spawnHandlerDelegate = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - switch (overload) - { - case RegisterPrefabOverload.Prefab: - NetworkClient.RegisterPrefab(prefab); - break; - case RegisterPrefabOverload.Prefab_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid); - break; - case RegisterPrefabOverload.Prefab_SpawnDelegate: - NetworkClient.RegisterPrefab(prefab, spawnHandler, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid, spawnHandler, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate: - NetworkClient.RegisterPrefab(prefab, spawnHandlerDelegate, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid, spawnHandlerDelegate, unspawnHandler); - break; - - default: - Debug.LogError("Overload not found"); - break; - } - } - - protected void CallRegisterPrefab(GameObject prefab, RegisterPrefabOverload overload, Guid guid) - { - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - SpawnHandlerDelegate spawnHandlerDelegate = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - switch (overload) - { - case RegisterPrefabOverload.Prefab_NewAssetId: - NetworkClient.RegisterPrefab(prefab, guid); - break; - case RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, guid, spawnHandler, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, guid, spawnHandlerDelegate, unspawnHandler); - break; - - case RegisterPrefabOverload.Prefab: - case RegisterPrefabOverload.Prefab_SpawnDelegate: - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate: - Debug.LogError("Overload did not have guid parameter"); - break; - default: - Debug.LogError("Overload not found"); - break; - } - } - - protected void CallRegisterPrefab(GameObject prefab, RegisterPrefabOverload overload, SpawnDelegate spawnHandler) - { - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - switch (overload) - { - case RegisterPrefabOverload.Prefab_SpawnDelegate: - NetworkClient.RegisterPrefab(prefab, spawnHandler, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid, spawnHandler, unspawnHandler); - break; - - case RegisterPrefabOverload.Prefab: - case RegisterPrefabOverload.Prefab_NewAssetId: - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate: - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId: - Debug.LogError("Overload did not have SpawnDelegate parameter"); - break; - default: - Debug.LogError("Overload not found"); - break; - } - } - - protected void CallRegisterPrefab(GameObject prefab, RegisterPrefabOverload overload, SpawnHandlerDelegate spawnHandlerDelegate) - { - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - switch (overload) - { - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate: - NetworkClient.RegisterPrefab(prefab, spawnHandlerDelegate, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid, spawnHandlerDelegate, unspawnHandler); - break; - - case RegisterPrefabOverload.Prefab: - case RegisterPrefabOverload.Prefab_NewAssetId: - case RegisterPrefabOverload.Prefab_SpawnDelegate: - case RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId: - Debug.LogError("Overload did not have SpawnHandlerDelegate parameter"); - break; - default: - Debug.LogError("Overload not found"); - break; - } - } - - protected void CallRegisterPrefab(GameObject prefab, RegisterPrefabOverload overload, UnSpawnDelegate unspawnHandler) - { - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - SpawnHandlerDelegate spawnHandlerDelegate = new SpawnHandlerDelegate(x => null); - - switch (overload) - { - - case RegisterPrefabOverload.Prefab_SpawnDelegate: - NetworkClient.RegisterPrefab(prefab, spawnHandler, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid, spawnHandler, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate: - NetworkClient.RegisterPrefab(prefab, spawnHandlerDelegate, unspawnHandler); - break; - case RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId: - NetworkClient.RegisterPrefab(prefab, anotherGuid, spawnHandlerDelegate, unspawnHandler); - break; - - case RegisterPrefabOverload.Prefab: - case RegisterPrefabOverload.Prefab_NewAssetId: - Debug.LogError("Overload did not have UnSpawnDelegate parameter"); - break; - default: - Debug.LogError("Overload not found"); - break; - } - } - - protected Guid GuidForOverload(RegisterPrefabOverload overload) => OverloadWithAssetId(overload) ? anotherGuid : validPrefabGuid; - } -} diff --git a/Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs.meta b/Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs.meta deleted file mode 100644 index 8324dc240..000000000 --- a/Assets/Mirror/Tests/Common/ClientSceneTests_RegisterPrefabBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8eb53689226946640bc49bb962b13638 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/FakeNetworkConnection.cs b/Assets/Mirror/Tests/Common/FakeNetworkConnection.cs deleted file mode 100644 index 58ea0a434..000000000 --- a/Assets/Mirror/Tests/Common/FakeNetworkConnection.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Mirror.Tests -{ - public class FakeNetworkConnection : NetworkConnectionToClient - { - public FakeNetworkConnection() : base(1) {} - public override string address => "Test"; - public override void Disconnect() {} - internal override void Send(ArraySegment segment, int channelId = 0) {} - } -} diff --git a/Assets/Mirror/Tests/Common/FakeNetworkConnection.cs.meta b/Assets/Mirror/Tests/Common/FakeNetworkConnection.cs.meta deleted file mode 100644 index 129765a98..000000000 --- a/Assets/Mirror/Tests/Common/FakeNetworkConnection.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 935b1eb49c500674eaaf88982952a69e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/MemoryTransport.cs b/Assets/Mirror/Tests/Common/MemoryTransport.cs deleted file mode 100644 index 6f0ace3bc..000000000 --- a/Assets/Mirror/Tests/Common/MemoryTransport.cs +++ /dev/null @@ -1,208 +0,0 @@ -// memory transport for easier testing -// note: file needs to be outside of Editor folder, otherwise AddComponent -// can't be called with MemoryTransport -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace Mirror.Tests -{ - public class MemoryTransport : Transport - { - public enum EventType { Connected, Data, Disconnected } - public struct Message - { - public int connectionId; - public EventType eventType; - public byte[] data; - public Message(int connectionId, EventType eventType, byte[] data) - { - this.connectionId = connectionId; - this.eventType = eventType; - this.data = data; - } - } - - bool clientConnected; - public Queue clientIncoming = new Queue(); - bool serverActive; - public Queue serverIncoming = new Queue(); - - public override bool Available() => true; - // limit max size to something reasonable so pool doesn't allocate - // int.MaxValue = 2GB each time. - public override int GetMaxPacketSize(int channelId) => ushort.MaxValue; - // 1400 max batch size - // -> need something != GetMaxPacketSize for testing - // -> MTU aka 1400 is used a lot anyway - public override int GetBatchThreshold(int channelId) => 1400; - public override void Shutdown() {} - public override bool ClientConnected() => clientConnected; - public override void ClientConnect(string address) - { - // only if server is running - if (serverActive) - { - // add server connected message with connId=1 because 0 is reserved - serverIncoming.Enqueue(new Message(1, EventType.Connected, null)); - - // add client connected message - clientIncoming.Enqueue(new Message(0, EventType.Connected, null)); - - clientConnected = true; - } - } - public override void ClientSend(ArraySegment segment, int channelId) - { - // only if client connected - if (clientConnected) - { - // a real transport fails for > max sized messages. - // mirror checks it, but let's guarantee that we catch > max - // sized message send attempts just like a real transport would. - // => helps to cover packet size issues i.e. for timestamp - // batching tests - int max = GetMaxPacketSize(channelId); - if (segment.Count > max) - throw new Exception($"MemoryTransport ClientSend of {segment.Count} bytes exceeds max of {max} bytes"); - - // copy segment data because it's only valid until return - byte[] data = new byte[segment.Count]; - Array.Copy(segment.Array, segment.Offset, data, 0, segment.Count); - - // add server data message with connId=1 because 0 is reserved - serverIncoming.Enqueue(new Message(1, EventType.Data, data)); - } - } - public override void ClientDisconnect() - { - // only if client connected - if (clientConnected) - { - // clear all pending messages that we may have received. - // over the wire, we wouldn't receive any more pending messages - // ether after calling disconnect. - clientIncoming.Clear(); - - // add server disconnected message with connId=1 because 0 is reserved - serverIncoming.Enqueue(new Message(1, EventType.Disconnected, null)); - - // add client disconnected message - clientIncoming.Enqueue(new Message(0, EventType.Disconnected, null)); - - // not connected anymore - clientConnected = false; - } - } - // messages should always be processed in early update - public override void ClientEarlyUpdate() - { - // note: process even if not connected because when calling - // Disconnect, we add a Disconnected event which still needs to be - // processed here. - while (clientIncoming.Count > 0) - { - Message message = clientIncoming.Dequeue(); - switch (message.eventType) - { - case EventType.Connected: - Debug.Log("MemoryTransport Client Message: Connected"); - OnClientConnected.Invoke(); - break; - case EventType.Data: - Debug.Log($"MemoryTransport Client Message: Data: {BitConverter.ToString(message.data)}"); - OnClientDataReceived.Invoke(new ArraySegment(message.data), 0); - break; - case EventType.Disconnected: - Debug.Log("MemoryTransport Client Message: Disconnected"); - OnClientDisconnected.Invoke(); - break; - } - } - } - - public override bool ServerActive() => serverActive; - public override Uri ServerUri() => throw new NotImplementedException(); - public override void ServerStart() { serverActive = true; } - public override void ServerSend(int connectionId, ArraySegment segment, int channelId) - { - // only if server is running and client is connected - if (serverActive && clientConnected) - { - // a real transport fails for > max sized messages. - // mirror checks it, but let's guarantee that we catch > max - // sized message send attempts just like a real transport would. - // => helps to cover packet size issues i.e. for timestamp - // batching tests - int max = GetMaxPacketSize(channelId); - if (segment.Count > max) - throw new Exception($"MemoryTransport ServerSend of {segment.Count} bytes exceeds max of {max} bytes"); - - // copy segment data because it's only valid until return - byte[] data = new byte[segment.Count]; - Array.Copy(segment.Array, segment.Offset, data, 0, segment.Count); - - // add client data message - clientIncoming.Enqueue(new Message(0, EventType.Data, data)); - } - } - - public override void ServerDisconnect(int connectionId) - { - // clear all pending messages that we may have received. - // over the wire, we wouldn't receive any more pending messages - // ether after calling disconnect. - serverIncoming.Clear(); - - // add client disconnected message with connectionId - clientIncoming.Enqueue(new Message(connectionId, EventType.Disconnected, null)); - - // add server disconnected message with connectionId - serverIncoming.Enqueue(new Message(connectionId, EventType.Disconnected, null)); - - // not active anymore - serverActive = false; - } - - public override string ServerGetClientAddress(int connectionId) => string.Empty; - public override void ServerStop() - { - // clear all pending messages that we may have received. - // over the wire, we wouldn't receive any more pending messages - // ether after calling stop. - serverIncoming.Clear(); - - // add client disconnected message - clientIncoming.Enqueue(new Message(0, EventType.Disconnected, null)); - - // add server disconnected message with connId=1 because 0 is reserved - serverIncoming.Enqueue(new Message(1, EventType.Disconnected, null)); - - // not active anymore - serverActive = false; - } - // messages should always be processed in early update - public override void ServerEarlyUpdate() - { - while (serverIncoming.Count > 0) - { - Message message = serverIncoming.Dequeue(); - switch (message.eventType) - { - case EventType.Connected: - Debug.Log("MemoryTransport Server Message: Connected"); - OnServerConnected.Invoke(message.connectionId); - break; - case EventType.Data: - Debug.Log($"MemoryTransport Server Message: Data: {BitConverter.ToString(message.data)}"); - OnServerDataReceived.Invoke(message.connectionId, new ArraySegment(message.data), 0); - break; - case EventType.Disconnected: - Debug.Log("MemoryTransport Server Message: Disconnected"); - OnServerDisconnected.Invoke(message.connectionId); - break; - } - } - } - } -} diff --git a/Assets/Mirror/Tests/Common/MemoryTransport.cs.meta b/Assets/Mirror/Tests/Common/MemoryTransport.cs.meta deleted file mode 100644 index d624b49ff..000000000 --- a/Assets/Mirror/Tests/Common/MemoryTransport.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6131cf1e8a1c14ef5b5253f86f3fc9c9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef b/Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef deleted file mode 100644 index ca39e3a96..000000000 --- a/Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "Mirror.Tests.Common", - "references": [ - "Mirror" - ], - "optionalUnityReferences": [ - "TestAssemblies" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [] -} \ No newline at end of file diff --git a/Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef.meta b/Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef.meta deleted file mode 100644 index e06568a88..000000000 --- a/Assets/Mirror/Tests/Common/Mirror.Tests.Common.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4e9aca8a359ab48de906aedbfa1ffe21 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/MirrorEditModeTest.cs b/Assets/Mirror/Tests/Common/MirrorEditModeTest.cs deleted file mode 100644 index 57db52499..000000000 --- a/Assets/Mirror/Tests/Common/MirrorEditModeTest.cs +++ /dev/null @@ -1,14 +0,0 @@ -// base class for networking tests to make things easier. -using NUnit.Framework; - -namespace Mirror.Tests -{ - public abstract class MirrorEditModeTest : MirrorTest - { - [SetUp] - public override void SetUp() => base.SetUp(); - - [TearDown] - public override void TearDown() => base.TearDown(); - } -} diff --git a/Assets/Mirror/Tests/Common/MirrorEditModeTest.cs.meta b/Assets/Mirror/Tests/Common/MirrorEditModeTest.cs.meta deleted file mode 100644 index 2f51f7e36..000000000 --- a/Assets/Mirror/Tests/Common/MirrorEditModeTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a6110480a9c07423290301aedafb2a93 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs b/Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs deleted file mode 100644 index a63dc836a..000000000 --- a/Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs +++ /dev/null @@ -1,27 +0,0 @@ -// base class for networking tests to make things easier. -using System.Collections; -using UnityEngine.TestTools; - -namespace Mirror.Tests -{ - public abstract class MirrorPlayModeTest : MirrorTest - { - // when overwriting, call it like this: - // yield return base.UnitySetUp(); - [UnitySetUp] - public virtual IEnumerator UnitySetUp() - { - base.SetUp(); - yield return null; - } - - // when overwriting, call it like this: - // yield return base.UnityTearDown(); - [UnityTearDown] - public virtual IEnumerator UnityTearDown() - { - base.TearDown(); - yield return null; - } - } -} diff --git a/Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs.meta b/Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs.meta deleted file mode 100644 index 5314431b2..000000000 --- a/Assets/Mirror/Tests/Common/MirrorPlayModeTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: be3f9e24bcdb748728f846e88eea29f3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/MirrorTest.cs b/Assets/Mirror/Tests/Common/MirrorTest.cs deleted file mode 100644 index b8b9ccd25..000000000 --- a/Assets/Mirror/Tests/Common/MirrorTest.cs +++ /dev/null @@ -1,557 +0,0 @@ -// base class for networking tests to make things easier. -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - // inherited by MirrorEditModeTest / MirrorPlayModeTest - // to call SetUp/TearDown by [SetUp]/[UnitySetUp] as needed - public abstract class MirrorTest - { - // keep track of networked GameObjects so we don't have to clean them - // up manually each time. - // CreateNetworked() adds to the list automatically. - public List instantiated; - - // we usually need the memory transport - public MemoryTransport transport; - - public virtual void SetUp() - { - instantiated = new List(); - - // need a transport to send & receive - Transport.activeTransport = transport = new GameObject().AddComponent(); - } - - public virtual void TearDown() - { - NetworkClient.Shutdown(); - NetworkServer.Shutdown(); - - // some tests might modify NetworkServer.connections without ever - // starting the server. - // NetworkServer.Shutdown() only clears connections if it was started. - // so let's do it manually for proper test cleanup here. - NetworkServer.connections.Clear(); - - foreach (GameObject go in instantiated) - if (go != null) - GameObject.DestroyImmediate(go); - - GameObject.DestroyImmediate(transport.gameObject); - Transport.activeTransport = null; - } - - // create a tracked GameObject for tests without Networkidentity - // add to tracker list if needed (useful for cleanups afterwards) - protected void CreateGameObject(out GameObject go) - { - go = new GameObject(); - // track - instantiated.Add(go); - } - - // create GameObject + MonoBehaviour - // add to tracker list if needed (useful for cleanups afterwards) - protected void CreateGameObject(out GameObject go, out T component) - where T : MonoBehaviour - { - CreateGameObject(out go); - component = go.AddComponent(); - } - - // create GameObject + NetworkIdentity - // add to tracker list if needed (useful for cleanups afterwards) - protected void CreateNetworked(out GameObject go, out NetworkIdentity identity) - { - go = new GameObject(); - identity = go.AddComponent(); - // Awake is only called in play mode. - // call manually for initialization. - identity.Awake(); - // track - instantiated.Add(go); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour - // add to tracker list if needed (useful for cleanups afterwards) - protected void CreateNetworked(out GameObject go, out NetworkIdentity identity, out T component) - where T : NetworkBehaviour - { - go = new GameObject(); - identity = go.AddComponent(); - component = go.AddComponent(); - // always set syncinterval = 0 for immediate testing - component.syncInterval = 0; - // Awake is only called in play mode. - // call manually for initialization. - identity.Awake(); - // track - instantiated.Add(go); - } - - // create GameObject + NetworkIdentity + 2x NetworkBehaviour - // add to tracker list if needed (useful for cleanups afterwards) - protected void CreateNetworked(out GameObject go, out NetworkIdentity identity, out T componentA, out U componentB) - where T : NetworkBehaviour - where U : NetworkBehaviour - { - go = new GameObject(); - identity = go.AddComponent(); - componentA = go.AddComponent(); - componentB = go.AddComponent(); - // always set syncinterval = 0 for immediate testing - componentA.syncInterval = 0; - componentB.syncInterval = 0; - // Awake is only called in play mode. - // call manually for initialization. - identity.Awake(); - // track - instantiated.Add(go); - } - - // create GameObject + NetworkIdentity + 2x NetworkBehaviour - // add to tracker list if needed (useful for cleanups afterwards) - protected void CreateNetworked(out GameObject go, out NetworkIdentity identity, out T componentA, out U componentB, out V componentC) - where T : NetworkBehaviour - where U : NetworkBehaviour - where V : NetworkBehaviour - { - go = new GameObject(); - identity = go.AddComponent(); - componentA = go.AddComponent(); - componentB = go.AddComponent(); - componentC = go.AddComponent(); - // always set syncinterval = 0 for immediate testing - componentA.syncInterval = 0; - componentB.syncInterval = 0; - componentC.syncInterval = 0; - // Awake is only called in play mode. - // call manually for initialization. - identity.Awake(); - // track - instantiated.Add(go); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - protected void CreateNetworkedAndSpawn(out GameObject go, out NetworkIdentity identity, NetworkConnection ownerConnection = null) - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - CreateNetworked(out go, out identity); - - // spawn - NetworkServer.Spawn(go, ownerConnection); - ProcessMessages(); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - // => returns objects from client and from server. - // will be same in host mode. - protected void CreateNetworkedAndSpawn( - out GameObject serverGO, out NetworkIdentity serverIdentity, - out GameObject clientGO, out NetworkIdentity clientIdentity, - NetworkConnection ownerConnection = null) - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create one on server, one on client - // (spawning has to find it on client, it doesn't create it) - CreateNetworked(out serverGO, out serverIdentity); - CreateNetworked(out clientGO, out clientIdentity); - - // give both a scene id and register it on client for spawnables - clientIdentity.sceneId = serverIdentity.sceneId = (ulong)serverGO.GetHashCode(); - NetworkClient.spawnableObjects[clientIdentity.sceneId] = clientIdentity; - - // spawn - NetworkServer.Spawn(serverGO, ownerConnection); - ProcessMessages(); - - // make sure the client really spawned it. - Assert.That(NetworkClient.spawned.ContainsKey(serverIdentity.netId)); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - protected void CreateNetworkedAndSpawn(out GameObject go, out NetworkIdentity identity, out T component, NetworkConnection ownerConnection = null) - where T : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - CreateNetworked(out go, out identity, out component); - - // spawn - NetworkServer.Spawn(go, ownerConnection); - ProcessMessages(); - - // double check that we have authority if we passed an owner connection - if (ownerConnection != null) - Debug.Assert(component.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - // => returns objects from client and from server. - // will be same in host mode. - protected void CreateNetworkedAndSpawn( - out GameObject serverGO, out NetworkIdentity serverIdentity, out T serverComponent, - out GameObject clientGO, out NetworkIdentity clientIdentity, out T clientComponent, - NetworkConnection ownerConnection = null) - where T : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create one on server, one on client - // (spawning has to find it on client, it doesn't create it) - CreateNetworked(out serverGO, out serverIdentity, out serverComponent); - CreateNetworked(out clientGO, out clientIdentity, out clientComponent); - - // give both a scene id and register it on client for spawnables - clientIdentity.sceneId = serverIdentity.sceneId = (ulong)serverGO.GetHashCode(); - NetworkClient.spawnableObjects[clientIdentity.sceneId] = clientIdentity; - - // spawn - NetworkServer.Spawn(serverGO, ownerConnection); - ProcessMessages(); - - // double check that we have authority if we passed an owner connection - if (ownerConnection != null) - Debug.Assert(serverComponent.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - - // make sure the client really spawned it. - Assert.That(NetworkClient.spawned.ContainsKey(serverIdentity.netId)); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - protected void CreateNetworkedAndSpawn(out GameObject go, out NetworkIdentity identity, out T componentA, out U componentB, NetworkConnection ownerConnection = null) - where T : NetworkBehaviour - where U : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - CreateNetworked(out go, out identity, out componentA, out componentB); - - // spawn - NetworkServer.Spawn(go, ownerConnection); - ProcessMessages(); - - // double check that we have authority if we passed an owner connection - if (ownerConnection != null) - { - Debug.Assert(componentA.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - Debug.Assert(componentB.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - } - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - // => returns objects from client and from server. - // will be same in host mode. - protected void CreateNetworkedAndSpawn( - out GameObject serverGO, out NetworkIdentity serverIdentity, out T serverComponentA, out U serverComponentB, - out GameObject clientGO, out NetworkIdentity clientIdentity, out T clientComponentA, out U clientComponentB, - NetworkConnection ownerConnection = null) - where T : NetworkBehaviour - where U : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create one on server, one on client - // (spawning has to find it on client, it doesn't create it) - CreateNetworked(out serverGO, out serverIdentity, out serverComponentA, out serverComponentB); - CreateNetworked(out clientGO, out clientIdentity, out clientComponentA, out clientComponentB); - - // give both a scene id and register it on client for spawnables - clientIdentity.sceneId = serverIdentity.sceneId = (ulong)serverGO.GetHashCode(); - NetworkClient.spawnableObjects[clientIdentity.sceneId] = clientIdentity; - - // spawn - NetworkServer.Spawn(serverGO, ownerConnection); - ProcessMessages(); - - // double check that we have authority if we passed an owner connection - if (ownerConnection != null) - { - Debug.Assert(serverComponentA.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - Debug.Assert(serverComponentB.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - } - - // make sure the client really spawned it. - Assert.That(NetworkClient.spawned.ContainsKey(serverIdentity.netId)); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - protected void CreateNetworkedAndSpawn(out GameObject go, out NetworkIdentity identity, out T componentA, out U componentB, out V componentC, NetworkConnection ownerConnection = null) - where T : NetworkBehaviour - where U : NetworkBehaviour - where V : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - CreateNetworked(out go, out identity, out componentA, out componentB, out componentC); - - // spawn - NetworkServer.Spawn(go, ownerConnection); - ProcessMessages(); - - // double check that we have authority if we passed an owner connection - if (ownerConnection != null) - { - Debug.Assert(componentA.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - Debug.Assert(componentB.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - Debug.Assert(componentC.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - } - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN - // => ownerConnection can be NetworkServer.localConnection if needed. - // => returns objects from client and from server. - // will be same in host mode. - protected void CreateNetworkedAndSpawn( - out GameObject serverGO, out NetworkIdentity serverIdentity, out T serverComponentA, out U serverComponentB, out V serverComponentC, - out GameObject clientGO, out NetworkIdentity clientIdentity, out T clientComponentA, out U clientComponentB, out V clientComponentC, - NetworkConnection ownerConnection = null) - where T : NetworkBehaviour - where U : NetworkBehaviour - where V : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create one on server, one on client - // (spawning has to find it on client, it doesn't create it) - CreateNetworked(out serverGO, out serverIdentity, out serverComponentA, out serverComponentB, out serverComponentC); - CreateNetworked(out clientGO, out clientIdentity, out clientComponentA, out clientComponentB, out clientComponentC); - - // give both a scene id and register it on client for spawnables - clientIdentity.sceneId = serverIdentity.sceneId = (ulong)serverGO.GetHashCode(); - NetworkClient.spawnableObjects[clientIdentity.sceneId] = clientIdentity; - - // spawn - NetworkServer.Spawn(serverGO, ownerConnection); - ProcessMessages(); - - // double check that we have authority if we passed an owner connection - if (ownerConnection != null) - { - Debug.Assert(serverComponentA.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - Debug.Assert(serverComponentB.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - Debug.Assert(serverComponentC.hasAuthority == true, $"Behaviour Had Wrong Authority when spawned, This means that the test is broken and will give the wrong results"); - } - - // make sure the client really spawned it. - Assert.That(NetworkClient.spawned.ContainsKey(serverIdentity.netId)); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN PLAYER. - // often times, we really need a player object for the client to receive - // certain messages. - protected void CreateNetworkedAndSpawnPlayer(out GameObject go, out NetworkIdentity identity, NetworkConnection ownerConnection) - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create a networked object - CreateNetworked(out go, out identity); - - // add as player & process spawn message on client. - NetworkServer.AddPlayerForConnection(ownerConnection, go); - ProcessMessages(); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN PLAYER. - // often times, we really need a player object for the client to receive - // certain messages. - // => returns objects from client and from server. - // will be same in host mode. - protected void CreateNetworkedAndSpawnPlayer( - out GameObject serverGO, out NetworkIdentity serverIdentity, - out GameObject clientGO, out NetworkIdentity clientIdentity, - NetworkConnection ownerConnection) - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create one on server, one on client - // (spawning has to find it on client, it doesn't create it) - CreateNetworked(out serverGO, out serverIdentity); - CreateNetworked(out clientGO, out clientIdentity); - - // give both a scene id and register it on client for spawnables - clientIdentity.sceneId = serverIdentity.sceneId = (ulong)serverGO.GetHashCode(); - NetworkClient.spawnableObjects[clientIdentity.sceneId] = clientIdentity; - - // add as player & process spawn message on client. - NetworkServer.AddPlayerForConnection(ownerConnection, serverGO); - ProcessMessages(); - - // make sure the client really spawned it. - Assert.That(NetworkClient.spawned.ContainsKey(serverIdentity.netId)); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN PLAYER. - // often times, we really need a player object for the client to receive - // certain messages. - protected void CreateNetworkedAndSpawnPlayer(out GameObject go, out NetworkIdentity identity, out T component, NetworkConnection ownerConnection) - where T : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create a networked object - CreateNetworked(out go, out identity, out component); - - // add as player & process spawn message on client. - NetworkServer.AddPlayerForConnection(ownerConnection, go); - ProcessMessages(); - } - - // create GameObject + NetworkIdentity + NetworkBehaviour & SPAWN PLAYER. - // often times, we really need a player object for the client to receive - // certain messages. - // => returns objects from client and from server. - // will be same in host mode. - protected void CreateNetworkedAndSpawnPlayer( - out GameObject serverGO, out NetworkIdentity serverIdentity, out T serverComponent, - out GameObject clientGO, out NetworkIdentity clientIdentity, out T clientComponent, - NetworkConnection ownerConnection) - where T : NetworkBehaviour - { - // server & client need to be active before spawning - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // create one on server, one on client - // (spawning has to find it on client, it doesn't create it) - CreateNetworked(out serverGO, out serverIdentity, out serverComponent); - CreateNetworked(out clientGO, out clientIdentity, out clientComponent); - - // give both a scene id and register it on client for spawnables - clientIdentity.sceneId = serverIdentity.sceneId = (ulong)serverGO.GetHashCode(); - NetworkClient.spawnableObjects[clientIdentity.sceneId] = clientIdentity; - - // add as player & process spawn message on client. - NetworkServer.AddPlayerForConnection(ownerConnection, serverGO); - ProcessMessages(); - - // make sure the client really spawned it. - Assert.That(NetworkClient.spawned.ContainsKey(serverIdentity.netId)); - } - - // fully connect client to local server - // gives out the server's connection to client for convenience if needed - protected void ConnectClientBlocking(out NetworkConnectionToClient connectionToClient) - { - NetworkClient.Connect("127.0.0.1"); - UpdateTransport(); - - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - connectionToClient = NetworkServer.connections.Values.First(); - } - - // fully connect client to local server & authenticate - protected void ConnectClientBlockingAuthenticated(out NetworkConnectionToClient connectionToClient) - { - ConnectClientBlocking(out connectionToClient); - - // authenticate server & client connections - connectionToClient.isAuthenticated = true; - NetworkClient.connection.isAuthenticated = true; - } - - // fully connect client to local server & authenticate & set read - protected void ConnectClientBlockingAuthenticatedAndReady(out NetworkConnectionToClient connectionToClient) - { - ConnectClientBlocking(out connectionToClient); - - // authenticate server & client connections - connectionToClient.isAuthenticated = true; - NetworkClient.connection.isAuthenticated = true; - - // set ready - NetworkClient.Ready(); - ProcessMessages(); - Assert.That(connectionToClient.isReady, Is.True); - } - - // fully connect HOST client to local server - // sets NetworkServer.localConnection / NetworkClient.connection. - protected void ConnectHostClientBlocking() - { - NetworkClient.ConnectHost(); - NetworkClient.ConnectLocalServer(); - UpdateTransport(); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - } - - // fully connect client to local server & authenticate & set read - protected void ConnectHostClientBlockingAuthenticatedAndReady() - { - ConnectHostClientBlocking(); - - // authenticate server & client connections - NetworkServer.localConnection.isAuthenticated = true; - NetworkClient.connection.isAuthenticated = true; - - // set ready - NetworkClient.Ready(); - ProcessMessages(); - Assert.That(NetworkServer.localConnection.isReady, Is.True); - } - - protected void UpdateTransport() - { - transport.ClientEarlyUpdate(); - transport.ServerEarlyUpdate(); - } - - protected void ProcessMessages() - { - // server & client need to be active - Debug.Assert(NetworkClient.active, "NetworkClient needs to be active before spawning."); - Debug.Assert(NetworkServer.active, "NetworkServer needs to be active before spawning."); - - // update server & client so batched messages are flushed - NetworkClient.NetworkLateUpdate(); - NetworkServer.NetworkLateUpdate(); - - // update transport so sent messages are received - UpdateTransport(); - } - - // helper function to create local connection pair - protected void CreateLocalConnectionPair(out LocalConnectionToClient connectionToClient, out LocalConnectionToServer connectionToServer) - { - connectionToClient = new LocalConnectionToClient(); - connectionToServer = new LocalConnectionToServer(); - connectionToClient.connectionToServer = connectionToServer; - connectionToServer.connectionToClient = connectionToClient; - } - } -} diff --git a/Assets/Mirror/Tests/Common/MirrorTest.cs.meta b/Assets/Mirror/Tests/Common/MirrorTest.cs.meta deleted file mode 100644 index d7b13dbe2..000000000 --- a/Assets/Mirror/Tests/Common/MirrorTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 67c5177a4b35749b8b9c4ca7107d8c25 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Common/NSubstitute.dll b/Assets/Mirror/Tests/Common/NSubstitute.dll deleted file mode 100755 index 010169440b91a22a446ebfadac1fdcca5b385e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148480 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 NHqOW%ckz~`;b$& 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 uFih!a$gz7Dg1^`###~GatUT(message)); - } - - [Test] - public void MakeNextBatch_OnlyAcceptsFreshWriter() - { - batcher.AddMessage(new ArraySegment(new byte[]{0x01})); - - writer.WriteByte(0); - Assert.Throws(() => { - batcher.MakeNextBatch(writer, TimeStamp); - }); - } - - [Test] - public void MakeNextBatch_NoMessage() - { - // make batch with no message - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(false)); - } - - [Test] - public void MakeNextBatch_OneMessage() - { - // add message - byte[] message = {0x01, 0x02}; - batcher.AddMessage(new ArraySegment(message)); - - // make batch - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, message))); - } - - [Test] - public void MakeNextBatch_MultipleMessages_AlmostFullBatch() - { - batcher.AddMessage(new ArraySegment(new byte[]{0x01, 0x02})); - batcher.AddMessage(new ArraySegment(new byte[]{0x03})); - - // make batch - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02, 0x03}))); - - // there should be no more batches to make - Assert.That(batcher.MakeNextBatch(writer, TimeStamp), Is.False); - } - - [Test] - public void MakeNextBatch_MultipleMessages_ExactlyFullBatch() - { - batcher.AddMessage(new ArraySegment(new byte[]{0x01, 0x02})); - batcher.AddMessage(new ArraySegment(new byte[]{0x03, 0x04})); - - // make batch - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02, 0x03, 0x04}))); - - // there should be no more batches to make - Assert.That(batcher.MakeNextBatch(writer, TimeStamp), Is.False); - } - - [Test] - public void MakeNextBatch_MultipleMessages_MoreThanOneBatch() - { - batcher.AddMessage(new ArraySegment(new byte[]{0x01, 0x02})); - batcher.AddMessage(new ArraySegment(new byte[]{0x03, 0x04})); - batcher.AddMessage(new ArraySegment(new byte[]{0x05})); - - // first batch - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02, 0x03, 0x04}))); - - // reset writer - writer.Position = 0; - - // second batch - result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x05}))); - } - - [Test] - public void MakeNextBatch_MultipleMessages_Small_Giant_Small() - { - // small, too big to include in batch, small - batcher.AddMessage(new ArraySegment(new byte[]{0x01})); - batcher.AddMessage(new ArraySegment(new byte[]{0x02, 0x03, 0x04, 0x05})); - batcher.AddMessage(new ArraySegment(new byte[]{0x06, 0x07})); - - // first batch - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x01}))); - - // reset writer - writer.Position = 0; - - // second batch - result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x02, 0x03, 0x04, 0x05}))); - - // reset writer - writer.Position = 0; - - // third batch - result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - - // check result: <> - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x06, 0x07}))); - } - - // messages > threshold should simply be single batches. - // those need to be supported too, for example: - // kcp prefers MTU sized batches - // but we still allow up to 144 KB max message size - [Test] - public void MakeNextBatch_LargerThanThreshold() - { - // make a larger than threshold message - byte[] large = new byte[Threshold + 1]; - for (int i = 0; i < Threshold + 1; ++i) - large[i] = (byte)i; - batcher.AddMessage(new ArraySegment(large)); - - // result should be only the large message - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, large))); - } - - // messages > threshold should simply be single batches. - // those need to be supported too, for example: - // kcp prefers MTU sized batches - // but we still allow up to 144 KB max message size - [Test] - public void MakeNextBatch_LargerThanThreshold_BetweenSmallerMessages() - { - // make a larger than threshold message - byte[] large = new byte[Threshold + 1]; - for (int i = 0; i < Threshold + 1; ++i) - large[i] = (byte)i; - - // add two small, one large, two small messages. - // to make sure everything around it is still batched, - // and the large one is a separate batch. - batcher.AddMessage(new ArraySegment(new byte[]{0x01})); - batcher.AddMessage(new ArraySegment(new byte[]{0x02})); - batcher.AddMessage(new ArraySegment(large)); - batcher.AddMessage(new ArraySegment(new byte[]{0x03})); - batcher.AddMessage(new ArraySegment(new byte[]{0x04})); - - // first batch should be the two small messages - bool result = batcher.MakeNextBatch(writer, TimeStamp); - Assert.That(result, Is.EqualTo(true)); - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02}))); - - // reset writer - writer.Position = 0; - - // second batch should be only the large message - result = batcher.MakeNextBatch(writer, TimeStamp + 1); - Assert.That(result, Is.EqualTo(true)); - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp + 1, large))); - - // reset writer - writer.Position = 0; - - // third batch be the two small messages - result = batcher.MakeNextBatch(writer, TimeStamp + 2); - Assert.That(result, Is.EqualTo(true)); - Assert.That(writer.ToArray().SequenceEqual(ConcatTimestamp(TimeStamp + 2, new byte[]{0x03, 0x04}))); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Batching/BatcherTests.cs.meta b/Assets/Mirror/Tests/Editor/Batching/BatcherTests.cs.meta deleted file mode 100644 index 9d19de00b..000000000 --- a/Assets/Mirror/Tests/Editor/Batching/BatcherTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 787d83b7e2ca4547aca251617d91f7d8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs b/Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs deleted file mode 100644 index e4b7e02ab..000000000 --- a/Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using NUnit.Framework; - -namespace Mirror.Tests.Batching -{ - public class UnbatcherTests - { - Unbatcher unbatcher; - const double TimeStamp = Math.PI; - - [SetUp] - public void SetUp() - { - unbatcher = new Unbatcher(); - } - - [Test] - public void GetNextMessage_NoBatches() - { - bool result = unbatcher.GetNextMessage(out _, out _); - Assert.That(result, Is.False); - } - - // test for nimoyd bug, where calling getnextmessage after the previous - // call already returned false would cause an InvalidOperationException. - [Test] - public void GetNextMessage_True_False_False_InvalidOperationException() - { - // add batch - byte[] batch = BatcherTests.ConcatTimestamp(TimeStamp, new byte[2]); - unbatcher.AddBatch(new ArraySegment(batch)); - - // get next message, pretend we read the whole thing - bool result = unbatcher.GetNextMessage(out NetworkReader reader, out _); - Assert.That(result, Is.True); - reader.Position = reader.Length; - - // shouldn't get another one - result = unbatcher.GetNextMessage(out reader, out _); - Assert.That(result, Is.False); - - // calling it again was causing "InvalidOperationException: Queue empty" - result = unbatcher.GetNextMessage(out reader, out _); - Assert.That(result, Is.False); - } - - [Test] - public void GetNextMessage_OneBatch() - { - // add one batch - byte[] batch = BatcherTests.ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02}); - unbatcher.AddBatch(new ArraySegment(batch)); - - // get next message, read first byte - bool result = unbatcher.GetNextMessage(out NetworkReader reader, out double remoteTimeStamp); - Assert.That(result, Is.True); - Assert.That(reader.ReadByte(), Is.EqualTo(0x01)); - Assert.That(remoteTimeStamp, Is.EqualTo(TimeStamp)); - - // get next message, read last byte - result = unbatcher.GetNextMessage(out reader, out remoteTimeStamp); - Assert.That(result, Is.True); - Assert.That(reader.ReadByte(), Is.EqualTo(0x02)); - Assert.That(remoteTimeStamp, Is.EqualTo(TimeStamp)); - - // there should be no more messages - result = unbatcher.GetNextMessage(out _, out _); - Assert.That(result, Is.False); - } - - [Test] - public void GetNextMessage_MultipleBatches() - { - // add first batch - byte[] firstBatch = BatcherTests.ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02}); - unbatcher.AddBatch(new ArraySegment(firstBatch)); - - // add second batch - byte[] secondBatch = BatcherTests.ConcatTimestamp(TimeStamp + 1, new byte[]{0x03, 0x04}); - unbatcher.AddBatch(new ArraySegment(secondBatch)); - - // get next message, read everything - bool result = unbatcher.GetNextMessage(out NetworkReader reader, out double remoteTimeStamp); - Assert.That(result, Is.True); - Assert.That(reader.ReadByte(), Is.EqualTo(0x01)); - Assert.That(reader.ReadByte(), Is.EqualTo(0x02)); - Assert.That(remoteTimeStamp, Is.EqualTo(TimeStamp)); - - // get next message, should point to next batch at Timestamp + 1 - result = unbatcher.GetNextMessage(out reader, out remoteTimeStamp); - Assert.That(result, Is.True); - Assert.That(reader.ReadByte(), Is.EqualTo(0x03)); - Assert.That(reader.ReadByte(), Is.EqualTo(0x04)); - Assert.That(remoteTimeStamp, Is.EqualTo(TimeStamp + 1)); - - // there should be no more messages - result = unbatcher.GetNextMessage(out _, out _); - Assert.That(result, Is.False); - } - - // make sure that retiring a batch, then adding a new batch works. - // previously there was a bug where the batch was retired, - // the reader still pointed to the old batch with pos=len, - // a new batch was added - // GetNextMessage() still returned false because reader still pointed to - // the old batch with pos=len. - [Test] - public void RetireBatchAndTryNewBatch() - { - // add first batch - byte[] firstBatch = BatcherTests.ConcatTimestamp(TimeStamp, new byte[]{0x01, 0x02}); - unbatcher.AddBatch(new ArraySegment(firstBatch)); - - // read everything - bool result = unbatcher.GetNextMessage(out NetworkReader reader, out double remoteTimeStamp); - Assert.That(result, Is.True); - Assert.That(reader.ReadByte(), Is.EqualTo(0x01)); - Assert.That(reader.ReadByte(), Is.EqualTo(0x02)); - Assert.That(remoteTimeStamp, Is.EqualTo(TimeStamp)); - - // try to read again. - // reader will be at limit, which should retire the batch. - result = unbatcher.GetNextMessage(out _, out _); - Assert.That(result, Is.False); - - // add new batch - byte[] secondBatch = BatcherTests.ConcatTimestamp(TimeStamp + 1, new byte[]{0x03, 0x04}); - unbatcher.AddBatch(new ArraySegment(secondBatch)); - - // read everything - result = unbatcher.GetNextMessage(out reader, out remoteTimeStamp); - Assert.That(result, Is.True); - Assert.That(reader.ReadByte(), Is.EqualTo(0x03)); - Assert.That(reader.ReadByte(), Is.EqualTo(0x04)); - Assert.That(remoteTimeStamp, Is.EqualTo(TimeStamp + 1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs.meta b/Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs.meta deleted file mode 100644 index b3cf32232..000000000 --- a/Assets/Mirror/Tests/Editor/Batching/UnbatcherTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ccc928bb22f5469886cef8c6132aa717 -timeCreated: 1623240730 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs b/Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs deleted file mode 100644 index 613b006c9..000000000 --- a/Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class VirtualClientRpc : NetworkBehaviour - { - public event Action onVirtualSendInt; - - [ClientRpc] - public virtual void RpcSendInt(int someInt) => - onVirtualSendInt?.Invoke(someInt); - } - - class VirtualNoOverrideClientRpc : VirtualClientRpc {} - - class VirtualOverrideClientRpc : VirtualClientRpc - { - public event Action onOverrideSendInt; - - [ClientRpc] - public override void RpcSendInt(int someInt) => - onOverrideSendInt?.Invoke(someInt); - } - - class VirtualOverrideClientRpcWithBase : VirtualClientRpc - { - public event Action onOverrideSendInt; - - [ClientRpc] - public override void RpcSendInt(int someInt) - { - base.RpcSendInt(someInt); - onOverrideSendInt?.Invoke(someInt); - } - } - - public class ClientRpcOverrideTest : RemoteTestBase - { - [Test] - public void VirtualRpcIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualClientRpc hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.RpcSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - } - - [Test] - public void VirtualCommandWithNoOverrideIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualNoOverrideClientRpc hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.RpcSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualRpcIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideClientRpc hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.RpcSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(0)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualWithBaseCallsBothVirtualAndBase() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideClientRpcWithBase hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.RpcSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs.meta b/Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs.meta deleted file mode 100644 index 68e53470b..000000000 --- a/Assets/Mirror/Tests/Editor/ClientRpcOverrideTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9759f0eddb9731c4b881ac30bacc0de0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientRpcTest.cs b/Assets/Mirror/Tests/Editor/ClientRpcTest.cs deleted file mode 100644 index a69e85f6e..000000000 --- a/Assets/Mirror/Tests/Editor/ClientRpcTest.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class ClientRpcBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [ClientRpc] - public void SendInt(int someInt) => - onSendInt?.Invoke(someInt); - } - - class ExcludeOwnerBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [ClientRpc(includeOwner = false)] - public void RpcSendInt(int someInt) => - onSendInt?.Invoke(someInt); - } - - class AbstractNetworkBehaviourClientRpcBehaviour : NetworkBehaviour - { - public abstract class MockMonsterBase : NetworkBehaviour {} - public class MockZombie : MockMonsterBase {} - public class MockWolf : MockMonsterBase {} - - public event Action onSendMonsterBase; - - [ClientRpc] - public void RpcSendMonster(MockMonsterBase someMonster) => - onSendMonsterBase?.Invoke(someMonster); - } - - public class ClientRpcTest : RemoteTestBase - { - [Test] - public void RpcIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out ClientRpcBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int called = 0; - hostBehaviour.onSendInt += incomingInt => - { - called++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.SendInt(someInt); - ProcessMessages(); - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void RpcIsCalledForNotOwner() - { - // spawn without owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out ExcludeOwnerBehaviour hostBehaviour); - - const int someInt = 20; - - int called = 0; - hostBehaviour.onSendInt += incomingInt => - { - called++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.RpcSendInt(someInt); - ProcessMessages(); - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void RpcNotCalledForOwner() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out ExcludeOwnerBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int called = 0; - hostBehaviour.onSendInt += incomingInt => - { - called++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.RpcSendInt(someInt); - ProcessMessages(); - Assert.That(called, Is.EqualTo(0)); - } - - [Test] - public void RpcIsCalledWithAbstractNetworkBehaviourParameter() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out AbstractNetworkBehaviourClientRpcBehaviour hostBehaviour, NetworkServer.localConnection); - - // spawn clientrpc parameter targets - CreateNetworkedAndSpawn(out _, out _, out AbstractNetworkBehaviourClientRpcBehaviour.MockWolf wolf, NetworkServer.localConnection); - CreateNetworkedAndSpawn(out _, out _, out AbstractNetworkBehaviourClientRpcBehaviour.MockZombie zombie, NetworkServer.localConnection); - - AbstractNetworkBehaviourClientRpcBehaviour.MockMonsterBase currentMonster = null; - - int called = 0; - hostBehaviour.onSendMonsterBase += incomingMonster => - { - called++; - Assert.That(incomingMonster, Is.EqualTo(currentMonster)); - }; - - currentMonster = wolf; - hostBehaviour.RpcSendMonster(currentMonster); - ProcessMessages(); - Assert.That(called, Is.EqualTo(1)); - - currentMonster = zombie; - hostBehaviour.RpcSendMonster(currentMonster); - ProcessMessages(); - Assert.That(called, Is.EqualTo(2)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientRpcTest.cs.meta b/Assets/Mirror/Tests/Editor/ClientRpcTest.cs.meta deleted file mode 100644 index 36ea9394d..000000000 --- a/Assets/Mirror/Tests/Editor/ClientRpcTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2928376e56382b646975dd00b68c2287 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs deleted file mode 100644 index 1b6cdbc71..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using NUnit.Framework; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_ClearSpawners : ClientSceneTestsBase - { - [Test] - public void RemovesAllPrefabsFromDictionary() - { - NetworkClient.prefabs.Add(Guid.NewGuid(), null); - NetworkClient.prefabs.Add(Guid.NewGuid(), null); - - NetworkClient.ClearSpawners(); - Assert.IsEmpty(NetworkClient.prefabs); - } - - [Test] - public void RemovesAllSpawnHandlersFromDictionary() - { - NetworkClient.spawnHandlers.Add(Guid.NewGuid(), null); - NetworkClient.spawnHandlers.Add(Guid.NewGuid(), null); - - NetworkClient.ClearSpawners(); - Assert.IsEmpty(NetworkClient.spawnHandlers); - } - - [Test] - public void RemovesAllUnspawnHandlersFromDictionary() - { - NetworkClient.unspawnHandlers.Add(Guid.NewGuid(), null); - NetworkClient.unspawnHandlers.Add(Guid.NewGuid(), null); - - NetworkClient.ClearSpawners(); - - Assert.IsEmpty(NetworkClient.unspawnHandlers); - } - - [Test] - public void ClearsAllDictionary() - { - NetworkClient.prefabs.Add(Guid.NewGuid(), null); - NetworkClient.prefabs.Add(Guid.NewGuid(), null); - - NetworkClient.spawnHandlers.Add(Guid.NewGuid(), null); - NetworkClient.spawnHandlers.Add(Guid.NewGuid(), null); - - NetworkClient.unspawnHandlers.Add(Guid.NewGuid(), null); - NetworkClient.unspawnHandlers.Add(Guid.NewGuid(), null); - - NetworkClient.ClearSpawners(); - - Assert.IsEmpty(NetworkClient.prefabs); - Assert.IsEmpty(NetworkClient.spawnHandlers); - Assert.IsEmpty(NetworkClient.unspawnHandlers); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs.meta deleted file mode 100644 index 3a955eb07..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_ClearSpawners.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ad2fe5633a9652045a5f7eb2643b6956 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs deleted file mode 100644 index 9fb848785..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_GetPrefab : ClientSceneTestsBase - { - [Test] - public void ReturnsFalseForEmptyGuid() - { - bool result = NetworkClient.GetPrefab(new Guid(), out GameObject prefab); - - Assert.IsFalse(result); - Assert.IsNull(prefab); - } - - [Test] - public void ReturnsFalseForPrefabNotFound() - { - Guid guid = Guid.NewGuid(); - bool result = NetworkClient.GetPrefab(guid, out GameObject prefab); - - Assert.IsFalse(result); - Assert.IsNull(prefab); - } - - [Test] - public void ReturnsFalseForPrefabIsNull() - { - Guid guid = Guid.NewGuid(); - NetworkClient.prefabs.Add(guid, null); - bool result = NetworkClient.GetPrefab(guid, out GameObject prefab); - - Assert.IsFalse(result); - Assert.IsNull(prefab); - } - - [Test] - public void ReturnsTrueWhenPrefabIsFound() - { - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - bool result = NetworkClient.GetPrefab(validPrefabGuid, out GameObject prefab); - - Assert.IsTrue(result); - Assert.NotNull(prefab); - } - - [Test] - public void HasOutPrefabWithCorrectGuid() - { - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - NetworkClient.GetPrefab(validPrefabGuid, out GameObject prefab); - - - Assert.NotNull(prefab); - - NetworkIdentity networkID = prefab.GetComponent(); - Assert.AreEqual(networkID.assetId, validPrefabGuid); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs.meta deleted file mode 100644 index 2dde78154..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_GetPrefab.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 27cbff3906928974bb20c3f50eacbbb0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs deleted file mode 100644 index 054151d94..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs +++ /dev/null @@ -1,736 +0,0 @@ -using System; -using System.Collections.Generic; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.ClientSceneTests -{ - public class PayloadTestBehaviour : NetworkBehaviour - { - public int value; - public Vector3 direction; - - public event Action OnDeserializeCalled; - public event Action OnSerializeCalled; - - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - base.OnSerialize(writer, initialState); - - writer.WriteInt(value); - writer.WriteVector3(direction); - - OnSerializeCalled?.Invoke(); - - return true; - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - base.OnDeserialize(reader, initialState); - - value = reader.ReadInt(); - direction = reader.ReadVector3(); - - OnDeserializeCalled?.Invoke(); - } - } - - public class BehaviourWithEvents : NetworkBehaviour - { - public event Action OnStartAuthorityCalled; - public event Action OnStartClientCalled; - public event Action OnStartLocalPlayerCalled; - - public override void OnStartAuthority() - { - OnStartAuthorityCalled?.Invoke(); - } - public override void OnStartClient() - { - OnStartClientCalled?.Invoke(); - } - public override void OnStartLocalPlayer() - { - OnStartLocalPlayerCalled?.Invoke(); - } - } - - public class ClientSceneTests_OnSpawn : ClientSceneTestsBase - { - Dictionary spawned => NetworkClient.spawned; - - [TearDown] - public override void TearDown() - { - spawned.Clear(); - base.TearDown(); - } - - [Test] - public void FindOrSpawnObject_FindExistingObject() - { - CreateNetworked(out _, out NetworkIdentity existing); - const uint netId = 1000; - existing.netId = netId; - spawned.Add(netId, existing); - - SpawnMessage msg = new SpawnMessage - { - netId = netId - }; - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity found); - - Assert.IsTrue(success); - Assert.That(found, Is.EqualTo(existing)); - } - - [Test] - public void FindOrSpawnObject_ErrorWhenNoExistingAndAssetIdAndSceneIdAreBothEmpty() - { - const uint netId = 1001; - SpawnMessage msg = new SpawnMessage - { - assetId = new Guid(), - sceneId = 0, - netId = netId - }; - - LogAssert.Expect(LogType.Error, $"OnSpawn message with netId '{netId}' has no AssetId or sceneId"); - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsFalse(success); - Assert.IsNull(networkIdentity); - } - - [Test] - public void FindOrSpawnObject_SpawnsFromPrefabDictionary() - { - const uint netId = 1002; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid - - }; - - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsTrue(success); - Assert.IsNotNull(networkIdentity); - Assert.That(networkIdentity.name, Is.EqualTo($"{validPrefab.name}(Clone)")); - - // cleanup - GameObject.DestroyImmediate(networkIdentity.gameObject); - } - - [Test] - public void FindOrSpawnObject_ErrorWhenPrefabInNullInDictionary() - { - const uint netId = 1002; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid - }; - - // could happen if the prefab is destroyed or unloaded - NetworkClient.prefabs.Add(validPrefabGuid, null); - - LogAssert.Expect(LogType.Error, $"Failed to spawn server object, did you forget to add it to the NetworkManager? assetId={msg.assetId} netId={msg.netId}"); - LogAssert.Expect(LogType.Error, $"Could not spawn assetId={msg.assetId} scene={msg.sceneId:X} netId={msg.netId}"); - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - - Assert.IsFalse(success); - Assert.IsNull(networkIdentity); - } - - [Test] - public void FindOrSpawnObject_SpawnsFromPrefabIfBothPrefabAndHandlerExists() - { - const uint netId = 1003; - int handlerCalled = 0; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid - }; - - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - NetworkClient.spawnHandlers.Add(validPrefabGuid, x => - { - handlerCalled++; - CreateNetworked(out GameObject go, out NetworkIdentity _); - return go; - }); - - - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsTrue(success); - Assert.IsNotNull(networkIdentity); - Assert.That(networkIdentity.name, Is.EqualTo($"{validPrefab.name}(Clone)")); - Assert.That(handlerCalled, Is.EqualTo(0), "Handler should not have been called"); - } - - [Test] - public void FindOrSpawnObject_SpawnHandlerCalledFromDictionary() - { - const uint netId = 1003; - int handlerCalled = 0; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid - }; - - GameObject createdInhandler = null; - - NetworkClient.spawnHandlers.Add(validPrefabGuid, x => - { - handlerCalled++; - Assert.That(x, Is.EqualTo(msg)); - CreateNetworked(out createdInhandler, out NetworkIdentity _); - return createdInhandler; - }); - - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsTrue(success); - Assert.IsNotNull(networkIdentity); - Assert.That(handlerCalled, Is.EqualTo(1)); - Assert.That(networkIdentity.gameObject, Is.EqualTo(createdInhandler), "Object returned should be the same object created by the spawn handler"); - } - - [Test] - public void FindOrSpawnObject_ErrorWhenSpawnHanlderReturnsNull() - { - const uint netId = 1003; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid - }; - - NetworkClient.spawnHandlers.Add(validPrefabGuid, (x) => null); - - LogAssert.Expect(LogType.Error, $"Spawn Handler returned null, Handler assetId '{msg.assetId}'"); - LogAssert.Expect(LogType.Error, $"Could not spawn assetId={msg.assetId} scene={msg.sceneId:X} netId={msg.netId}"); - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsFalse(success); - Assert.IsNull(networkIdentity); - } - [Test] - public void FindOrSpawnObject_ErrorWhenSpawnHanlderReturnsWithoutNetworkIdentity() - { - const uint netId = 1003; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid - }; - - NetworkClient.spawnHandlers.Add(validPrefabGuid, (x) => - { - CreateGameObject(out GameObject go); - return go; - }); - - LogAssert.Expect(LogType.Error, $"Object Spawned by handler did not have a NetworkIdentity, Handler assetId '{validPrefabGuid}'"); - LogAssert.Expect(LogType.Error, $"Could not spawn assetId={msg.assetId} scene={msg.sceneId:X} netId={msg.netId}"); - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsFalse(success); - Assert.IsNull(networkIdentity); - } - - NetworkIdentity CreateSceneObject(ulong sceneId) - { - CreateNetworked(out _, out NetworkIdentity identity); - // set sceneId to zero as it is set in onvalidate (does not set id at runtime) - identity.sceneId = sceneId; - NetworkClient.spawnableObjects.Add(sceneId, identity); - return identity; - } - - [Test] - public void FindOrSpawnObject_UsesSceneIdToSpawnFromSpawnableObjectsDictionary() - { - const uint netId = 1003; - const int sceneId = 100020; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - sceneId = sceneId - }; - - NetworkIdentity sceneObject = CreateSceneObject(sceneId); - - - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsTrue(success); - Assert.IsNotNull(networkIdentity); - Assert.That(networkIdentity, Is.EqualTo(sceneObject)); - } - - [Test] - public void FindOrSpawnObject_SpawnsUsingSceneIdInsteadOfAssetId() - { - const uint netId = 1003; - const int sceneId = 100020; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - sceneId = sceneId, - assetId = validPrefabGuid - }; - - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - NetworkIdentity sceneObject = CreateSceneObject(sceneId); - - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsTrue(success); - Assert.IsNotNull(networkIdentity); - Assert.That(networkIdentity, Is.EqualTo(sceneObject)); - } - - [Test] - public void FindOrSpawnObject_ErrorWhenSceneIdIsNotInSpawnableObjectsDictionary() - { - const uint netId = 1004; - const int sceneId = 100021; - SpawnMessage msg = new SpawnMessage - { - netId = netId, - sceneId = sceneId, - }; - - LogAssert.Expect(LogType.Error, $"Spawn scene object not found for {msg.sceneId:X}. Make sure that client and server use exactly the same project. This only happens if the hierarchy gets out of sync."); - LogAssert.Expect(LogType.Error, $"Could not spawn assetId={msg.assetId} scene={msg.sceneId:X} netId={msg.netId}"); - bool success = NetworkClient.FindOrSpawnObject(msg, out NetworkIdentity networkIdentity); - - Assert.IsFalse(success); - Assert.IsNull(networkIdentity); - } - - - [Test] - public void ApplyPayload_AppliesTransform() - { - const uint netId = 1000; - - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - Vector3 position = new Vector3(10, 0, 20); - Quaternion rotation = Quaternion.Euler(0, 45, 0); - Vector3 scale = new Vector3(1.5f, 1.5f, 1.5f); - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = false, - isOwner = false, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = position, - rotation = rotation, - scale = scale, - - payload = default, - }; - - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.That(identity.transform.position, Is.EqualTo(position)); - // use angle because of floating point numbers - // only need to check if rotations are approximately equal - Assert.That(Quaternion.Angle(identity.transform.rotation, rotation), Is.LessThan(0.0001f)); - Assert.That(identity.transform.localScale, Is.EqualTo(scale)); - } - - [Test] - public void ApplyPayload_AppliesLocalValuesToTransform() - { - const uint netId = 1000; - CreateGameObject(out GameObject parent); - parent.transform.position = new Vector3(100, 20, 0); - parent.transform.rotation = Quaternion.LookRotation(Vector3.left); - parent.transform.localScale = Vector3.one * 2; - - CreateNetworked(out GameObject go, out NetworkIdentity identity); - go.transform.parent = parent.transform; - - Vector3 position = new Vector3(10, 0, 20); - Quaternion rotation = Quaternion.Euler(0, 45, 0); - Vector3 scale = new Vector3(1.5f, 1.5f, 1.5f); - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = false, - isOwner = false, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = position, - rotation = rotation, - scale = scale, - - payload = default, - }; - - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.That(identity.transform.localPosition, Is.EqualTo(position)); - // use angle because of floating point numbers - // only need to check if rotations are approximately equal - Assert.That(Quaternion.Angle(identity.transform.localRotation, rotation), Is.LessThan(0.0001f)); - Assert.That(identity.transform.localScale, Is.EqualTo(scale)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ApplyPayload_AppliesAuthority(bool isOwner) - { - const uint netId = 1000; - - CreateNetworked(out _, out NetworkIdentity identity); - - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = false, - isOwner = isOwner, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = Vector3.zero, - rotation = Quaternion.identity, - scale = Vector3.one, - - payload = default - }; - - // set to opposite to make sure it is changed - identity.hasAuthority = !isOwner; - - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.That(identity.hasAuthority, Is.EqualTo(isOwner)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ApplyPayload_EnablesObject(bool startActive) - { - const uint netId = 1000; - - CreateNetworked(out GameObject go, out NetworkIdentity identity); - go.SetActive(startActive); - - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = false, - isOwner = false, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = Vector3.zero, - rotation = Quaternion.identity, - scale = Vector3.one, - - payload = default, - }; - - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.IsTrue(identity.gameObject.activeSelf); - } - - [Test] - public void ApplyPayload_SetsAssetId() - { - const uint netId = 1000; - - CreateNetworked(out _, out NetworkIdentity identity); - - Guid guid = Guid.NewGuid(); - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = false, - isOwner = false, - sceneId = 0, - assetId = guid, - // use local values for VR support - position = Vector3.zero, - rotation = Quaternion.identity, - scale = Vector3.one, - - payload = default - }; - - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.IsTrue(identity.gameObject.activeSelf); - - Assert.That(identity.assetId, Is.EqualTo(guid)); - } - - [Test] - public void ApplyPayload_DoesNotSetAssetIdToEmpty() - { - const uint netId = 1000; - - CreateNetworked(out _, out NetworkIdentity identity); - Guid guid = Guid.NewGuid(); - identity.assetId = guid; - - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = false, - isOwner = false, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = Vector3.zero, - rotation = Quaternion.identity, - scale = Vector3.one, - - payload = default - }; - - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.That(identity.assetId, Is.EqualTo(guid), "AssetId should not have changed"); - } - - [Test] - public void ApplyPayload_SendsDataToNetworkBehaviourDeserialize() - { - const int value = 12; - Vector3 direction = new Vector3(0, 1, 1); - - const uint netId = 1000; - - // server object - CreateNetworked(out _, out NetworkIdentity serverIdentity, out PayloadTestBehaviour serverPayloadBehaviour); - - // client object - CreateNetworked(out _, out NetworkIdentity clientIdentity, out PayloadTestBehaviour clientPayloadBehaviour); - - int onSerializeCalled = 0; - serverPayloadBehaviour.OnSerializeCalled += () => { onSerializeCalled++; }; - - int onDeserializeCalled = 0; - clientPayloadBehaviour.OnDeserializeCalled += () => { onDeserializeCalled++; }; - - serverPayloadBehaviour.value = value; - serverPayloadBehaviour.direction = direction; - - NetworkWriter ownerWriter = new NetworkWriter(); - NetworkWriter observersWriter = new NetworkWriter(); - serverIdentity.OnSerializeAllSafely(true, ownerWriter, observersWriter); - - // check that Serialize was called - Assert.That(onSerializeCalled, Is.EqualTo(1)); - - // create spawn message - SpawnMessage msg = new SpawnMessage - { - netId = netId, - payload = ownerWriter.ToArraySegment(), - }; - - // check values start default - Assert.That(onDeserializeCalled, Is.EqualTo(0)); - Assert.That(clientPayloadBehaviour.value, Is.EqualTo(0)); - Assert.That(clientPayloadBehaviour.direction, Is.EqualTo(Vector3.zero)); - - NetworkClient.ApplySpawnPayload(clientIdentity, msg); - - // check values have been set by payload - Assert.That(onDeserializeCalled, Is.EqualTo(1)); - Assert.That(clientPayloadBehaviour.value, Is.EqualTo(value)); - Assert.That(clientPayloadBehaviour.direction, Is.EqualTo(direction)); - } - - [Test] - public void ApplyPayload_LocalPlayerAddsIdentityToConnection() - { - Debug.Assert(NetworkClient.localPlayer == null, "LocalPlayer should be null before this test"); - const uint netId = 1000; - - CreateNetworked(out _, out NetworkIdentity identity); - - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = true, - isOwner = true, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = Vector3.zero, - rotation = Quaternion.identity, - scale = Vector3.one, - - payload = default, - }; - - NetworkClient.connection = new FakeNetworkConnection(); - NetworkClient.ready = true; - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.That(NetworkClient.localPlayer, Is.EqualTo(identity)); - Assert.That(NetworkClient.connection.identity, Is.EqualTo(identity)); - } - - [Test] - public void ApplyPayload_LocalPlayerWarningWhenNoReadyConnection() - { - Debug.Assert(NetworkClient.localPlayer == null, "LocalPlayer should be null before this test"); - const uint netId = 1000; - - CreateNetworked(out _, out NetworkIdentity identity); - - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = true, - isOwner = true, - sceneId = 0, - assetId = Guid.Empty, - // use local values for VR support - position = Vector3.zero, - rotation = Quaternion.identity, - scale = Vector3.one, - - payload = default, - }; - - - LogAssert.Expect(LogType.Warning, "No ready connection found for setting player controller during InternalAddPlayer"); - NetworkClient.ApplySpawnPayload(identity, msg); - - Assert.That(NetworkClient.localPlayer, Is.EqualTo(identity)); - } - - [Flags] - public enum SpawnFinishedState - { - isSpawnFinished = 1, - hasAuthority = 2, - isLocalPlayer = 4 - } - [Test] - [TestCase(0)] - [TestCase(1)] - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - public void ApplyPayload_isSpawnFinished(SpawnFinishedState flag) - { - bool isSpawnFinished = flag.HasFlag(SpawnFinishedState.isSpawnFinished); - bool hasAuthority = flag.HasFlag(SpawnFinishedState.hasAuthority); - bool isLocalPlayer = flag.HasFlag(SpawnFinishedState.isLocalPlayer); - - if (isSpawnFinished) - { - NetworkClient.OnObjectSpawnFinished(new ObjectSpawnFinishedMessage()); - } - - const uint netId = 1000; - CreateNetworked(out _, out NetworkIdentity identity, out BehaviourWithEvents events); - - int onStartAuthorityCalled = 0; - int onStartClientCalled = 0; - int onStartLocalPlayerCalled = 0; - events.OnStartAuthorityCalled += () => { onStartAuthorityCalled++; }; - events.OnStartClientCalled += () => { onStartClientCalled++; }; - events.OnStartLocalPlayerCalled += () => { onStartLocalPlayerCalled++; }; - - SpawnMessage msg = new SpawnMessage - { - netId = netId, - isLocalPlayer = isLocalPlayer, - isOwner = hasAuthority, - }; - - NetworkClient.ApplySpawnPayload(identity, msg); - - if (isSpawnFinished) - { - Assert.That(onStartClientCalled, Is.EqualTo(1)); - Assert.That(onStartAuthorityCalled, Is.EqualTo(hasAuthority ? 1 : 0)); - Assert.That(onStartLocalPlayerCalled, Is.EqualTo(isLocalPlayer ? 1 : 0)); - } - else - { - Assert.That(onStartAuthorityCalled, Is.Zero); - Assert.That(onStartClientCalled, Is.Zero); - Assert.That(onStartLocalPlayerCalled, Is.Zero); - } - } - - [Test] - public void OnSpawn_SpawnsAndAppliesPayload() - { - const int netId = 1; - Debug.Assert(spawned.Count == 0, "There should be no spawned objects before test"); - - Vector3 position = new Vector3(30, 20, 10); - Quaternion rotation = Quaternion.Euler(0, 0, 90); - SpawnMessage msg = new SpawnMessage - { - netId = netId, - assetId = validPrefabGuid, - position = position, - rotation = rotation - }; - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - - NetworkClient.OnSpawn(msg); - - Assert.That(spawned.Count, Is.EqualTo(1)); - Assert.IsTrue(spawned.ContainsKey(netId)); - - NetworkIdentity identity = spawned[netId]; - Assert.IsNotNull(identity); - Assert.That(identity.name, Is.EqualTo($"{validPrefab.name}(Clone)")); - Assert.That(identity.transform.position, Is.EqualTo(position)); - // use angle because of floating point numbers - // only need to check if rotations are approximately equal - Assert.That(Quaternion.Angle(identity.transform.rotation, rotation), Is.LessThan(0.0001f)); - } - - [Test] - public void OnSpawn_GiveNoExtraErrorsWhenPrefabIsntSpawned() - { - const int netId = 20033; - Debug.Assert(spawned.Count == 0, "There should be no spawned objects before test"); - SpawnMessage msg = new SpawnMessage - { - netId = netId, - }; - - // Check for log that FindOrSpawnObject gives, and make sure there are no other error logs - LogAssert.Expect(LogType.Error, $"OnSpawn message with netId '{netId}' has no AssetId or sceneId"); - NetworkClient.OnSpawn(msg); - - Assert.That(spawned, Is.Empty); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs.meta deleted file mode 100644 index 03d445c2d..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_OnSpawn.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b85d949dccc6ab4498da187264323dcc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs deleted file mode 100644 index 4f9532c28..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs +++ /dev/null @@ -1,104 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_PrepareToSpawnSceneObjects : ClientSceneTestsBase - { - NetworkIdentity CreateSceneObject(ulong sceneId) - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity); - gameObject.name = "Runtime GameObject"; - // set sceneId to zero as it is set in onvalidate (does not set id at runtime) - identity.sceneId = sceneId; - return identity; - } - - [Test] - public void AddsAllInactiveIdentitiesInSceneWithSceneIdToDictionary() - { - NetworkIdentity obj1 = CreateSceneObject(10); - NetworkIdentity obj2 = CreateSceneObject(11); - - obj1.gameObject.SetActive(false); - obj2.gameObject.SetActive(false); - - NetworkClient.PrepareToSpawnSceneObjects(); - - Assert.That(NetworkClient.spawnableObjects, Has.Count.EqualTo(2)); - - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsValue(obj1)); - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsValue(obj2)); - } - - [Test] - public void DoesNotAddActiveObjectsToDictionary() - { - NetworkIdentity active = CreateSceneObject(30); - NetworkIdentity inactive = CreateSceneObject(32); - - active.gameObject.SetActive(true); - inactive.gameObject.SetActive(false); - - NetworkClient.PrepareToSpawnSceneObjects(); - - Assert.That(NetworkClient.spawnableObjects, Has.Count.EqualTo(1)); - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsValue(inactive)); - Assert.IsFalse(NetworkClient.spawnableObjects.ContainsValue(active)); - } - - [Test] - public void DoesNotAddObjectsWithNoSceneId() - { - NetworkIdentity noId = CreateSceneObject(0); - NetworkIdentity hasId = CreateSceneObject(40); - - noId.gameObject.SetActive(false); - hasId.gameObject.SetActive(false); - - NetworkClient.PrepareToSpawnSceneObjects(); - - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsValue(hasId)); - Assert.IsFalse(NetworkClient.spawnableObjects.ContainsValue(noId)); - } - - [Test] - public void AddsIdentitiesToDictionaryUsingSceneId() - { - NetworkIdentity obj1 = CreateSceneObject(20); - NetworkIdentity obj2 = CreateSceneObject(21); - obj1.gameObject.SetActive(false); - obj2.gameObject.SetActive(false); - - NetworkClient.PrepareToSpawnSceneObjects(); - - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsKey(20)); - Assert.That(NetworkClient.spawnableObjects[20], Is.EqualTo(obj1)); - - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsKey(21)); - Assert.That(NetworkClient.spawnableObjects[21], Is.EqualTo(obj2)); - } - - [Test] - public void ClearsExistingItemsFromDictionary() - { - // destroyed objects from old scene - NetworkClient.spawnableObjects.Add(60, null); - NetworkClient.spawnableObjects.Add(62, null); - - // active object - NetworkIdentity obj1 = CreateSceneObject(61); - NetworkClient.spawnableObjects.Add(61, obj1); - - // new disabled object - NetworkIdentity obj2 = CreateSceneObject(63); - obj2.gameObject.SetActive(false); - - NetworkClient.PrepareToSpawnSceneObjects(); - - Assert.That(NetworkClient.spawnableObjects, Has.Count.EqualTo(1)); - Assert.IsFalse(NetworkClient.spawnableObjects.ContainsValue(null)); - Assert.IsTrue(NetworkClient.spawnableObjects.ContainsValue(obj2)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs.meta deleted file mode 100644 index 9652845b1..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_PrepareToSpawnSceneObjects.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 546931b1b1c38d5498f2c189e68b63aa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs deleted file mode 100644 index a63b1f628..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_RegisterPrefab : ClientSceneTests_RegisterPrefabBase - { - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - public void Prefab_AddsPrefabToDictionary(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - - CallRegisterPrefab(validPrefab, overload); - - Assert.IsTrue(NetworkClient.prefabs.ContainsKey(guid)); - Assert.AreEqual(NetworkClient.prefabs[guid], validPrefab); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId)] - public void PrefabNewGuid_ErrorDoesNotChangePrefabsAssetId(RegisterPrefabOverload overload) - { - Guid guid = anotherGuid; - - LogAssert.Expect(LogType.Error, $"Could not register '{validPrefab.name}' to {guid} because it already had an AssetId, Existing assetId {validPrefabGuid}"); - CallRegisterPrefab(validPrefab, overload); - - Assert.IsFalse(NetworkClient.prefabs.ContainsKey(guid)); - - NetworkIdentity netId = validPrefab.GetComponent(); - - Assert.AreEqual(netId.assetId, validPrefabGuid); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void HandlerNewGuid_ErrorDoesNotChangePrefabsAssetId(RegisterPrefabOverload overload) - { - Guid guid = anotherGuid; - - LogAssert.Expect(LogType.Error, $"Could not register Handler for '{validPrefab.name}' to {guid} because it already had an AssetId, Existing assetId {validPrefabGuid}"); - CallRegisterPrefab(validPrefab, overload); - - Assert.IsFalse(NetworkClient.spawnHandlers.ContainsKey(guid)); - Assert.IsFalse(NetworkClient.unspawnHandlers.ContainsKey(guid)); - - NetworkIdentity netId = validPrefab.GetComponent(); - - Assert.AreEqual(netId.assetId, validPrefabGuid); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId)] - public void PrefabNewGuid_NoErrorWhenNewAssetIdIsSameAsCurrentPrefab(RegisterPrefabOverload overload) - { - Guid guid = validPrefabGuid; - - CallRegisterPrefab(validPrefab, overload, guid); - - Assert.IsTrue(NetworkClient.prefabs.ContainsKey(guid)); - - NetworkIdentity netId = validPrefab.GetComponent(); - - Assert.AreEqual(netId.assetId, validPrefabGuid); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void HandlerNewGuid_NoErrorWhenAssetIdIsSameAsCurrentPrefab(RegisterPrefabOverload overload) - { - Guid guid = validPrefabGuid; - - CallRegisterPrefab(validPrefab, overload, guid); - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - Assert.IsTrue(NetworkClient.unspawnHandlers.ContainsKey(guid)); - - NetworkIdentity netId = validPrefab.GetComponent(); - - Assert.AreEqual(netId.assetId, validPrefabGuid); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void ErrorForNullPrefab(RegisterPrefabOverload overload) - { - string msg = OverloadWithHandler(overload) - ? "Could not register handler for prefab because the prefab was null" - : "Could not register prefab because it was null"; - - LogAssert.Expect(LogType.Error, msg); - CallRegisterPrefab(null, overload); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void ErrorForPrefabWithoutNetworkIdentity(RegisterPrefabOverload overload) - { - string msg = OverloadWithHandler(overload) - ? $"Could not register handler for '{invalidPrefab.name}' since it contains no NetworkIdentity component" - : $"Could not register '{invalidPrefab.name}' since it contains no NetworkIdentity component"; - - LogAssert.Expect(LogType.Error, msg); - CallRegisterPrefab(invalidPrefab, overload); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void NewGuid_ErrorForEmptyGuid(RegisterPrefabOverload overload) - { - string msg = OverloadWithHandler(overload) - ? $"Could not register handler for '{validPrefab.name}' with new assetId because the new assetId was empty" - : $"Could not register '{validPrefab.name}' with new assetId because the new assetId was empty"; - LogAssert.Expect(LogType.Error, msg); - CallRegisterPrefab(validPrefab, overload, new Guid()); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void ErrorIfPrefabHadSceneId(RegisterPrefabOverload overload) - { - GameObject clone = GameObject.Instantiate(validPrefab); - NetworkIdentity netId = clone.GetComponent(); - // Scene Id needs to not be zero for this test - netId.sceneId = 20; - - LogAssert.Expect(LogType.Error, $"Can not Register '{clone.name}' because it has a sceneId, make sure you are passing in the original prefab and not an instance in the scene."); - CallRegisterPrefab(clone, overload); - - GameObject.DestroyImmediate(clone); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void ErrorForNetworkIdentityInChildren(RegisterPrefabOverload overload) - { - LogAssert.Expect(LogType.Error, $"Prefab '{prefabWithChildren.name}' has multiple NetworkIdentity components. There should only be one NetworkIdentity on a prefab, and it must be on the root object."); - CallRegisterPrefab(prefabWithChildren, overload); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - public void Prefab_WarningForAssetIdAlreadyExistingInPrefabsDictionary(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - - NetworkClient.prefabs.Add(guid, validPrefab); - - LogAssert.Expect(LogType.Warning, $"Replacing existing prefab with assetId '{guid}'. Old prefab '{validPrefab.name}', New prefab '{validPrefab.name}'"); - CallRegisterPrefab(validPrefab, overload); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void Handler_ErrorForAssetIdAlreadyExistingInPrefabsDictionary(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - - NetworkClient.prefabs.Add(guid, validPrefab); - - LogAssert.Expect(LogType.Error, $"assetId '{guid}' is already used by prefab '{validPrefab.name}', unregister the prefab first before trying to add handler"); - CallRegisterPrefab(validPrefab, overload); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void WarningForAssetIdAlreadyExistingInHandlersDictionary(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - - NetworkClient.spawnHandlers.Add(guid, x => null); - NetworkClient.unspawnHandlers.Add(guid, x => {}); - - string msg = OverloadWithHandler(overload) - ? $"Replacing existing spawnHandlers for prefab '{validPrefab.name}' with assetId '{guid}'" - : $"Adding prefab '{validPrefab.name}' with assetId '{guid}' when spawnHandlers with same assetId already exists."; - - LogAssert.Expect(LogType.Warning, msg); - CallRegisterPrefab(validPrefab, overload); - } - - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - public void SpawnDelegate_AddsHandlerToSpawnHandlers(RegisterPrefabOverload overload) - { - int handlerCalled = 0; - - Guid guid = GuidForOverload(overload); - SpawnDelegate handler = new SpawnDelegate((pos, rot) => - { - handlerCalled++; - return null; - }); - - CallRegisterPrefab(validPrefab, overload, handler); - - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - - // check spawnHandler above is called - SpawnHandlerDelegate handlerInDictionary = NetworkClient.spawnHandlers[guid]; - handlerInDictionary.Invoke(default); - Assert.That(handlerCalled, Is.EqualTo(1)); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - public void SpawnDelegate_AddsHandlerToSpawnHandlersWithCorrectArguments(RegisterPrefabOverload overload) - { - int handlerCalled = 0; - Vector3 somePosition = new Vector3(10, 20, 3); - - Guid guid = GuidForOverload(overload); - SpawnDelegate handler = new SpawnDelegate((pos, assetId) => - { - handlerCalled++; - Assert.That(pos, Is.EqualTo(somePosition)); - Assert.That(assetId, Is.EqualTo(guid)); - return null; - }); - - CallRegisterPrefab(validPrefab, overload, handler); - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - - // check spawnHandler above is called - SpawnHandlerDelegate handlerInDictionary = NetworkClient.spawnHandlers[guid]; - handlerInDictionary.Invoke(new SpawnMessage { position = somePosition, assetId = guid }); - Assert.That(handlerCalled, Is.EqualTo(1)); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - public void SpawnDelegate_ErrorWhenSpawnHandlerIsNull(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - LogAssert.Expect(LogType.Error, $"Can not Register null SpawnHandler for {guid}"); - CallRegisterPrefab(validPrefab, overload, spawnHandler: null); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void SpawnHandleDelegate_AddsHandlerToSpawnHandlers(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - - SpawnHandlerDelegate handler = new SpawnHandlerDelegate(x => null); - - CallRegisterPrefab(validPrefab, overload, handler); - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - Assert.AreEqual(NetworkClient.spawnHandlers[guid], handler); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void SpawnHandleDelegate_ErrorWhenSpawnHandlerIsNull(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - LogAssert.Expect(LogType.Error, $"Can not Register null SpawnHandler for {guid}"); - CallRegisterPrefab(validPrefab, overload, spawnHandlerDelegate: null); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void Handler_ErrorWhenUnSpawnHandlerIsNull(RegisterPrefabOverload overload) - { - Guid guid = GuidForOverload(overload); - LogAssert.Expect(LogType.Error, $"Can not Register null UnSpawnHandler for {guid}"); - CallRegisterPrefab(validPrefab, overload, unspawnHandler: null); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs.meta deleted file mode 100644 index 803aa0ab5..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterPrefab.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bdfdcfafb85b3be418f2085e38663006 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs deleted file mode 100644 index fce157b0d..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs +++ /dev/null @@ -1,224 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_RegisterSpawnHandler : ClientSceneTestsBase - { - [Test] - public void SpawnDelegate_AddsHandlerToSpawnHandlers() - { - int handlerCalled = 0; - - Guid guid = Guid.NewGuid(); - SpawnDelegate spawnHandler = new SpawnDelegate((pos, rot) => - { - handlerCalled++; - return null; - }); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - - // check spawnHandler above is called - SpawnHandlerDelegate handler = NetworkClient.spawnHandlers[guid]; - handler.Invoke(default); - Assert.That(handlerCalled, Is.EqualTo(1)); - } - - [Test] - public void SpawnDelegate_AddsHandlerToSpawnHandlersWithCorrectArguments() - { - int handlerCalled = 0; - Vector3 somePosition = new Vector3(10, 20, 3); - - Guid guid = Guid.NewGuid(); - SpawnDelegate spawnHandler = new SpawnDelegate((pos, assetId) => - { - handlerCalled++; - Assert.That(pos, Is.EqualTo(somePosition)); - Assert.That(assetId, Is.EqualTo(guid)); - return null; - }); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - - // check spawnHandler above is called - SpawnHandlerDelegate handler = NetworkClient.spawnHandlers[guid]; - handler.Invoke(new SpawnMessage { position = somePosition, assetId = guid }); - Assert.That(handlerCalled, Is.EqualTo(1)); - } - - [Test] - public void SpawnDelegate_AddsHandlerToUnSpawnHandlers() - { - Guid guid = Guid.NewGuid(); - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - Assert.IsTrue(NetworkClient.unspawnHandlers.ContainsKey(guid)); - Assert.AreEqual(NetworkClient.unspawnHandlers[guid], unspawnHandler); - } - - [Test] - public void SpawnDelegate_ErrorWhenSpawnHandlerIsNull() - { - Guid guid = Guid.NewGuid(); - SpawnDelegate spawnHandler = null; - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - LogAssert.Expect(LogType.Error, $"Can not Register null SpawnHandler for {guid}"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - [Test] - public void SpawnDelegate_ErrorWhenUnSpawnHandlerIsNull() - { - Guid guid = Guid.NewGuid(); - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - UnSpawnDelegate unspawnHandler = null; - - LogAssert.Expect(LogType.Error, $"Can not Register null UnSpawnHandler for {guid}"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - [Test] - public void SpawnDelegate_ErrorWhenAssetIdIsEmpty() - { - Guid guid = new Guid(); - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - LogAssert.Expect(LogType.Error, "Can not Register SpawnHandler for empty Guid"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - [Test] - public void SpawnDelegate_WarningWhenHandlerForGuidAlreadyExistsInHandlerDictionary() - { - Guid guid = Guid.NewGuid(); - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - SpawnDelegate spawnHandler2 = new SpawnDelegate((x, y) => new GameObject()); - UnSpawnDelegate unspawnHandler2 = new UnSpawnDelegate(x => UnityEngine.Object.Destroy(x)); - - LogAssert.Expect(LogType.Warning, $"Replacing existing spawnHandlers for {guid}"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler2, unspawnHandler2); - } - - [Test] - public void SpawnDelegate_ErrorWhenHandlerForGuidAlreadyExistsInPrefabDictionary() - { - Guid guid = Guid.NewGuid(); - NetworkClient.prefabs.Add(guid, validPrefab); - - SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - LogAssert.Expect(LogType.Error, $"assetId '{guid}' is already used by prefab '{validPrefab.name}'"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - - [Test] - public void SpawnHandlerDelegate_AddsHandlerToSpawnHandlers() - { - Guid guid = Guid.NewGuid(); - SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(guid)); - Assert.AreEqual(NetworkClient.spawnHandlers[guid], spawnHandler); - } - - [Test] - public void SpawnHandlerDelegate_AddsHandlerToUnSpawnHandlers() - { - Guid guid = Guid.NewGuid(); - SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - Assert.IsTrue(NetworkClient.unspawnHandlers.ContainsKey(guid)); - Assert.AreEqual(NetworkClient.unspawnHandlers[guid], unspawnHandler); - } - - [Test] - public void SpawnHandlerDelegate_ErrorWhenSpawnHandlerIsNull() - { - Guid guid = Guid.NewGuid(); - SpawnHandlerDelegate spawnHandler = null; - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - LogAssert.Expect(LogType.Error, $"Can not Register null SpawnHandler for {guid}"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - [Test] - public void SpawnHandlerDelegate_ErrorWhenUnSpawnHandlerIsNull() - { - Guid guid = Guid.NewGuid(); - SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = null; - - LogAssert.Expect(LogType.Error, $"Can not Register null UnSpawnHandler for {guid}"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - [Test] - public void SpawnHandlerDelegate_ErrorWhenAssetIdIsEmpty() - { - Guid guid = new Guid(); - SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - LogAssert.Expect(LogType.Error, "Can not Register SpawnHandler for empty Guid"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - [Test] - public void SpawnHandlerDelegate_WarningWhenHandlerForGuidAlreadyExistsInHandlerDictionary() - { - Guid guid = Guid.NewGuid(); - SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => null); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {}); - - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - - SpawnHandlerDelegate spawnHandler2 = new SpawnHandlerDelegate(x => new GameObject()); - UnSpawnDelegate unspawnHandler2 = new UnSpawnDelegate(x => UnityEngine.Object.Destroy(x)); - - LogAssert.Expect(LogType.Warning, $"Replacing existing spawnHandlers for {guid}"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler2, unspawnHandler2); - } - - [Test] - public void SpawnHandlerDelegate_ErrorWhenHandlerForGuidAlreadyExistsInPrefabDictionary() - { - Guid guid = Guid.NewGuid(); - NetworkClient.prefabs.Add(guid, validPrefab); - - SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => new GameObject()); - UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => UnityEngine.Object.Destroy(x)); - - LogAssert.Expect(LogType.Error, $"assetId '{guid}' is already used by prefab '{validPrefab.name}'"); - NetworkClient.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler); - } - - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs.meta deleted file mode 100644 index ec826b7c5..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_RegisterSpawnHandler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c7e6577e8c2e64e41ae255edc61e91a2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs deleted file mode 100644 index ec1b7a6a5..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs +++ /dev/null @@ -1,48 +0,0 @@ -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_UnregisterPrefab : ClientSceneTestsBase - { - [Test] - public void RemovesPrefabFromDictionary() - { - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - NetworkClient.UnregisterPrefab(validPrefab); - Assert.IsFalse(NetworkClient.prefabs.ContainsKey(validPrefabGuid)); - } - - [Test] - public void RemovesSpawnHandlerFromDictionary() - { - NetworkClient.spawnHandlers.Add(validPrefabGuid, new SpawnHandlerDelegate(x => null)); - NetworkClient.UnregisterPrefab(validPrefab); - Assert.IsFalse(NetworkClient.spawnHandlers.ContainsKey(validPrefabGuid)); - } - - [Test] - public void RemovesUnSpawnHandlerFromDictionary() - { - NetworkClient.unspawnHandlers.Add(validPrefabGuid, new UnSpawnDelegate(x => {})); - NetworkClient.UnregisterPrefab(validPrefab); - Assert.IsFalse(NetworkClient.unspawnHandlers.ContainsKey(validPrefabGuid)); - } - - [Test] - public void ErrorWhenPrefabIsNull() - { - LogAssert.Expect(LogType.Error, "Could not unregister prefab because it was null"); - NetworkClient.UnregisterPrefab(null); - } - - [Test] - public void ErrorWhenPrefabHasNoNetworkIdentity() - { - LogAssert.Expect(LogType.Error, $"Could not unregister '{invalidPrefab.name}' since it contains no NetworkIdentity component"); - NetworkClient.UnregisterPrefab(invalidPrefab); - } - - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs.meta deleted file mode 100644 index 8478bffbc..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterPrefab.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: aa6fa692d80eaf8419e559c35034f016 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs b/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs deleted file mode 100644 index 7e1f6e3d3..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs +++ /dev/null @@ -1,33 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests.ClientSceneTests -{ - public class ClientSceneTests_UnregisterSpawnHandler : ClientSceneTestsBase - { - [Test] - public void RemovesSpawnHandlersFromDictionary() - { - NetworkClient.spawnHandlers.Add(validPrefabGuid, new SpawnHandlerDelegate(x => null)); - NetworkClient.UnregisterSpawnHandler(validPrefabGuid); - Assert.IsFalse(NetworkClient.unspawnHandlers.ContainsKey(validPrefabGuid)); - } - - [Test] - public void RemovesUnSpawnHandlersFromDictionary() - { - NetworkClient.unspawnHandlers.Add(validPrefabGuid, new UnSpawnDelegate(x => {})); - NetworkClient.UnregisterSpawnHandler(validPrefabGuid); - Assert.IsFalse(NetworkClient.unspawnHandlers.ContainsKey(validPrefabGuid)); - } - - [Test] - public void DoesNotRemovePrefabDictionary() - { - NetworkClient.prefabs.Add(validPrefabGuid, validPrefab); - NetworkClient.UnregisterSpawnHandler(validPrefabGuid); - // Should not be removed - Assert.IsTrue(NetworkClient.prefabs.ContainsKey(validPrefabGuid)); - } - - } -} diff --git a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs.meta b/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs.meta deleted file mode 100644 index 006dad00a..000000000 --- a/Assets/Mirror/Tests/Editor/ClientSceneTests_UnregisterSpawnHandler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 49ef76b8883ba3845942503683c9a9b3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/CommandOverrideTest.cs b/Assets/Mirror/Tests/Editor/CommandOverrideTest.cs deleted file mode 100644 index c9c57d54e..000000000 --- a/Assets/Mirror/Tests/Editor/CommandOverrideTest.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class VirtualCommand : NetworkBehaviour - { - public event Action onVirtualSendInt; - - [Command] - public virtual void CmdSendInt(int someInt) => - onVirtualSendInt?.Invoke(someInt); - } - - class VirtualNoOverrideCommand : VirtualCommand {} - - class VirtualOverrideCommand : VirtualCommand - { - public event Action onOverrideSendInt; - - [Command] - public override void CmdSendInt(int someInt) => - onOverrideSendInt?.Invoke(someInt); - } - - class VirtualOverrideCommandWithBase : VirtualCommand - { - public event Action onOverrideSendInt; - - [Command] - public override void CmdSendInt(int someInt) - { - base.CmdSendInt(someInt); - onOverrideSendInt?.Invoke(someInt); - } - } - - // test for 2 overrides - class VirtualOverrideCommandWithBase2 : VirtualOverrideCommandWithBase - { - public event Action onOverrideSendInt2; - - [Command] - public override void CmdSendInt(int someInt) - { - base.CmdSendInt(someInt); - onOverrideSendInt2?.Invoke(someInt); - } - } - - public class CommandOverrideTest : RemoteTestBase - { - [Test] - public void VirtualCommandIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualCommand hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - } - - [Test] - public void VirtualCommandWithNoOverrideIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualNoOverrideCommand hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualCommandIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideCommand hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(0)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualWithBaseCallsBothVirtualAndBase() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideCommandWithBase hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualWithBaseCallsAllMethodsThatCallBase() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideCommandWithBase2 hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - int override2CallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.onOverrideSendInt2 += incomingInt => - { - override2CallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - Assert.That(override2CallCount, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/CommandOverrideTest.cs.meta b/Assets/Mirror/Tests/Editor/CommandOverrideTest.cs.meta deleted file mode 100644 index 2afb7834e..000000000 --- a/Assets/Mirror/Tests/Editor/CommandOverrideTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 881c801c26e90df43b3558a23c96e0ea -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/CommandTest.cs b/Assets/Mirror/Tests/Editor/CommandTest.cs deleted file mode 100644 index adb4c812f..000000000 --- a/Assets/Mirror/Tests/Editor/CommandTest.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System; -using System.Text.RegularExpressions; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class AuthorityBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [Command] - public void SendInt(int someInt) => - onSendInt?.Invoke(someInt); - } - - class IgnoreAuthorityBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [Command(requiresAuthority = false)] - public void CmdSendInt(int someInt) => - onSendInt?.Invoke(someInt); - } - - class SenderConnectionBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [Command] - public void CmdSendInt(int someInt, NetworkConnectionToClient conn = null) => - onSendInt?.Invoke(someInt, conn); - } - - class SenderConnectionIgnoreAuthorityBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [Command(requiresAuthority = false)] - public void CmdSendInt(int someInt, NetworkConnectionToClient conn = null) => - onSendInt?.Invoke(someInt, conn); - } - - class ThrowBehaviour : NetworkBehaviour - { - public const string ErrorMessage = "Bad things happened"; - - [Command] - public void SendThrow(int _) => throw new Exception(ErrorMessage); - } - - public class CommandTest : RemoteTestBase - { - [Test] - public void CommandIsSentWithAuthority() - { - // spawn with owner - CreateNetworkedAndSpawn(out _, out _, out AuthorityBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int callCount = 0; - hostBehaviour.onSendInt += incomingInt => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.SendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void WarningForCommandSentWithoutAuthority() - { - // spawn without owner - CreateNetworkedAndSpawn(out _, out _, out AuthorityBehaviour hostBehaviour); - - const int someInt = 20; - - int callCount = 0; - hostBehaviour.onSendInt += incomingInt => - { - callCount++; - }; - LogAssert.Expect(LogType.Warning, $"Trying to send command for object without authority. {typeof(AuthorityBehaviour)}.{nameof(AuthorityBehaviour.SendInt)}"); - hostBehaviour.SendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.Zero); - } - - - [Test] - public void CommandIsSentWithAuthorityWhenIgnoringAuthority() - { - // spawn with owner - CreateNetworkedAndSpawn(out _, out _, out IgnoreAuthorityBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int callCount = 0; - hostBehaviour.onSendInt += incomingInt => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void CommandIsSentWithoutAuthorityWhenIgnoringAuthority() - { - // spawn without owner - CreateNetworkedAndSpawn(out _, out _, out IgnoreAuthorityBehaviour hostBehaviour); - - const int someInt = 20; - - int callCount = 0; - hostBehaviour.onSendInt += incomingInt => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - // test to prevent https://github.com/vis2k/Mirror/issues/2629 - // from happening again in the future - // -> [Command]s can be called on other objects with requiresAuthority=false. - // -> those objects don't have a .connectionToServer - // -> we broke it when using .connectionToServer instead of - // NetworkClient.connection in SendCommandInternal. - [Test] - public void Command_RequiresAuthorityFalse_ForOtherObjectWithoutConnectionToServer() - { - // spawn without owner (= without connectionToClient) - CreateNetworkedAndSpawn(out _, out _, out IgnoreAuthorityBehaviour comp); - - // setup callback - int called = 0; - comp.onSendInt += _ => { ++called; }; - - // call command. don't require authority. - // the object doesn't have a .connectionToServer (like a scene object) - Assert.That(comp.connectionToServer, Is.Null); - comp.CmdSendInt(0); - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void SenderConnectionIsSetWhenCommandIsRecieved() - { - // spawn with owner - CreateNetworkedAndSpawn(out _, out _, out SenderConnectionBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - NetworkConnectionToClient connectionToClient = NetworkServer.connections[0]; - Debug.Assert(connectionToClient != null, $"connectionToClient was null, This means that the test is broken and will give the wrong results"); - - - int callCount = 0; - hostBehaviour.onSendInt += (incomingInt, incomingConn) => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - Assert.That(incomingConn, Is.EqualTo(connectionToClient)); - }; - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void SenderConnectionIsSetWhenCommandIsRecievedWithIgnoreAuthority() - { - // spawn without owner - CreateNetworkedAndSpawn(out _, out _, out SenderConnectionIgnoreAuthorityBehaviour hostBehaviour); - - const int someInt = 20; - NetworkConnectionToClient connectionToClient = NetworkServer.connections[0]; - Debug.Assert(connectionToClient != null, $"connectionToClient was null, This means that the test is broken and will give the wrong results"); - - int callCount = 0; - hostBehaviour.onSendInt += (incomingInt, incomingConn) => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - Assert.That(incomingConn, Is.EqualTo(connectionToClient)); - }; - hostBehaviour.CmdSendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void CommandThatThrowsShouldBeCaught() - { - // spawn with owner - CreateNetworkedAndSpawn(out _, out _, out ThrowBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - NetworkConnectionToClient connectionToClient = NetworkServer.connections[0]; - Debug.Assert(connectionToClient != null, $"connectionToClient was null, This means that the test is broken and will give the wrong results"); - - LogAssert.Expect(LogType.Error, new Regex($".*{ThrowBehaviour.ErrorMessage}.*")); - Assert.DoesNotThrow(() => - { - hostBehaviour.SendThrow(someInt); - ProcessMessages(); - }, "Processing new message should not throw, the exception from SendThrow should be caught"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/CommandTest.cs.meta b/Assets/Mirror/Tests/Editor/CommandTest.cs.meta deleted file mode 100644 index 4d4917ddf..000000000 --- a/Assets/Mirror/Tests/Editor/CommandTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1dd3f8a95eee6f74997bc8abcd43a401 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/CompressionTests.cs b/Assets/Mirror/Tests/Editor/CompressionTests.cs deleted file mode 100644 index b03ec36f0..000000000 --- a/Assets/Mirror/Tests/Editor/CompressionTests.cs +++ /dev/null @@ -1,257 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class CompressionTests - { - [Test] - public void LargestAbsoluteComponentIndex() - { - // positive value & xyw smallest - Vector4 value = new Vector4(1, 3, 4, 2); - int index = Compression.LargestAbsoluteComponentIndex(value, out float largest, out Vector3 withoutLargest); - Assert.That(index, Is.EqualTo(2)); - Assert.That(largest, Is.EqualTo(Mathf.Abs(value.z))); - Assert.That(withoutLargest, Is.EqualTo(new Vector3(value.x, value.y, value.w))); - - // negative value should use abs & xzw smallest - value = new Vector4(1, -5, 4, 0); - index = Compression.LargestAbsoluteComponentIndex(value, out largest, out withoutLargest); - Assert.That(index, Is.EqualTo(1)); - Assert.That(largest, Is.EqualTo(Mathf.Abs(value.y))); - Assert.That(withoutLargest, Is.EqualTo(new Vector3(value.x, value.z, value.w))); - - // positive value & yzw smallest - value = new Vector4(5, 2, 3, 4); - index = Compression.LargestAbsoluteComponentIndex(value, out largest, out withoutLargest); - Assert.That(index, Is.EqualTo(0)); - Assert.That(largest, Is.EqualTo(Mathf.Abs(value.x))); - Assert.That(withoutLargest, Is.EqualTo(new Vector3(value.y, value.z, value.w))); - - // test to guarantee it uses 'abs' for first value - // to reproduce https://github.com/vis2k/Mirror/issues/2674 - // IF all values are properly 'abs', THEN first one should be largest - value = new Vector4(-3, 0, 1, 2); - index = Compression.LargestAbsoluteComponentIndex(value, out largest, out withoutLargest); - Assert.That(index, Is.EqualTo(0)); - Assert.That(largest, Is.EqualTo(Mathf.Abs(value.x))); - Assert.That(withoutLargest, Is.EqualTo(new Vector3(value.y, value.z, value.w))); - } - - [Test, Ignore("Enable when needed.")] - public void LargestAbsoluteComponentIndexBenchmark() - { - Vector4 value = new Vector4(1, 2, 3, 4); - for (int i = 0; i < 100000; ++i) - Compression.LargestAbsoluteComponentIndex(value, out float _, out Vector3 _); - } - - [Test] - public void ScaleFloatToUShort() - { - Assert.That(Compression.ScaleFloatToUShort(-1f, -1f, 1f, ushort.MinValue, ushort.MaxValue), Is.EqualTo(0)); - Assert.That(Compression.ScaleFloatToUShort(0f, -1f, 1f, ushort.MinValue, ushort.MaxValue), Is.EqualTo(32767)); - Assert.That(Compression.ScaleFloatToUShort(0.5f, -1f, 1f, ushort.MinValue, ushort.MaxValue), Is.EqualTo(49151)); - Assert.That(Compression.ScaleFloatToUShort(1f, -1f, 1f, ushort.MinValue, ushort.MaxValue), Is.EqualTo(65535)); - } - - [Test] - public void ScaleUShortToFloat() - { - Assert.That(Compression.ScaleUShortToFloat(0, ushort.MinValue, ushort.MaxValue, -1, 1), Is.EqualTo(-1).Within(0.0001f)); - Assert.That(Compression.ScaleUShortToFloat(32767, ushort.MinValue, ushort.MaxValue, -1, 1), Is.EqualTo(-0f).Within(0.0001f)); - Assert.That(Compression.ScaleUShortToFloat(49151, ushort.MinValue, ushort.MaxValue, -1, 1), Is.EqualTo(0.5f).Within(0.0001f)); - Assert.That(Compression.ScaleUShortToFloat(65535, ushort.MinValue, ushort.MaxValue, -1, 1), Is.EqualTo(1).Within(0.0001f)); - } - - [Test] - public void CompressAndDecompressQuaternion() - { - // we need a normalized value - Quaternion value = new Quaternion(1, 3, 4, 2).normalized; - - // compress - uint data = Compression.CompressQuaternion(value); - Assert.That(data, Is.EqualTo(0xA83E2F07)); - - // decompress - Quaternion decompressed = Compression.DecompressQuaternion(data); - Assert.That(decompressed.x, Is.EqualTo(value.x).Within(0.005f)); - Assert.That(decompressed.y, Is.EqualTo(value.y).Within(0.005f)); - Assert.That(decompressed.z, Is.EqualTo(value.z).Within(0.005f)); - Assert.That(decompressed.w, Is.EqualTo(value.w).Within(0.005f)); - } - - // iterate all [0..360] euler angles for x, y, z - // to make sure it all works and we missed nothing. - [Test] - public void CompressAndDecompressQuaternion_Iterate_0_to_360() - { - // stepSize 1: 360 * 360 * 360 = 46 million [takes 96 s] - // stepSize 5: 72 * 72 * 72 = 373 thousand [takes 700 ms] - // stepSize 10: 36 * 36 * 36 = 46 thousand [takes 100 ms] - // - // => 10 is enough. 700ms accumulates in hours of time waited over - // the years.. - const int stepSize = 10; - - for (int x = 0; x <= 360; x += stepSize) - { - for (int y = 0; y <= 360; y += stepSize) - { - for (int z = 0; z <= 360; z += stepSize) - { - // we need a normalized value - Quaternion value = Quaternion.Euler(x, y, z).normalized; - - // compress - uint data = Compression.CompressQuaternion(value); - - // decompress - Quaternion decompressed = Compression.DecompressQuaternion(data); - - // compare them. Quaternion.Angle is easiest to get the angle - // between them. using .eulerAngles would give 0, 90, 360 which is - // hard to compare. - float angle = Quaternion.Angle(value, decompressed); - // 1 degree tolerance - Assert.That(Mathf.Abs(angle), Is.LessThanOrEqualTo(1)); - } - } - } - } - - // someone mentioned issues with 90 degree euler becoming -90 degree - [Test] - public void CompressAndDecompressQuaternion_90DegreeEuler() - { - // we need a normalized value - Quaternion value = Quaternion.Euler(0, 90, 0).normalized; - - // compress - uint data = Compression.CompressQuaternion(value); - - // decompress - Quaternion decompressed = Compression.DecompressQuaternion(data); - - // compare them. Quaternion.Angle is easiest to get the angle - // between them. using .eulerAngles would give 0, 90, 360 which is - // hard to compare. - Debug.Log($"euler={decompressed.eulerAngles}"); - float angle = Quaternion.Angle(value, decompressed); - // 1 degree tolerance - Assert.That(Mathf.Abs(angle), Is.LessThanOrEqualTo(1)); - } - - // test for issue https://github.com/vis2k/Mirror/issues/2674 - [Test] - public void CompressAndDecompressQuaternion_2674() - { - // we need a normalized value - Quaternion value = Quaternion.Euler(338.850037f, 170.609955f, 182.979996f).normalized; - Debug.Log($"original={value.eulerAngles}"); - - // compress - uint data = Compression.CompressQuaternion(value); - - // decompress - Quaternion decompressed = Compression.DecompressQuaternion(data); - - // compare them. Quaternion.Angle is easiest to get the angle - // between them. using .eulerAngles would give 0, 90, 360 which is - // hard to compare. - - // (51.6, 355.5, 348.1) - Debug.Log($"euler={decompressed.eulerAngles}"); - float angle = Quaternion.Angle(value, decompressed); - // 1 degree tolerance - Assert.That(Mathf.Abs(angle), Is.LessThanOrEqualTo(1)); - } - - // client sending invalid data should still produce valid quaternions to - // avoid any possible bugs on server - [Test] - public void DecompressQuaternionInvalidData() - { - // decompress - // 0xFFFFFFFF will decompress to (0.7, 0.7, 0.7, NaN) - Quaternion decompressed = Compression.DecompressQuaternion(0xFFFFFFFF); - Assert.That(decompressed, Is.EqualTo(Quaternion.identity)); - } - - [Test] - public void VarInt() - { - NetworkWriter writer = new NetworkWriter(); - Compression.CompressVarUInt(writer, 0); - Compression.CompressVarUInt(writer, 234); - Compression.CompressVarUInt(writer, 2284); - Compression.CompressVarUInt(writer, 67821); - Compression.CompressVarUInt(writer, 16777210); - Compression.CompressVarUInt(writer, 16777219); - Compression.CompressVarUInt(writer, 4294967295); - Compression.CompressVarUInt(writer, 1099511627775); - Compression.CompressVarUInt(writer, 281474976710655); - Compression.CompressVarUInt(writer, 72057594037927935); - Compression.CompressVarUInt(writer, ulong.MaxValue); - - Compression.CompressVarInt(writer, long.MinValue); - Compression.CompressVarInt(writer, -72057594037927935); - Compression.CompressVarInt(writer, -281474976710655); - Compression.CompressVarInt(writer, -1099511627775); - Compression.CompressVarInt(writer, -4294967295); - Compression.CompressVarInt(writer, -16777219); - Compression.CompressVarInt(writer, -16777210); - Compression.CompressVarInt(writer, -67821); - Compression.CompressVarInt(writer, -2284); - Compression.CompressVarInt(writer, -234); - Compression.CompressVarInt(writer, 0); - Compression.CompressVarInt(writer, 234); - Compression.CompressVarInt(writer, 2284); - Compression.CompressVarInt(writer, 67821); - Compression.CompressVarInt(writer, 16777210); - Compression.CompressVarInt(writer, 16777219); - Compression.CompressVarInt(writer, 4294967295); - Compression.CompressVarInt(writer, 1099511627775); - Compression.CompressVarInt(writer, 281474976710655); - Compression.CompressVarInt(writer, 72057594037927935); - Compression.CompressVarInt(writer, long.MaxValue); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(0)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(234)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(2284)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(67821)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(16777210)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(16777219)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(4294967295)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(1099511627775)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(281474976710655)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(72057594037927935)); - Assert.That(Compression.DecompressVarUInt(reader), Is.EqualTo(ulong.MaxValue)); - - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(long.MinValue)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-72057594037927935)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-281474976710655)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-1099511627775)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-4294967295)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-16777219)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-16777210)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-67821)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-2284)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(-234)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(0)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(234)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(2284)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(67821)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(16777210)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(16777219)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(4294967295)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(1099511627775)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(281474976710655)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(72057594037927935)); - Assert.That(Compression.DecompressVarInt(reader), Is.EqualTo(long.MaxValue)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/CompressionTests.cs.meta b/Assets/Mirror/Tests/Editor/CompressionTests.cs.meta deleted file mode 100644 index b1487c00a..000000000 --- a/Assets/Mirror/Tests/Editor/CompressionTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 541cf2bc89fe4395b2a50d921c91424a -timeCreated: 1613190697 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/CustomRWTest.cs b/Assets/Mirror/Tests/Editor/CustomRWTest.cs deleted file mode 100644 index 3b015b383..000000000 --- a/Assets/Mirror/Tests/Editor/CustomRWTest.cs +++ /dev/null @@ -1,53 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class MockQuest - { - public int Id; - - public MockQuest(int id) - { - Id = id; - } - - public MockQuest() - { - Id = 0; - } - } - - public static class MockQuestReaderWriter - { - public static void WriteQuest(this NetworkWriter writer, MockQuest quest) - { - writer.WriteInt(quest.Id); - } - public static MockQuest WriteQuest(this NetworkReader reader) - { - return new MockQuest(reader.ReadInt()); - } - } - - [TestFixture] - public class CustomRWTest - { - public struct QuestMessage : NetworkMessage - { - public MockQuest quest; - } - - [Test] - public void TestCustomRW() - { - QuestMessage message = new QuestMessage - { - quest = new MockQuest(100) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - QuestMessage unpacked = MessagePackingTest.UnpackFromByteArray(data); - Assert.That(unpacked.quest.Id, Is.EqualTo(100)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/CustomRWTest.cs.meta b/Assets/Mirror/Tests/Editor/CustomRWTest.cs.meta deleted file mode 100644 index d1adf21d0..000000000 --- a/Assets/Mirror/Tests/Editor/CustomRWTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3d74d53ca2c8c4b1195833376f9f6bb6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs b/Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs deleted file mode 100644 index a37e18245..000000000 --- a/Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs +++ /dev/null @@ -1,91 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - public static class MyCustomEnumReadWrite - { - public static void WriteMyCustomEnum(this NetworkWriter networkWriter, EnumReadWriteTests.MyCustomEnum customEnum) - { - // if O write N - if (customEnum == EnumReadWriteTests.MyCustomEnum.O) - { - networkWriter.WriteInt((int)EnumReadWriteTests.MyCustomEnum.N); - } - else - { - networkWriter.WriteInt((int)customEnum); - } - } - public static EnumReadWriteTests.MyCustomEnum ReadMyCustomEnum(this NetworkReader networkReader) - { - return (EnumReadWriteTests.MyCustomEnum)networkReader.ReadInt(); - } - } - public class EnumReadWriteTests - { - public struct ByteMessage : NetworkMessage { public MyByteEnum byteEnum; } - public enum MyByteEnum : byte - { - A, B, C, D - } - - public struct ShortMessage : NetworkMessage { public MyShortEnum shortEnum; } - public enum MyShortEnum : short - { - E, F, G, H - } - - public struct CustomMessage : NetworkMessage { public MyCustomEnum customEnum; } - - public enum MyCustomEnum - { - M, N, O, P - } - - - [Test] - public void ByteIsSentForByteEnum() - { - ByteMessage msg = new ByteMessage() { byteEnum = MyByteEnum.B }; - - NetworkWriter writer = new NetworkWriter(); - writer.Write(msg); - - // should be 1 byte for data - Assert.That(writer.Position, Is.EqualTo(1)); - } - - [Test] - public void ShortIsSentForShortEnum() - { - ShortMessage msg = new ShortMessage() { shortEnum = MyShortEnum.G }; - - NetworkWriter writer = new NetworkWriter(); - writer.Write(msg); - - // should be 2 bytes for data - Assert.That(writer.Position, Is.EqualTo(2)); - } - - [Test] - public void CustomWriterIsUsedForEnum() - { - CustomMessage serverMsg = new CustomMessage() { customEnum = MyCustomEnum.O }; - CustomMessage clientMsg = SerializeAndDeserializeMessage(serverMsg); - - // custom writer should write N if it sees O - Assert.That(clientMsg.customEnum, Is.EqualTo(MyCustomEnum.N)); - } - T SerializeAndDeserializeMessage(T msg) - where T : struct, NetworkMessage - { - NetworkWriter writer = new NetworkWriter(); - - writer.Write(msg); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - return reader.Read(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs.meta b/Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs.meta deleted file mode 100644 index 5832f084c..000000000 --- a/Assets/Mirror/Tests/Editor/EnumReadWriteTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 79e6cd90456eed340a72b1bdb6fe7e49 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs b/Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs deleted file mode 100644 index 3b55264c4..000000000 --- a/Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs +++ /dev/null @@ -1,42 +0,0 @@ -using NUnit.Framework; -namespace Mirror.Tests -{ - [TestFixture] - public class ExponentialMovingAverageTest - { - [Test] - public void TestInitial() - { - ExponentialMovingAverage ema = new ExponentialMovingAverage(10); - - ema.Add(3); - - Assert.That(ema.Value, Is.EqualTo(3)); - Assert.That(ema.Var, Is.EqualTo(0)); - } - - [Test] - public void TestMovingAverage() - { - ExponentialMovingAverage ema = new ExponentialMovingAverage(10); - - ema.Add(5); - ema.Add(6); - - Assert.That(ema.Value, Is.EqualTo(5.1818).Within(0.0001f)); - Assert.That(ema.Var, Is.EqualTo(0.1487).Within(0.0001f)); - } - - [Test] - public void TestVar() - { - ExponentialMovingAverage ema = new ExponentialMovingAverage(10); - - ema.Add(5); - ema.Add(6); - ema.Add(7); - - Assert.That(ema.Var, Is.EqualTo(0.6134).Within(0.0001f)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs.meta b/Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs.meta deleted file mode 100644 index 535f33d77..000000000 --- a/Assets/Mirror/Tests/Editor/ExponentialMovingAverageTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8e3f2ecadd13149f29cd3e83ef6a4bff -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ExtensionsTest.cs b/Assets/Mirror/Tests/Editor/ExtensionsTest.cs deleted file mode 100644 index ef1e0d8ab..000000000 --- a/Assets/Mirror/Tests/Editor/ExtensionsTest.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class ExtensionsTest - { - // supposed to return same result on all platforms - [Test] - public void GetStableHashHode() - { - Assert.That("".GetStableHashCode(), Is.EqualTo(23)); - Assert.That("Test".GetStableHashCode(), Is.EqualTo(23844169)); - } - - [Test] - public void CopyToList() - { - List source = new List{1, 2, 3}; - List destination = new List(); - source.CopyTo(destination); - Assert.That(destination.SequenceEqual(source), Is.True); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/ExtensionsTest.cs.meta b/Assets/Mirror/Tests/Editor/ExtensionsTest.cs.meta deleted file mode 100644 index bc31df854..000000000 --- a/Assets/Mirror/Tests/Editor/ExtensionsTest.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 21e1452d6f734618a9364a2c6c116922 -timeCreated: 1621762116 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs b/Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs deleted file mode 100644 index 8d1ee0fe7..000000000 --- a/Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using Mirror.Tests.RemoteAttrributeTest; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.GeneratedWriterTests -{ - public class BaseData - { - public bool toggle; - } - public class SomeOtherData : BaseData - { - public int usefulNumber; - } - - public class DataSenderBehaviour : NetworkBehaviour - { - public event Action onData; - - [Command] - public void CmdSendData(SomeOtherData otherData) - { - onData?.Invoke(otherData); - } - } - - public class FieldsInBaseClasses : RemoteTestBase - { - [Test, Ignore("Destroy is needed for the code. Can't be called in Edit mode.")] - public void WriterShouldIncludeFieldsInBaseClass() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out DataSenderBehaviour hostBehaviour, NetworkServer.localConnection); - - const bool toggle = true; - const int usefulNumber = 10; - - int called = 0; - hostBehaviour.onData += data => - { - called++; - Assert.That(data.usefulNumber, Is.EqualTo(usefulNumber)); - Assert.That(data.toggle, Is.EqualTo(toggle)); - }; - hostBehaviour.CmdSendData(new SomeOtherData - { - usefulNumber = usefulNumber, - toggle = toggle - }); - - ProcessMessages(); - Assert.That(called, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs.meta b/Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs.meta deleted file mode 100644 index 67a428572..000000000 --- a/Assets/Mirror/Tests/Editor/FieldsInBaseClasses.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 518288ffe7c7215458a98466131fc7af -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Generated.meta b/Assets/Mirror/Tests/Editor/Generated.meta deleted file mode 100644 index be2f418af..000000000 --- a/Assets/Mirror/Tests/Editor/Generated.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f1a04c2c41f19ea46b0b1a33c8f2ae89 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs b/Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs deleted file mode 100644 index 773567b10..000000000 --- a/Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs +++ /dev/null @@ -1,5946 +0,0 @@ -// Generated by AttributeTestGenerator.cs -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Generated.Attributes -{ - public class ClassWithNoConstructor - { - public int a; - } - - public class ClassWithConstructor - { - public int a; - - public ClassWithConstructor(int a) - { - this.a = a; - } - } - - public class AttributeBehaviour_NetworkBehaviour : NetworkBehaviour - { - public static readonly float Expected_float = 2020f; - public static readonly double Expected_double = 2.54; - public static readonly bool Expected_bool = true; - public static readonly char Expected_char = 'a'; - public static readonly byte Expected_byte = 224; - public static readonly int Expected_int = 103; - public static readonly long Expected_long = -123456789L; - public static readonly ulong Expected_ulong = 123456789UL; - public static readonly Vector3 Expected_Vector3 = new Vector3(29, 1, 10); - public static readonly ClassWithNoConstructor Expected_ClassWithNoConstructor = new ClassWithNoConstructor { a = 10 }; - public static readonly ClassWithConstructor Expected_ClassWithConstructor = new ClassWithConstructor(29); - - - [Client] - public float Client_float_Function() - { - return Expected_float; - } - - [Client] - public void Client_float_out_Function(out float value) - { - value = Expected_float; - } - - [Client] - public double Client_double_Function() - { - return Expected_double; - } - - [Client] - public void Client_double_out_Function(out double value) - { - value = Expected_double; - } - - [Client] - public bool Client_bool_Function() - { - return Expected_bool; - } - - [Client] - public void Client_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [Client] - public char Client_char_Function() - { - return Expected_char; - } - - [Client] - public void Client_char_out_Function(out char value) - { - value = Expected_char; - } - - [Client] - public byte Client_byte_Function() - { - return Expected_byte; - } - - [Client] - public void Client_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [Client] - public int Client_int_Function() - { - return Expected_int; - } - - [Client] - public void Client_int_out_Function(out int value) - { - value = Expected_int; - } - - [Client] - public long Client_long_Function() - { - return Expected_long; - } - - [Client] - public void Client_long_out_Function(out long value) - { - value = Expected_long; - } - - [Client] - public ulong Client_ulong_Function() - { - return Expected_ulong; - } - - [Client] - public void Client_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [Client] - public Vector3 Client_Vector3_Function() - { - return Expected_Vector3; - } - - [Client] - public void Client_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [Client] - public ClassWithNoConstructor Client_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [Client] - public void Client_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [Client] - public ClassWithConstructor Client_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [Client] - public void Client_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [Server] - public float Server_float_Function() - { - return Expected_float; - } - - [Server] - public void Server_float_out_Function(out float value) - { - value = Expected_float; - } - - [Server] - public double Server_double_Function() - { - return Expected_double; - } - - [Server] - public void Server_double_out_Function(out double value) - { - value = Expected_double; - } - - [Server] - public bool Server_bool_Function() - { - return Expected_bool; - } - - [Server] - public void Server_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [Server] - public char Server_char_Function() - { - return Expected_char; - } - - [Server] - public void Server_char_out_Function(out char value) - { - value = Expected_char; - } - - [Server] - public byte Server_byte_Function() - { - return Expected_byte; - } - - [Server] - public void Server_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [Server] - public int Server_int_Function() - { - return Expected_int; - } - - [Server] - public void Server_int_out_Function(out int value) - { - value = Expected_int; - } - - [Server] - public long Server_long_Function() - { - return Expected_long; - } - - [Server] - public void Server_long_out_Function(out long value) - { - value = Expected_long; - } - - [Server] - public ulong Server_ulong_Function() - { - return Expected_ulong; - } - - [Server] - public void Server_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [Server] - public Vector3 Server_Vector3_Function() - { - return Expected_Vector3; - } - - [Server] - public void Server_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [Server] - public ClassWithNoConstructor Server_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [Server] - public void Server_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [Server] - public ClassWithConstructor Server_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [Server] - public void Server_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [ClientCallback] - public float ClientCallback_float_Function() - { - return Expected_float; - } - - [ClientCallback] - public void ClientCallback_float_out_Function(out float value) - { - value = Expected_float; - } - - [ClientCallback] - public double ClientCallback_double_Function() - { - return Expected_double; - } - - [ClientCallback] - public void ClientCallback_double_out_Function(out double value) - { - value = Expected_double; - } - - [ClientCallback] - public bool ClientCallback_bool_Function() - { - return Expected_bool; - } - - [ClientCallback] - public void ClientCallback_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [ClientCallback] - public char ClientCallback_char_Function() - { - return Expected_char; - } - - [ClientCallback] - public void ClientCallback_char_out_Function(out char value) - { - value = Expected_char; - } - - [ClientCallback] - public byte ClientCallback_byte_Function() - { - return Expected_byte; - } - - [ClientCallback] - public void ClientCallback_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [ClientCallback] - public int ClientCallback_int_Function() - { - return Expected_int; - } - - [ClientCallback] - public void ClientCallback_int_out_Function(out int value) - { - value = Expected_int; - } - - [ClientCallback] - public long ClientCallback_long_Function() - { - return Expected_long; - } - - [ClientCallback] - public void ClientCallback_long_out_Function(out long value) - { - value = Expected_long; - } - - [ClientCallback] - public ulong ClientCallback_ulong_Function() - { - return Expected_ulong; - } - - [ClientCallback] - public void ClientCallback_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [ClientCallback] - public Vector3 ClientCallback_Vector3_Function() - { - return Expected_Vector3; - } - - [ClientCallback] - public void ClientCallback_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [ClientCallback] - public ClassWithNoConstructor ClientCallback_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [ClientCallback] - public void ClientCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [ClientCallback] - public ClassWithConstructor ClientCallback_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [ClientCallback] - public void ClientCallback_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [ServerCallback] - public float ServerCallback_float_Function() - { - return Expected_float; - } - - [ServerCallback] - public void ServerCallback_float_out_Function(out float value) - { - value = Expected_float; - } - - [ServerCallback] - public double ServerCallback_double_Function() - { - return Expected_double; - } - - [ServerCallback] - public void ServerCallback_double_out_Function(out double value) - { - value = Expected_double; - } - - [ServerCallback] - public bool ServerCallback_bool_Function() - { - return Expected_bool; - } - - [ServerCallback] - public void ServerCallback_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [ServerCallback] - public char ServerCallback_char_Function() - { - return Expected_char; - } - - [ServerCallback] - public void ServerCallback_char_out_Function(out char value) - { - value = Expected_char; - } - - [ServerCallback] - public byte ServerCallback_byte_Function() - { - return Expected_byte; - } - - [ServerCallback] - public void ServerCallback_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [ServerCallback] - public int ServerCallback_int_Function() - { - return Expected_int; - } - - [ServerCallback] - public void ServerCallback_int_out_Function(out int value) - { - value = Expected_int; - } - - [ServerCallback] - public long ServerCallback_long_Function() - { - return Expected_long; - } - - [ServerCallback] - public void ServerCallback_long_out_Function(out long value) - { - value = Expected_long; - } - - [ServerCallback] - public ulong ServerCallback_ulong_Function() - { - return Expected_ulong; - } - - [ServerCallback] - public void ServerCallback_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [ServerCallback] - public Vector3 ServerCallback_Vector3_Function() - { - return Expected_Vector3; - } - - [ServerCallback] - public void ServerCallback_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [ServerCallback] - public ClassWithNoConstructor ServerCallback_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [ServerCallback] - public void ServerCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [ServerCallback] - public ClassWithConstructor ServerCallback_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [ServerCallback] - public void ServerCallback_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - } - - - public class AttributeTest_NetworkBehaviour - { - AttributeBehaviour_NetworkBehaviour behaviour; - GameObject go; - - [OneTimeSetUp] - public void SetUp() - { - go = new GameObject(); - behaviour = go.AddComponent(); - } - - [OneTimeTearDown] - public void TearDown() - { - UnityEngine.Object.DestroyImmediate(go); - NetworkClient.connectState = ConnectState.None; - NetworkServer.active = false; - } - - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_float_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Single Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_float_Function()' called when client was not active"); - } - float actual = behaviour.Client_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_float_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_float_out_Function(System.Single&)' called when client was not active"); - } - behaviour.Client_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_double_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Double Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_double_Function()' called when client was not active"); - } - double actual = behaviour.Client_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_double_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_double_out_Function(System.Double&)' called when client was not active"); - } - behaviour.Client_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_bool_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Boolean Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_bool_Function()' called when client was not active"); - } - bool actual = behaviour.Client_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_bool_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_bool_out_Function(System.Boolean&)' called when client was not active"); - } - behaviour.Client_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_char_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Char Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_char_Function()' called when client was not active"); - } - char actual = behaviour.Client_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_char_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_char_out_Function(System.Char&)' called when client was not active"); - } - behaviour.Client_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_byte_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Byte Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_byte_Function()' called when client was not active"); - } - byte actual = behaviour.Client_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_byte_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_byte_out_Function(System.Byte&)' called when client was not active"); - } - behaviour.Client_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_int_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Int32 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_int_Function()' called when client was not active"); - } - int actual = behaviour.Client_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_int_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_int_out_Function(System.Int32&)' called when client was not active"); - } - behaviour.Client_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_long_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Int64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_long_Function()' called when client was not active"); - } - long actual = behaviour.Client_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_long_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_long_out_Function(System.Int64&)' called when client was not active"); - } - behaviour.Client_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ulong_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.UInt64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_ulong_Function()' called when client was not active"); - } - ulong actual = behaviour.Client_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ulong_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_ulong_out_Function(System.UInt64&)' called when client was not active"); - } - behaviour.Client_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_Vector3_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'UnityEngine.Vector3 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_Vector3_Function()' called when client was not active"); - } - Vector3 actual = behaviour.Client_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_Vector3_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_Vector3_out_Function(UnityEngine.Vector3&)' called when client was not active"); - } - behaviour.Client_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'Mirror.Tests.Generated.Attributes.ClassWithNoConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_ClassWithNoConstructor_Function()' called when client was not active"); - } - ClassWithNoConstructor actual = behaviour.Client_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_ClassWithNoConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithNoConstructor&)' called when client was not active"); - } - behaviour.Client_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'Mirror.Tests.Generated.Attributes.ClassWithConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_ClassWithConstructor_Function()' called when client was not active"); - } - ClassWithConstructor actual = behaviour.Client_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Client_ClassWithConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithConstructor&)' called when client was not active"); - } - behaviour.Client_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_float_returnsValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Single Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_float_Function()' called when server was not active"); - } - float actual = behaviour.Server_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_float_setsOutValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_float_out_Function(System.Single&)' called when server was not active"); - } - behaviour.Server_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_double_returnsValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Double Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_double_Function()' called when server was not active"); - } - double actual = behaviour.Server_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_double_setsOutValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_double_out_Function(System.Double&)' called when server was not active"); - } - behaviour.Server_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_bool_returnsValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Boolean Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_bool_Function()' called when server was not active"); - } - bool actual = behaviour.Server_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_bool_setsOutValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_bool_out_Function(System.Boolean&)' called when server was not active"); - } - behaviour.Server_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_char_returnsValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Char Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_char_Function()' called when server was not active"); - } - char actual = behaviour.Server_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_char_setsOutValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_char_out_Function(System.Char&)' called when server was not active"); - } - behaviour.Server_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_byte_returnsValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Byte Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_byte_Function()' called when server was not active"); - } - byte actual = behaviour.Server_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_byte_setsOutValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_byte_out_Function(System.Byte&)' called when server was not active"); - } - behaviour.Server_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_int_returnsValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Int32 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_int_Function()' called when server was not active"); - } - int actual = behaviour.Server_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_int_setsOutValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_int_out_Function(System.Int32&)' called when server was not active"); - } - behaviour.Server_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_long_returnsValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Int64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_long_Function()' called when server was not active"); - } - long actual = behaviour.Server_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_long_setsOutValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_long_out_Function(System.Int64&)' called when server was not active"); - } - behaviour.Server_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ulong_returnsValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.UInt64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_ulong_Function()' called when server was not active"); - } - ulong actual = behaviour.Server_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ulong_setsOutValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_ulong_out_Function(System.UInt64&)' called when server was not active"); - } - behaviour.Server_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_Vector3_returnsValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'UnityEngine.Vector3 Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_Vector3_Function()' called when server was not active"); - } - Vector3 actual = behaviour.Server_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_Vector3_setsOutValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_Vector3_out_Function(UnityEngine.Vector3&)' called when server was not active"); - } - behaviour.Server_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'Mirror.Tests.Generated.Attributes.ClassWithNoConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_ClassWithNoConstructor_Function()' called when server was not active"); - } - ClassWithNoConstructor actual = behaviour.Server_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_ClassWithNoConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithNoConstructor&)' called when server was not active"); - } - behaviour.Server_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'Mirror.Tests.Generated.Attributes.ClassWithConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_ClassWithConstructor_Function()' called when server was not active"); - } - ClassWithConstructor actual = behaviour.Server_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_NetworkBehaviour::Server_ClassWithConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithConstructor&)' called when server was not active"); - } - behaviour.Server_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_float_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - float actual = behaviour.ClientCallback_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_float_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - behaviour.ClientCallback_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_double_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - double actual = behaviour.ClientCallback_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_double_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - behaviour.ClientCallback_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_bool_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - bool actual = behaviour.ClientCallback_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_bool_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - behaviour.ClientCallback_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_char_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - char actual = behaviour.ClientCallback_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_char_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - behaviour.ClientCallback_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_byte_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - byte actual = behaviour.ClientCallback_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_byte_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - behaviour.ClientCallback_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_int_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - int actual = behaviour.ClientCallback_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_int_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - behaviour.ClientCallback_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_long_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - long actual = behaviour.ClientCallback_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_long_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - behaviour.ClientCallback_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ulong_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - ulong actual = behaviour.ClientCallback_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ulong_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - behaviour.ClientCallback_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_Vector3_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - Vector3 actual = behaviour.ClientCallback_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_Vector3_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - behaviour.ClientCallback_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - ClassWithNoConstructor actual = behaviour.ClientCallback_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - behaviour.ClientCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - ClassWithConstructor actual = behaviour.ClientCallback_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - behaviour.ClientCallback_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_float_returnsValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - float actual = behaviour.ServerCallback_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_float_setsOutValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_float : default; - - behaviour.ServerCallback_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_double_returnsValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - double actual = behaviour.ServerCallback_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_double_setsOutValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_double : default; - - behaviour.ServerCallback_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_bool_returnsValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - bool actual = behaviour.ServerCallback_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_bool_setsOutValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_bool : default; - - behaviour.ServerCallback_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_char_returnsValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - char actual = behaviour.ServerCallback_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_char_setsOutValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_char : default; - - behaviour.ServerCallback_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_byte_returnsValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - byte actual = behaviour.ServerCallback_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_byte_setsOutValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_byte : default; - - behaviour.ServerCallback_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_int_returnsValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - int actual = behaviour.ServerCallback_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_int_setsOutValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_int : default; - - behaviour.ServerCallback_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_long_returnsValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - long actual = behaviour.ServerCallback_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_long_setsOutValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_long : default; - - behaviour.ServerCallback_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ulong_returnsValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - ulong actual = behaviour.ServerCallback_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ulong_setsOutValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ulong : default; - - behaviour.ServerCallback_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_Vector3_returnsValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - Vector3 actual = behaviour.ServerCallback_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_Vector3_setsOutValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_Vector3 : default; - - behaviour.ServerCallback_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - ClassWithNoConstructor actual = behaviour.ServerCallback_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithNoConstructor : default; - - behaviour.ServerCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - ClassWithConstructor actual = behaviour.ServerCallback_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_NetworkBehaviour.Expected_ClassWithConstructor : default; - - behaviour.ServerCallback_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - } - - public class AttributeBehaviour_MonoBehaviour : MonoBehaviour - { - public static readonly float Expected_float = 2020f; - public static readonly double Expected_double = 2.54; - public static readonly bool Expected_bool = true; - public static readonly char Expected_char = 'a'; - public static readonly byte Expected_byte = 224; - public static readonly int Expected_int = 103; - public static readonly long Expected_long = -123456789L; - public static readonly ulong Expected_ulong = 123456789UL; - public static readonly Vector3 Expected_Vector3 = new Vector3(29, 1, 10); - public static readonly ClassWithNoConstructor Expected_ClassWithNoConstructor = new ClassWithNoConstructor { a = 10 }; - public static readonly ClassWithConstructor Expected_ClassWithConstructor = new ClassWithConstructor(29); - - - [Client] - public float Client_float_Function() - { - return Expected_float; - } - - [Client] - public void Client_float_out_Function(out float value) - { - value = Expected_float; - } - - [Client] - public double Client_double_Function() - { - return Expected_double; - } - - [Client] - public void Client_double_out_Function(out double value) - { - value = Expected_double; - } - - [Client] - public bool Client_bool_Function() - { - return Expected_bool; - } - - [Client] - public void Client_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [Client] - public char Client_char_Function() - { - return Expected_char; - } - - [Client] - public void Client_char_out_Function(out char value) - { - value = Expected_char; - } - - [Client] - public byte Client_byte_Function() - { - return Expected_byte; - } - - [Client] - public void Client_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [Client] - public int Client_int_Function() - { - return Expected_int; - } - - [Client] - public void Client_int_out_Function(out int value) - { - value = Expected_int; - } - - [Client] - public long Client_long_Function() - { - return Expected_long; - } - - [Client] - public void Client_long_out_Function(out long value) - { - value = Expected_long; - } - - [Client] - public ulong Client_ulong_Function() - { - return Expected_ulong; - } - - [Client] - public void Client_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [Client] - public Vector3 Client_Vector3_Function() - { - return Expected_Vector3; - } - - [Client] - public void Client_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [Client] - public ClassWithNoConstructor Client_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [Client] - public void Client_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [Client] - public ClassWithConstructor Client_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [Client] - public void Client_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [Server] - public float Server_float_Function() - { - return Expected_float; - } - - [Server] - public void Server_float_out_Function(out float value) - { - value = Expected_float; - } - - [Server] - public double Server_double_Function() - { - return Expected_double; - } - - [Server] - public void Server_double_out_Function(out double value) - { - value = Expected_double; - } - - [Server] - public bool Server_bool_Function() - { - return Expected_bool; - } - - [Server] - public void Server_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [Server] - public char Server_char_Function() - { - return Expected_char; - } - - [Server] - public void Server_char_out_Function(out char value) - { - value = Expected_char; - } - - [Server] - public byte Server_byte_Function() - { - return Expected_byte; - } - - [Server] - public void Server_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [Server] - public int Server_int_Function() - { - return Expected_int; - } - - [Server] - public void Server_int_out_Function(out int value) - { - value = Expected_int; - } - - [Server] - public long Server_long_Function() - { - return Expected_long; - } - - [Server] - public void Server_long_out_Function(out long value) - { - value = Expected_long; - } - - [Server] - public ulong Server_ulong_Function() - { - return Expected_ulong; - } - - [Server] - public void Server_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [Server] - public Vector3 Server_Vector3_Function() - { - return Expected_Vector3; - } - - [Server] - public void Server_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [Server] - public ClassWithNoConstructor Server_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [Server] - public void Server_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [Server] - public ClassWithConstructor Server_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [Server] - public void Server_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [ClientCallback] - public float ClientCallback_float_Function() - { - return Expected_float; - } - - [ClientCallback] - public void ClientCallback_float_out_Function(out float value) - { - value = Expected_float; - } - - [ClientCallback] - public double ClientCallback_double_Function() - { - return Expected_double; - } - - [ClientCallback] - public void ClientCallback_double_out_Function(out double value) - { - value = Expected_double; - } - - [ClientCallback] - public bool ClientCallback_bool_Function() - { - return Expected_bool; - } - - [ClientCallback] - public void ClientCallback_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [ClientCallback] - public char ClientCallback_char_Function() - { - return Expected_char; - } - - [ClientCallback] - public void ClientCallback_char_out_Function(out char value) - { - value = Expected_char; - } - - [ClientCallback] - public byte ClientCallback_byte_Function() - { - return Expected_byte; - } - - [ClientCallback] - public void ClientCallback_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [ClientCallback] - public int ClientCallback_int_Function() - { - return Expected_int; - } - - [ClientCallback] - public void ClientCallback_int_out_Function(out int value) - { - value = Expected_int; - } - - [ClientCallback] - public long ClientCallback_long_Function() - { - return Expected_long; - } - - [ClientCallback] - public void ClientCallback_long_out_Function(out long value) - { - value = Expected_long; - } - - [ClientCallback] - public ulong ClientCallback_ulong_Function() - { - return Expected_ulong; - } - - [ClientCallback] - public void ClientCallback_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [ClientCallback] - public Vector3 ClientCallback_Vector3_Function() - { - return Expected_Vector3; - } - - [ClientCallback] - public void ClientCallback_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [ClientCallback] - public ClassWithNoConstructor ClientCallback_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [ClientCallback] - public void ClientCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [ClientCallback] - public ClassWithConstructor ClientCallback_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [ClientCallback] - public void ClientCallback_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [ServerCallback] - public float ServerCallback_float_Function() - { - return Expected_float; - } - - [ServerCallback] - public void ServerCallback_float_out_Function(out float value) - { - value = Expected_float; - } - - [ServerCallback] - public double ServerCallback_double_Function() - { - return Expected_double; - } - - [ServerCallback] - public void ServerCallback_double_out_Function(out double value) - { - value = Expected_double; - } - - [ServerCallback] - public bool ServerCallback_bool_Function() - { - return Expected_bool; - } - - [ServerCallback] - public void ServerCallback_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [ServerCallback] - public char ServerCallback_char_Function() - { - return Expected_char; - } - - [ServerCallback] - public void ServerCallback_char_out_Function(out char value) - { - value = Expected_char; - } - - [ServerCallback] - public byte ServerCallback_byte_Function() - { - return Expected_byte; - } - - [ServerCallback] - public void ServerCallback_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [ServerCallback] - public int ServerCallback_int_Function() - { - return Expected_int; - } - - [ServerCallback] - public void ServerCallback_int_out_Function(out int value) - { - value = Expected_int; - } - - [ServerCallback] - public long ServerCallback_long_Function() - { - return Expected_long; - } - - [ServerCallback] - public void ServerCallback_long_out_Function(out long value) - { - value = Expected_long; - } - - [ServerCallback] - public ulong ServerCallback_ulong_Function() - { - return Expected_ulong; - } - - [ServerCallback] - public void ServerCallback_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [ServerCallback] - public Vector3 ServerCallback_Vector3_Function() - { - return Expected_Vector3; - } - - [ServerCallback] - public void ServerCallback_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [ServerCallback] - public ClassWithNoConstructor ServerCallback_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [ServerCallback] - public void ServerCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [ServerCallback] - public ClassWithConstructor ServerCallback_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [ServerCallback] - public void ServerCallback_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - } - - - public class AttributeTest_MonoBehaviour - { - AttributeBehaviour_MonoBehaviour behaviour; - GameObject go; - - [OneTimeSetUp] - public void SetUp() - { - go = new GameObject(); - behaviour = go.AddComponent(); - } - - [OneTimeTearDown] - public void TearDown() - { - UnityEngine.Object.DestroyImmediate(go); - NetworkClient.connectState = ConnectState.None; - NetworkServer.active = false; - } - - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_float_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Single Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_float_Function()' called when client was not active"); - } - float actual = behaviour.Client_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_float_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_float_out_Function(System.Single&)' called when client was not active"); - } - behaviour.Client_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_double_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Double Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_double_Function()' called when client was not active"); - } - double actual = behaviour.Client_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_double_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_double_out_Function(System.Double&)' called when client was not active"); - } - behaviour.Client_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_bool_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Boolean Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_bool_Function()' called when client was not active"); - } - bool actual = behaviour.Client_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_bool_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_bool_out_Function(System.Boolean&)' called when client was not active"); - } - behaviour.Client_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_char_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Char Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_char_Function()' called when client was not active"); - } - char actual = behaviour.Client_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_char_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_char_out_Function(System.Char&)' called when client was not active"); - } - behaviour.Client_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_byte_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Byte Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_byte_Function()' called when client was not active"); - } - byte actual = behaviour.Client_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_byte_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_byte_out_Function(System.Byte&)' called when client was not active"); - } - behaviour.Client_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_int_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Int32 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_int_Function()' called when client was not active"); - } - int actual = behaviour.Client_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_int_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_int_out_Function(System.Int32&)' called when client was not active"); - } - behaviour.Client_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_long_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Int64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_long_Function()' called when client was not active"); - } - long actual = behaviour.Client_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_long_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_long_out_Function(System.Int64&)' called when client was not active"); - } - behaviour.Client_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ulong_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.UInt64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_ulong_Function()' called when client was not active"); - } - ulong actual = behaviour.Client_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ulong_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_ulong_out_Function(System.UInt64&)' called when client was not active"); - } - behaviour.Client_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_Vector3_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'UnityEngine.Vector3 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_Vector3_Function()' called when client was not active"); - } - Vector3 actual = behaviour.Client_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_Vector3_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_Vector3_out_Function(UnityEngine.Vector3&)' called when client was not active"); - } - behaviour.Client_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'Mirror.Tests.Generated.Attributes.ClassWithNoConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_ClassWithNoConstructor_Function()' called when client was not active"); - } - ClassWithNoConstructor actual = behaviour.Client_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_ClassWithNoConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithNoConstructor&)' called when client was not active"); - } - behaviour.Client_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'Mirror.Tests.Generated.Attributes.ClassWithConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_ClassWithConstructor_Function()' called when client was not active"); - } - ClassWithConstructor actual = behaviour.Client_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Client_ClassWithConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithConstructor&)' called when client was not active"); - } - behaviour.Client_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_float_returnsValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Single Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_float_Function()' called when server was not active"); - } - float actual = behaviour.Server_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_float_setsOutValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_float_out_Function(System.Single&)' called when server was not active"); - } - behaviour.Server_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_double_returnsValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Double Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_double_Function()' called when server was not active"); - } - double actual = behaviour.Server_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_double_setsOutValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_double_out_Function(System.Double&)' called when server was not active"); - } - behaviour.Server_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_bool_returnsValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Boolean Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_bool_Function()' called when server was not active"); - } - bool actual = behaviour.Server_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_bool_setsOutValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_bool_out_Function(System.Boolean&)' called when server was not active"); - } - behaviour.Server_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_char_returnsValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Char Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_char_Function()' called when server was not active"); - } - char actual = behaviour.Server_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_char_setsOutValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_char_out_Function(System.Char&)' called when server was not active"); - } - behaviour.Server_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_byte_returnsValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Byte Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_byte_Function()' called when server was not active"); - } - byte actual = behaviour.Server_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_byte_setsOutValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_byte_out_Function(System.Byte&)' called when server was not active"); - } - behaviour.Server_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_int_returnsValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Int32 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_int_Function()' called when server was not active"); - } - int actual = behaviour.Server_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_int_setsOutValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_int_out_Function(System.Int32&)' called when server was not active"); - } - behaviour.Server_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_long_returnsValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Int64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_long_Function()' called when server was not active"); - } - long actual = behaviour.Server_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_long_setsOutValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_long_out_Function(System.Int64&)' called when server was not active"); - } - behaviour.Server_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ulong_returnsValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.UInt64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_ulong_Function()' called when server was not active"); - } - ulong actual = behaviour.Server_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ulong_setsOutValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_ulong_out_Function(System.UInt64&)' called when server was not active"); - } - behaviour.Server_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_Vector3_returnsValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'UnityEngine.Vector3 Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_Vector3_Function()' called when server was not active"); - } - Vector3 actual = behaviour.Server_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_Vector3_setsOutValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_Vector3_out_Function(UnityEngine.Vector3&)' called when server was not active"); - } - behaviour.Server_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'Mirror.Tests.Generated.Attributes.ClassWithNoConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_ClassWithNoConstructor_Function()' called when server was not active"); - } - ClassWithNoConstructor actual = behaviour.Server_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_ClassWithNoConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithNoConstructor&)' called when server was not active"); - } - behaviour.Server_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'Mirror.Tests.Generated.Attributes.ClassWithConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_ClassWithConstructor_Function()' called when server was not active"); - } - ClassWithConstructor actual = behaviour.Server_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_MonoBehaviour::Server_ClassWithConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithConstructor&)' called when server was not active"); - } - behaviour.Server_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_float_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - float actual = behaviour.ClientCallback_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_float_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - behaviour.ClientCallback_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_double_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - double actual = behaviour.ClientCallback_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_double_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - behaviour.ClientCallback_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_bool_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - bool actual = behaviour.ClientCallback_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_bool_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - behaviour.ClientCallback_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_char_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - char actual = behaviour.ClientCallback_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_char_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - behaviour.ClientCallback_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_byte_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - byte actual = behaviour.ClientCallback_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_byte_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - behaviour.ClientCallback_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_int_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - int actual = behaviour.ClientCallback_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_int_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - behaviour.ClientCallback_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_long_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - long actual = behaviour.ClientCallback_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_long_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - behaviour.ClientCallback_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ulong_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - ulong actual = behaviour.ClientCallback_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ulong_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - behaviour.ClientCallback_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_Vector3_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - Vector3 actual = behaviour.ClientCallback_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_Vector3_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - behaviour.ClientCallback_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - ClassWithNoConstructor actual = behaviour.ClientCallback_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - behaviour.ClientCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - ClassWithConstructor actual = behaviour.ClientCallback_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - behaviour.ClientCallback_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_float_returnsValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - float actual = behaviour.ServerCallback_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_float_setsOutValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_MonoBehaviour.Expected_float : default; - - behaviour.ServerCallback_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_double_returnsValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - double actual = behaviour.ServerCallback_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_double_setsOutValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_MonoBehaviour.Expected_double : default; - - behaviour.ServerCallback_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_bool_returnsValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - bool actual = behaviour.ServerCallback_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_bool_setsOutValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_MonoBehaviour.Expected_bool : default; - - behaviour.ServerCallback_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_char_returnsValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - char actual = behaviour.ServerCallback_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_char_setsOutValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_MonoBehaviour.Expected_char : default; - - behaviour.ServerCallback_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_byte_returnsValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - byte actual = behaviour.ServerCallback_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_byte_setsOutValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_MonoBehaviour.Expected_byte : default; - - behaviour.ServerCallback_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_int_returnsValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - int actual = behaviour.ServerCallback_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_int_setsOutValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_MonoBehaviour.Expected_int : default; - - behaviour.ServerCallback_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_long_returnsValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - long actual = behaviour.ServerCallback_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_long_setsOutValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_MonoBehaviour.Expected_long : default; - - behaviour.ServerCallback_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ulong_returnsValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - ulong actual = behaviour.ServerCallback_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ulong_setsOutValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ulong : default; - - behaviour.ServerCallback_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_Vector3_returnsValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - Vector3 actual = behaviour.ServerCallback_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_Vector3_setsOutValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_MonoBehaviour.Expected_Vector3 : default; - - behaviour.ServerCallback_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - ClassWithNoConstructor actual = behaviour.ServerCallback_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithNoConstructor : default; - - behaviour.ServerCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - ClassWithConstructor actual = behaviour.ServerCallback_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_MonoBehaviour.Expected_ClassWithConstructor : default; - - behaviour.ServerCallback_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - } - - public class AttributeBehaviour_ClassWithNoConstructor : ClassWithNoConstructor - { - public static readonly float Expected_float = 2020f; - public static readonly double Expected_double = 2.54; - public static readonly bool Expected_bool = true; - public static readonly char Expected_char = 'a'; - public static readonly byte Expected_byte = 224; - public static readonly int Expected_int = 103; - public static readonly long Expected_long = -123456789L; - public static readonly ulong Expected_ulong = 123456789UL; - public static readonly Vector3 Expected_Vector3 = new Vector3(29, 1, 10); - public static readonly ClassWithNoConstructor Expected_ClassWithNoConstructor = new ClassWithNoConstructor { a = 10 }; - public static readonly ClassWithConstructor Expected_ClassWithConstructor = new ClassWithConstructor(29); - - - [Client] - public float Client_float_Function() - { - return Expected_float; - } - - [Client] - public void Client_float_out_Function(out float value) - { - value = Expected_float; - } - - [Client] - public double Client_double_Function() - { - return Expected_double; - } - - [Client] - public void Client_double_out_Function(out double value) - { - value = Expected_double; - } - - [Client] - public bool Client_bool_Function() - { - return Expected_bool; - } - - [Client] - public void Client_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [Client] - public char Client_char_Function() - { - return Expected_char; - } - - [Client] - public void Client_char_out_Function(out char value) - { - value = Expected_char; - } - - [Client] - public byte Client_byte_Function() - { - return Expected_byte; - } - - [Client] - public void Client_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [Client] - public int Client_int_Function() - { - return Expected_int; - } - - [Client] - public void Client_int_out_Function(out int value) - { - value = Expected_int; - } - - [Client] - public long Client_long_Function() - { - return Expected_long; - } - - [Client] - public void Client_long_out_Function(out long value) - { - value = Expected_long; - } - - [Client] - public ulong Client_ulong_Function() - { - return Expected_ulong; - } - - [Client] - public void Client_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [Client] - public Vector3 Client_Vector3_Function() - { - return Expected_Vector3; - } - - [Client] - public void Client_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [Client] - public ClassWithNoConstructor Client_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [Client] - public void Client_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [Client] - public ClassWithConstructor Client_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [Client] - public void Client_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [Server] - public float Server_float_Function() - { - return Expected_float; - } - - [Server] - public void Server_float_out_Function(out float value) - { - value = Expected_float; - } - - [Server] - public double Server_double_Function() - { - return Expected_double; - } - - [Server] - public void Server_double_out_Function(out double value) - { - value = Expected_double; - } - - [Server] - public bool Server_bool_Function() - { - return Expected_bool; - } - - [Server] - public void Server_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [Server] - public char Server_char_Function() - { - return Expected_char; - } - - [Server] - public void Server_char_out_Function(out char value) - { - value = Expected_char; - } - - [Server] - public byte Server_byte_Function() - { - return Expected_byte; - } - - [Server] - public void Server_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [Server] - public int Server_int_Function() - { - return Expected_int; - } - - [Server] - public void Server_int_out_Function(out int value) - { - value = Expected_int; - } - - [Server] - public long Server_long_Function() - { - return Expected_long; - } - - [Server] - public void Server_long_out_Function(out long value) - { - value = Expected_long; - } - - [Server] - public ulong Server_ulong_Function() - { - return Expected_ulong; - } - - [Server] - public void Server_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [Server] - public Vector3 Server_Vector3_Function() - { - return Expected_Vector3; - } - - [Server] - public void Server_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [Server] - public ClassWithNoConstructor Server_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [Server] - public void Server_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [Server] - public ClassWithConstructor Server_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [Server] - public void Server_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [ClientCallback] - public float ClientCallback_float_Function() - { - return Expected_float; - } - - [ClientCallback] - public void ClientCallback_float_out_Function(out float value) - { - value = Expected_float; - } - - [ClientCallback] - public double ClientCallback_double_Function() - { - return Expected_double; - } - - [ClientCallback] - public void ClientCallback_double_out_Function(out double value) - { - value = Expected_double; - } - - [ClientCallback] - public bool ClientCallback_bool_Function() - { - return Expected_bool; - } - - [ClientCallback] - public void ClientCallback_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [ClientCallback] - public char ClientCallback_char_Function() - { - return Expected_char; - } - - [ClientCallback] - public void ClientCallback_char_out_Function(out char value) - { - value = Expected_char; - } - - [ClientCallback] - public byte ClientCallback_byte_Function() - { - return Expected_byte; - } - - [ClientCallback] - public void ClientCallback_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [ClientCallback] - public int ClientCallback_int_Function() - { - return Expected_int; - } - - [ClientCallback] - public void ClientCallback_int_out_Function(out int value) - { - value = Expected_int; - } - - [ClientCallback] - public long ClientCallback_long_Function() - { - return Expected_long; - } - - [ClientCallback] - public void ClientCallback_long_out_Function(out long value) - { - value = Expected_long; - } - - [ClientCallback] - public ulong ClientCallback_ulong_Function() - { - return Expected_ulong; - } - - [ClientCallback] - public void ClientCallback_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [ClientCallback] - public Vector3 ClientCallback_Vector3_Function() - { - return Expected_Vector3; - } - - [ClientCallback] - public void ClientCallback_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [ClientCallback] - public ClassWithNoConstructor ClientCallback_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [ClientCallback] - public void ClientCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [ClientCallback] - public ClassWithConstructor ClientCallback_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [ClientCallback] - public void ClientCallback_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - - [ServerCallback] - public float ServerCallback_float_Function() - { - return Expected_float; - } - - [ServerCallback] - public void ServerCallback_float_out_Function(out float value) - { - value = Expected_float; - } - - [ServerCallback] - public double ServerCallback_double_Function() - { - return Expected_double; - } - - [ServerCallback] - public void ServerCallback_double_out_Function(out double value) - { - value = Expected_double; - } - - [ServerCallback] - public bool ServerCallback_bool_Function() - { - return Expected_bool; - } - - [ServerCallback] - public void ServerCallback_bool_out_Function(out bool value) - { - value = Expected_bool; - } - - [ServerCallback] - public char ServerCallback_char_Function() - { - return Expected_char; - } - - [ServerCallback] - public void ServerCallback_char_out_Function(out char value) - { - value = Expected_char; - } - - [ServerCallback] - public byte ServerCallback_byte_Function() - { - return Expected_byte; - } - - [ServerCallback] - public void ServerCallback_byte_out_Function(out byte value) - { - value = Expected_byte; - } - - [ServerCallback] - public int ServerCallback_int_Function() - { - return Expected_int; - } - - [ServerCallback] - public void ServerCallback_int_out_Function(out int value) - { - value = Expected_int; - } - - [ServerCallback] - public long ServerCallback_long_Function() - { - return Expected_long; - } - - [ServerCallback] - public void ServerCallback_long_out_Function(out long value) - { - value = Expected_long; - } - - [ServerCallback] - public ulong ServerCallback_ulong_Function() - { - return Expected_ulong; - } - - [ServerCallback] - public void ServerCallback_ulong_out_Function(out ulong value) - { - value = Expected_ulong; - } - - [ServerCallback] - public Vector3 ServerCallback_Vector3_Function() - { - return Expected_Vector3; - } - - [ServerCallback] - public void ServerCallback_Vector3_out_Function(out Vector3 value) - { - value = Expected_Vector3; - } - - [ServerCallback] - public ClassWithNoConstructor ServerCallback_ClassWithNoConstructor_Function() - { - return Expected_ClassWithNoConstructor; - } - - [ServerCallback] - public void ServerCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor value) - { - value = Expected_ClassWithNoConstructor; - } - - [ServerCallback] - public ClassWithConstructor ServerCallback_ClassWithConstructor_Function() - { - return Expected_ClassWithConstructor; - } - - [ServerCallback] - public void ServerCallback_ClassWithConstructor_out_Function(out ClassWithConstructor value) - { - value = Expected_ClassWithConstructor; - } - } - - - public class AttributeTest_ClassWithNoConstructor - { - AttributeBehaviour_ClassWithNoConstructor behaviour; - GameObject go; - - [OneTimeSetUp] - public void SetUp() - { - behaviour = new AttributeBehaviour_ClassWithNoConstructor(); - } - - [OneTimeTearDown] - public void TearDown() - { - - NetworkClient.connectState = ConnectState.None; - NetworkServer.active = false; - } - - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_float_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Single Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_float_Function()' called when client was not active"); - } - float actual = behaviour.Client_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_float_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_float_out_Function(System.Single&)' called when client was not active"); - } - behaviour.Client_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_double_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Double Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_double_Function()' called when client was not active"); - } - double actual = behaviour.Client_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_double_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_double_out_Function(System.Double&)' called when client was not active"); - } - behaviour.Client_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_bool_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Boolean Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_bool_Function()' called when client was not active"); - } - bool actual = behaviour.Client_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_bool_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_bool_out_Function(System.Boolean&)' called when client was not active"); - } - behaviour.Client_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_char_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Char Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_char_Function()' called when client was not active"); - } - char actual = behaviour.Client_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_char_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_char_out_Function(System.Char&)' called when client was not active"); - } - behaviour.Client_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_byte_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Byte Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_byte_Function()' called when client was not active"); - } - byte actual = behaviour.Client_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_byte_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_byte_out_Function(System.Byte&)' called when client was not active"); - } - behaviour.Client_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_int_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Int32 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_int_Function()' called when client was not active"); - } - int actual = behaviour.Client_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_int_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_int_out_Function(System.Int32&)' called when client was not active"); - } - behaviour.Client_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_long_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Int64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_long_Function()' called when client was not active"); - } - long actual = behaviour.Client_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_long_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_long_out_Function(System.Int64&)' called when client was not active"); - } - behaviour.Client_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ulong_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.UInt64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_ulong_Function()' called when client was not active"); - } - ulong actual = behaviour.Client_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ulong_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_ulong_out_Function(System.UInt64&)' called when client was not active"); - } - behaviour.Client_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_Vector3_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'UnityEngine.Vector3 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_Vector3_Function()' called when client was not active"); - } - Vector3 actual = behaviour.Client_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_Vector3_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_Vector3_out_Function(UnityEngine.Vector3&)' called when client was not active"); - } - behaviour.Client_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'Mirror.Tests.Generated.Attributes.ClassWithNoConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_ClassWithNoConstructor_Function()' called when client was not active"); - } - ClassWithNoConstructor actual = behaviour.Client_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_ClassWithNoConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithNoConstructor&)' called when client was not active"); - } - behaviour.Client_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'Mirror.Tests.Generated.Attributes.ClassWithConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_ClassWithConstructor_Function()' called when client was not active"); - } - ClassWithConstructor actual = behaviour.Client_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Client_ClassWithConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Client] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Client_ClassWithConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithConstructor&)' called when client was not active"); - } - behaviour.Client_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_float_returnsValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Single Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_float_Function()' called when server was not active"); - } - float actual = behaviour.Server_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_float_setsOutValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_float_out_Function(System.Single&)' called when server was not active"); - } - behaviour.Server_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_double_returnsValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Double Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_double_Function()' called when server was not active"); - } - double actual = behaviour.Server_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_double_setsOutValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_double_out_Function(System.Double&)' called when server was not active"); - } - behaviour.Server_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_bool_returnsValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Boolean Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_bool_Function()' called when server was not active"); - } - bool actual = behaviour.Server_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_bool_setsOutValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_bool_out_Function(System.Boolean&)' called when server was not active"); - } - behaviour.Server_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_char_returnsValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Char Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_char_Function()' called when server was not active"); - } - char actual = behaviour.Server_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_char_setsOutValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_char_out_Function(System.Char&)' called when server was not active"); - } - behaviour.Server_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_byte_returnsValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Byte Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_byte_Function()' called when server was not active"); - } - byte actual = behaviour.Server_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_byte_setsOutValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_byte_out_Function(System.Byte&)' called when server was not active"); - } - behaviour.Server_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_int_returnsValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Int32 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_int_Function()' called when server was not active"); - } - int actual = behaviour.Server_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_int_setsOutValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_int_out_Function(System.Int32&)' called when server was not active"); - } - behaviour.Server_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_long_returnsValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Int64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_long_Function()' called when server was not active"); - } - long actual = behaviour.Server_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_long_setsOutValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_long_out_Function(System.Int64&)' called when server was not active"); - } - behaviour.Server_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ulong_returnsValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.UInt64 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_ulong_Function()' called when server was not active"); - } - ulong actual = behaviour.Server_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ulong_setsOutValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_ulong_out_Function(System.UInt64&)' called when server was not active"); - } - behaviour.Server_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_Vector3_returnsValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'UnityEngine.Vector3 Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_Vector3_Function()' called when server was not active"); - } - Vector3 actual = behaviour.Server_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_Vector3_setsOutValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_Vector3_out_Function(UnityEngine.Vector3&)' called when server was not active"); - } - behaviour.Server_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'Mirror.Tests.Generated.Attributes.ClassWithNoConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_ClassWithNoConstructor_Function()' called when server was not active"); - } - ClassWithNoConstructor actual = behaviour.Server_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_ClassWithNoConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithNoConstructor&)' called when server was not active"); - } - behaviour.Server_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'Mirror.Tests.Generated.Attributes.ClassWithConstructor Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_ClassWithConstructor_Function()' called when server was not active"); - } - ClassWithConstructor actual = behaviour.Server_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Server_ClassWithConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - if (!active) - { - LogAssert.Expect(LogType.Warning, "[Server] function 'System.Void Mirror.Tests.Generated.Attributes.AttributeBehaviour_ClassWithNoConstructor::Server_ClassWithConstructor_out_Function(Mirror.Tests.Generated.Attributes.ClassWithConstructor&)' called when server was not active"); - } - behaviour.Server_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_float_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - float actual = behaviour.ClientCallback_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_float_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - behaviour.ClientCallback_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_double_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - double actual = behaviour.ClientCallback_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_double_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - behaviour.ClientCallback_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_bool_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - bool actual = behaviour.ClientCallback_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_bool_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - behaviour.ClientCallback_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_char_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - char actual = behaviour.ClientCallback_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_char_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - behaviour.ClientCallback_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_byte_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - byte actual = behaviour.ClientCallback_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_byte_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - behaviour.ClientCallback_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_int_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - int actual = behaviour.ClientCallback_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_int_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - behaviour.ClientCallback_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_long_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - long actual = behaviour.ClientCallback_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_long_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - behaviour.ClientCallback_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ulong_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - ulong actual = behaviour.ClientCallback_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ulong_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - behaviour.ClientCallback_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_Vector3_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - Vector3 actual = behaviour.ClientCallback_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_Vector3_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - behaviour.ClientCallback_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - ClassWithNoConstructor actual = behaviour.ClientCallback_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - behaviour.ClientCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithConstructor_returnsValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - ClassWithConstructor actual = behaviour.ClientCallback_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ClientCallback_ClassWithConstructor_setsOutValue(bool active) - { - NetworkClient.connectState = active ? ConnectState.Connected : ConnectState.None; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - behaviour.ClientCallback_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_float_returnsValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - float actual = behaviour.ServerCallback_float_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_float_setsOutValue(bool active) - { - NetworkServer.active = active; - - float expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_float : default; - - behaviour.ServerCallback_float_out_Function(out float actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_double_returnsValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - double actual = behaviour.ServerCallback_double_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_double_setsOutValue(bool active) - { - NetworkServer.active = active; - - double expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_double : default; - - behaviour.ServerCallback_double_out_Function(out double actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_bool_returnsValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - bool actual = behaviour.ServerCallback_bool_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_bool_setsOutValue(bool active) - { - NetworkServer.active = active; - - bool expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_bool : default; - - behaviour.ServerCallback_bool_out_Function(out bool actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_char_returnsValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - char actual = behaviour.ServerCallback_char_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_char_setsOutValue(bool active) - { - NetworkServer.active = active; - - char expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_char : default; - - behaviour.ServerCallback_char_out_Function(out char actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_byte_returnsValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - byte actual = behaviour.ServerCallback_byte_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_byte_setsOutValue(bool active) - { - NetworkServer.active = active; - - byte expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_byte : default; - - behaviour.ServerCallback_byte_out_Function(out byte actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_int_returnsValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - int actual = behaviour.ServerCallback_int_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_int_setsOutValue(bool active) - { - NetworkServer.active = active; - - int expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_int : default; - - behaviour.ServerCallback_int_out_Function(out int actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_long_returnsValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - long actual = behaviour.ServerCallback_long_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_long_setsOutValue(bool active) - { - NetworkServer.active = active; - - long expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_long : default; - - behaviour.ServerCallback_long_out_Function(out long actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ulong_returnsValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - ulong actual = behaviour.ServerCallback_ulong_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ulong_setsOutValue(bool active) - { - NetworkServer.active = active; - - ulong expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ulong : default; - - behaviour.ServerCallback_ulong_out_Function(out ulong actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_Vector3_returnsValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - Vector3 actual = behaviour.ServerCallback_Vector3_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_Vector3_setsOutValue(bool active) - { - NetworkServer.active = active; - - Vector3 expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_Vector3 : default; - - behaviour.ServerCallback_Vector3_out_Function(out Vector3 actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithNoConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - ClassWithNoConstructor actual = behaviour.ServerCallback_ClassWithNoConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithNoConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithNoConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithNoConstructor : default; - - behaviour.ServerCallback_ClassWithNoConstructor_out_Function(out ClassWithNoConstructor actual); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithConstructor_returnsValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - ClassWithConstructor actual = behaviour.ServerCallback_ClassWithConstructor_Function(); - - Assert.AreEqual(expected, actual); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void ServerCallback_ClassWithConstructor_setsOutValue(bool active) - { - NetworkServer.active = active; - - ClassWithConstructor expected = active ? AttributeBehaviour_ClassWithNoConstructor.Expected_ClassWithConstructor : default; - - behaviour.ServerCallback_ClassWithConstructor_out_Function(out ClassWithConstructor actual); - - Assert.AreEqual(expected, actual); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs.meta b/Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs.meta deleted file mode 100644 index 3e05bedb0..000000000 --- a/Assets/Mirror/Tests/Editor/Generated/AttritubeTest.gen.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e49c298f22d4292439dc17f7e59f08b7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs b/Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs deleted file mode 100644 index 081b7f4c0..000000000 --- a/Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs +++ /dev/null @@ -1,1049 +0,0 @@ -// Generated by CollectionWriterGenerator.cs -using System; -using System.Collections.Generic; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.Generated.CollectionWriters -{ - public struct FloatStringStruct - { - public float value; - public string anotherValue; - } - - public class ClassWithNoConstructor - { - public int a; - } - - public class Array_int_Test - { - public struct Message : NetworkMessage - { - public int[] collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - int[] unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new int[] {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - int[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new int[] - { - 3, 4, 5 - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - int[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo(3)); - Assert.That(unpackedCollection[1], Is.EqualTo(4)); - Assert.That(unpackedCollection[2], Is.EqualTo(5)); - } - } - - public class Array_string_Test - { - public struct Message : NetworkMessage - { - public string[] collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - string[] unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new string[] {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - string[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new string[] - { - "Some", "String", "Value" - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - string[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo("Some")); - Assert.That(unpackedCollection[1], Is.EqualTo("String")); - Assert.That(unpackedCollection[2], Is.EqualTo("Value")); - } - } - - public class Array_Vector3_Test - { - public struct Message : NetworkMessage - { - public Vector3[] collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - Vector3[] unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new Vector3[] {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - Vector3[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new Vector3[] - { - new Vector3(1, 2, 3), new Vector3(4, 5, 6), new Vector3(7, 8, 9) - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - Vector3[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo(new Vector3(1, 2, 3))); - Assert.That(unpackedCollection[1], Is.EqualTo(new Vector3(4, 5, 6))); - Assert.That(unpackedCollection[2], Is.EqualTo(new Vector3(7, 8, 9))); - } - } - - public class Array_FloatStringStruct_Test - { - public struct Message : NetworkMessage - { - public FloatStringStruct[] collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - FloatStringStruct[] unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new FloatStringStruct[] {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - FloatStringStruct[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new FloatStringStruct[] - { - new FloatStringStruct { value = 3, anotherValue = "Some" }, new FloatStringStruct { value = 4, anotherValue = "String" }, new FloatStringStruct { value = 5, anotherValue = "Values" } - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - FloatStringStruct[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo(new FloatStringStruct { value = 3, anotherValue = "Some" })); - Assert.That(unpackedCollection[1], Is.EqualTo(new FloatStringStruct { value = 4, anotherValue = "String" })); - Assert.That(unpackedCollection[2], Is.EqualTo(new FloatStringStruct { value = 5, anotherValue = "Values" })); - } - } - - public class Array_ClassWithNoConstructor_Test - { - public struct Message : NetworkMessage - { - public ClassWithNoConstructor[] collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ClassWithNoConstructor[] unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new ClassWithNoConstructor[] {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ClassWithNoConstructor[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new ClassWithNoConstructor[] - { - new ClassWithNoConstructor { a = 3 }, new ClassWithNoConstructor { a = 4 }, new ClassWithNoConstructor { a = 5 } - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ClassWithNoConstructor[] unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0].a, Is.EqualTo(new ClassWithNoConstructor { a = 3 }.a)); - Assert.That(unpackedCollection[1].a, Is.EqualTo(new ClassWithNoConstructor { a = 4 }.a)); - Assert.That(unpackedCollection[2].a, Is.EqualTo(new ClassWithNoConstructor { a = 5 }.a)); - } - } - - public class ArraySegment_int_Test - { - public struct Message : NetworkMessage - { - public ArraySegment collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection.Array, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - int[] array = new int[] - { - default, - default, - default, - }; - - Message message = new Message - { - collection = new ArraySegment(array, 0, 0) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsEmpty(unpackedCollection.Array); - } - - [Test] - public void SendsData() - { - int[] array = new int[] - { - default, - 3, 4, 5, - default, - default, - default, - }; - - - Message message = new Message - { - collection = new ArraySegment(array, 1, 3) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsNotEmpty(unpackedCollection.Array); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 0], Is.EqualTo(3)); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 1], Is.EqualTo(4)); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 2], Is.EqualTo(5)); - } - } - - public class ArraySegment_string_Test - { - public struct Message : NetworkMessage - { - public ArraySegment collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection.Array, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - string[] array = new string[] - { - default, - default, - default, - }; - - Message message = new Message - { - collection = new ArraySegment(array, 0, 0) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsEmpty(unpackedCollection.Array); - } - - [Test] - public void SendsData() - { - string[] array = new string[] - { - default, - "Some", "String", "Value", - default, - default, - default, - }; - - - Message message = new Message - { - collection = new ArraySegment(array, 1, 3) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsNotEmpty(unpackedCollection.Array); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 0], Is.EqualTo("Some")); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 1], Is.EqualTo("String")); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 2], Is.EqualTo("Value")); - } - } - - public class ArraySegment_Vector3_Test - { - public struct Message : NetworkMessage - { - public ArraySegment collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection.Array, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Vector3[] array = new Vector3[] - { - default, - default, - default, - }; - - Message message = new Message - { - collection = new ArraySegment(array, 0, 0) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsEmpty(unpackedCollection.Array); - } - - [Test] - public void SendsData() - { - Vector3[] array = new Vector3[] - { - default, - new Vector3(1, 2, 3), new Vector3(4, 5, 6), new Vector3(7, 8, 9), - default, - default, - default, - }; - - - Message message = new Message - { - collection = new ArraySegment(array, 1, 3) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsNotEmpty(unpackedCollection.Array); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 0], Is.EqualTo(new Vector3(1, 2, 3))); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 1], Is.EqualTo(new Vector3(4, 5, 6))); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 2], Is.EqualTo(new Vector3(7, 8, 9))); - } - } - - public class ArraySegment_FloatStringStruct_Test - { - public struct Message : NetworkMessage - { - public ArraySegment collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection.Array, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - FloatStringStruct[] array = new FloatStringStruct[] - { - default, - default, - default, - }; - - Message message = new Message - { - collection = new ArraySegment(array, 0, 0) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsEmpty(unpackedCollection.Array); - } - - [Test] - public void SendsData() - { - FloatStringStruct[] array = new FloatStringStruct[] - { - default, - new FloatStringStruct { value = 3, anotherValue = "Some" }, new FloatStringStruct { value = 4, anotherValue = "String" }, new FloatStringStruct { value = 5, anotherValue = "Values" }, - default, - default, - default, - }; - - - Message message = new Message - { - collection = new ArraySegment(array, 1, 3) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsNotEmpty(unpackedCollection.Array); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 0], Is.EqualTo(new FloatStringStruct { value = 3, anotherValue = "Some" })); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 1], Is.EqualTo(new FloatStringStruct { value = 4, anotherValue = "String" })); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 2], Is.EqualTo(new FloatStringStruct { value = 5, anotherValue = "Values" })); - } - } - - public class ArraySegment_ClassWithNoConstructor_Test - { - public struct Message : NetworkMessage - { - public ArraySegment collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection.Array, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - ClassWithNoConstructor[] array = new ClassWithNoConstructor[] - { - default, - default, - default, - }; - - Message message = new Message - { - collection = new ArraySegment(array, 0, 0) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsEmpty(unpackedCollection.Array); - } - - [Test] - public void SendsData() - { - ClassWithNoConstructor[] array = new ClassWithNoConstructor[] - { - default, - new ClassWithNoConstructor { a = 3 }, new ClassWithNoConstructor { a = 4 }, new ClassWithNoConstructor { a = 5 }, - default, - default, - default, - }; - - - Message message = new Message - { - collection = new ArraySegment(array, 1, 3) - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - ArraySegment unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection.Array); - Assert.IsNotEmpty(unpackedCollection.Array); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 0].a, Is.EqualTo(new ClassWithNoConstructor { a = 3 }.a)); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 1].a, Is.EqualTo(new ClassWithNoConstructor { a = 4 }.a)); - Assert.That(unpackedCollection.Array[unpackedCollection.Offset + 2].a, Is.EqualTo(new ClassWithNoConstructor { a = 5 }.a)); - } - } - - public class List_int_Test - { - public struct Message : NetworkMessage - { - public List collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new List {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new List - { - 3, 4, 5 - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo(3)); - Assert.That(unpackedCollection[1], Is.EqualTo(4)); - Assert.That(unpackedCollection[2], Is.EqualTo(5)); - } - } - - public class List_string_Test - { - public struct Message : NetworkMessage - { - public List collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new List {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new List - { - "Some", "String", "Value" - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo("Some")); - Assert.That(unpackedCollection[1], Is.EqualTo("String")); - Assert.That(unpackedCollection[2], Is.EqualTo("Value")); - } - } - - public class List_Vector3_Test - { - public struct Message : NetworkMessage - { - public List collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new List {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new List - { - new Vector3(1, 2, 3), new Vector3(4, 5, 6), new Vector3(7, 8, 9) - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo(new Vector3(1, 2, 3))); - Assert.That(unpackedCollection[1], Is.EqualTo(new Vector3(4, 5, 6))); - Assert.That(unpackedCollection[2], Is.EqualTo(new Vector3(7, 8, 9))); - } - } - - public class List_FloatStringStruct_Test - { - public struct Message : NetworkMessage - { - public List collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new List {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new List - { - new FloatStringStruct { value = 3, anotherValue = "Some" }, new FloatStringStruct { value = 4, anotherValue = "String" }, new FloatStringStruct { value = 5, anotherValue = "Values" } - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0], Is.EqualTo(new FloatStringStruct { value = 3, anotherValue = "Some" })); - Assert.That(unpackedCollection[1], Is.EqualTo(new FloatStringStruct { value = 4, anotherValue = "String" })); - Assert.That(unpackedCollection[2], Is.EqualTo(new FloatStringStruct { value = 5, anotherValue = "Values" })); - } - } - - public class List_ClassWithNoConstructor_Test - { - public struct Message : NetworkMessage - { - public List collection; - } - - [Test] - public void SendsNull() - { - Message message = new Message - { - collection = default - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.That(unpackedCollection, Is.Null.Or.Empty); - } - - [Test] - public void SendsEmpty() - { - Message message = new Message - { - collection = new List {} - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsEmpty(unpackedCollection); - } - - [Test] - public void SendsData() - { - Message message = new Message - { - collection = new List - { - new ClassWithNoConstructor { a = 3 }, new ClassWithNoConstructor { a = 4 }, new ClassWithNoConstructor { a = 5 } - } - }; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - Message unpacked = MessagePackingTest.UnpackFromByteArray(data); - List unpackedCollection = unpacked.collection; - - Assert.IsNotNull(unpackedCollection); - Assert.IsNotEmpty(unpackedCollection); - Assert.That(unpackedCollection[0].a, Is.EqualTo(new ClassWithNoConstructor { a = 3 }.a)); - Assert.That(unpackedCollection[1].a, Is.EqualTo(new ClassWithNoConstructor { a = 4 }.a)); - Assert.That(unpackedCollection[2].a, Is.EqualTo(new ClassWithNoConstructor { a = 5 }.a)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs.meta b/Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs.meta deleted file mode 100644 index 28a873611..000000000 --- a/Assets/Mirror/Tests/Editor/Generated/CollectionWriterTests.gen.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c573b90d8949dec4cafb4f7401be9950 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Grid2DTests.cs b/Assets/Mirror/Tests/Editor/Grid2DTests.cs deleted file mode 100644 index b3a608542..000000000 --- a/Assets/Mirror/Tests/Editor/Grid2DTests.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Collections.Generic; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class Grid2DTests - { - Grid2D grid = new Grid2D(); - - [Test] - public void AddAndGetNeighbours() - { - // add two at (0, 0) - grid.Add(Vector2Int.zero, 1); - grid.Add(Vector2Int.zero, 2); - HashSet result = new HashSet(); - grid.GetWithNeighbours(Vector2Int.zero, result); - Assert.That(result.Count, Is.EqualTo(2)); - Assert.That(result.Contains(1), Is.True); - Assert.That(result.Contains(2), Is.True); - - // add a neighbour at (1, 1) - grid.Add(new Vector2Int(1, 1), 3); - grid.GetWithNeighbours(Vector2Int.zero, result); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.Contains(1), Is.True); - Assert.That(result.Contains(2), Is.True); - Assert.That(result.Contains(3), Is.True); - } - - [Test] - public void GetIgnoresTooFarNeighbours() - { - // add at (0, 0) - grid.Add(Vector2Int.zero, 1); - - // get at (2, 0) which is out of 9 neighbour radius - HashSet result = new HashSet(); - grid.GetWithNeighbours(new Vector2Int(2, 0), result); - Assert.That(result.Count, Is.EqualTo(0)); - } - - [Test] - public void ClearNonAlloc() - { - // add some - grid.Add(Vector2Int.zero, 1); - grid.Add(Vector2Int.zero, 2); - - // clear and check if empty now - grid.ClearNonAlloc(); - HashSet result = new HashSet(); - grid.GetWithNeighbours(Vector2Int.zero, result); - Assert.That(result.Count, Is.EqualTo(0)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Grid2DTests.cs.meta b/Assets/Mirror/Tests/Editor/Grid2DTests.cs.meta deleted file mode 100644 index 2f71bbdc1..000000000 --- a/Assets/Mirror/Tests/Editor/Grid2DTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f8f3c4f37bb54824b5dfe70e0984b3d3 -timeCreated: 1613188745 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs b/Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs deleted file mode 100644 index 8b57a8966..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs +++ /dev/null @@ -1,95 +0,0 @@ -// default = no component = everyone sees everyone -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public abstract class InterestManagementTests_Common : MirrorEditModeTest - { - protected GameObject gameObjectA; - protected NetworkIdentity identityA; - protected NetworkConnectionToClient connectionA; - - protected GameObject gameObjectB; - protected NetworkIdentity identityB; - protected NetworkConnectionToClient connectionB; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // A with connectionId = 0x0A, netId = 0xAA - CreateNetworked(out gameObjectA, out identityA); - connectionA = new NetworkConnectionToClient(0x0A); - connectionA.isAuthenticated = true; - connectionA.isReady = true; - connectionA.identity = identityA; - NetworkServer.spawned[0xAA] = identityA; - - // B - CreateNetworked(out gameObjectB, out identityB); - connectionB = new NetworkConnectionToClient(0x0B); - connectionB.isAuthenticated = true; - connectionB.isReady = true; - connectionB.identity = identityB; - NetworkServer.spawned[0xBB] = identityB; - - // need to start server so that interest management works - NetworkServer.Listen(10); - - // add both connections - NetworkServer.connections[connectionA.connectionId] = connectionA; - NetworkServer.connections[connectionB.connectionId] = connectionB; - - // spawn both so that .observers is created - NetworkServer.Spawn(gameObjectA, connectionA); - NetworkServer.Spawn(gameObjectB, connectionB); - - // spawn already runs interest management once - // clear observers and observing so tests can start from scratch - identityA.observers.Clear(); - identityB.observers.Clear(); - connectionA.observing.Clear(); - connectionB.observing.Clear(); - } - - [TearDown] - public override void TearDown() - { - // set isServer is false. otherwise Destroy instead of - // DestroyImmediate is called internally, giving an error in Editor - identityA.isServer = false; - - // set isServer is false. otherwise Destroy instead of - // DestroyImmediate is called internally, giving an error in Editor - identityB.isServer = false; - - // clear connections first. calling OnDisconnect wouldn't work since - // we have no real clients. - NetworkServer.connections.Clear(); - - base.TearDown(); - } - - // player should always see self no matter what - [Test] - public void PlayerAlwaysSeesSelf_Initial() - { - // rebuild for A - // initial rebuild adds all connections if no interest management available - NetworkServer.RebuildObservers(identityA, true); - - // should see self - Assert.That(identityA.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // forceHidden should still work - [Test] - public abstract void ForceHidden_Initial(); - - // forceShown should still work - [Test] - public abstract void ForceShown_Initial(); - } -} diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs.meta b/Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs.meta deleted file mode 100644 index fa5a3884a..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_Common.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f0349d2e3a74454e9dc8badec1db0289 -timeCreated: 1613049868 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs b/Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs deleted file mode 100644 index f33505d40..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs +++ /dev/null @@ -1,62 +0,0 @@ -// default = no component = everyone sees everyone -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class InterestManagementTests_Default : InterestManagementTests_Common - { - // no interest management (default) - // => forceHidden should still work - [Test] - public override void ForceHidden_Initial() - { - // force hide A - identityA.visible = Visibility.ForceHidden; - - // rebuild for both - // initial rebuild adds all connections if no interest management available - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // A should not be seen by B because A is force hidden - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - // B should be seen by A because - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // no interest management (default) - // => forceShown should still work - [Test] - public override void ForceShown_Initial() - { - // force show A - identityA.visible = Visibility.ForceShown; - - // rebuild for both - // initial rebuild adds all connections if no interest management available - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // both should see each other because by default, everyone sees everyone - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // no interest management (default) - // => everyone should see everyone - [Test] - public void EveryoneSeesEveryone_Initial() - { - // rebuild for both - // initial rebuild adds all connections if no interest management available - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // both should see each other - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // TODO add tests to make sure old observers are removed etc. - } -} diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs.meta b/Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs.meta deleted file mode 100644 index 96ed6142a..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_Default.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c5ac1fc2c25043378f80bc02d868a5d6 -timeCreated: 1613042576 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs b/Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs deleted file mode 100644 index 9d8cf35a6..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs +++ /dev/null @@ -1,142 +0,0 @@ -// Vector3.Distance based -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class InterestManagementTests_Distance : InterestManagementTests_Common - { - DistanceInterestManagement aoi; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // create AOI GameObject - CreateGameObject(out GameObject go, out aoi); - aoi.visRange = 10; - // setup server aoi since InterestManagement Awake isn't called - NetworkServer.aoi = aoi; - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - // clear server aoi again - NetworkServer.aoi = null; - } - - // brute force interest management - // => forceHidden should still work - [Test] - public override void ForceHidden_Initial() - { - // A and B are at (0,0,0) so within range! - - // force hide A - identityA.visible = Visibility.ForceHidden; - - // rebuild for both - // initial rebuild while both are within range - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // A should not be seen by B because A is force hidden - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - // B should be seen by A because - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // brute force interest management - // => forceHidden should still work - [Test] - public override void ForceShown_Initial() - { - // A and B are too far from each other - identityB.transform.position = Vector3.right * (aoi.visRange + 1); - - // force show A - identityA.visible = Visibility.ForceShown; - - // rebuild for both - // initial rebuild while both are within range - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // A should see B because A is force shown - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - // B should not be seen by A because they are too far from each other - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.False); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void InRange_Initial() - { - // A and B are at (0,0,0) so within range! - - // rebuild for both - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // both should see each other because they are in range - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void InRange_NotInitial() - { - // A and B are at (0,0,0) so within range! - - // rebuild for both - NetworkServer.RebuildObservers(identityA, false); - NetworkServer.RebuildObservers(identityB, false); - - // both should see each other because they are in range - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void OutOfRange_Initial() - { - // A and B are too far from each other - identityB.transform.position = Vector3.right * (aoi.visRange + 1); - - // rebuild for boths - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // both should not see each other - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.False); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void OutOfRange_NotInitial() - { - // A and B are too far from each other - identityB.transform.position = Vector3.right * (aoi.visRange + 1); - - // rebuild for boths - NetworkServer.RebuildObservers(identityA, false); - NetworkServer.RebuildObservers(identityB, false); - - // both should not see each other - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.False); - } - - // TODO add tests to make sure old observers are removed etc. - } -} diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs.meta b/Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs.meta deleted file mode 100644 index 269736062..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_Distance.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ffb9dc0ff01e4f979c216984d7fc48d0 -timeCreated: 1613049838 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs b/Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs deleted file mode 100644 index 78a3b9090..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs +++ /dev/null @@ -1,154 +0,0 @@ -// default = no component = everyone sees everyone -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class InterestManagementTests_SpatialHashing : InterestManagementTests_Common - { - SpatialHashingInterestManagement aoi; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // create spatial hashing object & component - CreateGameObject(out GameObject go, out aoi); - aoi.visRange = 10; - // setup server aoi since InterestManagement Awake isn't called - NetworkServer.aoi = aoi; - - // rebuild grid once so the two connections are in there - aoi.Update(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - // clear server aoi again - NetworkServer.aoi = null; - } - - // brute force interest management - // => forceHidden should still work - [Test] - public override void ForceHidden_Initial() - { - // A and B are at (0,0,0) so within range! - - // force hide A - identityA.visible = Visibility.ForceHidden; - - // rebuild for both - // initial rebuild while both are within range - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // A should not be seen by B because A is force hidden - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - // B should be seen by A because - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // brute force interest management - // => forceShown should still work - [Test] - public override void ForceShown_Initial() - { - // A and B are too far from each other - identityB.transform.position = Vector3.right * (aoi.visRange + 1); - - // force show A - identityA.visible = Visibility.ForceShown; - - // update grid now that positions were changed - aoi.Update(); - - // rebuild for both - // initial rebuild while both are within range - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // A should see B because A is force shown - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - // B should not be seen by A because they are too far from each other - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.False); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void InRange_Initial() - { - // A and B are at (0,0,0) so within range! - - // rebuild for both - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // both should see each other because they are in range - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void InRange_NotInitial() - { - // A and B are at (0,0,0) so within range! - - // rebuild for both - NetworkServer.RebuildObservers(identityA, false); - NetworkServer.RebuildObservers(identityB, false); - - // both should see each other because they are in range - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.True); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.True); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void OutOfRange_Initial() - { - // A and B are too far from each other - identityB.transform.position = Vector3.right * (aoi.visRange + 1); - - // update grid now that positions were changed - aoi.Update(); - - // rebuild for boths - NetworkServer.RebuildObservers(identityA, true); - NetworkServer.RebuildObservers(identityB, true); - - // both should not see each other - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.False); - } - - // brute force interest management - // => everyone should see everyone if in range - [Test] - public void OutOfRange_NotInitial() - { - // A and B are too far from each other - identityB.transform.position = Vector3.right * (aoi.visRange + 1); - - // update grid now that positions were changed - aoi.Update(); - - // rebuild for boths - NetworkServer.RebuildObservers(identityA, false); - NetworkServer.RebuildObservers(identityB, false); - - // both should not see each other - Assert.That(identityA.observers.ContainsKey(connectionB.connectionId), Is.False); - Assert.That(identityB.observers.ContainsKey(connectionA.connectionId), Is.False); - } - - // TODO add tests to make sure old observers are removed etc. - } -} diff --git a/Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs.meta b/Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs.meta deleted file mode 100644 index 8f145f0a4..000000000 --- a/Assets/Mirror/Tests/Editor/InterestManagementTests_SpatialHashing.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 63d9e0d6aa9a4eec8b4e2db07e6261bf -timeCreated: 1613117841 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/LocalConnectionTest.cs b/Assets/Mirror/Tests/Editor/LocalConnectionTest.cs deleted file mode 100644 index 9fe986b94..000000000 --- a/Assets/Mirror/Tests/Editor/LocalConnectionTest.cs +++ /dev/null @@ -1,71 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class LocalConnectionTest : MirrorTest - { - struct TestMessage : NetworkMessage {} - - LocalConnectionToClient connectionToClient; - LocalConnectionToServer connectionToServer; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - CreateLocalConnectionPair(out connectionToClient, out connectionToServer); - - // set up server/client connections so message handling works - NetworkClient.connection = connectionToServer; - NetworkServer.connections[connectionToClient.connectionId] = connectionToClient; - } - - [TearDown] - public override void TearDown() - { - connectionToServer.Disconnect(); - base.TearDown(); - } - - [Test] - public void ClientToServerTest() - { - Assert.That(connectionToClient.address, Is.EqualTo("localhost")); - - bool invoked = false; - void Handler(NetworkConnection conn, TestMessage message) - { - invoked = true; - } - - // set up handler on the server connection - NetworkServer.RegisterHandler(Handler, false); - - connectionToServer.Send(new TestMessage()); - connectionToServer.Update(); - - Assert.True(invoked, "handler should have been invoked"); - } - - [Test] - public void ServerToClient() - { - Assert.That(connectionToServer.address, Is.EqualTo("localhost")); - - bool invoked = false; - void Handler(TestMessage message) - { - invoked = true; - } - - // set up handler on the client connection - NetworkClient.RegisterHandler(Handler, false); - - connectionToClient.Send(new TestMessage()); - connectionToServer.Update(); - - Assert.True(invoked, "handler should have been invoked"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/LocalConnectionTest.cs.meta b/Assets/Mirror/Tests/Editor/LocalConnectionTest.cs.meta deleted file mode 100644 index a1a525792..000000000 --- a/Assets/Mirror/Tests/Editor/LocalConnectionTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 405841e2a21c64d7585d5c71d06ffff2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs b/Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs deleted file mode 100644 index 89a84b7a5..000000000 --- a/Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs +++ /dev/null @@ -1,125 +0,0 @@ -// TODO Send only supports structs. Consider removing those tests. -using NUnit.Framework; - -namespace Mirror.Tests.MessageTests -{ - class ParentMessage : NetworkMessage - { - public int parentValue; - } - - class ChildMessage : ParentMessage - { - public int childValue; - } - - - public abstract class RequestMessageBase : NetworkMessage - { - public int responseId = 0; - } - public class ResponseMessage : RequestMessageBase - { - public int state; - public string message = ""; - public int errorCode = 0; // optional for error codes - } - - //reverseOrder to test this https://github.com/vis2k/Mirror/issues/1925 - public class ResponseMessageReverse : RequestMessageBaseReverse - { - public int state; - public string message = ""; - public int errorCode = 0; // optional for error codes - } - public abstract class RequestMessageBaseReverse : NetworkMessage - { - public int responseId = 0; - } - - [TestFixture] - public class MessageInheritanceTest - { - [Test] - public void SendsVauesInParentAndChildClass() - { - NetworkWriter writer = new NetworkWriter(); - - writer.Write(new ChildMessage - { - parentValue = 3, - childValue = 4 - }); - - byte[] arr = writer.ToArray(); - - NetworkReader reader = new NetworkReader(arr); - ChildMessage received = reader.Read(); - - Assert.AreEqual(3, received.parentValue); - Assert.AreEqual(4, received.childValue); - - int writeLength = writer.Position; - int readLength = reader.Position; - Assert.That(writeLength == readLength, $"OnSerializeAll and OnDeserializeAll calls write the same amount of data\n writeLength={writeLength}\n readLength={readLength}"); - } - - [Test] - public void SendsVauesWhenUsingAbstractClass() - { - NetworkWriter writer = new NetworkWriter(); - - const int state = 2; - const string message = "hello world"; - const int responseId = 5; - writer.Write(new ResponseMessage - { - state = state, - message = message, - responseId = responseId, - }); - - byte[] arr = writer.ToArray(); - - NetworkReader reader = new NetworkReader(arr); - ResponseMessage received = reader.Read(); - - Assert.AreEqual(state, received.state); - Assert.AreEqual(message, received.message); - Assert.AreEqual(responseId, received.responseId); - - int writeLength = writer.Position; - int readLength = reader.Position; - Assert.That(writeLength == readLength, $"OnSerializeAll and OnDeserializeAll calls write the same amount of data\n writeLength={writeLength}\n readLength={readLength}"); - } - - [Test] - public void SendsVauesWhenUsingAbstractClassReverseDefineOrder() - { - NetworkWriter writer = new NetworkWriter(); - - const int state = 2; - const string message = "hello world"; - const int responseId = 5; - writer.Write(new ResponseMessageReverse - { - state = state, - message = message, - responseId = responseId, - }); - - byte[] arr = writer.ToArray(); - - NetworkReader reader = new NetworkReader(arr); - ResponseMessageReverse received = reader.Read(); - - Assert.AreEqual(state, received.state); - Assert.AreEqual(message, received.message); - Assert.AreEqual(responseId, received.responseId); - - int writeLength = writer.Position; - int readLength = reader.Position; - Assert.That(writeLength == readLength, $"OnSerializeAll and OnDeserializeAll calls write the same amount of data\n writeLength={writeLength}\n readLength={readLength}"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs.meta b/Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs.meta deleted file mode 100644 index 4e78acae8..000000000 --- a/Assets/Mirror/Tests/Editor/MessageInheritanceTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 808855b645f9843d2b3077ab1304b2b3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/MessagePackingTest.cs b/Assets/Mirror/Tests/Editor/MessagePackingTest.cs deleted file mode 100644 index 570edb435..000000000 --- a/Assets/Mirror/Tests/Editor/MessagePackingTest.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using Mirror.Tests.MessageTests; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - [TestFixture] - public class MessagePackingTest - { - public struct EmptyMessage : NetworkMessage {} - - // helper function to pack message into a simple byte[] - public static byte[] PackToByteArray(T message) - where T : struct, NetworkMessage - { - using (PooledNetworkWriter writer = NetworkWriterPool.GetWriter()) - { - MessagePacking.Pack(message, writer); - return writer.ToArray(); - } - } - - // unpack a message we received - public static T UnpackFromByteArray(byte[] data) - where T : struct, NetworkMessage - { - using (PooledNetworkReader networkReader = NetworkReaderPool.GetReader(data)) - { - int msgType = MessagePacking.GetId(); - - int id = networkReader.ReadUShort(); - if (id != msgType) - throw new FormatException($"Invalid message, could not unpack {typeof(T).FullName}"); - - return networkReader.Read(); - } - } - - // message id is generated from message.FullName. - // should be consistent across all platforms. - [Test] - public void GetId() - { - // "Mirror.Tests.MessageTests.TestMessage" - Debug.Log(typeof(TestMessage).FullName); - Assert.That(MessagePacking.GetId(), Is.EqualTo(0x8706)); - } - - [Test] - public void TestPacking() - { - SceneMessage message = new SceneMessage() - { - sceneName = "Hello world", - sceneOperation = SceneOperation.LoadAdditive - }; - - byte[] data = PackToByteArray(message); - - SceneMessage unpacked = UnpackFromByteArray(data); - - Assert.That(unpacked.sceneName, Is.EqualTo("Hello world")); - Assert.That(unpacked.sceneOperation, Is.EqualTo(SceneOperation.LoadAdditive)); - } - - [Test] - public void UnpackWrongMessage() - { - SpawnMessage message = new SpawnMessage(); - - byte[] data = PackToByteArray(message); - - Assert.Throws(() => - { - ReadyMessage unpacked = UnpackFromByteArray(data); - }); - } - - [Test] - public void TestUnpackIdMismatch() - { - // Unpack has a id != msgType case that throws a FormatException. - // let's try to trigger it. - - SceneMessage message = new SceneMessage() - { - sceneName = "Hello world", - sceneOperation = SceneOperation.LoadAdditive - }; - - byte[] data = PackToByteArray(message); - - // overwrite the id - data[0] = 0x01; - data[1] = 0x02; - - Assert.Throws(() => - { - SceneMessage unpacked = UnpackFromByteArray(data); - }); - } - - [Test] - public void TestUnpackMessageNonGeneric() - { - // try a regular message - SceneMessage message = new SceneMessage() - { - sceneName = "Hello world", - sceneOperation = SceneOperation.LoadAdditive - }; - - byte[] data = PackToByteArray(message); - NetworkReader reader = new NetworkReader(data); - - bool result = MessagePacking.Unpack(reader, out ushort msgType); - Assert.That(result, Is.EqualTo(true)); - Assert.That(msgType, Is.EqualTo(BitConverter.ToUInt16(data, 0))); - } - - [Test] - public void UnpackInvalidMessage() - { - // try an invalid message - NetworkReader reader2 = new NetworkReader(new byte[0]); - bool result2 = MessagePacking.Unpack(reader2, out ushort msgType2); - Assert.That(result2, Is.EqualTo(false)); - Assert.That(msgType2, Is.EqualTo(0)); - } - - [Test] - public void MessageIdIsCorrectLength() - { - NetworkWriter writer = new NetworkWriter(); - MessagePacking.Pack(new EmptyMessage(), writer); - - ArraySegment segment = writer.ToArraySegment(); - - Assert.That(segment.Count, Is.EqualTo(MessagePacking.HeaderSize), "Empty message should have same size as HeaderSize"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/MessagePackingTest.cs.meta b/Assets/Mirror/Tests/Editor/MessagePackingTest.cs.meta deleted file mode 100644 index 70e62403b..000000000 --- a/Assets/Mirror/Tests/Editor/MessagePackingTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8d57c17d9ee7c49e6bacc54ddbeac751 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs b/Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs deleted file mode 100644 index bb24fd8d9..000000000 --- a/Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs +++ /dev/null @@ -1,386 +0,0 @@ -using System; -using System.IO; -using NSubstitute; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class MyMiddleware : MiddlewareTransport {} - - [Description("Test to make sure inner methods are called when using Middleware Transport")] - public class MiddlewareTransportTest - { - Transport inner; - MyMiddleware middleware; - - [SetUp] - public void Setup() - { - inner = Substitute.For(); - - GameObject gameObject = new GameObject(); - - middleware = gameObject.AddComponent(); - middleware.inner = inner; - } - - [TearDown] - public void TearDown() - { - GameObject.DestroyImmediate(middleware.gameObject); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void TestAvailable(bool available) - { - inner.Available().Returns(available); - - Assert.That(middleware.Available(), Is.EqualTo(available)); - - inner.Received(1).Available(); - } - - [Test] - [TestCase(Channels.Reliable, 4000)] - [TestCase(Channels.Reliable, 2000)] - [TestCase(Channels.Unreliable, 4000)] - public void TestGetMaxPacketSize(int channel, int packageSize) - { - inner.GetMaxPacketSize(Arg.Any()).Returns(packageSize); - - Assert.That(middleware.GetMaxPacketSize(channel), Is.EqualTo(packageSize)); - - inner.Received(1).GetMaxPacketSize(Arg.Is(x => x == channel)); - inner.Received(0).GetMaxPacketSize(Arg.Is(x => x != channel)); - } - - [Test] - public void TestShutdown() - { - middleware.Shutdown(); - - inner.Received(1).Shutdown(); - } - - [Test] - [TestCase("localhost")] - [TestCase("example.com")] - public void TestClientConnect(string address) - { - middleware.ClientConnect(address); - - inner.Received(1).ClientConnect(address); - inner.Received(0).ClientConnect(Arg.Is(x => x != address)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void TestClientConnected(bool connected) - { - inner.ClientConnected().Returns(connected); - - Assert.That(middleware.ClientConnected(), Is.EqualTo(connected)); - - inner.Received(1).ClientConnected(); - } - - [Test] - public void TestClientDisconnect() - { - middleware.ClientDisconnect(); - - inner.Received(1).ClientDisconnect(); - } - - [Test] - [TestCase(Channels.Reliable)] - [TestCase(Channels.Unreliable)] - public void TestClientSend(int channel) - { - byte[] array = new byte[10]; - const int offset = 2; - const int count = 5; - ArraySegment segment = new ArraySegment(array, offset, count); - - middleware.ClientSend(segment, channel); - - inner.Received(1).ClientSend(Arg.Is>(x => x.Array == array && x.Offset == offset && x.Count == count), channel); - inner.Received(0).ClientSend(Arg.Any>(), Arg.Is(x => x != channel)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void TestServerActive(bool active) - { - inner.ServerActive().Returns(active); - - Assert.That(middleware.ServerActive(), Is.EqualTo(active)); - - inner.Received(1).ServerActive(); - } - - [Test] - public void TestServerStart() - { - middleware.ServerStart(); - - inner.Received(1).ServerStart(); - } - - [Test] - public void TestServerStop() - { - middleware.ServerStop(); - - inner.Received(1).ServerStop(); - } - - [Test] - [TestCase(0, 0)] - [TestCase(1, 0)] - [TestCase(0, 1)] - [TestCase(19, 1)] - public void TestServerSend(int id, int channel) - { - byte[] array = new byte[10]; - const int offset = 2; - const int count = 5; - ArraySegment segment = new ArraySegment(array, offset, count); - - middleware.ServerSend(id, segment, channel); - - inner.Received(1).ServerSend(id, Arg.Is>(x => x.Array == array && x.Offset == offset && x.Count == count), channel); - // only need to check first arg, - inner.Received(0).ServerSend(Arg.Is(x => x != id), Arg.Any>(), Arg.Any()); - } - - [Test] - [TestCase(0, "tcp4://localhost:7777")] - [TestCase(19, "tcp4://example.com:7777")] - public void TestServerGetClientAddress(int id, string result) - { - inner.ServerGetClientAddress(id).Returns(result); - - Assert.That(middleware.ServerGetClientAddress(id), Is.EqualTo(result)); - - inner.Received(1).ServerGetClientAddress(id); - inner.Received(0).ServerGetClientAddress(Arg.Is(x => x != id)); - - } - - [Test] - [TestCase("tcp4://localhost:7777")] - [TestCase("tcp4://example.com:7777")] - public void TestServerUri(string address) - { - Uri uri = new Uri(address); - inner.ServerUri().Returns(uri); - - Assert.That(middleware.ServerUri(), Is.EqualTo(uri)); - - inner.Received(1).ServerUri(); - } - - [Test] - public void TestClientConnectedCallback() - { - int called = 0; - middleware.OnClientConnected = () => - { - called++; - }; - // connect to give callback to inner - middleware.ClientConnect("localhost"); - - inner.OnClientConnected.Invoke(); - Assert.That(called, Is.EqualTo(1)); - - inner.OnClientConnected.Invoke(); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - [TestCase(0)] - [TestCase(1)] - public void TestClientDataReceivedCallback(int channel) - { - byte[] data = new byte[4]; - ArraySegment segment = new ArraySegment(data, 1, 2); - - int called = 0; - middleware.OnClientDataReceived = (d, c) => - { - called++; - Assert.That(c, Is.EqualTo(channel)); - Assert.That(d.Array, Is.EqualTo(segment.Array)); - Assert.That(d.Offset, Is.EqualTo(segment.Offset)); - Assert.That(d.Count, Is.EqualTo(segment.Count)); - }; - // connect to give callback to inner - middleware.ClientConnect("localhost"); - - inner.OnClientDataReceived.Invoke(segment, channel); - Assert.That(called, Is.EqualTo(1)); - - - data = new byte[4]; - segment = new ArraySegment(data, 0, 3); - - inner.OnClientDataReceived.Invoke(segment, channel); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - public void TestClientDisconnectedCallback() - { - int called = 0; - middleware.OnClientDisconnected = () => - { - called++; - }; - // connect to give callback to inner - middleware.ClientConnect("localhost"); - - inner.OnClientDisconnected.Invoke(); - Assert.That(called, Is.EqualTo(1)); - - inner.OnClientDisconnected.Invoke(); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - public void TestClientErrorCallback() - { - Exception exception = new InvalidDataException(); - - int called = 0; - middleware.OnClientError = (e) => - { - called++; - Assert.That(e, Is.EqualTo(exception)); - }; - // connect to give callback to inner - middleware.ClientConnect("localhost"); - - inner.OnClientError.Invoke(exception); - Assert.That(called, Is.EqualTo(1)); - - exception = new NullReferenceException(); - - inner.OnClientError.Invoke(exception); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - [TestCase(0)] - [TestCase(1)] - [TestCase(19)] - public void TestServerConnectedCallback(int id) - { - int called = 0; - middleware.OnServerConnected = (i) => - { - called++; - Assert.That(i, Is.EqualTo(id)); - }; - // start to give callback to inner - middleware.ServerStart(); - - inner.OnServerConnected.Invoke(id); - Assert.That(called, Is.EqualTo(1)); - - inner.OnServerConnected.Invoke(id); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - [TestCase(0, 0)] - [TestCase(1, 0)] - [TestCase(19, 0)] - [TestCase(0, 1)] - [TestCase(1, 1)] - [TestCase(19, 1)] - public void TestServerDataReceivedCallback(int id, int channel) - { - byte[] data = new byte[4]; - ArraySegment segment = new ArraySegment(data, 1, 2); - - int called = 0; - middleware.OnServerDataReceived = (i, d, c) => - { - called++; - Assert.That(i, Is.EqualTo(id)); - Assert.That(c, Is.EqualTo(channel)); - Assert.That(d.Array, Is.EqualTo(segment.Array)); - Assert.That(d.Offset, Is.EqualTo(segment.Offset)); - Assert.That(d.Count, Is.EqualTo(segment.Count)); - }; - // start to give callback to inner - middleware.ServerStart(); - - inner.OnServerDataReceived.Invoke(id, segment, channel); - Assert.That(called, Is.EqualTo(1)); - - - data = new byte[4]; - segment = new ArraySegment(data, 0, 3); - - inner.OnServerDataReceived.Invoke(id, segment, channel); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - [TestCase(0)] - [TestCase(1)] - [TestCase(19)] - public void TestServerDisconnectedCallback(int id) - { - int called = 0; - middleware.OnServerDisconnected = (i) => - { - called++; - Assert.That(i, Is.EqualTo(id)); - }; - // start to give callback to inner - middleware.ServerStart(); - - inner.OnServerDisconnected.Invoke(id); - Assert.That(called, Is.EqualTo(1)); - - inner.OnServerDisconnected.Invoke(id); - Assert.That(called, Is.EqualTo(2)); - } - - [Test] - [TestCase(0)] - [TestCase(1)] - [TestCase(19)] - public void TestServerErrorCallback(int id) - { - Exception exception = new InvalidDataException(); - - int called = 0; - middleware.OnServerError = (i, e) => - { - called++; - Assert.That(i, Is.EqualTo(id)); - Assert.That(e, Is.EqualTo(exception)); - }; - // start to give callback to inner - middleware.ServerStart(); - - inner.OnServerError.Invoke(id, exception); - Assert.That(called, Is.EqualTo(1)); - - exception = new NullReferenceException(); - - inner.OnServerError.Invoke(id, exception); - Assert.That(called, Is.EqualTo(2)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs.meta b/Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs.meta deleted file mode 100644 index 9766d9cdd..000000000 --- a/Assets/Mirror/Tests/Editor/MiddlewareTransportTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1ee4c7efa89013a41aeee942e60af4e7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef b/Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef deleted file mode 100644 index 45f67bd5e..000000000 --- a/Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "Mirror.Tests", - "rootNamespace": "", - "references": [ - "Mirror", - "Mirror.Editor", - "Mirror.Components", - "Mirror.Tests.Common", - "Telepathy", - "UnityEngine.TestRunner", - "UnityEditor.TestRunner", - "Unity.Mirror.CodeGen" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "NSubstitute.dll", - "Castle.Core.dll", - "System.Threading.Tasks.Extensions.dll", - "Mono.CecilX.dll", - "nunit.framework.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_INCLUDE_TESTS" - ], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef.meta b/Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef.meta deleted file mode 100644 index 4f2302303..000000000 --- a/Assets/Mirror/Tests/Editor/Mirror.Tests.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 8b489029f75e64a7bbf6918bf1a49e39 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/MultiplexTest.cs b/Assets/Mirror/Tests/Editor/MultiplexTest.cs deleted file mode 100644 index 795e7a1e0..000000000 --- a/Assets/Mirror/Tests/Editor/MultiplexTest.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using NSubstitute; -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class MultiplexTest : MirrorTest - { - Transport transport1; - Transport transport2; - new MultiplexTransport transport; - - [SetUp] - public void Setup() - { - base.SetUp(); - - CreateGameObject(out _, out transport); - - transport1 = Substitute.For(); - transport2 = Substitute.For(); - transport.transports = new[] { transport1, transport2 }; - - transport.Awake(); - } - - // A Test behaves as an ordinary method - [Test] - public void TestAvailable() - { - transport1.Available().Returns(true); - transport2.Available().Returns(false); - Assert.That(transport.Available()); - } - - // A Test behaves as an ordinary method - [Test] - public void TestNotAvailable() - { - transport1.Available().Returns(false); - transport2.Available().Returns(false); - Assert.That(transport.Available(), Is.False); - } - - // A Test behaves as an ordinary method - [Test] - public void TestConnect() - { - transport1.Available().Returns(false); - transport2.Available().Returns(true); - transport.ClientConnect("some.server.com"); - - transport1.DidNotReceive().ClientConnect(Arg.Any()); - transport2.Received().ClientConnect("some.server.com"); - } - - // A Test behaves as an ordinary method - [Test] - public void TestConnectFirstUri() - { - Uri uri = new Uri("tcp://some.server.com"); - - transport1.Available().Returns(true); - transport2.Available().Returns(true); - - transport.ClientConnect(uri); - transport1.Received().ClientConnect(uri); - transport2.DidNotReceive().ClientConnect(uri); - } - - - // A Test behaves as an ordinary method - [Test] - public void TestConnectSecondUri() - { - Uri uri = new Uri("ws://some.server.com"); - - transport1.Available().Returns(true); - - // first transport does not support websocket - transport1 - .When(x => x.ClientConnect(uri)) - .Do(x => { throw new ArgumentException("Scheme not supported"); }); - - transport2.Available().Returns(true); - - transport.ClientConnect(uri); - transport2.Received().ClientConnect(uri); - } - - [Test] - public void TestConnected() - { - transport1.Available().Returns(true); - transport.ClientConnect("some.server.com"); - - transport1.ClientConnected().Returns(true); - - Assert.That(transport.ClientConnected()); - } - - [Test] - public void TestDisconnect() - { - transport1.Available().Returns(true); - transport.ClientConnect("some.server.com"); - - transport.ClientDisconnect(); - - transport1.Received().ClientDisconnect(); - } - - [Test] - public void TestClientSend() - { - transport1.Available().Returns(true); - transport.ClientConnect("some.server.com"); - - byte[] data = { 1, 2, 3 }; - ArraySegment segment = new ArraySegment(data); - - transport.ClientSend(segment, 3); - - transport1.Received().ClientSend(segment, 3); - } - - [Test] - public void TestClient1Connected() - { - transport1.Available().Returns(true); - transport2.Available().Returns(true); - - Action callback = Substitute.For(); - // find available - transport.Awake(); - // set event and connect to give event to inner - transport.OnClientConnected = callback; - transport.ClientConnect("localhost"); - transport1.OnClientConnected.Invoke(); - callback.Received().Invoke(); - } - - [Test] - public void TestClient2Connected() - { - transport1.Available().Returns(false); - transport2.Available().Returns(true); - - Action callback = Substitute.For(); - // find available - transport.Awake(); - // set event and connect to give event to inner - transport.OnClientConnected = callback; - transport.ClientConnect("localhost"); - transport2.OnClientConnected.Invoke(); - callback.Received().Invoke(); - } - - [Test] - public void TestServerConnected() - { - byte[] data = { 1, 2, 3 }; - ArraySegment segment = new ArraySegment(data); - - // on connect, send a message back - void SendMessage(int connectionId) - { - transport.ServerSend(connectionId, segment, 5); - } - - // set event and Start to give event to inner - transport.OnServerConnected = SendMessage; - transport.ServerStart(); - - transport1.OnServerConnected.Invoke(1); - - transport1.Received().ServerSend(1, segment, 5); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/MultiplexTest.cs.meta b/Assets/Mirror/Tests/Editor/MultiplexTest.cs.meta deleted file mode 100644 index a4ec69160..000000000 --- a/Assets/Mirror/Tests/Editor/MultiplexTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f0d8bef6afd464247bf433cdc5d3ff23 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs b/Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs deleted file mode 100644 index 9edc8087a..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs +++ /dev/null @@ -1,184 +0,0 @@ -// dirty bits are powerful magic. -// add some tests to guarantee correct behaviour. -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - class NetworkBehaviourWithSyncVarsAndCollections : NetworkBehaviour - { - // SyncVars - [SyncVar] public int health; - [SyncVar] public int mana; - - // SyncCollections - public readonly SyncList list = new SyncList(); - public readonly SyncDictionary dict = new SyncDictionary(); - } - - public class NetworkBehaviourSyncVarDirtyBitsExposed : NetworkBehaviour - { - public ulong syncVarDirtyBitsExposed => syncVarDirtyBits; - } - - public class NetworkBehaviourDirtyBitsTests : MirrorEditModeTest - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // SyncLists are only set dirty while owner has observers. - // need a connection. - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - - [Test] - public void SetSyncVarDirtyBit() - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out NetworkBehaviourSyncVarDirtyBitsExposed comp); - - // set 3rd dirty bit. - comp.SetSyncVarDirtyBit(0b_00000000_00000100); - Assert.That(comp.syncVarDirtyBitsExposed, Is.EqualTo(0b_00000000_00000100)); - - // set 5th dirty bit. - // both 3rd and 5th should be set. - comp.SetSyncVarDirtyBit(0b_00000000_00010000); - Assert.That(comp.syncVarDirtyBitsExposed, Is.EqualTo(0b_00000000_00010100)); - } - - // changing a SyncObject (collection) should modify the dirty mask. - [Test] - public void SyncObjectsSetDirtyBits() - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out NetworkBehaviourWithSyncVarsAndCollections comp); - - // not dirty by default - Assert.That(comp.syncObjectDirtyBits, Is.EqualTo(0UL)); - - // change the list. should be dirty now. - comp.list.Add(42); - Assert.That(comp.syncObjectDirtyBits, Is.EqualTo(0b01)); - - // change the dict. should both be dirty. - comp.dict[42] = null; - Assert.That(comp.syncObjectDirtyBits, Is.EqualTo(0b11)); - } - - [Test] - public void IsDirty() - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity identity, out NetworkBehaviourWithSyncVarsAndCollections comp); - - // not dirty by default - Assert.That(comp.IsDirty(), Is.False); - - // changing a [SyncVar] should set it dirty - ++comp.health; - Assert.That(comp.IsDirty(), Is.True); - comp.ClearAllDirtyBits(); - - // changing a SyncCollection should set it dirty - comp.list.Add(42); - Assert.That(comp.IsDirty(), Is.True); - comp.ClearAllDirtyBits(); - - // it should only be dirty after syncInterval elapsed - comp.syncInterval = float.MaxValue; - Assert.That(comp.IsDirty(), Is.False); - } - - [Test] - public void ClearAllDirtyBitsClearsSyncVarDirtyBits() - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out EmptyBehaviour emptyBehaviour); - - // set syncinterval so dirtybit works fine - emptyBehaviour.syncInterval = 0; - Assert.That(emptyBehaviour.IsDirty(), Is.False); - - // set one syncvar dirty bit - emptyBehaviour.SetSyncVarDirtyBit(1); - Assert.That(emptyBehaviour.IsDirty(), Is.True); - - // clear it - emptyBehaviour.ClearAllDirtyBits(); - Assert.That(emptyBehaviour.IsDirty(), Is.False); - } - - [Test] - public void ClearAllDirtyBitsClearsSyncObjectsDirtyBits() - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out NetworkBehaviourWithSyncVarsAndCollections comp); - - // set syncinterval so dirtybit works fine - comp.syncInterval = 0; - Assert.That(comp.IsDirty(), Is.False); - - // dirty the synclist - comp.list.Add(42); - Assert.That(comp.IsDirty, Is.True); - - // clear bits should clear synclist bits too - comp.ClearAllDirtyBits(); - Assert.That(comp.IsDirty, Is.False); - } - - // NetworkServer.Broadcast clears all dirty bits in all spawned - // identity's components if they have no observers. - // - // this way dirty bit tracking only starts after first observer. - // otherwise first observer would still get dirty update for everything - // that was dirty before he observed. even though he already got the - // full state in spawn packet. - [Test] - public void DirtyBitsAreClearedForSpawnedWithoutObservers() - { - // need one player, one monster - CreateNetworkedAndSpawnPlayer(out _, out NetworkIdentity player, NetworkServer.localConnection); - CreateNetworkedAndSpawn(out _, out NetworkIdentity monster, out NetworkBehaviourWithSyncVarsAndCollections monsterComp); - - // without AOI, player connection sees everyone automatically. - // remove the monster from observing. - // remvoe player from monster observers. - monster.RemoveObserver(player.connectionToClient); - Assert.That(monster.observers.Count, Is.EqualTo(0)); - - // modify something in the monster so that dirty bit is set - monsterComp.syncInterval = 0; - ++monsterComp.health; - Assert.That(monsterComp.IsDirty(), Is.True); - - // add first observer. dirty bits should be cleared. - monster.AddObserver(player.connectionToClient); - Assert.That(monsterComp.IsDirty(), Is.False); - } - } - - // hook tests can only be ran when inheriting from NetworkBehaviour - public class NetworkBehaviourDirtyBitsHookGuardTester : NetworkBehaviour - { - [Test] - public void HookGuard() - { - // set hook guard for some bits - for (int i = 0; i < 10; ++i) - { - ulong bit = 1ul << i; - - // should be false by default - Assert.That(GetSyncVarHookGuard(bit), Is.False); - - // set true - SetSyncVarHookGuard(bit, true); - Assert.That(GetSyncVarHookGuard(bit), Is.True); - - // set false again - SetSyncVarHookGuard(bit, false); - Assert.That(GetSyncVarHookGuard(bit), Is.False); - } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs.meta deleted file mode 100644 index c9e0879cf..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkBehaviourDirtyBitsTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 71cd60f7177a4d3da75bb87f5ac13a18 -timeCreated: 1631772886 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs b/Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs deleted file mode 100644 index 99dbbd3e9..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs +++ /dev/null @@ -1,341 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -// Note: Weaver doesn't run on nested class so use namespace to group classes instead -namespace Mirror.Tests.NetworkBehaviourSerialize -{ - #region No OnSerialize/OnDeserialize override - abstract class AbstractBehaviour : NetworkBehaviour - { - public readonly SyncList syncListInAbstract = new SyncList(); - - [SyncVar] - public int SyncFieldInAbstract; - } - - class BehaviourWithSyncVar : NetworkBehaviour - { - public readonly SyncList syncList = new SyncList(); - - [SyncVar] - public int SyncField; - } - - class OverrideBehaviourFromSyncVar : AbstractBehaviour {} - - class OverrideBehaviourWithSyncVarFromSyncVar : AbstractBehaviour - { - public readonly SyncList syncListInOverride = new SyncList(); - - [SyncVar] - public int SyncFieldInOverride; - } - - class MiddleClass : AbstractBehaviour - { - // class with no sync var - } - - class SubClass : MiddleClass - { - // class with sync var - // this is to make sure that override works correctly if base class doesn't have sync vars - [SyncVar] - public Vector3 anotherSyncField; - } - - class MiddleClassWithSyncVar : AbstractBehaviour - { - // class with sync var - [SyncVar] - public string syncFieldInMiddle; - } - - class SubClassFromSyncVar : MiddleClassWithSyncVar - { - // class with sync var - // this is to make sure that override works correctly if base class doesn't have sync vars - [SyncVar] - public Vector3 syncFieldInSub; - } - #endregion - - #region OnSerialize/OnDeserialize override - - class BehaviourWithSyncVarWithOnSerialize : NetworkBehaviour - { - public readonly SyncList syncList = new SyncList(); - - [SyncVar] - public int SyncField; - - public float customSerializeField; - - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - writer.WriteFloat(customSerializeField); - return base.OnSerialize(writer, initialState); - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - customSerializeField = reader.ReadFloat(); - base.OnDeserialize(reader, initialState); - } - } - - class OverrideBehaviourFromSyncVarWithOnSerialize : AbstractBehaviour - { - public float customSerializeField; - - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - writer.WriteFloat(customSerializeField); - return base.OnSerialize(writer, initialState); - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - customSerializeField = reader.ReadFloat(); - base.OnDeserialize(reader, initialState); - } - } - - class OverrideBehaviourWithSyncVarFromSyncVarWithOnSerialize : AbstractBehaviour - { - public readonly SyncList syncListInOverride = new SyncList(); - - [SyncVar] - public int SyncFieldInOverride; - - public float customSerializeField; - - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - writer.WriteFloat(customSerializeField); - return base.OnSerialize(writer, initialState); - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - customSerializeField = reader.ReadFloat(); - base.OnDeserialize(reader, initialState); - } - } - #endregion - - public class NetworkBehaviourSerializeTest : MirrorEditModeTest - { - static void SyncNetworkBehaviour(NetworkBehaviour source, NetworkBehaviour target, bool initialState) - { - using (PooledNetworkWriter writer = NetworkWriterPool.GetWriter()) - { - source.OnSerialize(writer, initialState); - - using (PooledNetworkReader reader = NetworkReaderPool.GetReader(writer.ToArraySegment())) - { - target.OnDeserialize(reader, initialState); - } - } - } - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // SyncLists are only set dirty while owner has observers. - // need a connection. - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void BehaviourWithSyncVarTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out BehaviourWithSyncVar source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out BehaviourWithSyncVar target); - - source.SyncField = 10; - source.syncList.Add(true); - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncField, Is.EqualTo(10)); - Assert.That(target.syncList.Count, Is.EqualTo(1)); - Assert.That(target.syncList[0], Is.True); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void OverrideBehaviourFromSyncVarTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourFromSyncVar source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourFromSyncVar target); - - source.SyncFieldInAbstract = 12; - source.syncListInAbstract.Add(true); - source.syncListInAbstract.Add(false); - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncFieldInAbstract, Is.EqualTo(12)); - Assert.That(target.syncListInAbstract.Count, Is.EqualTo(2)); - Assert.That(target.syncListInAbstract[0], Is.True); - Assert.That(target.syncListInAbstract[1], Is.False); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void OverrideBehaviourWithSyncVarFromSyncVarTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourWithSyncVarFromSyncVar source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourWithSyncVarFromSyncVar target); - - source.SyncFieldInAbstract = 10; - source.syncListInAbstract.Add(true); - - source.SyncFieldInOverride = 52; - source.syncListInOverride.Add(false); - source.syncListInOverride.Add(true); - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncFieldInAbstract, Is.EqualTo(10)); - Assert.That(target.syncListInAbstract.Count, Is.EqualTo(1)); - Assert.That(target.syncListInAbstract[0], Is.True); - - - Assert.That(target.SyncFieldInOverride, Is.EqualTo(52)); - Assert.That(target.syncListInOverride.Count, Is.EqualTo(2)); - Assert.That(target.syncListInOverride[0], Is.False); - Assert.That(target.syncListInOverride[1], Is.True); - } - - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SubClassTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out SubClass source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out SubClass target); - - source.SyncFieldInAbstract = 10; - source.syncListInAbstract.Add(true); - - source.anotherSyncField = new Vector3(40, 20, 10); - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncFieldInAbstract, Is.EqualTo(10)); - Assert.That(target.syncListInAbstract.Count, Is.EqualTo(1)); - Assert.That(target.syncListInAbstract[0], Is.True); - - Assert.That(target.anotherSyncField, Is.EqualTo(new Vector3(40, 20, 10))); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SubClassFromSyncVarTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out SubClassFromSyncVar source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out SubClassFromSyncVar target); - - source.SyncFieldInAbstract = 10; - source.syncListInAbstract.Add(true); - - source.syncFieldInMiddle = "Hello World!"; - source.syncFieldInSub = new Vector3(40, 20, 10); - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncFieldInAbstract, Is.EqualTo(10)); - Assert.That(target.syncListInAbstract.Count, Is.EqualTo(1)); - Assert.That(target.syncListInAbstract[0], Is.True); - - Assert.That(target.syncFieldInMiddle, Is.EqualTo("Hello World!")); - Assert.That(target.syncFieldInSub, Is.EqualTo(new Vector3(40, 20, 10))); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void BehaviourWithSyncVarWithOnSerializeTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out BehaviourWithSyncVarWithOnSerialize source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out BehaviourWithSyncVarWithOnSerialize target); - - source.SyncField = 10; - source.syncList.Add(true); - - source.customSerializeField = 20.5f; - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncField, Is.EqualTo(10)); - Assert.That(target.syncList.Count, Is.EqualTo(1)); - Assert.That(target.syncList[0], Is.True); - - Assert.That(target.customSerializeField, Is.EqualTo(20.5f)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void OverrideBehaviourFromSyncVarWithOnSerializeTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourFromSyncVarWithOnSerialize source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourFromSyncVarWithOnSerialize target); - - source.SyncFieldInAbstract = 12; - source.syncListInAbstract.Add(true); - source.syncListInAbstract.Add(false); - - source.customSerializeField = 20.5f; - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncFieldInAbstract, Is.EqualTo(12)); - Assert.That(target.syncListInAbstract.Count, Is.EqualTo(2)); - Assert.That(target.syncListInAbstract[0], Is.True); - Assert.That(target.syncListInAbstract[1], Is.False); - - Assert.That(target.customSerializeField, Is.EqualTo(20.5f)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void OverrideBehaviourWithSyncVarFromSyncVarWithOnSerializeTest(bool initialState) - { - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourWithSyncVarFromSyncVarWithOnSerialize source); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out OverrideBehaviourWithSyncVarFromSyncVarWithOnSerialize target); - - source.SyncFieldInAbstract = 10; - source.syncListInAbstract.Add(true); - - source.SyncFieldInOverride = 52; - source.syncListInOverride.Add(false); - source.syncListInOverride.Add(true); - - source.customSerializeField = 20.5f; - - SyncNetworkBehaviour(source, target, initialState); - - Assert.That(target.SyncFieldInAbstract, Is.EqualTo(10)); - Assert.That(target.syncListInAbstract.Count, Is.EqualTo(1)); - Assert.That(target.syncListInAbstract[0], Is.True); - - - Assert.That(target.SyncFieldInOverride, Is.EqualTo(52)); - Assert.That(target.syncListInOverride.Count, Is.EqualTo(2)); - Assert.That(target.syncListInOverride[0], Is.False); - Assert.That(target.syncListInOverride[1], Is.True); - - Assert.That(target.customSerializeField, Is.EqualTo(20.5f)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs.meta deleted file mode 100644 index b76e74fed..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkBehaviourSerializeTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 253d419ce2900134482c3c8b76883c60 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs b/Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs deleted file mode 100644 index a84e74e83..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs +++ /dev/null @@ -1,884 +0,0 @@ -using Mirror.RemoteCalls; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests -{ - class EmptyBehaviour : NetworkBehaviour {} - - // we need to inherit from networkbehaviour to test protected functions - public class NetworkBehaviourDelegateComponent : NetworkBehaviour - { - public static void Delegate(NetworkBehaviour comp, NetworkReader reader, NetworkConnection senderConnection) {} - public static void Delegate2(NetworkBehaviour comp, NetworkReader reader, NetworkConnection senderConnection) {} - } - - // we need to inherit from networkbehaviour to test protected functions - public class NetworkBehaviourSetSyncVarGameObjectComponent : NetworkBehaviour - { - //[SyncVar] - public GameObject test; - // usually generated by weaver - public uint testNetId; - - // SetSyncVarGameObject wrapper to expose it - public void SetSyncVarGameObjectExposed(GameObject newGameObject, ulong dirtyBit) => - SetSyncVarGameObject(newGameObject, ref test, dirtyBit, ref testNetId); - } - - // we need to inherit from networkbehaviour to test protected functions - public class NetworkBehaviourGetSyncVarGameObjectComponent : NetworkBehaviour - { - //[SyncVar] - public GameObject test; - // usually generated by weaver - public uint testNetId; - - // SetSyncVarGameObject wrapper to expose it - public GameObject GetSyncVarGameObjectExposed() => - GetSyncVarGameObject(testNetId, ref test); - } - - // we need to inherit from networkbehaviour to test protected functions - public class NetworkBehaviourSetSyncVarNetworkIdentityComponent : NetworkBehaviour - { - //[SyncVar] - public NetworkIdentity test; - // usually generated by weaver - public uint testNetId; - - // SetSyncVarNetworkIdentity wrapper to expose it - public void SetSyncVarNetworkIdentityExposed(NetworkIdentity newNetworkIdentity, ulong dirtyBit) => - SetSyncVarNetworkIdentity(newNetworkIdentity, ref test, dirtyBit, ref testNetId); - } - - // we need to inherit from networkbehaviour to test protected functions - public class NetworkBehaviourGetSyncVarNetworkIdentityComponent : NetworkBehaviour - { - //[SyncVar] - public NetworkIdentity test; - // usually generated by weaver - public uint testNetId; - - // SetSyncVarNetworkIdentity wrapper to expose it - public NetworkIdentity GetSyncVarNetworkIdentityExposed() => - GetSyncVarNetworkIdentity(testNetId, ref test); - } - - // we need to inherit from networkbehaviour to test protected functions - public class OnStopClientComponent : NetworkBehaviour - { - public int called; - public override void OnStopClient() => ++called; - } - - // we need to inherit from networkbehaviour to test protected functions - public class OnStartClientComponent : NetworkBehaviour - { - public int called; - public override void OnStartClient() => ++called; - } - - // we need to inherit from networkbehaviour to test protected functions - public class OnStartLocalPlayerComponent : NetworkBehaviour - { - public int called; - public override void OnStartLocalPlayer() => ++called; - } - - public class NetworkBehaviourTests : MirrorEditModeTest - { - [TearDown] - public override void TearDown() - { - NetworkServer.RemoveLocalConnection(); - base.TearDown(); - } - - [Test] - public void IsServerOnly() - { - CreateNetworked(out _, out NetworkIdentity identity, out EmptyBehaviour emptyBehaviour); - - // call OnStartServer so isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // isServerOnly should be true when isServer = true && isClient = false - Assert.That(emptyBehaviour.isServer, Is.True); - Assert.That(emptyBehaviour.isClient, Is.False); - Assert.That(emptyBehaviour.isServerOnly, Is.True); - } - - [Test] - public void IsClientOnly() - { - CreateNetworked(out _, out NetworkIdentity identity, out EmptyBehaviour emptyBehaviour); - - // isClientOnly should be true when isServer = false && isClient = true - identity.isClient = true; - Assert.That(emptyBehaviour.isServer, Is.False); - Assert.That(emptyBehaviour.isClient, Is.True); - Assert.That(emptyBehaviour.isClientOnly, Is.True); - } - - [Test] - public void HasNoAuthorityByDefault() - { - // no authority by default - CreateNetworked(out _, out _, out EmptyBehaviour emptyBehaviour); - Assert.That(emptyBehaviour.hasAuthority, Is.False); - } - - [Test] - public void HasIdentitysNetId() - { - CreateNetworked(out _, out NetworkIdentity identity, out EmptyBehaviour emptyBehaviour); - identity.netId = 42; - Assert.That(emptyBehaviour.netId, Is.EqualTo(42)); - } - - [Test] - public void HasIdentitysConnectionToServer() - { - CreateNetworked(out _, out NetworkIdentity identity, out EmptyBehaviour emptyBehaviour); - identity.connectionToServer = new LocalConnectionToServer(); - Assert.That(emptyBehaviour.connectionToServer, Is.EqualTo(identity.connectionToServer)); - } - - [Test] - public void HasIdentitysConnectionToClient() - { - CreateNetworked(out _, out NetworkIdentity identity, out EmptyBehaviour emptyBehaviour); - identity.connectionToClient = new LocalConnectionToClient(); - Assert.That(emptyBehaviour.connectionToClient, Is.EqualTo(identity.connectionToClient)); - } - - [Test] - public void ComponentIndex() - { - // create a NetworkIdentity with two components - CreateNetworked(out GameObject _, out NetworkIdentity _, out EmptyBehaviour first, out EmptyBehaviour second); - Assert.That(first.ComponentIndex, Is.EqualTo(0)); - Assert.That(second.ComponentIndex, Is.EqualTo(1)); - } - - [Test, Ignore("NetworkServerTest.SendCommand does it already")] - public void SendCommandInternal() {} - - [Test, Ignore("ClientRpcTest.cs tests Rpcs already")] - public void SendRPCInternal() {} - - [Test, Ignore("TargetRpcTest.cs tests TargetRpcs already")] - public void SendTargetRPCInternal() {} - - [Test] - public void RegisterDelegateDoesntOverwrite() - { - // registerdelegate is protected, but we can use - // RegisterCommandDelegate which calls RegisterDelegate - int registeredHash1 = RemoteCallHelper.RegisterDelegate( - typeof(NetworkBehaviourDelegateComponent), - nameof(NetworkBehaviourDelegateComponent.Delegate), - MirrorInvokeType.Command, - NetworkBehaviourDelegateComponent.Delegate, - false); - - // registering the exact same one should be fine. it should simply - // do nothing. - int registeredHash2 = RemoteCallHelper.RegisterDelegate( - typeof(NetworkBehaviourDelegateComponent), - nameof(NetworkBehaviourDelegateComponent.Delegate), - MirrorInvokeType.Command, - NetworkBehaviourDelegateComponent.Delegate, - false); - - // registering the same name with a different callback shouldn't - // work - LogAssert.Expect(LogType.Error, $"Function {typeof(NetworkBehaviourDelegateComponent)}.{nameof(NetworkBehaviourDelegateComponent.Delegate)} and {typeof(NetworkBehaviourDelegateComponent)}.{nameof(NetworkBehaviourDelegateComponent.Delegate2)} have the same hash. Please rename one of them"); - int registeredHash3 = RemoteCallHelper.RegisterDelegate( - typeof(NetworkBehaviourDelegateComponent), - nameof(NetworkBehaviourDelegateComponent.Delegate), - MirrorInvokeType.Command, - NetworkBehaviourDelegateComponent.Delegate2, - false); - - // clean up - RemoteCallHelper.RemoveDelegate(registeredHash1); - RemoteCallHelper.RemoveDelegate(registeredHash2); - RemoteCallHelper.RemoveDelegate(registeredHash3); - } - - [Test] - public void GetDelegate() - { - // registerdelegate is protected, but we can use - // RegisterCommandDelegate which calls RegisterDelegate - int registeredHash = RemoteCallHelper.RegisterDelegate( - typeof(NetworkBehaviourDelegateComponent), - nameof(NetworkBehaviourDelegateComponent.Delegate), - MirrorInvokeType.Command, - NetworkBehaviourDelegateComponent.Delegate, - false); - - // get handler - int cmdHash = RemoteCallHelper.GetMethodHash(typeof(NetworkBehaviourDelegateComponent), nameof(NetworkBehaviourDelegateComponent.Delegate)); - CmdDelegate func = RemoteCallHelper.GetDelegate(cmdHash); - CmdDelegate expected = NetworkBehaviourDelegateComponent.Delegate; - Assert.That(func, Is.EqualTo(expected)); - - // invalid hash should return null handler - CmdDelegate funcNull = RemoteCallHelper.GetDelegate(1234); - Assert.That(funcNull, Is.Null); - - // clean up - RemoteCallHelper.RemoveDelegate(registeredHash); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualZeroNetIdNullIsTrue() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - // null and identity.netid==0 returns true (=equal) - // - // later we should reevaluate if this is so smart or not. might be - // better to return false here. - // => we possibly return false so that resync doesn't happen when - // GO disappears? or not? - bool result = NetworkBehaviour.SyncVarGameObjectEqual(null, identity.netId); - Assert.That(result, Is.True); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualNull() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - // our identity should have a netid for comparing - identity.netId = 42; - - // null should return false - bool result = NetworkBehaviour.SyncVarGameObjectEqual(null, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualZeroNetIdAndGOWithoutIdentityComponentIsTrue() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - CreateNetworked(out GameObject go, out NetworkIdentity _); - - // null and identity.netid==0 returns true (=equal) - // - // later we should reevaluate if this is so smart or not. might be - // better to return false here. - // => we possibly return false so that resync doesn't happen when - // GO disappears? or not? - bool result = NetworkBehaviour.SyncVarGameObjectEqual(go, identity.netId); - Assert.That(result, Is.True); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualWithoutIdentityComponent() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject without networkidentity component should return false - CreateNetworked(out GameObject go, out NetworkIdentity _); - bool result = NetworkBehaviour.SyncVarGameObjectEqual(go, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualValidGOWithDifferentNetId() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject with valid networkidentity and netid that is different - CreateNetworked(out GameObject go, out NetworkIdentity ni); - ni.netId = 43; - bool result = NetworkBehaviour.SyncVarGameObjectEqual(go, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualValidGOWithSameNetId() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject with valid networkidentity and netid that is different - CreateNetworked(out GameObject go, out NetworkIdentity ni); - ni.netId = 42; - bool result = NetworkBehaviour.SyncVarGameObjectEqual(go, identity.netId); - Assert.That(result, Is.True); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualUnspawnedGO() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject with valid networkidentity and 0 netid that is unspawned - CreateNetworked(out GameObject go, out NetworkIdentity ni); - LogAssert.Expect(LogType.Warning, $"SetSyncVarGameObject GameObject {go} has a zero netId. Maybe it is not spawned yet?"); - bool result = NetworkBehaviour.SyncVarGameObjectEqual(go, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarGameObjectEqual should be static later - [Test] - public void SyncVarGameObjectEqualUnspawnedGOZeroNetIdIsTrue() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // unspawned go and identity.netid==0 returns true (=equal) - CreateNetworked(out GameObject go, out NetworkIdentity ni); - LogAssert.Expect(LogType.Warning, $"SetSyncVarGameObject GameObject {go} has a zero netId. Maybe it is not spawned yet?"); - bool result = NetworkBehaviour.SyncVarGameObjectEqual(go, identity.netId); - Assert.That(result, Is.True); - } - - // NOTE: SyncVarNetworkIdentityEqual should be static later - [Test] - public void SyncVarNetworkIdentityEqualZeroNetIdNullIsTrue() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // null and identity.netid==0 returns true (=equal) - // - // later we should reevaluate if this is so smart or not. might be - // better to return false here. - // => we possibly return false so that resync doesn't happen when - // GO disappears? or not? - bool result = NetworkBehaviour.SyncVarNetworkIdentityEqual(null, identity.netId); - Assert.That(result, Is.True); - } - - // NOTE: SyncVarNetworkIdentityEqual should be static later - [Test] - public void SyncVarNetworkIdentityEqualNull() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // null should return false - bool result = NetworkBehaviour.SyncVarNetworkIdentityEqual(null, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarNetworkIdentityEqual should be static later - [Test] - public void SyncVarNetworkIdentityEqualValidIdentityWithDifferentNetId() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject with valid networkidentity and netid that is different - CreateNetworked(out GameObject go, out NetworkIdentity ni); - ni.netId = 43; - bool result = NetworkBehaviour.SyncVarNetworkIdentityEqual(ni, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarNetworkIdentityEqual should be static later - [Test] - public void SyncVarNetworkIdentityEqualValidIdentityWithSameNetId() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject with valid networkidentity and netid that is different - CreateNetworked(out GameObject _, out NetworkIdentity ni); - ni.netId = 42; - bool result = NetworkBehaviour.SyncVarNetworkIdentityEqual(ni, identity.netId); - Assert.That(result, Is.True); - } - - // NOTE: SyncVarNetworkIdentityEqual should be static later - [Test] - public void SyncVarNetworkIdentityEqualUnspawnedIdentity() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // our identity should have a netid for comparing - identity.netId = 42; - - // gameobject with valid networkidentity and 0 netid that is unspawned - CreateNetworked(out GameObject go, out NetworkIdentity ni); - LogAssert.Expect(LogType.Warning, $"SetSyncVarNetworkIdentity NetworkIdentity {ni} has a zero netId. Maybe it is not spawned yet?"); - bool result = NetworkBehaviour.SyncVarNetworkIdentityEqual(ni, identity.netId); - Assert.That(result, Is.False); - } - - // NOTE: SyncVarNetworkIdentityEqual should be static later - [Test] - public void SyncVarNetworkIdentityEqualUnspawnedIdentityZeroNetIdIsTrue() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // unspawned go and identity.netid==0 returns true (=equal) - CreateNetworked(out GameObject go, out NetworkIdentity ni); - LogAssert.Expect(LogType.Warning, $"SetSyncVarNetworkIdentity NetworkIdentity {ni} has a zero netId. Maybe it is not spawned yet?"); - bool result = NetworkBehaviour.SyncVarNetworkIdentityEqual(ni, identity.netId); - Assert.That(result, Is.True); - } - - [Test] - public void SetSyncVarGameObjectWithValidObject() - { - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourSetSyncVarGameObjectComponent comp); - - // create a valid GameObject with networkidentity and netid - CreateNetworked(out GameObject go, out NetworkIdentity ni); - ni.netId = 43; - - // set the GameObject SyncVar - Assert.That(comp.IsDirty(), Is.False); - comp.SetSyncVarGameObjectExposed(go, 1ul); - Assert.That(comp.test, Is.EqualTo(go)); - Assert.That(comp.testNetId, Is.EqualTo(ni.netId)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void SetSyncVarGameObjectNull() - { - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourSetSyncVarGameObjectComponent comp); - - // set some existing GO+netId first to check if it is going to be - // overwritten - CreateGameObject(out GameObject go); - comp.test = go; - comp.testNetId = 43; - - // set the GameObject SyncVar to null - Assert.That(comp.IsDirty(), Is.False); - comp.SetSyncVarGameObjectExposed(null, 1ul); - Assert.That(comp.test, Is.EqualTo(null)); - Assert.That(comp.testNetId, Is.EqualTo(0)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void SetSyncVarGameObjectWithoutNetworkIdentity() - { - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourSetSyncVarGameObjectComponent comp); - - // set some existing GO+netId first to check if it is going to be - // overwritten - CreateGameObject(out GameObject go); - comp.test = go; - comp.testNetId = 43; - - // create test GO with no networkidentity - CreateGameObject(out GameObject test); - - // set the GameObject SyncVar to 'test' GO without netidentity. - // -> the way it currently works is that it sets netId to 0, but - // it DOES set gameObjectField to the GameObject without the - // NetworkIdentity, instead of setting it to null because it's - // seemingly invalid. - // -> there might be a deeper reason why UNET did that. perhaps for - // cases where we assign a GameObject before the network was - // fully started and has no netId or networkidentity yet etc. - // => it works, so let's keep it for now - Assert.That(comp.IsDirty(), Is.False); - comp.SetSyncVarGameObjectExposed(test, 1ul); - Assert.That(comp.test, Is.EqualTo(test)); - Assert.That(comp.testNetId, Is.EqualTo(0)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void SetSyncVarGameObjectZeroNetId() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity, out NetworkBehaviourSetSyncVarGameObjectComponent comp); - - // set some existing GO+netId first to check if it is going to be - // overwritten - CreateGameObject(out GameObject go); - comp.test = go; - comp.testNetId = 43; - - // create test GO with networkidentity and zero netid - CreateNetworked(out GameObject test, out NetworkIdentity ni); - Assert.That(ni.netId, Is.EqualTo(0)); - - // set the GameObject SyncVar to 'test' GO with zero netId. - // -> the way it currently works is that it sets netId to 0, but - // it DOES set gameObjectField to the GameObject without the - // NetworkIdentity, instead of setting it to null because it's - // seemingly invalid. - // -> there might be a deeper reason why UNET did that. perhaps for - // cases where we assign a GameObject before the network was - // fully started and has no netId or networkidentity yet etc. - // => it works, so let's keep it for now - Assert.That(comp.IsDirty(), Is.False); - LogAssert.Expect(LogType.Warning, $"SetSyncVarGameObject GameObject {test} has a zero netId. Maybe it is not spawned yet?"); - comp.SetSyncVarGameObjectExposed(test, 1ul); - Assert.That(comp.test, Is.EqualTo(test)); - Assert.That(comp.testNetId, Is.EqualTo(0)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void GetSyncVarGameObjectOnServer() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity, out NetworkBehaviourGetSyncVarGameObjectComponent comp); - - // call OnStartServer so isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // create a syncable GameObject - CreateNetworked(out GameObject go, out NetworkIdentity ni); - ni.netId = identity.netId + 1; - - // assign it in the component - comp.test = go; - comp.testNetId = ni.netId; - - // get it on the server. should simply return the field instead of - // doing any netId lookup like on the client - GameObject result = comp.GetSyncVarGameObjectExposed(); - Assert.That(result, Is.EqualTo(go)); - - // clean up: set isServer false first, otherwise Destroy instead of DestroyImmediate is called - identity.netId = 0; - } - - [Test] - public void GetSyncVarGameObjectOnServerNull() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity, out NetworkBehaviourGetSyncVarGameObjectComponent comp); - - // call OnStartServer and assign netId so isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // get it on the server. null should work fine. - GameObject result = comp.GetSyncVarGameObjectExposed(); - Assert.That(result, Is.Null); - } - - [Test] - public void GetSyncVarGameObjectOnClient() - { - // start server & connect client because we need spawn functions - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out _); - - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // are we on client and not on server? - identity.isClient = true; - Assert.That(identity.isServer, Is.False); - - // create a networked object with test component - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourGetSyncVarGameObjectComponent comp); - - // create a spawned, syncable GameObject - // (client tries to look up via netid, so needs to be spawned) - CreateNetworkedAndSpawn( - out GameObject serverGO, out NetworkIdentity serverIdentity, - out GameObject clientGO, out NetworkIdentity clientIdentity); - - // assign ONLY netId in the component. assume that GameObject was - // assigned earlier but client walked so far out of range that it - // was despawned on the client. so it's forced to do the netId look- - // up. - Assert.That(comp.test, Is.Null); - comp.testNetId = clientIdentity.netId; - - // get it on the client. should look up netId in spawned - GameObject result = comp.GetSyncVarGameObjectExposed(); - Assert.That(result, Is.EqualTo(clientGO)); - } - - [Test] - public void GetSyncVarGameObjectOnClientNull() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // are we on client and not on server? - identity.isClient = true; - Assert.That(identity.isServer, Is.False); - - // create a networked object with test component - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourGetSyncVarGameObjectComponent comp); - - // get it on the client. null should be supported. - GameObject result = comp.GetSyncVarGameObjectExposed(); - Assert.That(result, Is.Null); - } - - [Test] - public void SetSyncVarNetworkIdentityWithValidObject() - { - // create a networked object with test component - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourSetSyncVarNetworkIdentityComponent comp); - - // create a valid GameObject with networkidentity and netid - CreateNetworked(out GameObject _, out NetworkIdentity ni); - ni.netId = 43; - - // set the NetworkIdentity SyncVar - Assert.That(comp.IsDirty(), Is.False); - comp.SetSyncVarNetworkIdentityExposed(ni, 1ul); - Assert.That(comp.test, Is.EqualTo(ni)); - Assert.That(comp.testNetId, Is.EqualTo(ni.netId)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void SetSyncVarNetworkIdentityNull() - { - // create a networked object with test component - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourSetSyncVarNetworkIdentityComponent comp); - - // set some existing NI+netId first to check if it is going to be - // overwritten - CreateNetworked(out GameObject _, out NetworkIdentity ni); - comp.test = ni; - comp.testNetId = 43; - - // set the NetworkIdentity SyncVar to null - Assert.That(comp.IsDirty(), Is.False); - comp.SetSyncVarNetworkIdentityExposed(null, 1ul); - Assert.That(comp.test, Is.EqualTo(null)); - Assert.That(comp.testNetId, Is.EqualTo(0)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void SetSyncVarNetworkIdentityZeroNetId() - { - CreateNetworked(out _, out _, out NetworkBehaviourSetSyncVarNetworkIdentityComponent comp); - - // set some existing NI+netId first to check if it is going to be - // overwritten - CreateNetworked(out GameObject _, out NetworkIdentity ni); - comp.test = ni; - comp.testNetId = 43; - - // create test GO with networkidentity and zero netid - CreateNetworked(out GameObject _, out NetworkIdentity testNi); - Assert.That(testNi.netId, Is.EqualTo(0)); - - // set the NetworkIdentity SyncVar to 'test' GO with zero netId. - // -> the way it currently works is that it sets netId to 0, but - // it DOES set gameObjectField to the GameObject without the - // NetworkIdentity, instead of setting it to null because it's - // seemingly invalid. - // -> there might be a deeper reason why UNET did that. perhaps for - // cases where we assign a GameObject before the network was - // fully started and has no netId or networkidentity yet etc. - // => it works, so let's keep it for now - Assert.That(comp.IsDirty(), Is.False); - LogAssert.Expect(LogType.Warning, $"SetSyncVarNetworkIdentity NetworkIdentity {testNi} has a zero netId. Maybe it is not spawned yet?"); - comp.SetSyncVarNetworkIdentityExposed(testNi, 1ul); - Assert.That(comp.test, Is.EqualTo(testNi)); - Assert.That(comp.testNetId, Is.EqualTo(0)); - Assert.That(comp.IsDirty(), Is.True); - } - - [Test] - public void GetSyncVarNetworkIdentityOnServer() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out NetworkBehaviourGetSyncVarNetworkIdentityComponent comp); - - // call OnStartServer so isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // create a syncable GameObject - CreateNetworked(out _, out NetworkIdentity ni); - ni.netId = identity.netId + 1; - - // assign it in the component - comp.test = ni; - comp.testNetId = ni.netId; - - // get it on the server. should simply return the field instead of - // doing any netId lookup like on the client - NetworkIdentity result = comp.GetSyncVarNetworkIdentityExposed(); - Assert.That(result, Is.EqualTo(ni)); - } - - [Test] - public void GetSyncVarNetworkIdentityOnServerNull() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out NetworkBehaviourGetSyncVarNetworkIdentityComponent comp); - - // call OnStartServer so isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // get it on the server. null should work fine. - NetworkIdentity result = comp.GetSyncVarNetworkIdentityExposed(); - Assert.That(result, Is.Null); - } - - [Test] - public void GetSyncVarNetworkIdentityOnClient() - { - // start server & connect client because we need spawn functions - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out _); - - CreateNetworked(out GameObject _, out NetworkIdentity identity, out NetworkBehaviourGetSyncVarNetworkIdentityComponent comp); - - // are we on client and not on server? - identity.isClient = true; - Assert.That(identity.isServer, Is.False); - - // create a spawned, syncable GameObject - // (client tries to look up via netid, so needs to be spawned) - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverIdentity, - out _, out NetworkIdentity clientIdentity); - - // assign ONLY netId in the component. assume that GameObject was - // assigned earlier but client walked so far out of range that it - // was despawned on the client. so it's forced to do the netId look- - // up. - Assert.That(comp.test, Is.Null); - comp.testNetId = clientIdentity.netId; - - // get it on the client. should look up netId in spawned - NetworkIdentity result = comp.GetSyncVarNetworkIdentityExposed(); - Assert.That(result, Is.EqualTo(clientIdentity)); - } - - [Test] - public void GetSyncVarNetworkIdentityOnClientNull() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out NetworkBehaviourGetSyncVarNetworkIdentityComponent comp); - - // are we on client and not on server? - identity.isClient = true; - Assert.That(identity.isServer, Is.False); - - // get it on the client. null should be supported. - NetworkIdentity result = comp.GetSyncVarNetworkIdentityExposed(); - Assert.That(result, Is.Null); - } - - [Test] - public void SerializeAndDeserializeObjectsAll() - { - CreateNetworked(out GameObject _, out NetworkIdentity _, out NetworkBehaviourWithSyncVarsAndCollections comp); - - // add values to synclist - comp.list.Add(42); - comp.list.Add(43); - - // serialize it - NetworkWriter writer = new NetworkWriter(); - comp.SerializeObjectsAll(writer); - - // clear original list - comp.list.Clear(); - Assert.That(comp.list.Count, Is.EqualTo(0)); - - // deserialize it - NetworkReader reader = new NetworkReader(writer.ToArray()); - comp.DeSerializeObjectsAll(reader); - Assert.That(comp.list.Count, Is.EqualTo(2)); - Assert.That(comp.list[0], Is.EqualTo(42)); - Assert.That(comp.list[1], Is.EqualTo(43)); - } - - [Test] - public void SerializeAndDeserializeObjectsDelta() - { - // SyncLists are only set dirty while owner has observers. - // need a connection. - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out NetworkBehaviourWithSyncVarsAndCollections comp); - - // add to synclist - comp.list.Add(42); - comp.list.Add(43); - - // serialize it - NetworkWriter writer = new NetworkWriter(); - comp.SerializeObjectsDelta(writer); - - // clear original list - comp.list.Clear(); - Assert.That(comp.list.Count, Is.EqualTo(0)); - - // deserialize it - NetworkReader reader = new NetworkReader(writer.ToArray()); - comp.DeSerializeObjectsDelta(reader); - Assert.That(comp.list.Count, Is.EqualTo(2)); - Assert.That(comp.list[0], Is.EqualTo(42)); - Assert.That(comp.list[1], Is.EqualTo(43)); - } - - [Test] - public void OnStopClient() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out OnStopClientComponent comp); - identity.OnStopClient(); - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStartClient() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out OnStartClientComponent comp); - identity.OnStartClient(); - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStartLocalPlayer() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out OnStartLocalPlayerComponent comp); - identity.OnStartLocalPlayer(); - Assert.That(comp.called, Is.EqualTo(1)); - } - } - - // we need to inherit from networkbehaviour to test protected functions - public class NetworkBehaviourInitSyncObjectTester : NetworkBehaviour - { - [Test] - public void InitSyncObject() - { - SyncObject syncObject = new SyncList(); - InitSyncObject(syncObject); - Assert.That(syncObjects.Count, Is.EqualTo(1)); - Assert.That(syncObjects[0], Is.EqualTo(syncObject)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs.meta deleted file mode 100644 index 49167f61a..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkBehaviourTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0e4164d273d6e4d71bd39cc246f454b2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkClientTests.cs b/Assets/Mirror/Tests/Editor/NetworkClientTests.cs deleted file mode 100644 index 729d23256..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkClientTests.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class NetworkClientTests : MirrorEditModeTest - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - // we need a server to connect to - NetworkServer.Listen(10); - } - - [Test] - public void ServerIp() - { - NetworkClient.ConnectHost(); - Assert.That(NetworkClient.serverIp, Is.EqualTo("localhost")); - } - - [Test] - public void IsConnected() - { - Assert.That(NetworkClient.isConnected, Is.False); - NetworkClient.ConnectHost(); - Assert.That(NetworkClient.isConnected, Is.True); - } - - [Test] - public void ConnectUri() - { - NetworkClient.Connect(new Uri("memory://localhost")); - // update transport so connect event is processed - UpdateTransport(); - Assert.That(NetworkClient.isConnected, Is.True); - } - - [Test] - public void DisconnectInHostMode() - { - NetworkClient.ConnectHost(); - Assert.That(NetworkClient.isConnected, Is.True); - Assert.That(NetworkServer.localConnection, !Is.Null); - - NetworkClient.Disconnect(); - Assert.That(NetworkClient.isConnected, Is.False); - Assert.That(NetworkServer.localConnection, Is.Null); - } - - [Test, Ignore("NetworkServerTest.SendClientToServerMessage does it already")] - public void Send() {} - - // test to guarantee Disconnect() eventually calls OnClientDisconnected. - // prevents https://github.com/vis2k/Mirror/issues/2818 forever. - // previously there was a bug where: - // - Disconnect() sets state = Disconnected - // - Transport processes it - // - OnTransportDisconnected() early returns because - // state == Disconnected already, so it wouldn't call the event. - [Test] - public void DisconnectCallsOnClientDisconnected_Remote() - { - // setup hook - bool called = false; - NetworkClient.OnDisconnectedEvent = () => called = true; - - // connect - ConnectClientBlocking(out _); - - // disconnect & process everything - NetworkClient.Disconnect(); - UpdateTransport(); - - // was it called? - Assert.That(called, Is.True); - } - - // same as above, but for host mode - // prevents https://github.com/vis2k/Mirror/issues/2818 forever. - [Test] - public void DisconnectCallsOnClientDisconnected_HostMode() - { - // setup hook - bool called = false; - NetworkClient.OnDisconnectedEvent = () => called = true; - - // connect host - NetworkClient.ConnectHost(); - - // disconnect & process everything - NetworkClient.Disconnect(); - UpdateTransport(); - - // was it called? - Assert.That(called, Is.True); - } - - [Test] - public void ShutdownCleanup() - { - // add some test event hooks to make sure they are cleaned up. - // there used to be a bug where they wouldn't be cleaned up. - NetworkClient.OnConnectedEvent = () => {}; - NetworkClient.OnDisconnectedEvent = () => {}; - - NetworkClient.Shutdown(); - - Assert.That(NetworkClient.handlers.Count, Is.EqualTo(0)); - Assert.That(NetworkClient.spawned.Count, Is.EqualTo(0)); - Assert.That(NetworkClient.spawnableObjects.Count, Is.EqualTo(0)); - - Assert.That(NetworkClient.connectState, Is.EqualTo(ConnectState.None)); - - Assert.That(NetworkClient.connection, Is.Null); - Assert.That(NetworkClient.localPlayer, Is.Null); - - Assert.That(NetworkClient.ready, Is.False); - Assert.That(NetworkClient.isSpawnFinished, Is.False); - Assert.That(NetworkClient.isLoadingScene, Is.False); - - Assert.That(NetworkClient.OnConnectedEvent, Is.Null); - Assert.That(NetworkClient.OnDisconnectedEvent, Is.Null); - Assert.That(NetworkClient.OnErrorEvent, Is.Null); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkClientTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkClientTests.cs.meta deleted file mode 100644 index 548cf375e..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkClientTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e55c00322b97542828f7d27c8182c60a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs b/Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs deleted file mode 100644 index fe150e468..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class NetworkConnectionToClientTests : MirrorEditModeTest - { - List clientReceived = new List(); - - [SetUp] - public override void SetUp() - { - base.SetUp(); - transport.OnClientDataReceived = (message, channelId) => { - byte[] array = new byte[message.Count]; - Buffer.BlockCopy(message.Array, message.Offset, array, 0, message.Count); - clientReceived.Add(array); - }; - transport.ServerStart(); - transport.ClientConnect("localhost"); - Assert.That(transport.ServerActive, Is.True); - Assert.That(transport.ClientConnected, Is.True); - } - - [TearDown] - public override void TearDown() - { - clientReceived.Clear(); - base.TearDown(); - } - - [Test] - public void Send_BatchesUntilUpdate() - { - // create connection and send - NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - byte[] message = {0x01, 0x02}; - connection.Send(new ArraySegment(message)); - - // Send() should only add to batch, not send anything yet - UpdateTransport(); - Assert.That(clientReceived.Count, Is.EqualTo(0)); - - // updating the connection should now send - connection.Update(); - UpdateTransport(); - Assert.That(clientReceived.Count, Is.EqualTo(1)); - } - - // IMPORTANT - // - // there was a bug where batching resets .Position instead of .Length, - // resulting in extremely high bandwidth where if the last message's - // Length was 2, and the current message's Length was 1, then we would - // still send a writer with Length = 2 because we did not reset .Length! - // -> let's try to send a big message, update, then send a small message - [Test] - public void SendBatchingResetsPreviousWriter() - { - // batching adds 8 byte timestamp header - const int BatchHeader = 8; - - // create connection - NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - - // send and update big message - byte[] message = {0x01, 0x02}; - connection.Send(new ArraySegment(message)); - connection.Update(); - UpdateTransport(); - Assert.That(clientReceived.Count, Is.EqualTo(1)); - Assert.That(clientReceived[0].Length, Is.EqualTo(BatchHeader + 2)); - Assert.That(clientReceived[0][BatchHeader + 0], Is.EqualTo(0x01)); - Assert.That(clientReceived[0][BatchHeader + 1], Is.EqualTo(0x02)); - - // clear previous - clientReceived.Clear(); - - // send a smaller message - message = new byte[]{0xFF}; - connection.Send(new ArraySegment(message)); - connection.Update(); - UpdateTransport(); - Assert.That(clientReceived.Count, Is.EqualTo(1)); - Assert.That(clientReceived[0].Length, Is.EqualTo(BatchHeader + 1)); - Assert.That(clientReceived[0][BatchHeader + 0], Is.EqualTo(0xFF)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs.meta deleted file mode 100644 index 94948fcd6..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkConnectionToClientTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 22aee0cf91224ec9925f7faabc073b09 -timeCreated: 1611722538 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs b/Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs deleted file mode 100644 index ecc1a4460..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs +++ /dev/null @@ -1,180 +0,0 @@ -// OnDe/SerializeSafely tests. -using System; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests -{ - public class NetworkIdentitySerializationTests : MirrorEditModeTest - { - // writers are always needed. create in setup for convenience. - NetworkWriter ownerWriter; - NetworkWriter observersWriter; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - ownerWriter = new NetworkWriter(); - observersWriter = new NetworkWriter(); - } - - // serialize -> deserialize. multiple components to be sure. - // one for Owner, one for Observer - [Test] - public void OnSerializeAndDeserializeAllSafely() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out SerializeTest1NetworkBehaviour comp1, - out SerializeTest2NetworkBehaviour comp2); - - // set some unique values to serialize - comp1.value = 12345; - comp1.syncMode = SyncMode.Observers; - comp2.value = "67890"; - comp2.syncMode = SyncMode.Owner; - - // serialize all - identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); - - // owner & observers should have written something - Assert.That(ownerWriter.Position, Is.GreaterThan(0)); - Assert.That(observersWriter.Position, Is.GreaterThan(0)); - Debug.Log($"ownerWriter: {BitConverter.ToString(ownerWriter.ToArray())}"); - Debug.Log($"observersWriter: {BitConverter.ToString(observersWriter.ToArray())}"); - - // reset component values - comp1.value = 0; - comp2.value = null; - - // deserialize all for owner - NetworkReader reader = new NetworkReader(ownerWriter.ToArray()); - identity.OnDeserializeAllSafely(reader, true); - Assert.That(comp1.value, Is.EqualTo(12345)); - Assert.That(comp2.value, Is.EqualTo("67890")); - - // reset component values - comp1.value = 0; - comp2.value = null; - - // deserialize all for observers - reader = new NetworkReader(observersWriter.ToArray()); - identity.OnDeserializeAllSafely(reader, true); - // observers mode, should be in data - Assert.That(comp1.value, Is.EqualTo(12345)); - // owner mode, should not be in data - Assert.That(comp2.value, Is.EqualTo(null)); - } - - // serialization should work even if a component throws an exception. - // so if first component throws, second should still be serialized fine. - [Test] - public void SerializationException() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out SerializeExceptionNetworkBehaviour compExc, - out SerializeTest2NetworkBehaviour comp2); - - // set some unique values to serialize - compExc.syncMode = SyncMode.Observers; - comp2.value = "67890"; - comp2.syncMode = SyncMode.Owner; - - // serialize all - should work even if compExc throws an exception - // error log because of the exception is expected - LogAssert.ignoreFailingMessages = true; - identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); - LogAssert.ignoreFailingMessages = false; - - // owner & observers should have written something - Assert.That(ownerWriter.Position, Is.GreaterThan(0)); - Assert.That(observersWriter.Position, Is.GreaterThan(0)); - - // reset component values - comp2.value = null; - - // deserialize all for owner - should work even if compExc throws an exception - NetworkReader reader = new NetworkReader(ownerWriter.ToArray()); - // error log because of the exception is expected - LogAssert.ignoreFailingMessages = true; - identity.OnDeserializeAllSafely(reader, true); - LogAssert.ignoreFailingMessages = false; - Assert.That(comp2.value, Is.EqualTo("67890")); - - // reset component values - comp2.value = null; - - // deserialize all for observers - should work even if compExc throws an exception - reader = new NetworkReader(observersWriter.ToArray()); - // error log because of the exception is expected - LogAssert.ignoreFailingMessages = true; - identity.OnDeserializeAllSafely(reader, true); - LogAssert.ignoreFailingMessages = false; - // owner mode, should not be in data - Assert.That(comp2.value, Is.EqualTo(null)); - } - - // OnSerializeAllSafely supports at max 64 components, because our - // dirty mask is ulong and can only handle so many bits. - [Test] - public void TooManyComponents() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity); - - // add 65 components - for (int i = 0; i < 65; ++i) - gameObject.AddComponent(); - - // CreateNetworked already initializes the components. - // let's reset and initialize again with the added ones. - identity.Reset(); - identity.Awake(); - - // ignore error from creating cache (has its own test) - LogAssert.ignoreFailingMessages = true; - _ = identity.NetworkBehaviours; - LogAssert.ignoreFailingMessages = false; - - // try to serialize - identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); - - // Should still write with too many Components because NetworkBehavioursCache should handle the error - Assert.That(ownerWriter.Position, Is.GreaterThan(0)); - Assert.That(observersWriter.Position, Is.GreaterThan(0)); - } - - // OnDeserializeSafely should be able to detect and handle serialization - // mismatches (= if compA writes 10 bytes but only reads 8 or 12, it - // shouldn't break compB's serialization. otherwise we end up with - // insane runtime errors like monsters that look like npcs. that's what - // happened back in the day with UNET). - [Test] - public void SerializationMismatch() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out SerializeMismatchNetworkBehaviour compMiss, - out SerializeTest2NetworkBehaviour comp); - - // set some unique values to serialize - comp.value = "67890"; - - // serialize - identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); - - // reset component values - comp.value = null; - - // deserialize all - NetworkReader reader = new NetworkReader(ownerWriter.ToArray()); - // warning log because of serialization mismatch - LogAssert.ignoreFailingMessages = true; - identity.OnDeserializeAllSafely(reader, true); - LogAssert.ignoreFailingMessages = false; - - // the mismatch component will fail, but the one before and after - // should still work fine. that's the whole point. - Assert.That(comp.value, Is.EqualTo("67890")); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs.meta deleted file mode 100644 index 4ab5b3b19..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkIdentitySerializationTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 0ac8a004d23d4b91bbfd910183bdb89d -timeCreated: 1628417849 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs b/Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs deleted file mode 100644 index d0b8dba43..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs +++ /dev/null @@ -1,967 +0,0 @@ -using System; -using System.Text.RegularExpressions; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests -{ - class StartServerNetworkBehaviour : NetworkBehaviour - { - internal bool onStartServerInvoked; - public override void OnStartServer() => onStartServerInvoked = true; - } - - class StartServerExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStartServer() - { - ++called; - throw new Exception("some exception"); - } - } - - class StartClientExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStartClient() - { - ++called; - throw new Exception("some exception"); - } - } - - class StartAuthorityExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStartAuthority() - { - ++called; - throw new Exception("some exception"); - } - } - - class StartAuthorityCalledNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStartAuthority() => ++called; - } - - class StopAuthorityExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStopAuthority() - { - ++called; - throw new Exception("some exception"); - } - } - - class StopAuthorityCalledNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStopAuthority() => ++called; - } - - class StartLocalPlayerExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStartLocalPlayer() - { - ++called; - throw new Exception("some exception"); - } - } - - class StartLocalPlayerCalledNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStartLocalPlayer() => ++called; - } - - class NetworkDestroyExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStopClient() - { - ++called; - throw new Exception("some exception"); - } - } - - class NetworkDestroyCalledNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStopClient() => ++called; - } - - class StopServerCalledNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStopServer() => ++called; - } - - class StopServerExceptionNetworkBehaviour : NetworkBehaviour - { - public int called; - public override void OnStopServer() - { - ++called; - throw new Exception("some exception"); - } - } - - class SerializeTest1NetworkBehaviour : NetworkBehaviour - { - public int value; - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - writer.WriteInt(value); - return true; - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - value = reader.ReadInt(); - } - } - - class SerializeTest2NetworkBehaviour : NetworkBehaviour - { - public string value; - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - writer.WriteString(value); - return true; - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - value = reader.ReadString(); - } - } - - class SerializeExceptionNetworkBehaviour : NetworkBehaviour - { - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - throw new Exception("some exception"); - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - throw new Exception("some exception"); - } - } - - class SerializeMismatchNetworkBehaviour : NetworkBehaviour - { - public int value; - public override bool OnSerialize(NetworkWriter writer, bool initialState) - { - writer.WriteInt(value); - // one too many - writer.WriteInt(value); - return true; - } - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - value = reader.ReadInt(); - } - } - - class IsClientServerCheckComponent : NetworkBehaviour - { - // OnStartClient - internal bool OnStartClient_isClient; - internal bool OnStartClient_isServer; - internal bool OnStartClient_isLocalPlayer; - public override void OnStartClient() - { - OnStartClient_isClient = isClient; - OnStartClient_isServer = isServer; - OnStartClient_isLocalPlayer = isLocalPlayer; - } - - // OnStartServer - internal bool OnStartServer_isClient; - internal bool OnStartServer_isServer; - internal bool OnStartServer_isLocalPlayer; - public override void OnStartServer() - { - OnStartServer_isClient = isClient; - OnStartServer_isServer = isServer; - OnStartServer_isLocalPlayer = isLocalPlayer; - } - - // OnStartLocalPlayer - internal bool OnStartLocalPlayer_isClient; - internal bool OnStartLocalPlayer_isServer; - internal bool OnStartLocalPlayer_isLocalPlayer; - public override void OnStartLocalPlayer() - { - OnStartLocalPlayer_isClient = isClient; - OnStartLocalPlayer_isServer = isServer; - OnStartLocalPlayer_isLocalPlayer = isLocalPlayer; - } - - // Start - internal bool Start_isClient; - internal bool Start_isServer; - internal bool Start_isLocalPlayer; - public void Start() - { - Start_isClient = isClient; - Start_isServer = isServer; - Start_isLocalPlayer = isLocalPlayer; - } - - // OnDestroy - internal bool OnDestroy_isClient; - internal bool OnDestroy_isServer; - internal bool OnDestroy_isLocalPlayer; - public void OnDestroy() - { - OnDestroy_isClient = isClient; - OnDestroy_isServer = isServer; - OnDestroy_isLocalPlayer = isLocalPlayer; - } - } - - public class NetworkIdentityTests : MirrorEditModeTest - { - [Test] - public void OnStartServerTest() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StartServerNetworkBehaviour component1, out StartServerNetworkBehaviour component2); - identity.OnStartServer(); - - Assert.That(component1.onStartServerInvoked); - Assert.That(component2.onStartServerInvoked); - } - - // check isClient/isServer/isLocalPlayer in server-only mode - [Test] - public void ServerMode_IsFlags_Test() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity _, out IsClientServerCheckComponent component); - - // start the server - NetworkServer.Listen(1000); - - // spawn it - NetworkServer.Spawn(gameObject); - - // OnStartServer should have been called. check the flags. - Assert.That(component.OnStartServer_isClient, Is.EqualTo(false)); - Assert.That(component.OnStartServer_isLocalPlayer, Is.EqualTo(false)); - Assert.That(component.OnStartServer_isServer, Is.EqualTo(true)); - } - - // check isClient/isServer/isLocalPlayer in host mode - [Test] - public void HostMode_IsFlags_Test() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity, out IsClientServerCheckComponent component); - - // start the server - NetworkServer.Listen(1000); - - // start the client - NetworkClient.ConnectHost(); - - // set is as local player - NetworkClient.InternalAddPlayer(identity); - - // spawn it - NetworkServer.Spawn(gameObject); - - // OnStartServer should have been called. check the flags. - Assert.That(component.OnStartServer_isClient, Is.EqualTo(true)); - Assert.That(component.OnStartServer_isLocalPlayer, Is.EqualTo(true)); - Assert.That(component.OnStartServer_isServer, Is.EqualTo(true)); - - // stop the client - NetworkServer.RemoveLocalConnection(); - } - - [Test] - public void GetSetAssetId() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // assign a guid - Guid guid = new Guid(0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B); - identity.assetId = guid; - - // did it work? - Assert.That(identity.assetId, Is.EqualTo(guid)); - } - - [Test] - public void SetAssetId_GivesErrorIfOneExists() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - if (identity.assetId == Guid.Empty) - { - identity.assetId = Guid.NewGuid(); - } - - Guid guid1 = identity.assetId; - - // assign a guid - Guid guid2 = Guid.NewGuid(); - LogAssert.Expect(LogType.Error, $"Can not Set AssetId on NetworkIdentity '{identity.name}' because it already had an assetId, current assetId '{guid1:N}', attempted new assetId '{guid2:N}'"); - identity.assetId = guid2; - - // guid was changed - Assert.That(identity.assetId, Is.EqualTo(guid1)); - } - - [Test] - public void SetAssetId_GivesErrorForEmptyGuid() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - if (identity.assetId == Guid.Empty) - { - identity.assetId = Guid.NewGuid(); - } - - Guid guid1 = identity.assetId; - - // assign a guid - Guid guid2 = new Guid(); - LogAssert.Expect(LogType.Error, $"Can not set AssetId to empty guid on NetworkIdentity '{identity.name}', old assetId '{guid1:N}'"); - identity.assetId = guid2; - - // guid was NOT changed - Assert.That(identity.assetId, Is.EqualTo(guid1)); - } - - [Test] - public void SetAssetId_DoesNotGiveErrorIfBothOldAndNewAreEmpty() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - Debug.Assert(identity.assetId == Guid.Empty, "assetId needs to be empty at the start of this test"); - // assign a guid - Guid guid2 = new Guid(); - // expect no errors - identity.assetId = guid2; - - // guid was still empty - Assert.That(identity.assetId, Is.EqualTo(Guid.Empty)); - } - - [Test] - public void SetClientOwner() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // SetClientOwner - LocalConnectionToClient original = new LocalConnectionToClient(); - identity.SetClientOwner(original); - Assert.That(identity.connectionToClient, Is.EqualTo(original)); - - // setting it when it's already set shouldn't overwrite the original - LocalConnectionToClient overwrite = new LocalConnectionToClient(); - // will log a warning - LogAssert.ignoreFailingMessages = true; - identity.SetClientOwner(overwrite); - Assert.That(identity.connectionToClient, Is.EqualTo(original)); - LogAssert.ignoreFailingMessages = false; - } - - [Test] - public void RemoveObserver() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // call OnStartServer so that observers dict is created - identity.OnStartServer(); - - // add an observer connection - NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - identity.observers[connection.connectionId] = connection; - - // RemoveObserver with invalid connection should do nothing - identity.RemoveObserver(new NetworkConnectionToClient(43)); - Assert.That(identity.observers.Count, Is.EqualTo(1)); - - // RemoveObserver with existing connection should remove it - identity.RemoveObserver(connection); - Assert.That(identity.observers.Count, Is.EqualTo(0)); - } - - [Test] - public void AssignSceneID() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // Awake will have assigned a random sceneId of format 0x00000000FFFFFFFF - // -> make sure that one was assigned, and that the left part was - // left empty for scene hash - Assert.That(identity.sceneId, !Is.Zero); - Assert.That(identity.sceneId & 0xFFFFFFFF00000000, Is.EqualTo(0x0000000000000000)); - - // make sure that Awake added it to sceneIds dict - Assert.That(NetworkIdentity.GetSceneIdentity(identity.sceneId), !Is.Null); - } - - [Test] - public void SetSceneIdSceneHashPartInternal() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // Awake will have assigned a random sceneId of format 0x00000000FFFFFFFF - // -> make sure that one was assigned, and that the left part was - // left empty for scene hash - Assert.That(identity.sceneId, !Is.Zero); - Assert.That(identity.sceneId & 0xFFFFFFFF00000000, Is.EqualTo(0x0000000000000000)); - ulong rightPart = identity.sceneId; - - // set scene hash - identity.SetSceneIdSceneHashPartInternal(); - - // make sure that the right part is still the random sceneid - Assert.That(identity.sceneId & 0x00000000FFFFFFFF, Is.EqualTo(rightPart)); - - // make sure that the left part is a scene hash now - Assert.That(identity.sceneId & 0xFFFFFFFF00000000, !Is.Zero); - ulong finished = identity.sceneId; - - // calling it again should said the exact same hash again - identity.SetSceneIdSceneHashPartInternal(); - Assert.That(identity.sceneId, Is.EqualTo(finished)); - } - - [Test] - public void OnValidateSetupIDsSetsEmptyAssetIDForSceneObject() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // OnValidate will have been called. make sure that assetId was set - // to 0 empty and not anything else, because this is a scene object - Assert.That(identity.assetId, Is.EqualTo(Guid.Empty)); - } - - [Test] - public void OnStartServerCallsComponentsAndCatchesExceptions() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StartServerExceptionNetworkBehaviour comp); - - // make sure that comp.OnStartServer was called and make sure that - // the exception was caught and not thrown in here. - // an exception in OnStartServer should be caught, so that one - // component's exception doesn't stop all other components from - // being initialized - // (an error log is expected though) - LogAssert.ignoreFailingMessages = true; - // should catch the exception internally and not throw it - identity.OnStartServer(); - Assert.That(comp.called, Is.EqualTo(1)); - LogAssert.ignoreFailingMessages = false; - } - - [Test] - public void OnStartClientCallsComponentsAndCatchesExceptions() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StartClientExceptionNetworkBehaviour comp); - - // make sure that comp.OnStartClient was called and make sure that - // the exception was caught and not thrown in here. - // an exception in OnStartClient should be caught, so that one - // component's exception doesn't stop all other components from - // being initialized - // (an error log is expected though) - LogAssert.ignoreFailingMessages = true; - // should catch the exception internally and not throw it - identity.OnStartClient(); - Assert.That(comp.called, Is.EqualTo(1)); - LogAssert.ignoreFailingMessages = false; - - // we have checks to make sure that it's only called once. - // let's see if they work. - identity.OnStartClient(); - // same as before? - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStartAuthorityCallsComponentsAndCatchesExceptions() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StartAuthorityExceptionNetworkBehaviour comp); - - // make sure that comp.OnStartAuthority was called and make sure that - // the exception was caught and not thrown in here. - // an exception in OnStartAuthority should be caught, so that one - // component's exception doesn't stop all other components from - // being initialized - // (an error log is expected though) - LogAssert.ignoreFailingMessages = true; - // should catch the exception internally and not throw it - identity.OnStartAuthority(); - Assert.That(comp.called, Is.EqualTo(1)); - LogAssert.ignoreFailingMessages = false; - } - - [Test] - public void OnStopAuthorityCallsComponentsAndCatchesExceptions() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StopAuthorityExceptionNetworkBehaviour comp); - - // make sure that comp.OnStopAuthority was called and make sure that - // the exception was caught and not thrown in here. - // an exception in OnStopAuthority should be caught, so that one - // component's exception doesn't stop all other components from - // being initialized - // (an error log is expected though) - LogAssert.ignoreFailingMessages = true; - // should catch the exception internally and not throw it - identity.OnStopAuthority(); - Assert.That(comp.called, Is.EqualTo(1)); - LogAssert.ignoreFailingMessages = false; - } - - [Test] - public void AssignAndRemoveClientAuthority() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // test the callback too - int callbackCalled = 0; - NetworkConnection callbackConnection = null; - NetworkIdentity callbackIdentity = null; - bool callbackState = false; - NetworkIdentity.clientAuthorityCallback += (conn, networkIdentity, state) => - { - ++callbackCalled; - callbackConnection = conn; - callbackIdentity = identity; - callbackState = state; - }; - - // create connections - CreateLocalConnectionPair(out LocalConnectionToClient owner, out LocalConnectionToServer clientConnection); - owner.isReady = true; - - // setup NetworkServer/Client connections so messages are handled - NetworkClient.connection = clientConnection; - NetworkServer.connections[owner.connectionId] = owner; - - // add client handlers - int spawnCalled = 0; - void Handler(SpawnMessage _) => ++spawnCalled; - NetworkClient.RegisterHandler(Handler, false); - - // assigning authority should only work on server. - // if isServer is false because server isn't running yet then it - // should fail. - // error log is expected - LogAssert.ignoreFailingMessages = true; - bool result = identity.AssignClientAuthority(owner); - LogAssert.ignoreFailingMessages = false; - Assert.That(result, Is.False); - - // server is needed - NetworkServer.Listen(1); - - // call OnStartServer so that isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // assign authority - result = identity.AssignClientAuthority(owner); - Assert.That(result, Is.True); - Assert.That(identity.connectionToClient, Is.EqualTo(owner)); - Assert.That(callbackCalled, Is.EqualTo(1)); - Assert.That(callbackConnection, Is.EqualTo(owner)); - Assert.That(callbackIdentity, Is.EqualTo(identity)); - Assert.That(callbackState, Is.EqualTo(true)); - - // shouldn't be able to assign authority while already owned by - // another connection - // error log is expected - LogAssert.ignoreFailingMessages = true; - result = identity.AssignClientAuthority(new NetworkConnectionToClient(43)); - LogAssert.ignoreFailingMessages = false; - Assert.That(result, Is.False); - Assert.That(identity.connectionToClient, Is.EqualTo(owner)); - Assert.That(callbackCalled, Is.EqualTo(1)); - - // someone might try to remove authority by assigning null. - // make sure this fails. - // error log is expected - LogAssert.ignoreFailingMessages = true; - result = identity.AssignClientAuthority(null); - LogAssert.ignoreFailingMessages = false; - Assert.That(result, Is.False); - - // removing authority while not isServer shouldn't work. - // only allow it on server. - identity.isServer = false; - - // error log is expected - LogAssert.ignoreFailingMessages = true; - identity.RemoveClientAuthority(); - LogAssert.ignoreFailingMessages = false; - Assert.That(identity.connectionToClient, Is.EqualTo(owner)); - Assert.That(callbackCalled, Is.EqualTo(1)); - - // enable isServer again - identity.isServer = true; - - // removing authority for the main player object shouldn't work - // set connection's player object - owner.identity = identity; - // error log is expected - LogAssert.ignoreFailingMessages = true; - identity.RemoveClientAuthority(); - LogAssert.ignoreFailingMessages = false; - Assert.That(identity.connectionToClient, Is.EqualTo(owner)); - Assert.That(callbackCalled, Is.EqualTo(1)); - - // removing authority for a non-main-player object should work - owner.identity = null; - identity.RemoveClientAuthority(); - Assert.That(identity.connectionToClient, Is.Null); - Assert.That(callbackCalled, Is.EqualTo(2)); - // the one that was removed - Assert.That(callbackConnection, Is.EqualTo(owner)); - Assert.That(callbackIdentity, Is.EqualTo(identity)); - Assert.That(callbackState, Is.EqualTo(false)); - } - - [Test] - public void NotifyAuthorityCallsOnStartStopAuthority() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StartAuthorityCalledNetworkBehaviour compStart, out StopAuthorityCalledNetworkBehaviour compStop); - - // set authority from false to true, which should call OnStartAuthority - identity.hasAuthority = true; - identity.NotifyAuthority(); - // shouldn't be touched - Assert.That(identity.hasAuthority, Is.True); - // start should be called - Assert.That(compStart.called, Is.EqualTo(1)); - // stop shouldn't - Assert.That(compStop.called, Is.EqualTo(0)); - - // set it to true again, should do nothing because already true - identity.hasAuthority = true; - identity.NotifyAuthority(); - // shouldn't be touched - Assert.That(identity.hasAuthority, Is.True); - // same as before - Assert.That(compStart.called, Is.EqualTo(1)); - // same as before - Assert.That(compStop.called, Is.EqualTo(0)); - - // set it to false, should call OnStopAuthority - identity.hasAuthority = false; - identity.NotifyAuthority(); - // should be changed - Assert.That(identity.hasAuthority, Is.False); - // same as before - Assert.That(compStart.called, Is.EqualTo(1)); - // stop should be called - Assert.That(compStop.called, Is.EqualTo(1)); - - // set it to false again, should do nothing because already false - identity.hasAuthority = false; - identity.NotifyAuthority(); - // shouldn't be touched - Assert.That(identity.hasAuthority, Is.False); - // same as before - Assert.That(compStart.called, Is.EqualTo(1)); - // same as before - Assert.That(compStop.called, Is.EqualTo(1)); - } - - // OnStartServer in host mode should set isClient=true - [Test] - public void OnStartServerInHostModeSetsIsClientTrue() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // call client connect so that internals are set up - // (it won't actually successfully connect) - NetworkClient.Connect("localhost"); - - // manually invoke transport.OnConnected so that NetworkClient.active is set to true - Transport.activeTransport.OnClientConnected.Invoke(); - Assert.That(NetworkClient.active, Is.True); - - // isClient needs to be true in OnStartServer if in host mode. - // this is a test for a bug that we fixed, where isClient was false - // in OnStartServer if in host mode because in host mode, we only - // connect the client after starting the server, hence isClient would - // be false in OnStartServer until way later. - // -> we have the workaround in OnStartServer, so let's also test to - // make sure that nobody ever breaks it again - Assert.That(identity.isClient, Is.False); - identity.OnStartServer(); - Assert.That(identity.isClient, Is.True); - } - - [Test] - public void CreatingNetworkBehavioursCacheShouldLogErrorForTooComponents() - { - CreateNetworked(out GameObject gameObject, out NetworkIdentity identity); - - // add byte.MaxValue+1 components - for (int i = 0; i < byte.MaxValue + 1; ++i) - { - gameObject.AddComponent(); - } - - // CreateNetworked already initializes the components. - // let's reset and initialize again with the added ones. - identity.Reset(); - identity.Awake(); - - // call NetworkBehaviours property to create the cache - LogAssert.Expect(LogType.Error, new Regex($"Only {byte.MaxValue} NetworkBehaviour components are allowed for NetworkIdentity.+")); - _ = identity.NetworkBehaviours; - } - - [Test] - public void OnStartLocalPlayer() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out StartLocalPlayerExceptionNetworkBehaviour compEx, - out StartLocalPlayerCalledNetworkBehaviour comp); - - // make sure our test values are set to 0 - Assert.That(compEx.called, Is.EqualTo(0)); - Assert.That(comp.called, Is.EqualTo(0)); - - // call OnStartLocalPlayer in identity - // one component will throw an exception, but that shouldn't stop - // OnStartLocalPlayer from being called in the second one - // exception will log an error - LogAssert.ignoreFailingMessages = true; - identity.OnStartLocalPlayer(); - LogAssert.ignoreFailingMessages = false; - Assert.That(compEx.called, Is.EqualTo(1)); - Assert.That(comp.called, Is.EqualTo(1)); - - // we have checks to make sure that it's only called once. - // let's see if they work. - identity.OnStartLocalPlayer(); - // same as before? - Assert.That(compEx.called, Is.EqualTo(1)); - // same as before? - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStopClient() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out NetworkDestroyCalledNetworkBehaviour comp); - - // call OnStopClient in identity - identity.OnStopClient(); - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStopClientException() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out NetworkDestroyExceptionNetworkBehaviour compEx, - out NetworkDestroyCalledNetworkBehaviour comp); - - // call OnStopClient in identity - // one component will throw an exception, but that shouldn't stop - // OnStopClient from being called in the second one - // exception will log an error - LogAssert.ignoreFailingMessages = true; - identity.OnStopClient(); - LogAssert.ignoreFailingMessages = false; - Assert.That(compEx.called, Is.EqualTo(1)); - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStopServer() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out StopServerCalledNetworkBehaviour comp); - - identity.OnStopServer(); - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void OnStopServerException() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, out StopServerExceptionNetworkBehaviour compEx); - - // make sure our test values are set to 0 - Assert.That(compEx.called, Is.EqualTo(0)); - - // call OnStopClient in identity - // one component will throw an exception, but that shouldn't stop - // OnStopClient from being called in the second one - // exception will log an error - LogAssert.ignoreFailingMessages = true; - identity.OnStopServer(); - LogAssert.ignoreFailingMessages = false; - Assert.That(compEx.called, Is.EqualTo(1)); - } - - [Test] - public void AddObserver() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // create some connections - NetworkConnectionToClient connection1 = new NetworkConnectionToClient(42); - NetworkConnectionToClient connection2 = new NetworkConnectionToClient(43); - - // AddObserver should return early if called before .observers was - // created - Assert.That(identity.observers, Is.Null); - // error log is expected - LogAssert.ignoreFailingMessages = true; - identity.AddObserver(connection1); - LogAssert.ignoreFailingMessages = false; - Assert.That(identity.observers, Is.Null); - - // call OnStartServer so that observers dict is created - identity.OnStartServer(); - - // call AddObservers - identity.AddObserver(connection1); - identity.AddObserver(connection2); - Assert.That(identity.observers.Count, Is.EqualTo(2)); - Assert.That(identity.observers.ContainsKey(connection1.connectionId)); - Assert.That(identity.observers[connection1.connectionId], Is.EqualTo(connection1)); - Assert.That(identity.observers.ContainsKey(connection2.connectionId)); - Assert.That(identity.observers[connection2.connectionId], Is.EqualTo(connection2)); - - // adding a duplicate connectionId shouldn't overwrite the original - NetworkConnectionToClient duplicate = new NetworkConnectionToClient(connection1.connectionId); - identity.AddObserver(duplicate); - Assert.That(identity.observers.Count, Is.EqualTo(2)); - Assert.That(identity.observers.ContainsKey(connection1.connectionId)); - Assert.That(identity.observers[connection1.connectionId], Is.EqualTo(connection1)); - Assert.That(identity.observers.ContainsKey(connection2.connectionId)); - Assert.That(identity.observers[connection2.connectionId], Is.EqualTo(connection2)); - } - - [Test] - public void ClearObservers() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // call OnStartServer so that observers dict is created - identity.OnStartServer(); - - // add some observers - identity.observers[42] = new NetworkConnectionToClient(42); - identity.observers[43] = new NetworkConnectionToClient(43); - - // call ClearObservers - identity.ClearObservers(); - Assert.That(identity.observers.Count, Is.EqualTo(0)); - } - - [Test] - public void ClearDirtyComponentsDirtyBits() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out OnStartClientTestNetworkBehaviour compA, - out OnStartClientTestNetworkBehaviour compB); - - // set syncintervals so one is always dirty, one is never dirty - compA.syncInterval = 0; - compB.syncInterval = Mathf.Infinity; - - // set components dirty bits - compA.SetSyncVarDirtyBit(0x0001); - compB.SetSyncVarDirtyBit(0x1001); - // dirty because interval reached and mask != 0 - Assert.That(compA.IsDirty(), Is.True); - // not dirty because syncinterval not reached - Assert.That(compB.IsDirty(), Is.False); - - // call identity.ClearDirtyComponentsDirtyBits - identity.ClearDirtyComponentsDirtyBits(); - // should be cleared now - Assert.That(compA.IsDirty(), Is.False); - // should be untouched - Assert.That(compB.IsDirty(), Is.False); - - // set compB syncinterval to 0 to check if the masks were untouched - // (if they weren't, then it should be dirty now) - compB.syncInterval = 0; - Assert.That(compB.IsDirty(), Is.True); - } - - [Test] - public void ClearAllComponentsDirtyBits() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity, - out OnStartClientTestNetworkBehaviour compA, - out OnStartClientTestNetworkBehaviour compB); - - // set syncintervals so one is always dirty, one is never dirty - compA.syncInterval = 0; - compB.syncInterval = Mathf.Infinity; - - // set components dirty bits - compA.SetSyncVarDirtyBit(0x0001); - compB.SetSyncVarDirtyBit(0x1001); - // dirty because interval reached and mask != 0 - Assert.That(compA.IsDirty(), Is.True); - // not dirty because syncinterval not reached - Assert.That(compB.IsDirty(), Is.False); - - // call identity.ClearAllComponentsDirtyBits - identity.ClearAllComponentsDirtyBits(); - // should be cleared now - Assert.That(compA.IsDirty(), Is.False); - // should be cleared now - Assert.That(compB.IsDirty(), Is.False); - - // set compB syncinterval to 0 to check if the masks were cleared - // (if they weren't, then it would still be dirty now) - compB.syncInterval = 0; - Assert.That(compB.IsDirty(), Is.False); - } - - [Test] - public void Reset() - { - CreateNetworked(out GameObject _, out NetworkIdentity identity); - - // modify it a bit - identity.isClient = true; - // creates .observers and generates a netId - identity.OnStartServer(); - identity.connectionToClient = new NetworkConnectionToClient(1); - identity.connectionToServer = new NetworkConnectionToServer(); - identity.observers[43] = new NetworkConnectionToClient(2); - - // mark for reset and reset - identity.Reset(); - Assert.That(identity.isServer, Is.False); - Assert.That(identity.isClient, Is.False); - Assert.That(identity.isLocalPlayer, Is.False); - Assert.That(identity.netId, Is.EqualTo(0)); - Assert.That(identity.connectionToClient, Is.Null); - Assert.That(identity.connectionToServer, Is.Null); - Assert.That(identity.hasAuthority, Is.False); - Assert.That(identity.observers, Is.Empty); - } - - [Test, Ignore("NetworkServerTest.SendCommand does it already")] - public void HandleCommand() {} - - [Test, Ignore("RpcTests do it already")] - public void HandleRpc() {} - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs.meta deleted file mode 100644 index 6ae479b04..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e9b6d86d91cc74ce58e690371d4f3828 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkLoopTests.cs b/Assets/Mirror/Tests/Editor/NetworkLoopTests.cs deleted file mode 100644 index eb77bd7e8..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkLoopTests.cs +++ /dev/null @@ -1,110 +0,0 @@ -using NUnit.Framework; -#if UNITY_2019_1_OR_NEWER -using UnityEngine.LowLevel; -using UnityEngine.PlayerLoop; -#else -using UnityEngine.Experimental.LowLevel; -using UnityEngine.Experimental.PlayerLoop; -#endif - -namespace Mirror.Tests -{ - public class NetworkLoopTests - { - // all tests need a PlayerLoopSystem to work with - PlayerLoopSystem playerLoop; - - [SetUp] - public void SetUp() - { - // we get the main player loop to work with. - // we don't actually set it. no need to. - playerLoop = PlayerLoop.GetDefaultPlayerLoop(); - } - - // simple test to see if it finds and adds to EarlyUpdate() loop - [Test] - public void AddToPlayerLoop_EarlyUpdate_Beginning() - { - void Function() {} - - // add our function - bool result = NetworkLoop.AddToPlayerLoop(Function, typeof(NetworkLoopTests), ref playerLoop, typeof(EarlyUpdate), NetworkLoop.AddMode.Beginning); - Assert.That(result, Is.True); - - // was it added to the beginning? - int index = NetworkLoop.FindPlayerLoopEntryIndex(Function, playerLoop, typeof(EarlyUpdate)); - Assert.That(index, Is.EqualTo(0)); - } - - [Test] - public void AddToPlayerLoop_EarlyUpdate_End() - { - void Function() {} - - // add our function - bool result = NetworkLoop.AddToPlayerLoop(Function, typeof(NetworkLoopTests), ref playerLoop, typeof(EarlyUpdate), NetworkLoop.AddMode.End); - Assert.That(result, Is.True); - - // was it added to the end? we don't know the exact index, but it should be >0 - int index = NetworkLoop.FindPlayerLoopEntryIndex(Function, playerLoop, typeof(EarlyUpdate)); - Assert.That(index, Is.GreaterThan(0)); - } - - [Test] - public void AddToPlayerLoop_Update_Beginning() - { - void Function() {} - - // add our function - bool result = NetworkLoop.AddToPlayerLoop(Function, typeof(NetworkLoopTests), ref playerLoop, typeof(Update), NetworkLoop.AddMode.Beginning); - Assert.That(result, Is.True); - - // was it added to the beginning? - int index = NetworkLoop.FindPlayerLoopEntryIndex(Function, playerLoop, typeof(Update)); - Assert.That(index, Is.EqualTo(0)); - } - - [Test] - public void AddToPlayerLoop_Update_End() - { - void Function() {} - - // add our function - bool result = NetworkLoop.AddToPlayerLoop(Function, typeof(NetworkLoopTests), ref playerLoop, typeof(Update), NetworkLoop.AddMode.End); - Assert.That(result, Is.True); - - // was it added to the end? we don't know the exact index, but it should be >0 - int index = NetworkLoop.FindPlayerLoopEntryIndex(Function, playerLoop, typeof(Update)); - Assert.That(index, Is.GreaterThan(0)); - } - - [Test] - public void AddToPlayerLoop_PreLateUpdate_Beginning() - { - void Function() {} - - // add our function - bool result = NetworkLoop.AddToPlayerLoop(Function, typeof(NetworkLoopTests), ref playerLoop, typeof(PreLateUpdate), NetworkLoop.AddMode.Beginning); - Assert.That(result, Is.True); - - // was it added to the beginning? - int index = NetworkLoop.FindPlayerLoopEntryIndex(Function, playerLoop, typeof(PreLateUpdate)); - Assert.That(index, Is.EqualTo(0)); - } - - [Test] - public void AddToPlayerLoop_PreLateUpdate_End() - { - void Function() {} - - // add our function - bool result = NetworkLoop.AddToPlayerLoop(Function, typeof(NetworkLoopTests), ref playerLoop, typeof(PreLateUpdate), NetworkLoop.AddMode.End); - Assert.That(result, Is.True); - - // was it added to the end? we don't know the exact index, but it should be >0 - int index = NetworkLoop.FindPlayerLoopEntryIndex(Function, playerLoop, typeof(PreLateUpdate)); - Assert.That(index, Is.GreaterThan(0)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkLoopTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkLoopTests.cs.meta deleted file mode 100644 index 4fb7e3e0c..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkLoopTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: eedb822be9a941428259caf9f707bb45 -timeCreated: 1614573407 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs b/Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs deleted file mode 100644 index 21702edee..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs +++ /dev/null @@ -1,39 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - class NetworkManagerOnServerDisconnect : NetworkManager - { - public int called; - public override void OnServerDisconnect(NetworkConnection conn) - { - base.OnServerDisconnect(conn); - ++called; - } -} - - [TestFixture] - public class NetworkManagerStopHostOnServerDisconnectTest : MirrorEditModeTest - { - NetworkManagerOnServerDisconnect manager; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - manager = transport.gameObject.AddComponent(); - } - - // test to prevent https://github.com/vis2k/Mirror/issues/1515 - [Test] - public void StopHostCallsOnServerDisconnectForHostClient() - { - // OnServerDisconnect is always called when a client disconnects. - // it should also be called for the host client when we stop the host - Assert.That(manager.called, Is.EqualTo(0)); - manager.StartHost(); - manager.StopHost(); - Assert.That(manager.called, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs.meta deleted file mode 100644 index b21084477..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkManagerStopHostOnServerDisconnectTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2f583081473a64b92b971678e571382a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkManagerTest.cs b/Assets/Mirror/Tests/Editor/NetworkManagerTest.cs deleted file mode 100644 index 6d912a9e3..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkManagerTest.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - [TestFixture] - public class NetworkManagerTest : MirrorEditModeTest - { - GameObject gameObject; - NetworkManager manager; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - gameObject = transport.gameObject; - manager = gameObject.AddComponent(); - } - - [Test] - public void StartServerTest() - { - Assert.That(NetworkServer.active, Is.False); - - manager.StartServer(); - - Assert.That(manager.mode == NetworkManagerMode.ServerOnly); - Assert.That(NetworkServer.active, Is.True); - } - - [Test] - public void StopServerTest() - { - manager.StartServer(); - manager.StopServer(); - - Assert.That(manager.mode == NetworkManagerMode.Offline); - } - - [Test] - public void StartClientTest() - { - manager.StartClient(); - - Assert.That(manager.mode == NetworkManagerMode.ClientOnly); - - manager.StopClient(); - } - - [Test] - public void StopClientTest() - { - manager.StartClient(); - manager.StopClient(); - - Assert.That(manager.mode == NetworkManagerMode.Offline); - } - - [Test] - public void StartHostTest() - { - manager.StartHost(); - - Assert.That(manager.mode == NetworkManagerMode.Host); - Assert.That(NetworkServer.active, Is.True); - Assert.That(NetworkClient.active, Is.True); - } - - [Test] - public void StopHostTest() - { - manager.StartHost(); - manager.StopHost(); - - Assert.That(manager.mode == NetworkManagerMode.Offline); - Assert.That(NetworkServer.active, Is.False); - Assert.That(NetworkClient.active, Is.False); - } - - [Test] - public void ShutdownTest() - { - manager.StartClient(); - NetworkManager.ResetStatics(); - - Assert.That(NetworkManager.startPositions.Count, Is.Zero); - Assert.That(NetworkManager.startPositionIndex, Is.Zero); - Assert.That(NetworkManager.clientReadyConnection, Is.Null); - Assert.That(NetworkManager.loadingSceneAsync, Is.Null); - Assert.That(NetworkManager.singleton, Is.Null); - Assert.That(NetworkManager.networkSceneName, Is.Empty); - } - - [Test] - public void RegisterStartPositionTest() - { - Assert.That(NetworkManager.startPositions.Count, Is.Zero); - - NetworkManager.RegisterStartPosition(gameObject.transform); - Assert.That(NetworkManager.startPositions.Count, Is.EqualTo(1)); - Assert.That(NetworkManager.startPositions, Has.Member(gameObject.transform)); - - NetworkManager.UnRegisterStartPosition(gameObject.transform); - } - - [Test] - public void UnRegisterStartPositionTest() - { - Assert.That(NetworkManager.startPositions.Count, Is.Zero); - - NetworkManager.RegisterStartPosition(gameObject.transform); - Assert.That(NetworkManager.startPositions.Count, Is.EqualTo(1)); - Assert.That(NetworkManager.startPositions, Has.Member(gameObject.transform)); - - NetworkManager.UnRegisterStartPosition(gameObject.transform); - Assert.That(NetworkManager.startPositions.Count, Is.Zero); - } - - [Test] - public void GetStartPositionTest() - { - Assert.That(NetworkManager.startPositions.Count, Is.Zero); - - NetworkManager.RegisterStartPosition(gameObject.transform); - Assert.That(NetworkManager.startPositions.Count, Is.EqualTo(1)); - Assert.That(NetworkManager.startPositions, Has.Member(gameObject.transform)); - - Assert.That(manager.GetStartPosition(), Is.SameAs(gameObject.transform)); - - NetworkManager.UnRegisterStartPosition(gameObject.transform); - } - - [Test] - public void StartClientUriTest() - { - UriBuilder uriBuilder = new UriBuilder - { - Host = "localhost", - Scheme = "local" - }; - manager.StartClient(uriBuilder.Uri); - - Assert.That(manager.mode, Is.EqualTo(NetworkManagerMode.ClientOnly)); - Assert.That(manager.networkAddress, Is.EqualTo(uriBuilder.Uri.Host)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkManagerTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkManagerTest.cs.meta deleted file mode 100644 index ad10e831e..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkManagerTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 11f1d5fee03c2764691201aabc5dda98 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkMessageTests.cs b/Assets/Mirror/Tests/Editor/NetworkMessageTests.cs deleted file mode 100644 index 50e6cea19..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkMessageTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests.MessageTests -{ - struct TestMessage : NetworkMessage - { - public int IntValue; - public string StringValue; - public double DoubleValue; - - public TestMessage(int i, string s, double d) - { - IntValue = i; - StringValue = s; - DoubleValue = d; - } - - public void Deserialize(NetworkReader reader) - { - IntValue = reader.ReadInt(); - StringValue = reader.ReadString(); - DoubleValue = reader.ReadDouble(); - } - - public void Serialize(NetworkWriter writer) - { - writer.WriteInt(IntValue); - writer.WriteString(StringValue); - writer.WriteDouble(DoubleValue); - } - } - - struct StructWithEmptyMethodMessage : NetworkMessage - { - public int IntValue; - public string StringValue; - public double DoubleValue; - } - - [TestFixture] - public class NetworkMessageTests - { - // with Serialize/Deserialize - [Test] - public void StructWithMethods() - { - byte[] bytes = MessagePackingTest.PackToByteArray(new TestMessage(1, "2", 3.3)); - TestMessage message = MessagePackingTest.UnpackFromByteArray(bytes); - - Assert.AreEqual(1, message.IntValue); - } - - // without Serialize/Deserialize. Weaver should handle it. - [Test] - public void StructWithEmptyMethods() - { - byte[] bytes = MessagePackingTest.PackToByteArray(new StructWithEmptyMethodMessage { IntValue = 1, StringValue = "2", DoubleValue = 3.3 }); - StructWithEmptyMethodMessage message = MessagePackingTest.UnpackFromByteArray(bytes); - - Assert.AreEqual(1, message.IntValue); - Assert.AreEqual("2", message.StringValue); - Assert.AreEqual(3.3, message.DoubleValue); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkMessageTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkMessageTests.cs.meta deleted file mode 100644 index 14117769c..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkMessageTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ecf93fcf0386fee4e85f981d5ca9259d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkReaderTest.cs b/Assets/Mirror/Tests/Editor/NetworkReaderTest.cs deleted file mode 100644 index 49bf1bd48..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkReaderTest.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.IO; -using NUnit.Framework; - -namespace Mirror.Tests -{ - // NetworkWriterTest already covers most cases for NetworkReader. - // only a few are left - [TestFixture] - public class NetworkReaderTest - { - /* uncomment if needed. commented for faster test workflow. this takes >3s. - [Test] - public void Benchmark() - { - // 10 million reads, Unity 2019.3, code coverage disabled - // 4049ms (+GC later) - byte[] bytes = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C }; - for (int i = 0; i < 10000000; ++i) - { - ArraySegment segment = new ArraySegment(bytes); - NetworkReader reader = new NetworkReader(segment); - Vector3 value = reader.ReadVector3(); - } - } - */ - - [Test] - public void SetBuffer() - { - // start with an initial buffer - byte[] firstBuffer = {0xFF}; - NetworkReader reader = new NetworkReader(firstBuffer); - - // read one byte so we modify position - reader.ReadByte(); - - // set another buffer - byte[] secondBuffer = {0x42}; - reader.SetBuffer(secondBuffer); - - // was position reset? - Assert.That(reader.Position, Is.EqualTo(0)); - - // are we really on the second buffer now? - Assert.That(reader.ReadByte(), Is.EqualTo(0x42)); - } - - [Test] - public void Remaining() - { - byte[] bytes = {0x00, 0x01}; - NetworkReader reader = new NetworkReader(bytes); - Assert.That(reader.Remaining, Is.EqualTo(2)); - - reader.ReadByte(); - Assert.That(reader.Remaining, Is.EqualTo(1)); - - reader.ReadByte(); - Assert.That(reader.Remaining, Is.EqualTo(0)); - } - - [Test] - public void ReadBytesCountTooBigTest() - { - // calling ReadBytes with a count bigger than what is in Reader - // should throw an exception - byte[] bytes = { 0x00, 0x01 }; - - using (PooledNetworkReader reader = NetworkReaderPool.GetReader(bytes)) - { - try - { - byte[] result = reader.ReadBytes(bytes, bytes.Length + 1); - // BAD: IF WE GOT HERE, THEN NO EXCEPTION WAS THROWN - Assert.Fail(); - } - catch (EndOfStreamException) - { - // GOOD - } - } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkReaderTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkReaderTest.cs.meta deleted file mode 100644 index ce21bed1d..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkReaderTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3799af27efdf144909de8790851053a8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs b/Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs deleted file mode 100644 index 32fa7838f..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs +++ /dev/null @@ -1,31 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - [TestFixture] - public class NetworkReaderWriterTest - { - [Test] - public void TestIntWriterNotNull() - { - Assert.That(Writer.write, Is.Not.Null); - } - - [Test] - public void TestIntReaderNotNull() - { - Assert.That(Reader.read, Is.Not.Null); - } - - [Test] - public void TestAccessingCustomWriterAndReader() - { - NetworkWriter writer = new NetworkWriter(); - writer.Write(3); - NetworkReader reader = new NetworkReader(writer.ToArray()); - int copy = reader.Read(); - - Assert.That(copy, Is.EqualTo(3)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs.meta deleted file mode 100644 index 1e4a29f9b..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkReaderWriterTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4db12e3e883ac4c3aac177c638ee93e8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkServerTest.cs b/Assets/Mirror/Tests/Editor/NetworkServerTest.cs deleted file mode 100644 index bc126e84d..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkServerTest.cs +++ /dev/null @@ -1,1323 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using System.Threading; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests -{ - struct TestMessage1 : NetworkMessage {} - - struct VariableSizedMessage : NetworkMessage - { - // weaver serializes byte[] wit WriteBytesAndSize - public byte[] payload; - // so payload := size - 4 - // then the message is exactly maxed size. - // - // NOTE: we have a LargerMaxMessageSize test which guarantees that - // variablesized + 1 is exactly transport.max + 1 - public VariableSizedMessage(int size) => payload = new byte[size - 4]; - } - - public class CommandTestNetworkBehaviour : NetworkBehaviour - { - // counter to make sure that it's called exactly once - public int called; - - [Command] - public void TestCommand() => ++called; - } - - public class RpcTestNetworkBehaviour : NetworkBehaviour - { - // counter to make sure that it's called exactly once - public int called; - // weaver generates this from [Rpc] - // but for tests we need to add it manually - public static void RpcGenerated(NetworkBehaviour comp, NetworkReader reader, NetworkConnection senderConnection) - { - ++((RpcTestNetworkBehaviour)comp).called; - } - } - - public class OnStartClientTestNetworkBehaviour : NetworkBehaviour - { - // counter to make sure that it's called exactly once - public int called; - public override void OnStartClient() => ++called; - } - - public class OnStopClientTestNetworkBehaviour : NetworkBehaviour - { - // counter to make sure that it's called exactly once - public int called; - public override void OnStopClient() => ++called; - } - - [TestFixture] - public class NetworkServerTest : MirrorEditModeTest - { - [Test] - public void IsActive() - { - Assert.That(NetworkServer.active, Is.False); - NetworkServer.Listen(1); - Assert.That(NetworkServer.active, Is.True); - NetworkServer.Shutdown(); - Assert.That(NetworkServer.active, Is.False); - } - - [Test] - public void MaxConnections() - { - // listen with maxconnections=1 - NetworkServer.Listen(1); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - - // connect first: should work - transport.OnServerConnected.Invoke(42); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - - // connect second: should fail - transport.OnServerConnected.Invoke(43); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - } - - [Test] - public void OnConnectedEventCalled() - { - // message handlers - bool connectCalled = false; - NetworkServer.OnConnectedEvent = conn => connectCalled = true; - - // listen & connect - NetworkServer.Listen(1); - transport.OnServerConnected.Invoke(42); - Assert.That(connectCalled, Is.True); - } - - [Test] - public void OnDisconnectedEventCalled() - { - // message handlers - bool disconnectCalled = false; - NetworkServer.OnDisconnectedEvent = conn => disconnectCalled = true; - - // listen & connect - NetworkServer.Listen(1); - transport.OnServerConnected.Invoke(42); - - // disconnect - transport.OnServerDisconnected.Invoke(42); - Assert.That(disconnectCalled, Is.True); - } - - [Test] - public void ConnectionsDict() - { - // listen - NetworkServer.Listen(2); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - - // connect first - transport.OnServerConnected.Invoke(42); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - Assert.That(NetworkServer.connections.ContainsKey(42), Is.True); - - // connect second - transport.OnServerConnected.Invoke(43); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(2)); - Assert.That(NetworkServer.connections.ContainsKey(43), Is.True); - - // disconnect second - transport.OnServerDisconnected.Invoke(43); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - Assert.That(NetworkServer.connections.ContainsKey(42), Is.True); - - // disconnect first - transport.OnServerDisconnected.Invoke(42); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - } - - [Test] - public void OnConnectedOnlyAllowsNonZeroConnectionIds() - { - // OnConnected should only allow connectionIds >= 0 - // 0 is for local player - // <0 is never used - - // listen - NetworkServer.Listen(2); - - // connect with connectionId == 0 should fail - // (it will show an error message, which is expected) - LogAssert.ignoreFailingMessages = true; - transport.OnServerConnected.Invoke(0); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - LogAssert.ignoreFailingMessages = false; - } - - [Test] - public void ConnectDuplicateConnectionIds() - { - // listen - NetworkServer.Listen(2); - - // connect first - transport.OnServerConnected.Invoke(42); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - NetworkConnectionToClient original = NetworkServer.connections[42]; - - // connect duplicate - shouldn't overwrite first one - transport.OnServerConnected.Invoke(42); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - Assert.That(NetworkServer.connections[42], Is.EqualTo(original)); - } - - [Test] - public void SetLocalConnection() - { - // listen - NetworkServer.Listen(1); - - // set local connection - LocalConnectionToClient localConnection = new LocalConnectionToClient(); - NetworkServer.SetLocalConnection(localConnection); - Assert.That(NetworkServer.localConnection, Is.EqualTo(localConnection)); - } - - [Test] - public void SetLocalConnection_PreventsOverwrite() - { - // listen - NetworkServer.Listen(1); - - // set local connection - LocalConnectionToClient localConnection = new LocalConnectionToClient(); - NetworkServer.SetLocalConnection(localConnection); - - // try to overwrite it, which should not work - // (it will show an error message, which is expected) - LogAssert.ignoreFailingMessages = true; - NetworkServer.SetLocalConnection(new LocalConnectionToClient()); - Assert.That(NetworkServer.localConnection, Is.EqualTo(localConnection)); - LogAssert.ignoreFailingMessages = false; - } - - [Test] - public void RemoveLocalConnection() - { - // listen - NetworkServer.Listen(1); - - // set local connection - CreateLocalConnectionPair(out LocalConnectionToClient connectionToClient, out _); - NetworkServer.SetLocalConnection(connectionToClient); - - // remove local connection - NetworkServer.RemoveLocalConnection(); - Assert.That(NetworkServer.localConnection, Is.Null); - } - - [Test] - public void LocalClientActive() - { - // listen - NetworkServer.Listen(1); - Assert.That(NetworkServer.localClientActive, Is.False); - - // set local connection - NetworkServer.SetLocalConnection(new LocalConnectionToClient()); - Assert.That(NetworkServer.localClientActive, Is.True); - } - - [Test] - public void AddConnection() - { - // listen - NetworkServer.Listen(1); - - // add first connection - NetworkConnectionToClient conn42 = new NetworkConnectionToClient(42); - Assert.That(NetworkServer.AddConnection(conn42), Is.True); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - Assert.That(NetworkServer.connections[42], Is.EqualTo(conn42)); - - // add second connection - NetworkConnectionToClient conn43 = new NetworkConnectionToClient(43); - Assert.That(NetworkServer.AddConnection(conn43), Is.True); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(2)); - Assert.That(NetworkServer.connections[42], Is.EqualTo(conn42)); - Assert.That(NetworkServer.connections[43], Is.EqualTo(conn43)); - } - - [Test] - public void AddConnection_PreventsDuplicates() - { - // listen - NetworkServer.Listen(1); - - // add a connection - NetworkConnectionToClient conn42 = new NetworkConnectionToClient(42); - Assert.That(NetworkServer.AddConnection(conn42), Is.True); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - Assert.That(NetworkServer.connections[42], Is.EqualTo(conn42)); - - // add duplicate connectionId - NetworkConnectionToClient connDup = new NetworkConnectionToClient(42); - Assert.That(NetworkServer.AddConnection(connDup), Is.False); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - Assert.That(NetworkServer.connections[42], Is.EqualTo(conn42)); - } - - [Test] - public void RemoveConnection() - { - // listen - NetworkServer.Listen(1); - - // add connection - NetworkConnectionToClient conn42 = new NetworkConnectionToClient(42); - Assert.That(NetworkServer.AddConnection(conn42), Is.True); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - - // remove connection - Assert.That(NetworkServer.RemoveConnection(42), Is.True); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - } - - [Test] - public void DisconnectAllTest_RemoteConnection() - { - // listen - NetworkServer.Listen(1); - - // add connection - NetworkConnectionToClient conn42 = new NetworkConnectionToClient(42); - NetworkServer.AddConnection(conn42); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - - // disconnect all connections - NetworkServer.DisconnectAll(); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - } - - [Test] - public void DisconnectAllTest_LocalConnection() - { - // listen - NetworkServer.Listen(1); - - // set local connection - LocalConnectionToClient localConnection = new LocalConnectionToClient(); - NetworkServer.SetLocalConnection(localConnection); - - // disconnect all connections should remove local connection - NetworkServer.DisconnectAll(); - Assert.That(NetworkServer.localConnection, Is.Null); - } - - // test to reproduce https://github.com/vis2k/Mirror/pull/2797 - [Test] - public void Destroy_HostMode_CallsOnStopAuthority() - { - // listen & connect a HOST client - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // spawn a player(!) object - // otherwise client wouldn't receive spawn / authority messages - CreateNetworkedAndSpawnPlayer(out _, out NetworkIdentity player, - out StopAuthorityCalledNetworkBehaviour comp, - NetworkServer.localConnection); - - // need to have authority for this test - Assert.That(player.hasAuthority, Is.True); - - // destroy and ignore 'Destroy called in Edit mode' error - LogAssert.ignoreFailingMessages = true; - NetworkServer.Destroy(player.gameObject); - LogAssert.ignoreFailingMessages = false; - - // destroy should call OnStopAuthority - Assert.That(comp.called, Is.EqualTo(1)); - } - - // send a message all the way from client to server - [Test] - public void Send_ClientToServerMessage() - { - // register a message handler - int called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send message & process - NetworkClient.Send(new TestMessage1()); - ProcessMessages(); - - // did it get through? - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void Send_ServerToClientMessage() - { - // register a message handler - int called = 0; - NetworkClient.RegisterHandler(msg => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send message & process - connectionToClient.Send(new TestMessage1()); - ProcessMessages(); - - // did it get through? - Assert.That(called, Is.EqualTo(1)); - } - - // guarantee that exactly max packet size messages work - [Test] - public void Send_ClientToServerMessage_MaxMessageSize() - { - // register a message handler - int called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send message & process - int max = MessagePacking.MaxContentSize; - NetworkClient.Send(new VariableSizedMessage(max)); - ProcessMessages(); - - // did it get through? - Assert.That(called, Is.EqualTo(1)); - } - - // guarantee that exactly max packet size messages work - [Test] - public void Send_ServerToClientMessage_MaxMessageSize() - { - // register a message handler - int called = 0; - NetworkClient.RegisterHandler(msg => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send message & process - int max = MessagePacking.MaxContentSize; - connectionToClient.Send(new VariableSizedMessage(max)); - ProcessMessages(); - - // did it get through? - Assert.That(called, Is.EqualTo(1)); - } - - // guarantee that exactly max message size + 1 doesn't work anymore - [Test] - public void Send_ClientToServerMessage_LargerThanMaxMessageSize() - { - // register a message handler - int called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // calculate max := transport.max - message header - - // send message & process - int transportMax = transport.GetMaxPacketSize(Channels.Reliable); - int messageMax = MessagePacking.MaxContentSize; - LogAssert.Expect(LogType.Error, $"NetworkConnection.ValidatePacketSize: cannot send packet larger than {transportMax} bytes, was {transportMax + 1} bytes"); - NetworkClient.Send(new VariableSizedMessage(messageMax + 1)); - ProcessMessages(); - - // should be too big to send - Assert.That(called, Is.EqualTo(0)); - } - - // guarantee that exactly max message size + 1 doesn't work anymore - [Test] - public void Send_ServerToClientMessage_LargerThanMaxMessageSize() - { - // register a message handler - int called = 0; - NetworkClient.RegisterHandler(msg => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send message & process - int transportMax = transport.GetMaxPacketSize(Channels.Reliable); - int messageMax = MessagePacking.MaxContentSize; - LogAssert.Expect(LogType.Error, $"NetworkConnection.ValidatePacketSize: cannot send packet larger than {transportMax} bytes, was {transportMax + 1} bytes"); - connectionToClient.Send(new VariableSizedMessage(messageMax + 1)); - ProcessMessages(); - - // should be too big to send - Assert.That(called, Is.EqualTo(0)); - } - - // transport recommends a max batch size. - // but we support up to max packet size. - // for example, with KCP it makes sense to always send MTU sized batches. - // but we can send up to 144 KB messages. - // => make sure this works. it's a special path in the code and used to - // cause a bug in uMMORPG where SpawnMessage would be > MTU, the - // timestamp would not be included because > max batch, hence client - // couldn't parse it properly. - [Test] - public void Send_ClientToServerMessage_LargerThanBatchThreshold() - { - // register a message handler - int called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send message & process - int threshold = transport.GetBatchThreshold(Channels.Reliable); - NetworkClient.Send(new VariableSizedMessage(threshold + 1)); - ProcessMessages(); - - // did it get through? - Assert.That(called, Is.EqualTo(1)); - } - - // transport recommends a max batch size. - // but we support up to max packet size. - // for example, with KCP it makes sense to always send MTU sized batches. - // but we can send up to 144 KB messages. - // => make sure this works. it's a special path in the code and used to - // cause a bug in uMMORPG where SpawnMessage would be > MTU, the - // timestamp would not be included because > max batch, hence client - // couldn't parse it properly. - [Test] - public void Send_ServerToClientMessage_LargerThanBatchThreshold() - { - // register handler - int called = 0; - NetworkClient.RegisterHandler(msg => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send large message & process - int threshold = transport.GetBatchThreshold(Channels.Reliable); - connectionToClient.Send(new VariableSizedMessage(threshold + 1)); - ProcessMessages(); - - // did it get through? - Assert.That(called, Is.EqualTo(1)); - } - - // there used to be a data race where messages > batch threshold would - // be sent directly, instead of being flushed at the end of the frame - // like all the smaller messages. - // make sure this never happens again. - [Test] - public void Send_ClientToServerMessage_LargerThanBatchThreshold_SentInOrder() - { - // register two message handlers - List received = new List(); - NetworkServer.RegisterHandler((conn, msg) => received.Add("smol"), false); - NetworkServer.RegisterHandler((conn, msg) => received.Add("big"), false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send small message first - NetworkClient.Send(new TestMessage1()); - - // send large message - int threshold = transport.GetBatchThreshold(Channels.Reliable); - NetworkClient.Send(new VariableSizedMessage(threshold + 1)); - - // process everything - ProcessMessages(); - - // both arrived, and small arrived before large? - Assert.That(received.Count, Is.EqualTo(2)); - Assert.That(received[0], Is.EqualTo("smol")); - Assert.That(received[1], Is.EqualTo("big")); - } - - // there used to be a data race where messages > batch threshold would - // be sent directly, instead of being flushed at the end of the frame - // like all the smaller messages. - // make sure this never happens again. - [Test] - public void Send_ServerToClientMessage_LargerThanBatchThreshold_SentInOrder() - { - // register two message handlers - List received = new List(); - NetworkClient.RegisterHandler(msg => received.Add("smol"), false); - NetworkClient.RegisterHandler(msg => received.Add("big"), false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send small message first - connectionToClient.Send(new TestMessage1()); - - // send large message - int threshold = transport.GetBatchThreshold(Channels.Reliable); - connectionToClient.Send(new VariableSizedMessage(threshold + 1)); - - // process everything - ProcessMessages(); - - // both arrived, and small arrived before large? - Assert.That(received.Count, Is.EqualTo(2)); - Assert.That(received[0], Is.EqualTo("smol")); - Assert.That(received[1], Is.EqualTo("big")); - } - - // make sure NetworkConnection.remoteTimeStamp is always the time on the - // remote end when the message was sent - [Test] - public void Send_ClientToServerMessage_SetsRemoteTimeStamp() - { - // register a message handler - int called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send message - NetworkClient.Send(new TestMessage1()); - - // remember current time & update NetworkClient IMMEDIATELY so the - // batch is finished with timestamp. - double sendTime = NetworkTime.localTime; - NetworkClient.NetworkLateUpdate(); - - // let some time pass before processing - const int waitTime = 100; - Thread.Sleep(waitTime); - ProcessMessages(); - - // is the remote timestamp set to when we sent it? - // remember the time when we sent the message - // (within 1/10th of the time we waited. we need some tolerance - // because we don't capture NetworkTime.localTime exactly when we - // finish the batch. but the difference should not be > 'waitTime') - Assert.That(called, Is.EqualTo(1)); - Assert.That(connectionToClient.remoteTimeStamp, Is.EqualTo(sendTime).Within(waitTime / 10)); - } - - // test to avoid https://github.com/vis2k/Mirror/issues/2882 - // messages in a batch aren't length prefixed. - // if we can't read one, we need to warn and disconnect. - // otherwise it overlaps to the next message and causes undefined behaviour. - [Test] - public void Send_ClientToServerMessage_UnknownMessageIdDisconnects() - { - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send a message without a registered handler - NetworkClient.Send(new TestMessage1()); - ProcessMessages(); - - // should have been disconnected - Assert.That(NetworkServer.connections.ContainsKey(connectionToClient.connectionId), Is.False); - } - - [Test] - public void Send_ServerToClientMessage_SetsRemoteTimeStamp() - { - // register a message handler - int called = 0; - NetworkClient.RegisterHandler(msg => ++called, false); - - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send message - connectionToClient.Send(new TestMessage1()); - - // remember current time & update NetworkClient IMMEDIATELY so the - // batch is finished with timestamp. - double sendTime = NetworkTime.localTime; - NetworkServer.NetworkLateUpdate(); - - // let some time pass before processing - const int waitTime = 100; - Thread.Sleep(waitTime); - ProcessMessages(); - - // is the remote timestamp set to when we sent it? - // remember the time when we sent the message - // (within 1/10th of the time we waited. we need some tolerance - // because we don't capture NetworkTime.localTime exactly when we - // finish the batch. but the difference should not be > 'waitTime') - Assert.That(called, Is.EqualTo(1)); - Assert.That(NetworkClient.connection.remoteTimeStamp, Is.EqualTo(sendTime).Within(waitTime / 10)); - } - - // test to avoid https://github.com/vis2k/Mirror/issues/2882 - // messages in a batch aren't length prefixed. - // if we can't read one, we need to warn and disconnect. - // otherwise it overlaps to the next message and causes undefined behaviour. - [Test] - public void Send_ServerToClientMessage_UnknownMessageIdDisconnects() - { - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient connectionToClient); - - // send a message without a registered handler - connectionToClient.Send(new TestMessage1()); - ProcessMessages(); - - // should have been disconnected - Assert.That(NetworkClient.active, Is.False); - } - - [Test] - public void OnDataReceivedInvalidConnectionId() - { - // register a message handler - int called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++called, false); - - // listen - NetworkServer.Listen(1); - - // serialize a test message into an arraysegment - byte[] message = MessagePackingTest.PackToByteArray(new TestMessage1()); - - // call transport.OnDataReceived with an invalid connectionId - // an error log is expected. - LogAssert.ignoreFailingMessages = true; - transport.OnServerDataReceived.Invoke(42, new ArraySegment(message), 0); - LogAssert.ignoreFailingMessages = false; - - // message handler should never be called - Assert.That(called, Is.EqualTo(0)); - } - - [Test] - public void SetClientReadyAndNotReady() - { - CreateLocalConnectionPair(out LocalConnectionToClient connectionToClient, out _); - Assert.That(connectionToClient.isReady, Is.False); - - NetworkServer.SetClientReady(connectionToClient); - Assert.That(connectionToClient.isReady, Is.True); - - NetworkServer.SetClientNotReady(connectionToClient); - Assert.That(connectionToClient.isReady, Is.False); - } - - [Test] - public void SetAllClientsNotReady() - { - // add first ready client - CreateLocalConnectionPair(out LocalConnectionToClient first, out _); - first.isReady = true; - NetworkServer.connections[42] = first; - - // add second ready client - CreateLocalConnectionPair(out LocalConnectionToClient second, out _); - second.isReady = true; - NetworkServer.connections[43] = second; - - // set all not ready - NetworkServer.SetAllClientsNotReady(); - Assert.That(first.isReady, Is.False); - Assert.That(second.isReady, Is.False); - } - - [Test] - public void ReadyMessageSetsClientReady() - { - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out NetworkConnectionToClient connectionToClient); - Assert.That(connectionToClient.isReady, Is.True); - } - - // simply send a [Command] from client to server - [Test] - public void SendCommand() - { - // listen & connect - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // add an identity with two networkbehaviour components - // spawned, otherwise command handler won't find it in .spawned. - // WITH OWNER = WITH AUTHORITY - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out CommandTestNetworkBehaviour comp, NetworkServer.localConnection); - - // call the command - comp.TestCommand(); - ProcessMessages(); - Assert.That(comp.called, Is.EqualTo(1)); - } - - // send a [Command] to an entity with TWO command components. - // make sure the correct one is called. - [Test] - public void SendCommand_CalledOnCorrectComponent() - { - // listen & connect - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // add an identity with two networkbehaviour components. - // spawned, otherwise command handler won't find it in .spawned. - // WITH OWNER = WITH AUTHORITY - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out CommandTestNetworkBehaviour comp0, out CommandTestNetworkBehaviour comp1, NetworkServer.localConnection); - - // call the command - comp1.TestCommand(); - ProcessMessages(); - Assert.That(comp0.called, Is.EqualTo(0)); - Assert.That(comp1.called, Is.EqualTo(1)); - } - - [Test] - public void SendCommand_OnlyAllowedOnOwnedObjects() - { - // listen & connect - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // add an identity with two networkbehaviour components - // spawned, otherwise command handler won't find it in .spawned. - // WITH OWNER = WITH AUTHORITY - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity identity, out CommandTestNetworkBehaviour comp, NetworkServer.localConnection); - - // change identity's owner connection so we can't call [Commands] on it - identity.connectionToClient = new LocalConnectionToClient(); - - // call the command - comp.TestCommand(); - ProcessMessages(); - Assert.That(comp.called, Is.EqualTo(0)); - } - - [Test] - public void SendCommand_RequiresAuthority() - { - // listen & connect - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // add an identity with two networkbehaviour components - // spawned, otherwise command handler won't find it in .spawned. - // WITHOUT OWNER = WITHOUT AUTHORITY for this test - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out CommandTestNetworkBehaviour comp); - - // call the command - comp.TestCommand(); - ProcessMessages(); - Assert.That(comp.called, Is.EqualTo(0)); - } - - [Test] - public void ActivateHostSceneCallsOnStartClient() - { - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out _); - - // spawn identity with a networkbehaviour. - // (needs to be in .spawned for ActivateHostScene) - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverIdentity, out OnStartClientTestNetworkBehaviour serverComp, - out _, out _, out _); - - // ActivateHostScene calls OnStartClient for spawned objects where - // isClient is still false. set it to false first. - serverIdentity.isClient = false; - NetworkServer.ActivateHostScene(); - - // was OnStartClient called for all .spawned networkidentities? - Assert.That(serverComp.called, Is.EqualTo(1)); - } - - [Test] - public void SendToAll() - { - // message handler - int called = 0; - NetworkClient.RegisterHandler(msg => ++called, false); - - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send & process - NetworkServer.SendToAll(new TestMessage1()); - ProcessMessages(); - - // called? - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void UnregisterHandler() - { - // RegisterHandler(conn, msg) variant - int variant1Called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++variant1Called, false); - - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send a message, check if it was handled - NetworkClient.Send(new TestMessage1()); - ProcessMessages(); - Assert.That(variant1Called, Is.EqualTo(1)); - - // unregister, send again, should not be called again - NetworkServer.UnregisterHandler(); - NetworkClient.Send(new TestMessage1()); - ProcessMessages(); - Assert.That(variant1Called, Is.EqualTo(1)); - } - - [Test] - public void ClearHandler() - { - // RegisterHandler(conn, msg) variant - int variant1Called = 0; - NetworkServer.RegisterHandler((conn, msg) => ++variant1Called, false); - - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlocking(out _); - - // send a message, check if it was handled - NetworkClient.Send(new TestMessage1()); - ProcessMessages(); - Assert.That(variant1Called, Is.EqualTo(1)); - - // clear handlers, send again, should not be called again - NetworkServer.ClearHandlers(); - NetworkClient.Send(new TestMessage1()); - ProcessMessages(); - Assert.That(variant1Called, Is.EqualTo(1)); - } - - [Test] - public void GetNetworkIdentity() - { - // create a GameObject with NetworkIdentity - CreateNetworked(out GameObject go, out NetworkIdentity identity); - - // GetNetworkIdentity - bool result = NetworkServer.GetNetworkIdentity(go, out NetworkIdentity value); - Assert.That(result, Is.True); - Assert.That(value, Is.EqualTo(identity)); - } - - [Test] - public void GetNetworkIdentity_ErrorIfNotFound() - { - // create a GameObject without NetworkIdentity - CreateGameObject(out GameObject goWithout); - - // GetNetworkIdentity for GO without identity - LogAssert.Expect(LogType.Error, $"GameObject {goWithout.name} doesn't have NetworkIdentity."); - bool result = NetworkServer.GetNetworkIdentity(goWithout, out NetworkIdentity value); - Assert.That(result, Is.False); - Assert.That(value, Is.Null); - } - - [Test] - public void ShowForConnection() - { - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out NetworkConnectionToClient connectionToClient); - - // overwrite spawn message handler - int called = 0; - NetworkClient.ReplaceHandler(msg => ++called, false); - - // create a gameobject and networkidentity and some unique values - CreateNetworked(out GameObject _, out NetworkIdentity identity); - identity.connectionToClient = connectionToClient; - - // call ShowForConnection - NetworkServer.ShowForConnection(identity, connectionToClient); - ProcessMessages(); - Assert.That(called, Is.EqualTo(1)); - - // destroy manually to avoid 'Destroy can't be called in edit mode' - GameObject.DestroyImmediate(identity.gameObject); - } - - [Test] - public void ShowForConnection_OnlyWorksIfReady() - { - // listen & connect - // DO NOT set ready this time - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticated(out NetworkConnectionToClient connectionToClient); - - // overwrite spawn message handler - int called = 0; - NetworkClient.ReplaceHandler(msg => ++called, false); - - // create a gameobject and networkidentity and some unique values - CreateNetworked(out GameObject _, out NetworkIdentity identity); - identity.connectionToClient = connectionToClient; - - // call ShowForConnection - should not work if not ready - NetworkServer.ShowForConnection(identity, connectionToClient); - ProcessMessages(); - Assert.That(called, Is.EqualTo(0)); - - // destroy manually to avoid 'Destroy can't be called in edit mode' - GameObject.DestroyImmediate(identity.gameObject); - } - - [Test] - public void HideForConnection() - { - // listen & connect - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out NetworkConnectionToClient connectionToClient); - - // overwrite spawn message handler - int called = 0; - NetworkClient.ReplaceHandler(msg => ++called, false); - - // create a gameobject and networkidentity and some unique values - CreateNetworked(out GameObject _, out NetworkIdentity identity); - identity.connectionToClient = connectionToClient; - - // call HideForConnection - NetworkServer.HideForConnection(identity, connectionToClient); - ProcessMessages(); - Assert.That(called, Is.EqualTo(1)); - - // destroy manually to avoid 'Destroy can't be called in edit mode' - GameObject.DestroyImmediate(identity.gameObject); - } - - [Test] - public void ValidateSceneObject() - { - // create a gameobject and networkidentity - CreateNetworked(out GameObject go, out NetworkIdentity identity); - identity.sceneId = 42; - - // should be valid as long as it has a sceneId - Assert.That(NetworkServer.ValidateSceneObject(identity), Is.True); - - // shouldn't be valid with 0 sceneID - identity.sceneId = 0; - Assert.That(NetworkServer.ValidateSceneObject(identity), Is.False); - identity.sceneId = 42; - - // shouldn't be valid for certain hide flags - go.hideFlags = HideFlags.NotEditable; - Assert.That(NetworkServer.ValidateSceneObject(identity), Is.False); - go.hideFlags = HideFlags.HideAndDontSave; - Assert.That(NetworkServer.ValidateSceneObject(identity), Is.False); - } - - [Test] - public void SpawnObjects() - { - // create a scene object and set inactive before spawning - CreateNetworked(out GameObject go, out NetworkIdentity identity); - identity.sceneId = 42; - go.SetActive(false); - - // create a NON scene object and set inactive before spawning - CreateNetworked(out GameObject go2, out NetworkIdentity identity2); - identity2.sceneId = 0; - go2.SetActive(false); - - // start server - NetworkServer.Listen(1); - - // SpawnObjects() should return true and activate the scene object - Assert.That(NetworkServer.SpawnObjects(), Is.True); - Assert.That(go.activeSelf, Is.True); - Assert.That(go2.activeSelf, Is.False); - - // reset isServer to avoid Destroy instead of DestroyImmediate - identity.isServer = false; - identity2.isServer = false; - } - - [Test] - public void SpawnObjects_OnlyIfServerActive() - { - // calling SpawnObjects while server isn't active should do nothing - Assert.That(NetworkServer.SpawnObjects(), Is.False); - } - - [Test] - public void UnSpawn() - { - // create scene object with valid netid and set active - CreateNetworked(out GameObject go, out NetworkIdentity identity); - identity.sceneId = 42; - identity.netId = 123; - go.SetActive(true); - - // unspawn should reset netid - NetworkServer.UnSpawn(go); - Assert.That(identity.netId, Is.Zero); - } - - [Test] - public void UnSpawnAndClearAuthority() - { - // create scene object with valid netid and set active - CreateNetworked(out GameObject go, out NetworkIdentity identity, out StartAuthorityCalledNetworkBehaviour compStart, out StopAuthorityCalledNetworkBehaviour compStop); - identity.sceneId = 42; - identity.netId = 123; - go.SetActive(true); - - // set authority from false to true, which should call OnStartAuthority - identity.hasAuthority = true; - identity.NotifyAuthority(); - - // shouldn't be touched - Assert.That(identity.hasAuthority, Is.True); - // start should be called - Assert.That(compStart.called, Is.EqualTo(1)); - // stop shouldn't - Assert.That(compStop.called, Is.EqualTo(0)); - - // unspawn should reset netid and remove authority - NetworkServer.UnSpawn(go); - Assert.That(identity.netId, Is.Zero); - - // should be changed - Assert.That(identity.hasAuthority, Is.False); - // same as before - Assert.That(compStart.called, Is.EqualTo(1)); - // stop should be called - Assert.That(compStop.called, Is.EqualTo(1)); - } - - // test to reproduce a bug where stopping the server would not call - // OnStopServer on scene objects: - // https://github.com/vis2k/Mirror/issues/2119 - [Test] - public void Shutdown_CallsSceneObjectsOnStopServer() - { - // listen & connect a client - NetworkServer.Listen(1); - ConnectClientBlocking(out NetworkConnectionToClient _); - - // create & spawn an object - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity identity, - out StopServerCalledNetworkBehaviour comp); - - // make sure it was spawned as a scene object. - // they don't come from prefabs, so they always are. - Assert.That(identity.sceneId, !Is.Null); - - // shutdown should call OnStopServer etc. - NetworkServer.Shutdown(); - Assert.That(comp.called, Is.EqualTo(1)); - } - - [Test] - public void ShutdownCleanup() - { - // listen - NetworkServer.Listen(1); - - // add some test event hooks to make sure they are cleaned up. - // there used to be a bug where they wouldn't be cleaned up. - NetworkServer.OnConnectedEvent = connection => {}; - NetworkServer.OnDisconnectedEvent = connection => {}; - - // set local connection - NetworkServer.SetLocalConnection(new LocalConnectionToClient()); - - // connect a client - transport.ClientConnect("localhost"); - UpdateTransport(); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - - // shutdown - NetworkServer.Shutdown(); - - // state cleared? - Assert.That(NetworkServer.dontListen, Is.False); - Assert.That(NetworkServer.active, Is.False); - Assert.That(NetworkServer.isLoadingScene, Is.False); - - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - Assert.That(NetworkServer.connectionsCopy.Count, Is.EqualTo(0)); - Assert.That(NetworkServer.handlers.Count, Is.EqualTo(0)); - Assert.That(NetworkServer.newObservers.Count, Is.EqualTo(0)); - Assert.That(NetworkServer.spawned.Count, Is.EqualTo(0)); - - Assert.That(NetworkServer.localConnection, Is.Null); - Assert.That(NetworkServer.localClientActive, Is.False); - - Assert.That(NetworkServer.OnConnectedEvent, Is.Null); - Assert.That(NetworkServer.OnDisconnectedEvent, Is.Null); - Assert.That(NetworkServer.OnErrorEvent, Is.Null); - } - - [Test] - public void SendToAll_CalledWhileNotActive_ShouldGiveWarning() - { - LogAssert.Expect(LogType.Warning, $"Can not send using NetworkServer.SendToAll(T msg) because NetworkServer is not active"); - NetworkServer.SendToAll(new NetworkPingMessage {}); - } - - [Test] - public void SendToReady_CalledWhileNotActive_ShouldGiveWarning() - { - LogAssert.Expect(LogType.Warning, $"Can not send using NetworkServer.SendToReady(T msg) because NetworkServer is not active"); - NetworkServer.SendToReady(new NetworkPingMessage {}); - } - - [Test] - public void NoExternalConnections_WithNoConnection() - { - Assert.That(NetworkServer.connections.Count, Is.EqualTo(0)); - Assert.That(NetworkServer.NoExternalConnections(), Is.True); - } - - [Test] - public void NoExternalConnections_WithConnections() - { - NetworkServer.connections.Add(1, null); - NetworkServer.connections.Add(2, null); - Assert.That(NetworkServer.NoExternalConnections(), Is.False); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(2)); - } - - [Test] - public void NoExternalConnections_WithHostOnly() - { - CreateLocalConnectionPair(out LocalConnectionToClient connectionToClient, out _); - - NetworkServer.SetLocalConnection(connectionToClient); - NetworkServer.connections.Add(0, connectionToClient); - - Assert.That(NetworkServer.NoExternalConnections(), Is.True); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(1)); - - NetworkServer.RemoveLocalConnection(); - } - - [Test] - public void NoExternalConnections_WithHostAndConnection() - { - CreateLocalConnectionPair(out LocalConnectionToClient connectionToClient, out _); - - NetworkServer.SetLocalConnection(connectionToClient); - NetworkServer.connections.Add(0, connectionToClient); - NetworkServer.connections.Add(1, null); - - Assert.That(NetworkServer.NoExternalConnections(), Is.False); - Assert.That(NetworkServer.connections.Count, Is.EqualTo(2)); - - NetworkServer.RemoveLocalConnection(); - } - - // updating NetworkServer with a null entry in connection.observing - // should log a warning. someone probably used GameObject.Destroy - // instead of NetworkServer.Destroy. - [Test] - public void UpdateDetectsNullEntryInObserving() - { - // start - NetworkServer.Listen(1); - - // add a connection that is observed by a null entity - NetworkServer.connections[42] = new FakeNetworkConnection{isReady=true}; - NetworkServer.connections[42].observing.Add(null); - - // update - LogAssert.Expect(LogType.Warning, new Regex("Found 'null' entry in observing list.*")); - NetworkServer.NetworkLateUpdate(); - } - - // updating NetworkServer with a null entry in connection.observing - // should log a warning. someone probably used GameObject.Destroy - // instead of NetworkServer.Destroy. - // - // => need extra test because of Unity's custom null check - [Test] - public void UpdateDetectsDestroyedEntryInObserving() - { - // start - NetworkServer.Listen(1); - - // add a connection that is observed by a destroyed entity - CreateNetworked(out GameObject go, out NetworkIdentity ni); - NetworkServer.connections[42] = new FakeNetworkConnection{isReady=true}; - NetworkServer.connections[42].observing.Add(ni); - GameObject.DestroyImmediate(go); - - // update - LogAssert.Expect(LogType.Warning, new Regex("Found 'null' entry in observing list.*")); - NetworkServer.NetworkLateUpdate(); - } - - // SyncLists/Dict/Set .changes are only flushed when serializing. - // if an object has no observers, then serialize is never called. - // if we still keep changing the lists, then .changes would grow forever. - // => need to make sure that .changes doesn't grow while no observers. - [Test] - public void SyncObjectChanges_DontGrowWithoutObservers() - { - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // one monster - CreateNetworkedAndSpawn(out _, out NetworkIdentity identity, out NetworkBehaviourWithSyncVarsAndCollections comp); - - // without AOI, connections observer everything. - // clear the observers first. - identity.ClearObservers(); - - // insert into a synclist, which would add to .changes - comp.list.Add(42); - - // update everything once - ProcessMessages(); - - // changes should be empty since we have no observers - Assert.That(comp.list.GetChangeCount(), Is.EqualTo(0)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkServerTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkServerTest.cs.meta deleted file mode 100644 index 35d033b31..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkServerTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a47dc0cc3af7c49a18a4a1b8d7de9caa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs b/Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs deleted file mode 100644 index 748ae3fb9..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs +++ /dev/null @@ -1,362 +0,0 @@ -// TODO add true over-the-network movement tests. -// but we need to split NetworkIdentity.spawned in server/client first. -// atm we can't spawn an object on both server & client separately yet. -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.NetworkTransform2k -{ - // helper class to expose some of the protected methods - public class NetworkTransformExposed : NetworkTransform - { - public new NTSnapshot ConstructSnapshot() => base.ConstructSnapshot(); - public new void ApplySnapshot(NTSnapshot start, NTSnapshot goal, NTSnapshot interpolated) => - base.ApplySnapshot(start, goal, interpolated); - public new void OnClientToServerSync(Vector3? position, Quaternion? rotation, Vector3? scale) => - base.OnClientToServerSync(position, rotation, scale); - public new void OnServerToClientSync(Vector3? position, Quaternion? rotation, Vector3? scale) => - base.OnServerToClientSync(position, rotation, scale); - } - - public class NetworkTransform2kTests : MirrorTest - { - // networked and spawned NetworkTransform - NetworkConnectionToClient connectionToClient; - Transform transform; - NetworkTransformExposed component; - - [SetUp] - public override void SetUp() - { - // set up world with server & client - // host mode for now. - // TODO separate client & server after .spawned split. - // we can use CreateNetworkedAndSpawn that creates on sv & cl. - // then move on server, update, verify client position etc. - base.SetUp(); - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - connectionToClient = NetworkServer.localConnection; - - // create a networked object with NetworkTransform - CreateNetworkedAndSpawn(out GameObject go, out NetworkIdentity _, out component, connectionToClient); - // sync immediately - component.syncInterval = 0; - // remember transform for convenience - transform = go.transform; - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - NetworkClient.Disconnect(); - } - - // TODO move to NTSnapshot tests? - [Test] - public void Interpolate() - { - NTSnapshot from = new NTSnapshot( - 1, - 1, - new Vector3(1, 1, 1), - Quaternion.Euler(new Vector3(0, 0, 0)), - new Vector3(3, 3, 3) - ); - - NTSnapshot to = new NTSnapshot( - 2, - 2, - new Vector3(2, 2, 2), - Quaternion.Euler(new Vector3(0, 90, 0)), - new Vector3(4, 4, 4) - ); - - // interpolate - NTSnapshot between = NTSnapshot.Interpolate(from, to, 0.5); - - // note: timestamp interpolation isn't needed. we don't use it. - //Assert.That(between.remoteTimestamp, Is.EqualTo(1.5).Within(Mathf.Epsilon)); - //Assert.That(between.localTimestamp, Is.EqualTo(1.5).Within(Mathf.Epsilon)); - - // check position - Assert.That(between.position.x, Is.EqualTo(1.5).Within(Mathf.Epsilon)); - Assert.That(between.position.y, Is.EqualTo(1.5).Within(Mathf.Epsilon)); - Assert.That(between.position.z, Is.EqualTo(1.5).Within(Mathf.Epsilon)); - - // check rotation - // (epsilon is slightly too small) - Assert.That(between.rotation.eulerAngles.x, Is.EqualTo(0).Within(Mathf.Epsilon)); - Assert.That(between.rotation.eulerAngles.y, Is.EqualTo(45).Within(0.001)); - Assert.That(between.rotation.eulerAngles.z, Is.EqualTo(0).Within(Mathf.Epsilon)); - - // check scale - Assert.That(between.scale.x, Is.EqualTo(3.5).Within(Mathf.Epsilon)); - Assert.That(between.scale.y, Is.EqualTo(3.5).Within(Mathf.Epsilon)); - Assert.That(between.scale.z, Is.EqualTo(3.5).Within(Mathf.Epsilon)); - } - - [Test] - public void ConstructSnapshot() - { - // set unique position/rotation/scale - transform.position = new Vector3(1, 2, 3); - transform.rotation = Quaternion.identity; - transform.localScale = new Vector3(4, 5, 6); - - // construct snapshot - double time = NetworkTime.localTime; - NTSnapshot snapshot = component.ConstructSnapshot(); - Assert.That(snapshot.remoteTimestamp, Is.EqualTo(time).Within(0.01)); - Assert.That(snapshot.position, Is.EqualTo(new Vector3(1, 2, 3))); - Assert.That(snapshot.rotation, Is.EqualTo(Quaternion.identity)); - Assert.That(snapshot.scale, Is.EqualTo(new Vector3(4, 5, 6))); - } - - [Test] - public void ApplySnapshot_Interpolated() - { - // construct snapshot with unique position/rotation/scale - Vector3 position = new Vector3(1, 2, 3); - Quaternion rotation = Quaternion.Euler(45, 90, 45); - Vector3 scale = new Vector3(4, 5, 6); - - // apply snapshot with interpolation - component.syncPosition = true; - component.syncRotation = true; - component.syncScale = true; - component.interpolatePosition = true; - component.interpolateRotation = true; - component.interpolateScale = true; - component.ApplySnapshot(default, default, new NTSnapshot(0, 0, position, rotation, scale)); - - // was it applied? - Assert.That(transform.position, Is.EqualTo(position)); - Assert.That(Quaternion.Angle(transform.rotation, rotation), Is.EqualTo(0).Within(Mathf.Epsilon)); - Assert.That(transform.localScale, Is.EqualTo(scale)); - } - - [Test] - public void ApplySnapshot_Direct() - { - // construct snapshot with unique position/rotation/scale - Vector3 position = new Vector3(1, 2, 3); - Quaternion rotation = Quaternion.Euler(45, 90, 45); - Vector3 scale = new Vector3(4, 5, 6); - - // apply snapshot without interpolation - component.syncPosition = true; - component.syncRotation = true; - component.syncScale = true; - component.interpolatePosition = false; - component.interpolateRotation = false; - component.interpolateScale = false; - component.ApplySnapshot(default, new NTSnapshot(0, 0, position, rotation, scale), default); - - // was it applied? - Assert.That(transform.position, Is.EqualTo(position)); - Assert.That(Quaternion.Angle(transform.rotation, rotation), Is.EqualTo(0).Within(Mathf.Epsilon)); - Assert.That(transform.localScale, Is.EqualTo(scale)); - } - - [Test] - public void ApplySnapshot_DontSyncPosition() - { - // construct snapshot with unique position/rotation/scale - Vector3 position = new Vector3(1, 2, 3); - Quaternion rotation = Quaternion.Euler(45, 90, 45); - Vector3 scale = new Vector3(4, 5, 6); - - // apply snapshot without position sync should not apply position - component.syncPosition = false; - component.syncRotation = true; - component.syncScale = true; - component.interpolatePosition = false; - component.interpolateRotation = true; - component.interpolateScale = true; - component.ApplySnapshot(default, default, new NTSnapshot(0, 0, position, rotation, scale)); - - // was it applied? - Assert.That(transform.position, Is.EqualTo(Vector3.zero)); - Assert.That(Quaternion.Angle(transform.rotation, rotation), Is.EqualTo(0).Within(Mathf.Epsilon)); - Assert.That(transform.localScale, Is.EqualTo(scale)); - } - - [Test] - public void ApplySnapshot_DontSyncRotation() - { - // construct snapshot with unique position/rotation/scale - Vector3 position = new Vector3(1, 2, 3); - Quaternion rotation = Quaternion.Euler(45, 90, 45); - Vector3 scale = new Vector3(4, 5, 6); - - // apply snapshot without position sync should not apply position - component.syncPosition = true; - component.syncRotation = false; - component.syncScale = true; - component.interpolatePosition = true; - component.interpolateRotation = false; - component.interpolateScale = true; - component.ApplySnapshot(default, default, new NTSnapshot(0, 0, position, rotation, scale)); - - // was it applied? - Assert.That(transform.position, Is.EqualTo(position)); - Assert.That(transform.rotation, Is.EqualTo(Quaternion.identity)); - Assert.That(transform.localScale, Is.EqualTo(scale)); - } - - [Test] - public void ApplySnapshot_DontSyncScale() - { - // construct snapshot with unique position/rotation/scale - Vector3 position = new Vector3(1, 2, 3); - Quaternion rotation = Quaternion.Euler(45, 90, 45); - Vector3 scale = new Vector3(4, 5, 6); - - // apply snapshot without position sync should not apply position - component.syncPosition = true; - component.syncRotation = true; - component.syncScale = false; - component.interpolatePosition = true; - component.interpolateRotation = true; - component.interpolateScale = false; - component.ApplySnapshot(default, default, new NTSnapshot(0, 0, position, rotation, scale)); - - // was it applied? - Assert.That(transform.position, Is.EqualTo(position)); - Assert.That(Quaternion.Angle(transform.rotation, rotation), Is.EqualTo(0).Within(Mathf.Epsilon)); - Assert.That(transform.localScale, Is.EqualTo(Vector3.one)); - } - - [Test] - public void OnClientToServerSync_WithoutClientAuthority() - { - // call OnClientToServerSync without authority - component.clientAuthority = false; - component.OnClientToServerSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.serverBuffer.Count, Is.EqualTo(0)); - } - - [Test] - public void OnClientToServerSync_WithClientAuthority() - { - // call OnClientToServerSync with authority - component.clientAuthority = true; - component.OnClientToServerSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.serverBuffer.Count, Is.EqualTo(1)); - } - - [Test] - public void OnClientToServerSync_WithClientAuthority_BufferSizeLimit() - { - component.bufferSizeLimit = 1; - - // authority is required - component.clientAuthority = true; - - // add first should work - component.OnClientToServerSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.serverBuffer.Count, Is.EqualTo(1)); - - // add second should be too much - component.OnClientToServerSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.serverBuffer.Count, Is.EqualTo(1)); - } - - [Test] - public void OnClientToServerSync_WithClientAuthority_Nullables_Uses_Last() - { - // set some defaults - transform.position = Vector3.left; - transform.rotation = Quaternion.identity; - transform.localScale = Vector3.right; - - // call OnClientToServerSync with authority and nullable types - // to make sure it uses the last valid position then. - component.clientAuthority = true; - component.OnClientToServerSync(new Vector3?(), new Quaternion?(), new Vector3?()); - Assert.That(component.serverBuffer.Count, Is.EqualTo(1)); - NTSnapshot first = component.serverBuffer.Values[0]; - Assert.That(first.position, Is.EqualTo(Vector3.left)); - Assert.That(first.rotation, Is.EqualTo(Quaternion.identity)); - Assert.That(first.scale, Is.EqualTo(Vector3.right)); - } - - // server->client sync should only work if client doesn't have authority - [Test] - public void OnServerToClientSync_WithoutClientAuthority() - { - // pretend to be the client object - component.netIdentity.isServer = false; - component.netIdentity.isClient = true; - component.netIdentity.isLocalPlayer = true; - - // call OnServerToClientSync without authority - component.clientAuthority = false; - component.OnServerToClientSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.clientBuffer.Count, Is.EqualTo(1)); - } - - // server->client sync shouldn't work if client has authority - [Test] - public void OnServerToClientSync_WithoutClientAuthority_bufferSizeLimit() - { - component.bufferSizeLimit = 1; - - // pretend to be the client object - component.netIdentity.isServer = false; - component.netIdentity.isClient = true; - component.netIdentity.isLocalPlayer = true; - - // client authority has to be disabled - component.clientAuthority = false; - - // add first should work - component.OnServerToClientSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.clientBuffer.Count, Is.EqualTo(1)); - - // add second should be too much - component.OnServerToClientSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.clientBuffer.Count, Is.EqualTo(1)); - } - - // server->client sync shouldn't work if client has authority - [Test] - public void OnServerToClientSync_WithClientAuthority() - { - // pretend to be the client object - component.netIdentity.isServer = false; - component.netIdentity.isClient = true; - component.netIdentity.isLocalPlayer = true; - - // call OnServerToClientSync with authority - component.clientAuthority = true; - component.OnServerToClientSync(Vector3.zero, Quaternion.identity, Vector3.zero); - Assert.That(component.clientBuffer.Count, Is.EqualTo(0)); - } - - [Test] - public void OnServerToClientSync_WithClientAuthority_Nullables_Uses_Last() - { - // set some defaults - transform.position = Vector3.left; - transform.rotation = Quaternion.identity; - transform.localScale = Vector3.right; - - // pretend to be the client object - component.netIdentity.isServer = false; - component.netIdentity.isClient = true; - component.netIdentity.isLocalPlayer = true; - - // call OnClientToServerSync with authority and nullable types - // to make sure it uses the last valid position then. - component.OnServerToClientSync(new Vector3?(), new Quaternion?(), new Vector3?()); - Assert.That(component.clientBuffer.Count, Is.EqualTo(1)); - NTSnapshot first = component.clientBuffer.Values[0]; - Assert.That(first.position, Is.EqualTo(Vector3.left)); - Assert.That(first.rotation, Is.EqualTo(Quaternion.identity)); - Assert.That(first.scale, Is.EqualTo(Vector3.right)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs.meta b/Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs.meta deleted file mode 100644 index 89de25521..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkTransform2kTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 757a5c351d7046538812958112ce74f3 -timeCreated: 1624953125 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs b/Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs deleted file mode 100644 index 93d6ce211..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using Mirror.Tests.RemoteAttrributeTest; -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class NetworkWriterCollectionTest - { - [Test] - public void HasWriteFunctionForInt() - { - Assert.That(Writer.write, Is.Not.Null, "int write function was not found"); - - Action action = NetworkWriterExtensions.WriteInt; - Assert.That(Writer.write, Is.EqualTo(action), "int write function was incorrect value"); - } - - [Test] - public void HasReadFunctionForInt() - { - Assert.That(Reader.read, Is.Not.Null, "int read function was not found"); - - Func action = NetworkReaderExtensions.ReadInt; - Assert.That(Reader.read, Is.EqualTo(action), "int read function was incorrect value"); - } - - [Test] - public void HasWriteNetworkBehaviourFunction() - { - Assert.That(Writer.write, Is.Not.Null, "NetworkBehaviour read function was not found"); - - Action action = NetworkWriterExtensions.WriteNetworkBehaviour; - Assert.That(Writer.write, Is.EqualTo(action), "NetworkBehaviour read function was incorrect value"); - } - - [Test] - public void HasReadNetworkBehaviourFunction() - { - Assert.That(Reader.read, Is.Not.Null, "NetworkBehaviour read function was not found"); - - Func actionNonGeneric = NetworkReaderExtensions.ReadNetworkBehaviour; - Func actionGeneric = NetworkReaderExtensions.ReadNetworkBehaviour; - Assert.That(Reader.read, Is.EqualTo(actionNonGeneric).Or.EqualTo(actionGeneric), - "NetworkBehaviour read function was incorrect value, should be generic or non-generic"); - } - - [Test] - public void HasWriteNetworkBehaviourDerivedFunction() - { - // needs a networkbehaviour that is included in an Message/Rpc/syncvar for this test - Assert.That(Writer.write, Is.Not.Null, "RpcNetworkIdentityBehaviour read function was not found"); - - Action action = NetworkWriterExtensions.WriteNetworkBehaviour; - Assert.That(Writer.write, Is.EqualTo(action), "RpcNetworkIdentityBehaviour read function was incorrect value"); - } - - [Test] - public void HasReadNetworkBehaviourDerivedFunction() - { - Func reader = Reader.read; - Assert.That(reader, Is.Not.Null, "RpcNetworkIdentityBehaviour read function was not found"); - - Func action = NetworkReaderExtensions.ReadNetworkBehaviour; - Assert.That(reader, Is.EqualTo(action), "RpcNetworkIdentityBehaviour read function was incorrect value"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs.meta deleted file mode 100644 index 2dffba4eb..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkWriterCollectionTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bfc7cd9211e6145418289e9c9572ce55 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/NetworkWriterTest.cs b/Assets/Mirror/Tests/Editor/NetworkWriterTest.cs deleted file mode 100644 index aca3a34a5..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkWriterTest.cs +++ /dev/null @@ -1,1374 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Mirror.Tests.RemoteAttrributeTest; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - [TestFixture] - public class NetworkWriterTest : MirrorEditModeTest - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // start server & connect client because we need spawn functions - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - - /* uncomment if needed. commented for faster test workflow. this takes >3s. - [Test] - public void Benchmark() - { - // 10 million reads, Unity 2019.3, code coverage disabled - // 4014ms ms - NetworkWriter writer = new NetworkWriter(); - for (int i = 0; i < 10000000; ++i) - { - writer.SetLength(0); - writer.WriteVector3(new Vector3(1, 2, 3)); - } - } - */ - - // Write/ReadBlittable assumes same endianness on server & client. - [Test] - public void LittleEndianPlatform() - { - Assert.That(BitConverter.IsLittleEndian, Is.True); - } - - [Test] - public void TestWritingSmallMessage() - { - // try serializing less than 32kb and see what happens - NetworkWriter writer = new NetworkWriter(); - for (int i = 0; i < 30000 / 4; ++i) - writer.WriteInt(i); - Assert.That(writer.Position, Is.EqualTo(30000)); - } - - [Test] - public void TestWritingLargeMessage() - { - // try serializing more than 32kb and see what happens - NetworkWriter writer = new NetworkWriter(); - for (int i = 0; i < 40000 / 4; ++i) - writer.WriteInt(i); - Assert.That(writer.Position, Is.EqualTo(40000)); - } - - [Test] - public void TestWritingHugeArray() - { - // try serializing array more than 64KB large and see what happens - NetworkWriter writer = new NetworkWriter(); - writer.WriteBytesAndSize(new byte[100000]); - byte[] data = writer.ToArray(); - - NetworkReader reader = new NetworkReader(data); - byte[] deserialized = reader.ReadBytesAndSize(); - Assert.That(deserialized.Length, Is.EqualTo(100000)); - } - - [Test] - public void TestWritingBytesSegment() - { - byte[] data = { 1, 2, 3 }; - NetworkWriter writer = new NetworkWriter(); - writer.WriteBytes(data, 0, data.Length); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - ArraySegment deserialized = reader.ReadBytesSegment(data.Length); - Assert.That(deserialized.Count, Is.EqualTo(data.Length)); - for (int i = 0; i < data.Length; ++i) - Assert.That(deserialized.Array[deserialized.Offset + i], Is.EqualTo(data[i])); - } - - // write byte[], read segment - [Test] - public void TestWritingBytesAndReadingSegment() - { - byte[] data = { 1, 2, 3 }; - NetworkWriter writer = new NetworkWriter(); - writer.WriteBytesAndSize(data); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - ArraySegment deserialized = reader.ReadBytesAndSizeSegment(); - Assert.That(deserialized.Count, Is.EqualTo(data.Length)); - for (int i = 0; i < data.Length; ++i) - Assert.That(deserialized.Array[deserialized.Offset + i], Is.EqualTo(data[i])); - } - - // write segment, read segment - [Test] - public void TestWritingSegmentAndReadingSegment() - { - byte[] data = { 1, 2, 3, 4 }; - // [2, 3] - ArraySegment segment = new ArraySegment(data, 1, 1); - NetworkWriter writer = new NetworkWriter(); - writer.WriteBytesAndSizeSegment(segment); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - ArraySegment deserialized = reader.ReadBytesAndSizeSegment(); - Assert.That(deserialized.Count, Is.EqualTo(segment.Count)); - for (int i = 0; i < segment.Count; ++i) - Assert.That(deserialized.Array[deserialized.Offset + i], Is.EqualTo(segment.Array[segment.Offset + i])); - } - - [Test] - public void TestResetSetsPotionAndLength() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteString("I saw"); - writer.WriteLong(0xA_FADED_DEAD_EEL); - writer.WriteString("and ate it"); - writer.Reset(); - - Assert.That(writer.Position, Is.EqualTo(0)); - - byte[] data = writer.ToArray(); - Assert.That(data, Is.Empty); - } - - [Test] - public void TestReading0LengthBytesAndSize() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteBytesAndSize(new byte[] {}); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.That(reader.ReadBytesAndSize().Length, Is.EqualTo(0)); - } - - [Test] - public void TestReading0LengthBytes() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteBytes(new byte[] {}, 0, 0); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.That(reader.ReadBytes(0).Length, Is.EqualTo(0)); - } - - [Test] - public void TestWritingNegativeBytesAndSizeFailure() - { - NetworkWriter writer = new NetworkWriter(); - Assert.Throws(() => writer.WriteBytesAndSize(new byte[0], 0, -1)); - Assert.That(writer.Position, Is.EqualTo(0)); - } - - [Test] - public void TestReadingTooMuch() - { - void EnsureThrows(Action read, byte[] data = null) - { - Assert.Throws(() => read(new NetworkReader(data ?? new byte[] {}))); - } - // Try reading more than there is data to be read from - // This should throw EndOfStreamException always - EnsureThrows(r => r.ReadByte()); - EnsureThrows(r => r.ReadSByte()); - EnsureThrows(r => r.ReadChar()); - EnsureThrows(r => r.ReadBool()); - EnsureThrows(r => r.ReadShort()); - EnsureThrows(r => r.ReadUShort()); - EnsureThrows(r => r.ReadInt()); - EnsureThrows(r => r.ReadUInt()); - EnsureThrows(r => r.ReadLong()); - EnsureThrows(r => r.ReadULong()); - EnsureThrows(r => r.ReadDecimal()); - EnsureThrows(r => r.ReadFloat()); - EnsureThrows(r => r.ReadDouble()); - EnsureThrows(r => r.ReadString()); - EnsureThrows(r => r.ReadBytes(1)); - EnsureThrows(r => r.ReadBytes(2)); - EnsureThrows(r => r.ReadBytes(3)); - EnsureThrows(r => r.ReadBytes(4)); - EnsureThrows(r => r.ReadBytes(8)); - EnsureThrows(r => r.ReadBytes(16)); - EnsureThrows(r => r.ReadBytes(32)); - EnsureThrows(r => r.ReadBytes(100)); - EnsureThrows(r => r.ReadBytes(1000)); - EnsureThrows(r => r.ReadBytes(10000)); - EnsureThrows(r => r.ReadBytes(1000000)); - EnsureThrows(r => r.ReadBytes(10000000)); - EnsureThrows(r => r.ReadBytesAndSize()); - EnsureThrows(r => r.ReadVector2()); - EnsureThrows(r => r.ReadVector3()); - EnsureThrows(r => r.ReadVector4()); - EnsureThrows(r => r.ReadVector2Int()); - EnsureThrows(r => r.ReadVector3Int()); - EnsureThrows(r => r.ReadColor()); - EnsureThrows(r => r.ReadColor32()); - EnsureThrows(r => r.ReadQuaternion()); - EnsureThrows(r => r.ReadRect()); - EnsureThrows(r => r.ReadPlane()); - EnsureThrows(r => r.ReadRay()); - EnsureThrows(r => r.ReadMatrix4x4()); - EnsureThrows(r => r.ReadGuid()); - } - - [Test] - public void TestBool() - { - bool[] inputs = { true, false }; - foreach (bool input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteBool(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - bool output = reader.ReadBool(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestBoolNullable() - { - bool? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteBoolNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - bool? output = reader.ReadBoolNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestByte() - { - byte[] inputs = { 1, 2, 3, 4 }; - foreach (byte input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteByte(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - byte output = reader.ReadByte(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestByteNullable() - { - byte? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteByteNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - byte? output = reader.ReadByteNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestSByte() - { - sbyte[] inputs = { 1, 2, 3, 4 }; - foreach (sbyte input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteSByte(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - sbyte output = reader.ReadSByte(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestSByteNullable() - { - sbyte? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteSByteNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - sbyte? output = reader.ReadSByteNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestVector2() - { - Vector2[] inputs = { - Vector2.right, - Vector2.up, - Vector2.zero, - Vector2.one, - Vector2.positiveInfinity, - new Vector2(0.1f,3.1f) - }; - foreach (Vector2 input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector2(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector2 output = reader.ReadVector2(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestVector2Nullable() - { - Vector2? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector2Nullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector2? output = reader.ReadVector2Nullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestVector3() - { - Vector3[] inputs = { - Vector3.right, - Vector3.up, - Vector3.zero, - Vector3.one, - Vector3.positiveInfinity, - Vector3.forward, - new Vector3(0.1f,3.1f,1.4f) - }; - foreach (Vector3 input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector3(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector3 output = reader.ReadVector3(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestVector3Nullable() - { - Vector3? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector3Nullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector3? output = reader.ReadVector3Nullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestVector4() - { - Vector4[] inputs = { - Vector3.right, - Vector3.up, - Vector4.zero, - Vector4.one, - Vector4.positiveInfinity, - new Vector4(0.1f,3.1f,1.4f,4.9f) - }; - foreach (Vector4 input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector4(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector4 output = reader.ReadVector4(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestVector4Nullable() - { - Vector4? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector4Nullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector4? output = reader.ReadVector4Nullable(); - Assert.That(output, Is.EqualTo(output)); - } - - [Test] - public void TestVector2Int() - { - Vector2Int[] inputs = { - Vector2Int.down, - Vector2Int.up, - Vector2Int.left, - Vector2Int.zero, - new Vector2Int(-1023,-999999), - new Vector2Int(257,12345), - new Vector2Int(0x7fffffff,-12345), - }; - foreach (Vector2Int input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector2Int(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector2Int output = reader.ReadVector2Int(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestVector2IntNullable() - { - Vector2Int? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector2IntNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector2Int? output = reader.ReadVector2IntNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestVector3Int() - { - Vector3Int[] inputs = { - Vector3Int.down, - Vector3Int.up, - Vector3Int.left, - Vector3Int.one, - Vector3Int.zero, - new Vector3Int(-1023,-999999,1392), - new Vector3Int(257,12345,-6132), - new Vector3Int(0x7fffffff,-12345,-1), - }; - foreach (Vector3Int input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector3Int(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector3Int output = reader.ReadVector3Int(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestVector3IntNullable() - { - Vector3Int? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteVector3IntNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Vector3Int? output = reader.ReadVector3IntNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestColor() - { - Color[] inputs = { - Color.black, - Color.blue, - Color.cyan, - Color.yellow, - Color.magenta, - Color.white, - new Color(0.401f,0.2f,1.0f,0.123f) - }; - foreach (Color input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteColor(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Color output = reader.ReadColor(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestColorNullable() - { - Color? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteColorNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Color? output = reader.ReadColorNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestColor32() - { - Color32[] inputs = { - Color.black, - Color.blue, - Color.cyan, - Color.yellow, - Color.magenta, - Color.white, - new Color32(0xab,0xcd,0xef,0x12), - new Color32(125,126,0,255) - }; - foreach (Color32 input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteColor32(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Color32 output = reader.ReadColor32(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestColor32Nullable() - { - Color32? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteColor32Nullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Color32? output = reader.ReadColor32Nullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestQuaternion() - { - Quaternion[] inputs = { - Quaternion.identity, - default, - Quaternion.LookRotation(new Vector3(0.3f,0.4f,0.5f)), - Quaternion.Euler(45f,56f,Mathf.PI) - }; - foreach (Quaternion input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteQuaternion(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Quaternion output = reader.ReadQuaternion(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestQuaternionNullable() - { - Quaternion? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteQuaternionNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Quaternion? output = reader.ReadQuaternionNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestRect() - { - Rect[] inputs = { - Rect.zero, - new Rect(1004.1f,2.001f,4636,400f), - new Rect(-100.622f,-200f,300f,975.6f), - new Rect(-100f,435,-30.04f,400f), - new Rect(55,-200f,-44,-123), - }; - foreach (Rect input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteRect(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Rect output = reader.ReadRect(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestRectNullable() - { - Rect? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteRectNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Rect? output = reader.ReadRectNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestPlane() - { - Plane[] inputs = { - new Plane(new Vector3(-0.24f,0.34f,0.2f), 120.2f), - new Plane(new Vector3(0.133f,0.34f,0.122f), -10.135f), - new Plane(new Vector3(0.133f,-0.0f,float.MaxValue), -13.3f), - new Plane(new Vector3(0.1f,-0.2f,0.3f), 14.5f), - }; - foreach (Plane input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WritePlane(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Plane output = reader.ReadPlane(); - // note: Plane constructor does math internally, resulting in - // floating point precision loss that causes exact comparison - // to fail the test. So we test that the difference is small. - Assert.That((output.normal - input.normal).magnitude, Is.LessThan(1e-6f)); - Assert.That(output.distance, Is.EqualTo(input.distance)); - } - } - - [Test] - public void TestPlaneNullable() - { - Plane? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WritePlaneNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Plane? output = reader.ReadPlaneNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestRay() - { - Ray[] inputs = { - new Ray(Vector3.up,Vector3.down), - new Ray(new Vector3(0.1f,0.2f,0.3f), new Vector3(0.4f,0.5f,0.6f)), - new Ray(new Vector3(-0.3f,0.5f,0.999f), new Vector3(1f,100.1f,20f)), - }; - foreach (Ray input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteRay(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Ray output = reader.ReadRay(); - Assert.That((output.direction - input.direction).magnitude, Is.LessThan(1e-6f)); - Assert.That(output.origin, Is.EqualTo(input.origin)); - } - } - - [Test] - public void TestRayNullable() - { - Ray? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteRayNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Ray? output = reader.ReadRayNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestMatrix4x4() - { - Matrix4x4[] inputs = { - Matrix4x4.identity, - Matrix4x4.zero, - Matrix4x4.Scale(Vector3.one * 0.12345f), - Matrix4x4.LookAt(Vector2.up,Vector3.right,Vector3.forward), - Matrix4x4.Rotate(Quaternion.LookRotation(Vector3.one)), - }; - foreach (Matrix4x4 input in inputs) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteMatrix4x4(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Matrix4x4 output = reader.ReadMatrix4x4(); - Assert.That(output, Is.EqualTo(input)); - } - } - - [Test] - public void TestMatrix4x4Nullable() - { - Matrix4x4? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteMatrix4x4Nullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Matrix4x4? output = reader.ReadMatrix4x4Nullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestReadingInvalidString() - { - // These are all bytes which never show up in valid UTF8 encodings. - // NetworkReader should gracefully handle maliciously crafted input. - byte[] invalidUTF8bytes = { - 0xC0, 0xC1, 0xF5, 0xF6, - 0xF7, 0xF8, 0xF9, 0xFA, - 0xFB, 0xFC, 0xFD, 0xFE, - 0xFF, - }; - foreach (byte invalid in invalidUTF8bytes) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteString("an uncorrupted string"); - byte[] data = writer.ToArray(); - data[10] = invalid; - NetworkReader reader = new NetworkReader(data); - Assert.Throws(() => reader.ReadString()); - } - } - - [Test] - public void TestReadingTruncatedString() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteString("a string longer than 10 bytes"); - writer.Reset(); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.Throws(() => reader.ReadString()); - } - - [Test] - public void TestToArray() - { - // write 2 bytes - NetworkWriter writer = new NetworkWriter(); - writer.WriteByte(1); - writer.WriteByte(2); - - // .ToArray() length is 2? - Assert.That(writer.ToArray().Length, Is.EqualTo(2)); - - // set position back by one - writer.Position = 1; - - // Changing the position alter the size of the data - Assert.That(writer.ToArray().Length, Is.EqualTo(1)); - } - - [Test] - public void TestToArraySegment() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteString("hello"); - writer.WriteString("world"); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadString(), Is.EqualTo("hello")); - Assert.That(reader.ReadString(), Is.EqualTo("world")); - } - - // sometimes we may serialize nothing, then call ToArraySegment. - // make sure this works even if empty. - [Test] - public void TestToArraySegment_EmptyContent() - { - NetworkWriter writer = new NetworkWriter(); - ArraySegment segment = writer.ToArraySegment(); - Assert.That(segment.Count, Is.EqualTo(0)); - } - - [Test] - public void TestChar() - { - char a = 'a'; - char u = 'ⓤ'; - - NetworkWriter writer = new NetworkWriter(); - writer.WriteChar(a); - writer.WriteChar(u); - NetworkReader reader = new NetworkReader(writer.ToArray()); - char a2 = reader.ReadChar(); - Assert.That(a2, Is.EqualTo(a)); - char u2 = reader.ReadChar(); - Assert.That(u2, Is.EqualTo(u)); - } - - [Test] - public void TestCharNullable() - { - char? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteCharNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - char? output = reader.ReadCharNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestUnicodeString() - { - string[] weirdUnicode = { - "𝔲𝔫𝔦𝔠𝔬𝔡𝔢 𝔱𝔢𝔰𝔱", - "𝖚𝖓𝖎𝖈𝖔𝖉𝖊 𝖙𝖊𝖘𝖙", - "𝐮𝐧𝐢𝐜𝐨𝐝𝐞 𝐭𝐞𝐬𝐭", - "𝘶𝘯𝘪𝘤𝘰𝘥𝘦 𝘵𝘦𝘴𝘵", - "𝙪𝙣𝙞𝙘𝙤𝙙𝙚 𝙩𝙚𝙨𝙩", - "𝚞𝚗𝚒𝚌𝚘𝚍𝚎 𝚝𝚎𝚜𝚝", - "𝓊𝓃𝒾𝒸𝑜𝒹𝑒 𝓉𝑒𝓈𝓉", - "𝓾𝓷𝓲𝓬𝓸𝓭𝓮 𝓽𝓮𝓼𝓽", - "𝕦𝕟𝕚𝕔𝕠𝕕𝕖 𝕥𝕖𝕤𝕥", - "ЦПIᄃӨDΣ ƬΣƧƬ", - "ㄩ几丨匚ㄖᗪ乇 ㄒ乇丂ㄒ", - "ひ刀ノᄃのり乇 イ乇丂イ", - "Ʉ₦ł₵ØĐɆ ₮Ɇ₴₮", - "unicode test", - "ᴜɴɪᴄᴏᴅᴇ ᴛᴇꜱᴛ", - "ʇsǝʇ ǝpoɔıun", - "ยภเς๏๔є ՇєรՇ", - "ᑘᘉᓰᑢᓍᕲᘿ ᖶᘿSᖶ", - "υɳιƈσԃҽ ƚҽʂƚ", - "ʊռɨƈօɖɛ ȶɛֆȶ", - "🆄🅽🅸🅲🅾🅳🅴 🆃🅴🆂🆃", - "ⓤⓝⓘⓒⓞⓓⓔ ⓣⓔⓢⓣ", - "̶̝̳̥͈͖̝͌̈͛̽͊̏̚͠", - // test control codes - "\r\n", "\n", "\r", "\t", - "\\", "\"", "\'", - "\u0000\u0001\u0002\u0003", - "\u0004\u0005\u0006\u0007", - "\u0008\u0009\u000A\u000B", - "\u000C\u000D\u000E\u000F", - // test invalid bytes as characters - "\u00C0\u00C1\u00F5\u00F6", - "\u00F7\u00F8\u00F9\u00FA", - "\u00FB\u00FC\u00FD\u00FE", - "\u00FF", - }; - foreach (string weird in weirdUnicode) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteString(weird); - byte[] data = writer.ToArray(); - NetworkReader reader = new NetworkReader(data); - string str = reader.ReadString(); - Assert.That(str, Is.EqualTo(weird)); - } - } - - [Test] - public void TestGuid() - { - Guid originalGuid = new Guid("0123456789abcdef9876543210fedcba"); - NetworkWriter writer = new NetworkWriter(); - writer.WriteGuid(originalGuid); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - Guid readGuid = reader.ReadGuid(); - Assert.That(readGuid, Is.EqualTo(originalGuid)); - } - - [Test] - public void TestGuidNullable() - { - Guid? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteGuidNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - Guid? output = reader.ReadGuidNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestFloats() - { - float[] weirdFloats = { - 0f, - -0f, - float.Epsilon, - -float.Epsilon, - float.MaxValue, - float.MinValue, - float.NaN, - -float.NaN, - float.PositiveInfinity, - float.NegativeInfinity, - (float) double.MaxValue, - (float) double.MinValue, - (float) decimal.MaxValue, - (float) decimal.MinValue, - (float) Math.PI, - (float) Math.E - }; - foreach (float weird in weirdFloats) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteFloat(weird); - NetworkReader reader = new NetworkReader(writer.ToArray()); - float readFloat = reader.ReadFloat(); - Assert.That(readFloat, Is.EqualTo(weird)); - } - } - - [Test] - public void TestFloatNullable() - { - float? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteFloatNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - float? output = reader.ReadFloatNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestDoubles() - { - double[] weirdDoubles = { - 0d, - -0d, - double.Epsilon, - -double.Epsilon, - double.MaxValue, - double.MinValue, - double.NaN, - -double.NaN, - double.PositiveInfinity, - double.NegativeInfinity, - float.MaxValue, - float.MinValue, - (double) decimal.MaxValue, - (double) decimal.MinValue, - Math.PI, - Math.E - }; - foreach (double weird in weirdDoubles) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteDouble(weird); - NetworkReader reader = new NetworkReader(writer.ToArray()); - double readDouble = reader.ReadDouble(); - Assert.That(readDouble, Is.EqualTo(weird)); - } - } - - [Test] - public void TestDoubleNullable() - { - double? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteDoubleNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - double? output = reader.ReadDoubleNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestDecimals() - { - decimal[] weirdDecimals = { - decimal.Zero, - -decimal.Zero, - decimal.MaxValue, - decimal.MinValue, - (decimal) Math.PI, - (decimal) Math.E - }; - foreach (decimal weird in weirdDecimals) - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteDecimal(weird); - NetworkReader reader = new NetworkReader(writer.ToArray()); - decimal readDecimal = reader.ReadDecimal(); - Assert.That(readDecimal, Is.EqualTo(weird)); - } - } - - [Test] - public void TestDecimalNullable() - { - decimal? input = null; - NetworkWriter writer = new NetworkWriter(); - writer.WriteDecimalNullable(input); - NetworkReader reader = new NetworkReader(writer.ToArray()); - decimal? output = reader.ReadDecimalNullable(); - Assert.That(output, Is.EqualTo(input)); - } - - [Test] - public void TestFloatBinaryCompatibility() - { - float[] weirdFloats = { - ((float) Math.PI) / 3.0f, - ((float) Math.E) / 3.0f - }; - byte[] expected = { - 146, 10,134, 63, - 197,245,103, 63, - }; - NetworkWriter writer = new NetworkWriter(); - foreach (float weird in weirdFloats) - { - writer.WriteFloat(weird); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestDoubleBinaryCompatibility() - { - double[] weirdDoubles = { - Math.PI / 3.0d, - Math.E / 3.0d - }; - byte[] expected = { - 101,115, 45, 56, 82,193,240, 63, - 140,116,112,185,184,254,236, 63, - }; - NetworkWriter writer = new NetworkWriter(); - foreach (double weird in weirdDoubles) - { - writer.WriteDouble(weird); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestDecimalBinaryCompatibility() - { - decimal[] weirdDecimals = { - ((decimal) Math.PI) / 3.0m, - ((decimal) Math.E) / 3.0m - }; - byte[] expected = { - 0x00, 0x00, 0x1C, 0x00, 0x12, 0x37, 0xD6, 0x21, 0xAB, 0xEA, - 0x84, 0x0A, 0x5B, 0x5E, 0xB1, 0x03, 0x00, 0x00, 0x0E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF0, 0x6D, 0xC2, 0xA4, 0x68, 0x52, - 0x00, 0x00 - }; - NetworkWriter writer = new NetworkWriter(); - foreach (decimal weird in weirdDecimals) - { - writer.WriteDecimal(weird); - } - //Debug.Log(BitConverter.ToString(writer.ToArray())); - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestByteEndianness() - { - byte[] values = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 }; - byte[] expected = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 }; - NetworkWriter writer = new NetworkWriter(); - foreach (byte value in values) - { - writer.WriteByte(value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestUShortEndianness() - { - ushort[] values = { 0x0000, 0x1234, 0xabcd, 0xF00F, 0x0FF0, 0xbeef }; - byte[] expected = { 0x00, 0x00, 0x34, 0x12, 0xcd, 0xab, 0x0F, 0xF0, 0xF0, 0x0F, 0xef, 0xbe }; - NetworkWriter writer = new NetworkWriter(); - foreach (ushort value in values) - { - writer.WriteUShort(value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestUIntEndianness() - { - uint[] values = { 0x12345678, 0xabcdef09, 0xdeadbeef }; - byte[] expected = { 0x78, 0x56, 0x34, 0x12, 0x09, 0xef, 0xcd, 0xab, 0xef, 0xbe, 0xad, 0xde }; - NetworkWriter writer = new NetworkWriter(); - foreach (uint value in values) - { - writer.WriteUInt(value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestULongEndianness() - { - ulong[] values = { 0x0123456789abcdef, 0xdeaded_beef_c0ffee }; - byte[] expected = { 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0xee, 0xff, 0xc0, 0xef, 0xbe, 0xed, 0xad, 0xde }; - NetworkWriter writer = new NetworkWriter(); - foreach (ulong value in values) - { - writer.WriteULong(value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestSbyteEndianness() - { - byte[] values = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 }; - byte[] expected = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 }; - NetworkWriter writer = new NetworkWriter(); - foreach (byte value in values) - { - writer.WriteSByte((sbyte)value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestShortEndianness() - { - ushort[] values = { 0x0000, 0x1234, 0xabcd, 0xF00F, 0x0FF0, 0xbeef }; - byte[] expected = { 0x00, 0x00, 0x34, 0x12, 0xcd, 0xab, 0x0F, 0xF0, 0xF0, 0x0F, 0xef, 0xbe }; - NetworkWriter writer = new NetworkWriter(); - foreach (ushort value in values) - { - writer.WriteShort((short)value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestIntEndianness() - { - uint[] values = { 0x12345678, 0xabcdef09, 0xdeadbeef }; - byte[] expected = { 0x78, 0x56, 0x34, 0x12, 0x09, 0xef, 0xcd, 0xab, 0xef, 0xbe, 0xad, 0xde }; - NetworkWriter writer = new NetworkWriter(); - foreach (uint value in values) - { - writer.WriteInt((int)value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestLongEndianness() - { - ulong[] values = { 0x0123456789abcdef, 0xdeaded_beef_c0ffee }; - byte[] expected = { 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0xee, 0xff, 0xc0, 0xef, 0xbe, 0xed, 0xad, 0xde }; - NetworkWriter writer = new NetworkWriter(); - foreach (ulong value in values) - { - writer.WriteLong((long)value); - } - Assert.That(writer.ToArray(), Is.EqualTo(expected)); - } - - [Test] - public void TestWritingAndReading() - { - // write all simple types once - NetworkWriter writer = new NetworkWriter(); - writer.WriteChar((char)1); - writer.WriteByte(2); - writer.WriteSByte(3); - writer.WriteBool(true); - writer.WriteShort(4); - writer.WriteUShort(5); - writer.WriteInt(6); - writer.WriteUInt(7U); - writer.WriteLong(8L); - writer.WriteULong(9UL); - writer.WriteFloat(10.0F); - writer.WriteDouble(11.0D); - writer.WriteDecimal(12); - writer.WriteString(null); - writer.WriteString(""); - writer.WriteString("13"); - // just the byte array, no size info etc. - writer.WriteBytes(new byte[] { 14, 15 }, 0, 2); - // [SyncVar] struct values can have uninitialized byte arrays, null needs to be supported - writer.WriteBytesAndSize(null); - // buffer, no-offset, count - writer.WriteBytesAndSize(new byte[] { 17, 18 }, 0, 2); - // buffer, offset, count - writer.WriteBytesAndSize(new byte[] { 19, 20, 21 }, 1, 2); - // size, buffer - writer.WriteBytesAndSize(new byte[] { 22, 23 }, 0, 2); - - // read them - NetworkReader reader = new NetworkReader(writer.ToArray()); - - Assert.That(reader.ReadChar(), Is.EqualTo(1)); - Assert.That(reader.ReadByte(), Is.EqualTo(2)); - Assert.That(reader.ReadSByte(), Is.EqualTo(3)); - Assert.That(reader.ReadBool(), Is.True); - Assert.That(reader.ReadShort(), Is.EqualTo(4)); - Assert.That(reader.ReadUShort(), Is.EqualTo(5)); - Assert.That(reader.ReadInt(), Is.EqualTo(6)); - Assert.That(reader.ReadUInt(), Is.EqualTo(7)); - Assert.That(reader.ReadLong(), Is.EqualTo(8)); - Assert.That(reader.ReadULong(), Is.EqualTo(9)); - Assert.That(reader.ReadFloat(), Is.EqualTo(10)); - Assert.That(reader.ReadDouble(), Is.EqualTo(11)); - Assert.That(reader.ReadDecimal(), Is.EqualTo(12)); - // writing null string should write null in Mirror ("" in original HLAPI) - Assert.That(reader.ReadString(), Is.Null); - Assert.That(reader.ReadString(), Is.EqualTo("")); - Assert.That(reader.ReadString(), Is.EqualTo("13")); - - Assert.That(reader.ReadBytes(2), Is.EqualTo(new byte[] { 14, 15 })); - - Assert.That(reader.ReadBytesAndSize(), Is.Null); - - Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 17, 18 })); - - Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 20, 21 })); - - Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 22, 23 })); - } - - [Test] - public void TestWritingUri() - { - - Uri testUri = new Uri("https://www.mirror-networking.com?somthing=other"); - - NetworkWriter writer = new NetworkWriter(); - writer.WriteUri(testUri); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.That(reader.ReadUri(), Is.EqualTo(testUri)); - } - - // URI null support test for https://github.com/vis2k/Mirror/pull/2796/ - [Test] - public void TestWritingNullUri() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUri(null); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.That(reader.ReadUri(), Is.EqualTo(null)); - } - - [Test] - public void TestList() - { - List original = new List() { 1, 2, 3, 4, 5 }; - NetworkWriter writer = new NetworkWriter(); - writer.Write(original); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - List readList = reader.Read>(); - Assert.That(readList, Is.EqualTo(original)); - } - - [Test] - public void TestNullList() - { - NetworkWriter writer = new NetworkWriter(); - writer.Write>(null); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - List readList = reader.Read>(); - Assert.That(readList, Is.Null); - } - - - const int testArraySize = 4; - [Test] - [Description("ReadArray should throw if it is trying to read more than length of segment, this is to stop allocation attacks")] - public void TestArrayDoesNotThrowWithCorrectLength() - { - NetworkWriter writer = new NetworkWriter(); - WriteGoodArray(); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - Assert.DoesNotThrow(() => - { - _ = reader.ReadArray(); - }); - - void WriteGoodArray() - { - writer.WriteInt(testArraySize); - int[] array = new int[testArraySize] { 1, 2, 3, 4 }; - for (int i = 0; i < array.Length; i++) - writer.Write(array[i]); - } - } - [Test] - [Description("ReadArray should throw if it is trying to read more than length of segment, this is to stop allocation attacks")] - [TestCase(testArraySize * sizeof(int), Description = "max allowed value to allocate array")] - [TestCase(testArraySize * 2)] - [TestCase(testArraySize + 1, Description = "min allowed to allocate")] - public void TestArrayThrowsIfLengthIsWrong(int badLength) - { - NetworkWriter writer = new NetworkWriter(); - WriteBadArray(); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - EndOfStreamException exception = Assert.Throws(() => - { - _ = reader.ReadArray(); - }); - // todo improve this message check - Assert.That(exception, Has.Message.Contains($"ReadBlittable out of range")); - - void WriteBadArray() - { - writer.WriteInt(badLength); - int[] array = new int[testArraySize] { 1, 2, 3, 4 }; - for (int i = 0; i < array.Length; i++) - writer.Write(array[i]); - } - } - - [Test] - [Description("ReadArray should throw if it is trying to read more than length of segment, this is to stop allocation attacks")] - [TestCase(testArraySize * sizeof(int) + 1, Description = "min read count is 1 byte, 16 array bytes are writen so 17 should throw error")] - [TestCase(20_000)] - [TestCase(int.MaxValue)] - [TestCase(int.MaxValue - 1)] - // todo add fuzzy testing to check more values - public void TestArrayThrowsIfLengthIsTooBig(int badLength) - { - NetworkWriter writer = new NetworkWriter(); - WriteBadArray(); - - NetworkReader reader = new NetworkReader(writer.ToArray()); - EndOfStreamException exception = Assert.Throws(() => - { - _ = reader.ReadArray(); - }); - Assert.That(exception, Has.Message.EqualTo($"Received array that is too large: {badLength}")); - - void WriteBadArray() - { - writer.WriteInt(badLength); - int[] array = new int[testArraySize] { 1, 2, 3, 4 }; - for (int i = 0; i < array.Length; i++) - writer.Write(array[i]); - } - } - - [Test] - public void TestNetworkBehaviour() - { - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn(out _, out _, out RpcNetworkIdentityBehaviour behaviour); - - NetworkWriter writer = new NetworkWriter(); - writer.WriteNetworkBehaviour(behaviour); - - byte[] bytes = writer.ToArray(); - - Assert.That(bytes.Length, Is.EqualTo(5), "Networkbehaviour should be 5 bytes long."); - - NetworkReader reader = new NetworkReader(bytes); - RpcNetworkIdentityBehaviour actual = reader.ReadNetworkBehaviour(); - Assert.That(actual, Is.EqualTo(behaviour), "Read should find the same behaviour as written"); - } - - [Test] - public void TestNetworkBehaviourNull() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteNetworkBehaviour(null); - - byte[] bytes = writer.ToArray(); - - Assert.That(bytes.Length, Is.EqualTo(4), "null Networkbehaviour should be 4 bytes long."); - - NetworkReader reader = new NetworkReader(bytes); - RpcNetworkIdentityBehaviour actual = reader.ReadNetworkBehaviour(); - Assert.That(actual, Is.Null, "should read null"); - - Assert.That(reader.Position, Is.EqualTo(4), "should read 4 bytes when netid is 0"); - } - - [Test] - [Description("Uses Generic read function to check weaver correctly creates it")] - public void TestNetworkBehaviourWeaverGenerated() - { - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn(out _, out _, out RpcNetworkIdentityBehaviour behaviour); - - NetworkWriter writer = new NetworkWriter(); - writer.Write(behaviour); - - byte[] bytes = writer.ToArray(); - - Assert.That(bytes.Length, Is.EqualTo(5), "Networkbehaviour should be 5 bytes long."); - - NetworkReader reader = new NetworkReader(bytes); - RpcNetworkIdentityBehaviour actual = reader.Read(); - Assert.That(actual, Is.EqualTo(behaviour), "Read should find the same behaviour as written"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/NetworkWriterTest.cs.meta b/Assets/Mirror/Tests/Editor/NetworkWriterTest.cs.meta deleted file mode 100644 index 394706e04..000000000 --- a/Assets/Mirror/Tests/Editor/NetworkWriterTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9f7c59e9071cf4a64a9bd207465e3f1b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/OverloadMethodTest.cs b/Assets/Mirror/Tests/Editor/OverloadMethodTest.cs deleted file mode 100644 index 56313714d..000000000 --- a/Assets/Mirror/Tests/Editor/OverloadMethodTest.cs +++ /dev/null @@ -1,53 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests.MessageTests -{ - struct NoArgMethodMessage : NetworkMessage - { - public int someValue; - - // Weaver should ignore these methods because they have no args - public void Serialize() { /* method with no arg */ } - public void Deserialize() { /* method with no arg */ } - } - - struct TwoArgMethodMessage : NetworkMessage - { - public int someValue; - - // Weaver should ignore these methods because they have two args - public void Serialize(NetworkWriter writer, int AnotherValue) {} - public void Deserialize(NetworkReader reader, int AnotherValue) {} - } - - public class OverloadMethodTest - { - [Test] - public void MethodsWithNoArgs() - { - const int value = 10; - NoArgMethodMessage intMessage = new NoArgMethodMessage - { - someValue = value - }; - - byte[] data = MessagePackingTest.PackToByteArray(intMessage); - NoArgMethodMessage unpacked = MessagePackingTest.UnpackFromByteArray(data); - Assert.That(unpacked.someValue, Is.EqualTo(value)); - } - - [Test] - public void MethodsWithTwoArgs() - { - const int value = 10; - TwoArgMethodMessage intMessage = new TwoArgMethodMessage - { - someValue = value - }; - - byte[] data = MessagePackingTest.PackToByteArray(intMessage); - TwoArgMethodMessage unpacked = MessagePackingTest.UnpackFromByteArray(data); - Assert.That(unpacked.someValue, Is.EqualTo(value)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/OverloadMethodTest.cs.meta b/Assets/Mirror/Tests/Editor/OverloadMethodTest.cs.meta deleted file mode 100644 index 227a26a8b..000000000 --- a/Assets/Mirror/Tests/Editor/OverloadMethodTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bbe7affc888ce1041a8d6752b0f3f94b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/PoolTests.cs b/Assets/Mirror/Tests/Editor/PoolTests.cs deleted file mode 100644 index 2002c8de5..000000000 --- a/Assets/Mirror/Tests/Editor/PoolTests.cs +++ /dev/null @@ -1,45 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class PoolTests - { - Pool pool; - - [SetUp] - public void SetUp() - { - pool = new Pool(() => "new string", 0); - } - - [TearDown] - public void TearDown() - { - pool = null; - } - - [Test] - public void TakeFromEmpty() - { - // taking from an empty pool should give us a completely new string - Assert.That(pool.Take(), Is.EqualTo("new string")); - } - - [Test] - public void ReturnAndTake() - { - // returning and then taking should get the returned one, not a - // newly generated one. - pool.Return("returned"); - Assert.That(pool.Take(), Is.EqualTo("returned")); - } - - [Test] - public void Count() - { - Assert.That(pool.Count, Is.EqualTo(0)); - pool.Return("returned"); - Assert.That(pool.Count, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/PoolTests.cs.meta b/Assets/Mirror/Tests/Editor/PoolTests.cs.meta deleted file mode 100644 index 73ac928ce..000000000 --- a/Assets/Mirror/Tests/Editor/PoolTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 566efeb4786e4449bb70c041baf39b42 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/RemoteTestBase.cs b/Assets/Mirror/Tests/Editor/RemoteTestBase.cs deleted file mode 100644 index 05cb4fc36..000000000 --- a/Assets/Mirror/Tests/Editor/RemoteTestBase.cs +++ /dev/null @@ -1,15 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - public class RemoteTestBase : MirrorEditModeTest - { - [SetUp] - public void Setup() - { - // start server/client - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/RemoteTestBase.cs.meta b/Assets/Mirror/Tests/Editor/RemoteTestBase.cs.meta deleted file mode 100644 index 45e4de8ea..000000000 --- a/Assets/Mirror/Tests/Editor/RemoteTestBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 45bb26f0ce04fb749ac83a28d7590ebc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs b/Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs deleted file mode 100644 index 4916b8874..000000000 --- a/Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class RpcNetworkIdentityBehaviour : NetworkBehaviour - { - public event Action onSendNetworkIdentityCalled; - public event Action onSendGameObjectCalled; - public event Action onSendNetworkBehaviourCalled; - public event Action onSendNetworkBehaviourDerivedCalled; - - [ClientRpc] - public void SendNetworkIdentity(NetworkIdentity value) - { - onSendNetworkIdentityCalled?.Invoke(value); - } - - [ClientRpc] - public void SendGameObject(GameObject value) - { - onSendGameObjectCalled?.Invoke(value); - } - - [ClientRpc] - public void SendNetworkBehaviour(NetworkBehaviour value) - { - onSendNetworkBehaviourCalled?.Invoke(value); - } - - [ClientRpc] - public void SendNetworkBehaviourDerived(RpcNetworkIdentityBehaviour value) - { - onSendNetworkBehaviourDerivedCalled?.Invoke(value); - } - } - - [Description("Test for sending NetworkIdentity fields (NI/GO/NB) in RPC")] - public class RpcNetworkIdentityTest : RemoteTestBase - { - [Test] - public void RpcCanSendNetworkIdentity() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out RpcNetworkIdentityBehaviour hostBehaviour, NetworkServer.localConnection); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity expected, out RpcNetworkIdentityBehaviour _, NetworkServer.localConnection); - - int callCount = 0; - hostBehaviour.onSendNetworkIdentityCalled += actual => - { - callCount++; - Assert.That(actual, Is.EqualTo(expected)); - }; - hostBehaviour.SendNetworkIdentity(expected); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void RpcCanSendGameObject() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out RpcNetworkIdentityBehaviour hostBehaviour, NetworkServer.localConnection); - CreateNetworkedAndSpawn(out GameObject expected, out NetworkIdentity _, out RpcNetworkIdentityBehaviour _, NetworkServer.localConnection); - - int callCount = 0; - hostBehaviour.onSendGameObjectCalled += actual => - { - callCount++; - Assert.That(actual, Is.EqualTo(expected)); - }; - hostBehaviour.SendGameObject(expected); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void RpcCanSendNetworkBehaviour() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out RpcNetworkIdentityBehaviour hostBehaviour, NetworkServer.localConnection); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out RpcNetworkIdentityBehaviour expected, NetworkServer.localConnection); - - int callCount = 0; - hostBehaviour.onSendNetworkBehaviourCalled += actual => - { - callCount++; - Assert.That(actual, Is.EqualTo(expected)); - }; - hostBehaviour.SendNetworkBehaviour(expected); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void RpcCanSendNetworkBehaviourDerived() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out RpcNetworkIdentityBehaviour hostBehaviour, NetworkServer.localConnection); - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out RpcNetworkIdentityBehaviour expected, NetworkServer.localConnection); - - int callCount = 0; - hostBehaviour.onSendNetworkBehaviourDerivedCalled += actual => - { - callCount++; - Assert.That(actual, Is.EqualTo(expected)); - }; - hostBehaviour.SendNetworkBehaviourDerived(expected); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs.meta b/Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs.meta deleted file mode 100644 index af93365f5..000000000 --- a/Assets/Mirror/Tests/Editor/RpcNetworkIdentityTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6cd69a1f4a3c74e4fa03b9ab816d392c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs b/Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs deleted file mode 100644 index b5b83b9e8..000000000 --- a/Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs +++ /dev/null @@ -1,43 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class MyScriptableObject : ScriptableObject - { - public int someData; - } - - [TestFixture] - public class ScriptableObjectWriterTest - { - - // ArraySegment is a special case, optimized for no copy and no allocation - // other types are generated by the weaver - - - public struct ScriptableObjectMessage : NetworkMessage - { - public MyScriptableObject scriptableObject; - } - - [Test] - public void TestWriteScriptableObject() - { - ScriptableObjectMessage message = new ScriptableObjectMessage - { - scriptableObject = ScriptableObject.CreateInstance() - }; - - message.scriptableObject.someData = 10; - - byte[] data = MessagePackingTest.PackToByteArray(message); - - ScriptableObjectMessage unpacked = MessagePackingTest.UnpackFromByteArray(data); - - Assert.That(unpacked.scriptableObject, Is.Not.Null); - Assert.That(unpacked.scriptableObject.someData, Is.EqualTo(10)); - } - - } -} diff --git a/Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs.meta b/Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs.meta deleted file mode 100644 index 03cd254bd..000000000 --- a/Assets/Mirror/Tests/Editor/ScriptableObjectWriterTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b6c10e2d494114e9190f56d13a894c82 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs b/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs deleted file mode 100644 index 1ba07b1f9..000000000 --- a/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs +++ /dev/null @@ -1,724 +0,0 @@ - -using System; -using NUnit.Framework; -using System.Collections.Generic; -using UnityEngine; - -namespace Mirror.Tests -{ - // a simple snapshot with timestamp & interpolation - struct SimpleSnapshot : Snapshot - { - public double remoteTimestamp { get; set; } - public double localTimestamp { get; set; } - public double value; - - public SimpleSnapshot(double remoteTimestamp, double localTimestamp, double value) - { - this.remoteTimestamp = remoteTimestamp; - this.localTimestamp = localTimestamp; - this.value = value; - } - - public static SimpleSnapshot Interpolate(SimpleSnapshot from, SimpleSnapshot to, double t) => - new SimpleSnapshot( - // interpolated snapshot is applied directly. don't need timestamps. - 0, 0, - // lerp unclamped in case we ever need to extrapolate. - // atm SnapshotInterpolation never does. - Mathd.LerpUnclamped(from.value, to.value, t)); - } - - public class SnapshotInterpolationTests - { - // buffer for convenience so we don't have to create it manually each time - SortedList buffer; - - [SetUp] - public void SetUp() - { - buffer = new SortedList(); - } - - [Test] - public void InsertIfNewEnough() - { - // inserting a first value should always work - SimpleSnapshot first = new SimpleSnapshot(1, 1, 0); - SnapshotInterpolation.InsertIfNewEnough(first, buffer); - Assert.That(buffer.Count, Is.EqualTo(1)); - - // insert before first should not work - SimpleSnapshot before = new SimpleSnapshot(0.5, 0.5, 0); - SnapshotInterpolation.InsertIfNewEnough(before, buffer); - Assert.That(buffer.Count, Is.EqualTo(1)); - - // insert after first should work - SimpleSnapshot second = new SimpleSnapshot(2, 2, 0); - SnapshotInterpolation.InsertIfNewEnough(second, buffer); - Assert.That(buffer.Count, Is.EqualTo(2)); - Assert.That(buffer.Values[0], Is.EqualTo(first)); - Assert.That(buffer.Values[1], Is.EqualTo(second)); - - // insert after second should work - SimpleSnapshot after = new SimpleSnapshot(2.5, 2.5, 0); - SnapshotInterpolation.InsertIfNewEnough(after, buffer); - Assert.That(buffer.Count, Is.EqualTo(3)); - Assert.That(buffer.Values[0], Is.EqualTo(first)); - Assert.That(buffer.Values[1], Is.EqualTo(second)); - Assert.That(buffer.Values[2], Is.EqualTo(after)); - } - - // the 'ACB' problem: - // if we have a snapshot A at t=0 and C at t=2, - // we start interpolating between them. - // if suddenly B at t=1 comes in unexpectely, - // we should NOT suddenly steer towards B. - // => inserting between the first two snapshot should never be allowed - // in order to avoid all kinds of edge cases. - [Test] - public void InsertIfNewEnough_ACB_Problem() - { - SimpleSnapshot a = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot b = new SimpleSnapshot(1, 1, 0); - SimpleSnapshot c = new SimpleSnapshot(2, 2, 0); - - // insert A and C - SnapshotInterpolation.InsertIfNewEnough(a, buffer); - SnapshotInterpolation.InsertIfNewEnough(c, buffer); - - // trying to insert B between the first two snapshots should fail - SnapshotInterpolation.InsertIfNewEnough(b, buffer); - Assert.That(buffer.Count, Is.EqualTo(2)); - Assert.That(buffer.Values[0], Is.EqualTo(a)); - Assert.That(buffer.Values[1], Is.EqualTo(c)); - } - - // the 'first is lagging' problem: - // server sends A, B. - // A is lagging behind by 2000ms for whatever reason. - // we get B first. - // B should remain the first snapshot, the lagging A should be dropped - [Test] - public void InsertIfNewEnough_FirstIsLagging_Problem() - { - SimpleSnapshot a = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot b = new SimpleSnapshot(1, 1, 0); - - // insert B. A is still delayed. - SnapshotInterpolation.InsertIfNewEnough(b, buffer); - - // now the delayed A comes in. - // timestamp is before B though. - // but it should still be dropped. - SnapshotInterpolation.InsertIfNewEnough(a, buffer); - Assert.That(buffer.Count, Is.EqualTo(1)); - Assert.That(buffer.Values[0], Is.EqualTo(b)); - } - - [Test] - public void HasAmountOlderThan_NotEnough() - { - // only add two - SimpleSnapshot a = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot b = new SimpleSnapshot(1, 1, 0); - buffer.Add(a.remoteTimestamp, a); - buffer.Add(b.remoteTimestamp, b); - - // shouldn't have more old enough than two - // because we don't have more than two - Assert.That(SnapshotInterpolation.HasAmountOlderThan(buffer, 0, 3), Is.False); - } - - [Test] - public void HasAmountOlderThan_EnoughButNotOldEnough() - { - // add three - SimpleSnapshot a = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot b = new SimpleSnapshot(1, 1, 0); - SimpleSnapshot c = new SimpleSnapshot(2, 2, 0); - buffer.Add(a.remoteTimestamp, a); - buffer.Add(b.remoteTimestamp, b); - buffer.Add(c.remoteTimestamp, c); - - // check at time = 1.9, where third one would not be old enough. - Assert.That(SnapshotInterpolation.HasAmountOlderThan(buffer, 1.9, 3), Is.False); - } - - [Test] - public void HasAmountOlderThan_EnoughAndOldEnough() - { - // add three - SimpleSnapshot a = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot b = new SimpleSnapshot(1, 1, 0); - SimpleSnapshot c = new SimpleSnapshot(2, 2, 0); - buffer.Add(a.remoteTimestamp, a); - buffer.Add(b.remoteTimestamp, b); - buffer.Add(c.remoteTimestamp, c); - - // check at time = 2.1, where third one would be old enough. - Assert.That(SnapshotInterpolation.HasAmountOlderThan(buffer, 2.1, 3), Is.True); - } - - // UDP messages might arrive twice sometimes. - // make sure InsertIfNewEnough can handle it. - [Test] - public void InsertIfNewEnough_Duplicate() - { - SimpleSnapshot a = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot b = new SimpleSnapshot(1, 1, 0); - SimpleSnapshot c = new SimpleSnapshot(2, 2, 0); - - // add two valid snapshots first. - // we can't add 'duplicates' before 3rd and 4th anyway. - SnapshotInterpolation.InsertIfNewEnough(a, buffer); - SnapshotInterpolation.InsertIfNewEnough(b, buffer); - - // insert C which is newer than B. - // then insert it again because it arrive twice. - SnapshotInterpolation.InsertIfNewEnough(c, buffer); - SnapshotInterpolation.InsertIfNewEnough(c, buffer); - - // count should still be 3. - Assert.That(buffer.Count, Is.EqualTo(3)); - } - - [Test] - public void CalculateCatchup_Empty() - { - // make sure nothing happens with buffer size = 0 - Assert.That(SnapshotInterpolation.CalculateCatchup(buffer, 0, 10), Is.EqualTo(0)); - } - - [Test] - public void CalculateCatchup_None() - { - // add one - buffer.Add(0, default); - - // catch-up starts at threshold = 1. so nothing. - Assert.That(SnapshotInterpolation.CalculateCatchup(buffer, 1, 10), Is.EqualTo(0)); - } - - [Test] - public void GetFirstSecondAndDelta() - { - // add three - SimpleSnapshot a = new SimpleSnapshot(0, 1, 0); - SimpleSnapshot b = new SimpleSnapshot(2, 3, 0); - SimpleSnapshot c = new SimpleSnapshot(10, 20, 0); - buffer.Add(a.remoteTimestamp, a); - buffer.Add(b.remoteTimestamp, b); - buffer.Add(c.remoteTimestamp, c); - - SnapshotInterpolation.GetFirstSecondAndDelta(buffer, out SimpleSnapshot first, out SimpleSnapshot second, out double delta); - Assert.That(first, Is.EqualTo(a)); - Assert.That(second, Is.EqualTo(b)); - Assert.That(delta, Is.EqualTo(b.remoteTimestamp - a.remoteTimestamp)); - } - - [Test] - public void CalculateCatchup_Multiple() - { - // add three - buffer.Add(0, default); - buffer.Add(1, default); - buffer.Add(2, default); - - // catch-up starts at threshold = 1. so two are multiplied by 10. - Assert.That(SnapshotInterpolation.CalculateCatchup(buffer, 1, 10), Is.EqualTo(20)); - } - - // first step: with empty buffer and defaults, nothing should happen - [Test] - public void Compute_Step1_DefaultDoesNothing() - { - // compute with defaults - double localTime = 0; - double deltaTime = 0; - double interpolationTime = 0; - float bufferTime = 0; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should not spit out any snapshot to apply - Assert.That(result, Is.False); - // no interpolation should have happened yet - Assert.That(interpolationTime, Is.EqualTo(0)); - // buffer should still be untouched - Assert.That(buffer.Count, Is.EqualTo(0)); - } - - // third step: compute should always wait until the first two snapshots - // are older than the time we buffer ('bufferTime') - // => test for both snapshots not old enough - [Test] - public void Compute_Step3_WaitsUntilBufferTime() - { - // add two snapshots that are barely not old enough - // (localTime - bufferTime) - // IMPORTANT: use a 'definitely old enough' remoteTime to make sure - // that compute() actually checks LOCAL, not REMOTE time! - SimpleSnapshot first = new SimpleSnapshot(0.1, 0.1, 0); - SimpleSnapshot second = new SimpleSnapshot(0.9, 1.1, 0); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - double localTime = 3; - double deltaTime = 0.5; - double interpolationTime = 0; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should not spit out any snapshot to apply - Assert.That(result, Is.False); - // no interpolation should happen yet (not old enough) - Assert.That(interpolationTime, Is.EqualTo(0)); - // buffer should be untouched - Assert.That(buffer.Count, Is.EqualTo(2)); - } - - // third step: compute should always wait until the first two snapshots - // are older than the time we buffer ('bufferTime') - // => test for only one snapshot which is old enough - [Test] - public void Compute_Step3_WaitsForSecondSnapshot() - { - // add a snapshot at t = 0 - SimpleSnapshot first = new SimpleSnapshot(0, 0, 0); - buffer.Add(first.remoteTimestamp, first); - - // compute at localTime = 2 with bufferTime = 1 - // so the threshold is anything < t=1 - double localTime = 2; - double deltaTime = 0; - double interpolationTime = 0; - float bufferTime = 1; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should not spit out any snapshot to apply - Assert.That(result, Is.False); - // no interpolation should happen yet (not enough snapshots) - Assert.That(interpolationTime, Is.EqualTo(0)); - // buffer should be untouched - Assert.That(buffer.Count, Is.EqualTo(1)); - } - - // fourth step: compute should begin if we have two old enough snapshots - [Test] - public void Compute_Step4_InterpolateWithTwoOldEnoughSnapshots() - { - // add two old enough snapshots - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 1); - // IMPORTANT: second snapshot delta is != 1 so we can be sure that - // interpolationTime result is actual time, not 't' ratio. - // for a delta of 1, absolute and relative values would - // return the same results. - SimpleSnapshot second = new SimpleSnapshot(2, 2, 2); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - double localTime = 4; - double deltaTime = 1.5; - double interpolationTime = 0; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started just now, from 0. - // and deltaTime is 1.5, so we should be at 1.5 now. - Assert.That(interpolationTime, Is.EqualTo(1.5)); - // buffer should be untouched, we are still interpolating between the two - Assert.That(buffer.Count, Is.EqualTo(2)); - // interpolationTime is at 1.5, so 3/4 between first & second. - // computed snapshot should be interpolated at 3/4ths. - Assert.That(computed.value, Is.EqualTo(1.75).Within(Mathf.Epsilon)); - } - - // fourth step: compute should begin if we have two old enough snapshots - // => test with 3 snapshots to make sure the third one - // isn't touched while t between [0,1] - [Test] - public void Compute_Step4_InterpolateWithThreeOldEnoughSnapshots() - { - // add three old enough snapshots. - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 1); - SimpleSnapshot second = new SimpleSnapshot(1, 1, 2); - SimpleSnapshot third = new SimpleSnapshot(2, 2, 2); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - buffer.Add(third.remoteTimestamp, third); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - double localTime = 4; - double deltaTime = 0.5; - double interpolationTime = 0; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started just now, from 0. - // and deltaTime is 0.5, so we should be at 0.5 now. - Assert.That(interpolationTime, Is.EqualTo(0.5)); - // buffer should be untouched, we are still interpolating between - // the first two. third should still be there. - Assert.That(buffer.Count, Is.EqualTo(3)); - // computed snapshot should be interpolated in the middle - Assert.That(computed.value, Is.EqualTo(1.5).Within(Mathf.Epsilon)); - } - - // fourth step: simulate interpolation after a long time of no updates. - // for example, a mobile user might put the app in the - // background for a minute. - [Test] - public void Compute_Step4_InterpolateAfterLongPause() - { - // add two immediate, and one that arrives 100s later - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 0); - SimpleSnapshot second = new SimpleSnapshot(1, 1, 1); - SimpleSnapshot third = new SimpleSnapshot(101, 2, 101); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - buffer.Add(third.remoteTimestamp, third); - - // compute where we are half way between first and second, - // and now are updated 1 minute later. - double localTime = 103; // 1011+bufferTime so third snapshot is old enough - double deltaTime = 98.5; // 99s - interpolation time - double interpolationTime = 0.5; // half way between first and second - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started at 0.5, right between first & second. - // we received another snapshot at t=101. - // delta = 98.5 seconds - // => interpolationTime = 99 - // => overshoots second goal, so we move to third goal and subtract 1 - // => so we should be at 98 now - Assert.That(interpolationTime, Is.EqualTo(98)); - // we moved to the next snapshot. so only 2 should be in buffer now. - Assert.That(buffer.Count, Is.EqualTo(2)); - // delta between second and third is 100. - // interpolationTime is at 98 - // interpolationTime is relative to second.time - // => InverseLerp(1, 101, 1 + 98) = 0.98 - // which is at 98% of the value - // => Lerp(1, 101, 0.98): 101-1 is 100. 98% are 98. relative to '1' - // makes it 99. - Assert.That(computed.value, Is.EqualTo(99).Within(Mathf.Epsilon)); - } - - // fourth step: catchup should be considered if buffer gets too large - [Test] - public void Compute_Step4_InterpolateWithCatchup() - { - // add two old enough snapshots - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 1); - SimpleSnapshot second = new SimpleSnapshot(1, 1, 2); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - - // start applying 25% catchup per excess when > 2. - int catchupThreshold = 2; - float catchupMultiplier = 0.25f; - - // two excess snapshots to make sure that multiplier is accumulated - SimpleSnapshot excess1 = new SimpleSnapshot(2, 2, 3); - SimpleSnapshot excess2 = new SimpleSnapshot(3, 3, 4); - buffer.Add(excess1.remoteTimestamp, excess1); - buffer.Add(excess2.remoteTimestamp, excess2); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - double localTime = 3; - double deltaTime = 0.5; - double interpolationTime = 0; - float bufferTime = 2; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started just now, from 0. - // and deltaTime is 0.5 + 50% catchup, so we should be at 0.75 now - Assert.That(interpolationTime, Is.EqualTo(0.75)); - // buffer should be untouched, we are still interpolating between - // the first two. - Assert.That(buffer.Count, Is.EqualTo(4)); - // computed snapshot should be interpolated in 3/4 because - // interpolationTime is at 3/4 - Assert.That(computed.value, Is.EqualTo(1.75).Within(Mathf.Epsilon)); - } - - // fifth step: interpolation time overshoots the end while waiting for - // more snapshots. - // - // IMPORTANT: we should NOT extrapolate & predict while waiting for more - // snapshots as this would introduce a whole range of issues: - // * player might be extrapolated WAY out if we wait for long - // * player might be extrapolated behind walls - // * once we receive a new snapshot, we would interpolate - // not from the last valid position, but from the - // extrapolated position. this could be ANYWHERE. the - // player might get stuck in walls, etc. - // => we are NOT doing client side prediction & rollback here - // => we are simply interpolating with known, valid positions - // - // NOTE: to reproduce the issue in a real example: - // * open mirror benchmark example - // * editor=host 1000+ monsters & deep profiling for LOW FPS - // * build=client - // * move around client - // * see it all over the place in editor because it extrapolates, - // ends up at the wrong start positions and gets worse from - // there. - // - // video: https://gyazo.com/8de68f0a821449d7b9a8424e2c9e3ff8 - // (or see Mirror/Docs/Screenshots/NT Snap. Interp./extrapolation issues) - [Test] - public void Compute_Step5_OvershootWithoutEnoughSnapshots() - { - // add two old enough snapshots - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 1); - SimpleSnapshot second = new SimpleSnapshot(1, 1, 2); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - // -> interpolation time is already at '1' at the end. - // -> compute will add 0.5 deltaTime - // -> so we should NOT overshoot aka extrapolate beyond second snap. - double localTime = 3; - double deltaTime = 0.5; - double interpolationTime = 1; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started at the end = 1 - // and deltaTime is 0.5, so it's at 1.5 internally. - // - // BUT there's NO reason to overshoot interpolationTime if there's - // no other snapshots to move to. - // interpolationTime overshoot is only for smooth transitions WHILE - // moving. - // for example, if we keep overshooting to 100, then we would - // instantly skip the next 20 snapshots. - // => so it should be capped at second.remoteTime - Assert.That(interpolationTime, Is.EqualTo(1)); - // buffer should be untouched, we are still interpolating between the two - Assert.That(buffer.Count, Is.EqualTo(2)); - // computed snapshot should NOT extrapolate beyond second snap. - Assert.That(computed.value, Is.EqualTo(2).Within(Mathf.Epsilon)); - } - - // fifth step: interpolation time overshoots the end while having more - // snapshots available. - // BUT: the next snapshot isn't old enough yet. - // we shouldn't move there until old enough. - // for the same reason we don't move to first, second - // until they are old enough. - // => always need to be 'bufferTime' old. - [Test] - public void Compute_Step5_OvershootWithEnoughSnapshots_NextIsntOldEnough() - { - // add two old enough snapshots - // (localTime - bufferTime) - // - // IMPORTANT: second.time needs to be != second.time-first.time - // to guarantee that we cap interpolationTime (which is - // RELATIVE from 0..delta) at delta, not at second.time. - // this was a bug before. - SimpleSnapshot first = new SimpleSnapshot(1, 1, 1); - SimpleSnapshot second = new SimpleSnapshot(2, 2, 2); - // IMPORTANT: third snapshot needs to be: - // - a different time delta - // to test if overflow is correct if deltas are different. - // it's not obvious if we ever use t ratio between [0,1] where an - // overflow of 0.1 between A,B could speed up B,C interpolation if - // that's not the same delta, since t is a ratio. - // - a different value delta to check if it really _interpolates_, - // not just extrapolates further after A,B - SimpleSnapshot third = new SimpleSnapshot(4, 4, 4); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - buffer.Add(third.remoteTimestamp, third); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - // -> interpolation time is already at '1' at the end. - // -> compute will add 0.5 deltaTime - // -> so we overshoot beyond the second one and move to the next - // - // localTime is at 4 - // third snapshot localTime is at 4. - // bufferTime is 2, so it is NOT old enough and we should wait! - double localTime = 4; - double deltaTime = 0.5; - double interpolationTime = 1; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should still spit out a result between first & second. - Assert.That(result, Is.True); - // interpolation started at the end = 1 - // and deltaTime is 0.5, so we were at 1.5 internally. - // - // BUT there's NO reason to overshoot interpolationTime while we - // wait for the next snapshot which isn't old enough. - // we stopped movement anyway. - // interpolationTime overshoot is only for smooth transitions WHILE - // moving. - // for example, if we overshoot to 100 while waiting, then we would - // instantly skip the next 20 snapshots. - // => so it should be capped at max - // => which is always 0..delta, NOT first.time .. second.time!! - Assert.That(interpolationTime, Is.EqualTo(1)); - // buffer should be untouched. shouldn't have moved to third yet. - Assert.That(buffer.Count, Is.EqualTo(3)); - // computed snapshot should be all the way at second snapshot. - Assert.That(computed.value, Is.EqualTo(2).Within(Mathf.Epsilon)); - } - - // fifth step: interpolation time overshoots the end while having more - // snapshots available. - [Test] - public void Compute_Step5_OvershootWithEnoughSnapshots_MovesToNextSnapshotIfOldEnough() - { - // add two old enough snapshots - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 1); - SimpleSnapshot second = new SimpleSnapshot(1, 1, 2); - // IMPORTANT: third snapshot needs to be: - // - a different time delta - // to test if overflow is correct if deltas are different. - // it's not obvious if we ever use t ratio between [0,1] where an - // overflow of 0.1 between A,B could speed up B,C interpolation if - // that's not the same delta, since t is a ratio. - // - a different value delta to check if it really _interpolates_, - // not just extrapolates further after A,B - SimpleSnapshot third = new SimpleSnapshot(3, 3, 4); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - buffer.Add(third.remoteTimestamp, third); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - // -> interpolation time is already at '1' at the end. - // -> compute will add 0.5 deltaTime - // -> so we overshoot beyond the second one and move to the next - // - // localTime is 5. third snapshot localTime is at 3. - // bufferTime is 2. - // so third is exactly old enough and we should move there. - double localTime = 5; - double deltaTime = 0.5; - double interpolationTime = 1; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started at the end = 1 - // and deltaTime is 0.5, so we were at 1.5 internally. - // we have more snapshots, so we jump to the next and subtract '1' - // 1 + 0.5 = 1.5 => -1 => 0.5 - Assert.That(interpolationTime, Is.EqualTo(0.5)); - // buffer's first entry should have been removed - Assert.That(buffer.Count, Is.EqualTo(2)); - // computed snapshot should be 1/4 way between second and third - // because delta is 2 and interpolationTime is at 0.5 which is 1/4 - Assert.That(computed.value, Is.EqualTo(2.5).Within(Mathf.Epsilon)); - } - - // fifth step: interpolation time overshoots 2x the end while having - // >= 2 more snapshots available. it should correctly jump - // ahead the first pending one to the second one. - [Test] - public void Compute_Step5_OvershootWithEnoughSnapshots_2x_MovesToSecondNextSnapshot() - { - // add two old enough snapshots - // (localTime - bufferTime) - SimpleSnapshot first = new SimpleSnapshot(0, 0, 1); - SimpleSnapshot second = new SimpleSnapshot(1, 1, 2); - // IMPORTANT: third snapshot needs to be: - // - a different time delta - // to test if overflow is correct if deltas are different. - // it's not obvious if we ever use t ratio between [0,1] where an - // overflow of 0.1 between A,B could speed up B,C interpolation if - // that's not the same delta, since t is a ratio. - // - a different value delta to check if it really _interpolates_, - // not just extrapolates further after A,B - SimpleSnapshot third = new SimpleSnapshot(3, 3, 4); - SimpleSnapshot fourth = new SimpleSnapshot(5, 5, 6); - buffer.Add(first.remoteTimestamp, first); - buffer.Add(second.remoteTimestamp, second); - buffer.Add(third.remoteTimestamp, third); - buffer.Add(fourth.remoteTimestamp, fourth); - - // compute with initialized remoteTime and buffer time of 2 seconds - // and a delta time to be sure that we move along it no matter what. - // -> interpolation time is already at '1' at the end. - // -> compute will add 1.5 deltaTime - // -> so we should overshoot beyond second and third even - // - // localTime is 7. fourth snapshot localTime is at 5. - // bufferTime is 2. - // so fourth is exactly old enough and we should move there. - double localTime = 7; - double deltaTime = 2.5; - double interpolationTime = 1; - float bufferTime = 2; - int catchupThreshold = Int32.MaxValue; - float catchupMultiplier = 0; - bool result = SnapshotInterpolation.Compute(localTime, deltaTime, ref interpolationTime, bufferTime, buffer, catchupThreshold, catchupMultiplier, SimpleSnapshot.Interpolate, out SimpleSnapshot computed); - - // should spit out the interpolated snapshot - Assert.That(result, Is.True); - // interpolation started at the end = 1 - // and deltaTime is 2.5, so we were at 4.5 internally. - // we have more snapshots, so we: - // * jump to third, subtract delta of 1-0 = 1 => 2.5 - // * jump to fourth, subtract delta of 3-1 = 2 => 0.5 - // * end up at 0.5 again, between third and fourth - Assert.That(interpolationTime, Is.EqualTo(0.5)); - // buffer's first entry should have been removed - Assert.That(buffer.Count, Is.EqualTo(2)); - // computed snapshot should be 1/4 way between second and third - // because delta is 2 and interpolationTime is at 0.5 which is 1/4 - Assert.That(computed.value, Is.EqualTo(4.5).Within(Mathf.Epsilon)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs.meta b/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs.meta deleted file mode 100644 index 31edb4df0..000000000 --- a/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4d061a81bee3e4558b19b0d4dbedc8f0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/StructMessagesTests.cs b/Assets/Mirror/Tests/Editor/StructMessagesTests.cs deleted file mode 100644 index 79f03fca1..000000000 --- a/Assets/Mirror/Tests/Editor/StructMessagesTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests.StructMessages -{ - public struct SomeStructMessage : NetworkMessage - { - public int someValue; - } - - [TestFixture] - public class StructMessagesTests - { - [Test] - public void SerializeAreAddedWhenEmptyInStruct() - { - NetworkWriter writer = new NetworkWriter(); - - const int someValue = 3; - writer.Write(new SomeStructMessage - { - someValue = someValue, - }); - - byte[] arr = writer.ToArray(); - - NetworkReader reader = new NetworkReader(arr); - SomeStructMessage received = reader.Read(); - - Assert.AreEqual(someValue, received.someValue); - - int writeLength = writer.Position; - int readLength = reader.Position; - Assert.That(writeLength == readLength, $"OnSerializeAll and OnDeserializeAll calls write the same amount of data\n writeLength={writeLength}\n readLength={readLength}"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/StructMessagesTests.cs.meta b/Assets/Mirror/Tests/Editor/StructMessagesTests.cs.meta deleted file mode 100644 index f44bd63aa..000000000 --- a/Assets/Mirror/Tests/Editor/StructMessagesTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8268c9b6cd466ae4c806291bdc88c0e8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs b/Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs deleted file mode 100644 index e44927c4d..000000000 --- a/Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs +++ /dev/null @@ -1,353 +0,0 @@ -using System; -using System.Collections.Generic; -using NUnit.Framework; - -namespace Mirror.Tests -{ - [TestFixture] - public class SyncDictionaryTest - { - SyncDictionary serverSyncDictionary; - SyncDictionary clientSyncDictionary; - int serverSyncDictionaryDirtyCalled; - int clientSyncDictionaryDirtyCalled; - - void SerializeAllTo(T fromList, T toList) where T : SyncObject - { - NetworkWriter writer = new NetworkWriter(); - fromList.OnSerializeAll(writer); - NetworkReader reader = new NetworkReader(writer.ToArray()); - toList.OnDeserializeAll(reader); - } - - void SerializeDeltaTo(T fromList, T toList) where T : SyncObject - { - NetworkWriter writer = new NetworkWriter(); - fromList.OnSerializeDelta(writer); - NetworkReader reader = new NetworkReader(writer.ToArray()); - toList.OnDeserializeDelta(reader); - fromList.ClearChanges(); - } - - [SetUp] - public void SetUp() - { - serverSyncDictionary = new SyncDictionary(); - clientSyncDictionary = new SyncDictionary(); - - // add some data to the list - serverSyncDictionary.Add(0, "Hello"); - serverSyncDictionary.Add(1, "World"); - serverSyncDictionary.Add(2, "!"); - SerializeAllTo(serverSyncDictionary, clientSyncDictionary); - - // set up dirty callbacks for testing. - // AFTER adding the example data. we already know we added that data. - serverSyncDictionaryDirtyCalled = 0; - clientSyncDictionaryDirtyCalled = 0; - serverSyncDictionary.OnDirty = () => ++serverSyncDictionaryDirtyCalled; - clientSyncDictionary.OnDirty = () => ++clientSyncDictionaryDirtyCalled; - } - - [Test] - public void TestInit() - { - Dictionary comparer = new Dictionary - { - [0] = "Hello", - [1] = "World", - [2] = "!" - }; - Assert.That(clientSyncDictionary[0], Is.EqualTo("Hello")); - Assert.That(clientSyncDictionary, Is.EquivalentTo(comparer)); - } - - // test the '= List{1,2,3}' constructor. - // it calls .Add(1); .Add(2); .Add(3) in the constructor. - // (the OnDirty change broke this and we didn't have a test before) - [Test] - public void CurlyBracesConstructor() - { - SyncDictionary dict = new SyncDictionary{{1,"1"}, {2,"2"}, {3,"3"}}; - Assert.That(dict.Count, Is.EqualTo(3)); - } - - [Test] - public void TestAdd() - { - serverSyncDictionary.Add(4, "yay"); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary.ContainsKey(4)); - Assert.That(clientSyncDictionary[4], Is.EqualTo("yay")); - } - - [Test] - public void TestClear() - { - serverSyncDictionary.Clear(); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(serverSyncDictionary, Is.EquivalentTo(new SyncDictionary())); - } - - [Test] - public void TestSet() - { - serverSyncDictionary[1] = "yay"; - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary.ContainsKey(1)); - Assert.That(clientSyncDictionary[1], Is.EqualTo("yay")); - } - - [Test] - public void TestBareSet() - { - serverSyncDictionary[4] = "yay"; - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary.ContainsKey(4)); - Assert.That(clientSyncDictionary[4], Is.EqualTo("yay")); - } - - [Test] - public void TestBareSetNull() - { - serverSyncDictionary[4] = null; - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary[4], Is.Null); - Assert.That(clientSyncDictionary.ContainsKey(4)); - } - - [Test] - public void TestConsecutiveSet() - { - serverSyncDictionary[1] = "yay"; - serverSyncDictionary[1] = "world"; - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary[1], Is.EqualTo("world")); - } - - [Test] - public void TestNullSet() - { - serverSyncDictionary[1] = null; - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary.ContainsKey(1)); - Assert.That(clientSyncDictionary[1], Is.Null); - } - - [Test] - public void TestRemove() - { - serverSyncDictionary.Remove(1); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(!clientSyncDictionary.ContainsKey(1)); - } - - [Test] - public void TestMultSync() - { - serverSyncDictionary.Add(10, "1"); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - // add some delta and see if it applies - serverSyncDictionary.Add(11, "2"); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary.ContainsKey(10)); - Assert.That(clientSyncDictionary[10], Is.EqualTo("1")); - Assert.That(clientSyncDictionary.ContainsKey(11)); - Assert.That(clientSyncDictionary[11], Is.EqualTo("2")); - } - - [Test] - public void TestContains() - { - Assert.That(!clientSyncDictionary.Contains(new KeyValuePair(2, "Hello"))); - serverSyncDictionary[2] = "Hello"; - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(clientSyncDictionary.Contains(new KeyValuePair(2, "Hello"))); - } - - [Test] - public void CallbackTest() - { - bool called = false; - clientSyncDictionary.Callback += (op, index, item) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncDictionary.Operation.OP_ADD)); - Assert.That(index, Is.EqualTo(3)); - Assert.That(item, Is.EqualTo("yay")); - Assert.That(clientSyncDictionary[index], Is.EqualTo("yay")); - - }; - serverSyncDictionary.Add(3, "yay"); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(called, Is.True); - } - - [Test] - public void ServerCallbackTest() - { - bool called = false; - serverSyncDictionary.Callback += (op, index, item) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncDictionary.Operation.OP_ADD)); - Assert.That(index, Is.EqualTo(3)); - Assert.That(item, Is.EqualTo("yay")); - Assert.That(serverSyncDictionary[index], Is.EqualTo("yay")); - }; - serverSyncDictionary[3] = "yay"; - Assert.That(called, Is.True); - } - - [Test] - public void CallbackRemoveTest() - { - bool called = false; - clientSyncDictionary.Callback += (op, key, item) => - { - called = true; - Assert.That(op, Is.EqualTo(SyncDictionary.Operation.OP_REMOVE)); - Assert.That(item, Is.EqualTo("World")); - }; - serverSyncDictionary.Remove(1); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - Assert.That(called, Is.True); - } - - [Test] - public void CountTest() - { - Assert.That(serverSyncDictionary.Count, Is.EqualTo(3)); - } - - [Test] - public void CopyToTest() - { - KeyValuePair[] data = new KeyValuePair[3]; - - clientSyncDictionary.CopyTo(data, 0); - - Assert.That(data, Is.EquivalentTo(new KeyValuePair[] - { - new KeyValuePair(0, "Hello"), - new KeyValuePair(1, "World"), - new KeyValuePair(2, "!"), - - })); - } - - [Test] - public void CopyToOutOfRangeTest() - { - KeyValuePair[] data = new KeyValuePair[3]; - - Assert.Throws(typeof(ArgumentOutOfRangeException), delegate - { - clientSyncDictionary.CopyTo(data, -1); - }); - } - - [Test] - public void CopyToOutOfBoundsTest() - { - KeyValuePair[] data = new KeyValuePair[3]; - - Assert.Throws(typeof(ArgumentException), delegate - { - clientSyncDictionary.CopyTo(data, 2); - }); - } - - [Test] - public void TestRemovePair() - { - KeyValuePair data = new KeyValuePair(0, "Hello"); - - serverSyncDictionary.Remove(data); - - Assert.That(serverSyncDictionary, Is.EquivalentTo(new KeyValuePair[] - { - new KeyValuePair(1, "World"), - new KeyValuePair(2, "!"), - })); - } - - [Test] - public void ReadOnlyTest() - { - Assert.That(serverSyncDictionary.IsReadOnly, Is.False); - Assert.That(clientSyncDictionary.IsReadOnly, Is.True); - } - - [Test] - public void WritingToReadOnlyThrows() - { - Assert.Throws(() => clientSyncDictionary.Add(50, "fail")); - } - - [Test] - public void DirtyTest() - { - // Sync Delta to clear dirty - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - - // nothing to send - Assert.That(serverSyncDictionaryDirtyCalled, Is.EqualTo(0)); - - // something has changed - serverSyncDictionary.Add(15, "yay"); - Assert.That(serverSyncDictionaryDirtyCalled, Is.EqualTo(1)); - SerializeDeltaTo(serverSyncDictionary, clientSyncDictionary); - } - - [Test] - public void ObjectCanBeReusedAfterReset() - { - clientSyncDictionary.Reset(); - - // make old client the host - SyncDictionary hostList = clientSyncDictionary; - SyncDictionary clientList2 = new SyncDictionary(); - - Assert.That(hostList.IsReadOnly, Is.False); - - // Check Add and Sync without errors - hostList.Add(30, "hello"); - hostList.Add(35, "world"); - SerializeDeltaTo(hostList, clientList2); - } - - [Test] - public void ResetShouldSetReadOnlyToFalse() - { - clientSyncDictionary.Reset(); - Assert.That(clientSyncDictionary.IsReadOnly, Is.False); - } - - [Test] - public void ResetShouldClearChanges() - { - serverSyncDictionary.Reset(); - Assert.That(serverSyncDictionary.GetChangeCount(), Is.Zero); - } - - [Test] - public void ResetShouldClearItems() - { - serverSyncDictionary.Reset(); - Assert.That(serverSyncDictionary, Is.Empty); - } - - [Test] - public void IsRecording() - { - // shouldn't record changes if IsRecording() returns false - serverSyncDictionary.ClearChanges(); - serverSyncDictionary.IsRecording = () => false; - serverSyncDictionary[42] = null; - Assert.That(serverSyncDictionary.GetChangeCount(), Is.EqualTo(0)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs.meta deleted file mode 100644 index 552e96ded..000000000 --- a/Assets/Mirror/Tests/Editor/SyncDictionaryTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cadf48c3662efac4181b91f5c9c88774 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncListClassTest.cs b/Assets/Mirror/Tests/Editor/SyncListClassTest.cs deleted file mode 100644 index f6ed2b402..000000000 --- a/Assets/Mirror/Tests/Editor/SyncListClassTest.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System.Linq; -using NUnit.Framework; - -namespace Mirror.Tests -{ - class TestObjectBehaviour : NetworkBehaviour - { - // note synclists must be a property of a NetworkBehavior so that - // the weaver generates the reader and writer for the object - public readonly SyncList myList = new SyncList(); - } - - public class SyncListClassTest - { - [Test] - public void RemoveShouldRemoveItem() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - SyncListTest.SerializeAllTo(serverList, clientList); - - // add some items - TestObject item1 = new TestObject { id = 1, text = "Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nostrum ullam aliquid perferendis, aut nihil sunt quod ipsum corporis a. Cupiditate, alias. Commodi, molestiae distinctio repellendus dolor similique delectus inventore eum." }; - serverList.Add(item1); - TestObject item2 = new TestObject { id = 2, text = "Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nostrum ullam aliquid perferendis, aut nihil sunt quod ipsum corporis a. Cupiditate, alias. Commodi, molestiae distinctio repellendus dolor similique delectus inventore eum." }; - serverList.Add(item2); - - // sync - SyncListTest.SerializeDeltaTo(serverList, clientList); - - // clear all items - serverList.Remove(item1); - - // sync - SyncListTest.SerializeDeltaTo(serverList, clientList); - - Assert.IsFalse(clientList.Any(x => x.id == item1.id)); - Assert.IsTrue(clientList.Any(x => x.id == item2.id)); - } - - [Test] - public void ClearShouldClearAll() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - SyncListTest.SerializeAllTo(serverList, clientList); - - // add some items - TestObject item1 = new TestObject { id = 1, text = "Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nostrum ullam aliquid perferendis, aut nihil sunt quod ipsum corporis a. Cupiditate, alias. Commodi, molestiae distinctio repellendus dolor similique delectus inventore eum." }; - serverList.Add(item1); - TestObject item2 = new TestObject { id = 2, text = "Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nostrum ullam aliquid perferendis, aut nihil sunt quod ipsum corporis a. Cupiditate, alias. Commodi, molestiae distinctio repellendus dolor similique delectus inventore eum." }; - serverList.Add(item2); - - // sync - SyncListTest.SerializeDeltaTo(serverList, clientList); - - // clear all items - serverList.Clear(); - - // sync - SyncListTest.SerializeDeltaTo(serverList, clientList); - - Assert.That(clientList.Count, Is.Zero); - - Assert.IsFalse(clientList.Any(x => x.id == item1.id)); - Assert.IsFalse(clientList.Any(x => x.id == item2.id)); - } - } - - [System.Serializable] - public class TestObject - { - public int id; - public string text; - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncListClassTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncListClassTest.cs.meta deleted file mode 100644 index d26a39d04..000000000 --- a/Assets/Mirror/Tests/Editor/SyncListClassTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3c4bb793f509fcb47bdf830656826f2b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncListStructTest.cs b/Assets/Mirror/Tests/Editor/SyncListStructTest.cs deleted file mode 100644 index 6c3a6e565..000000000 --- a/Assets/Mirror/Tests/Editor/SyncListStructTest.cs +++ /dev/null @@ -1,73 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - class TestPlayerBehaviour : NetworkBehaviour - { - // note synclists must be a property of a NetworkBehavior so that - // the weaver generates the reader and writer for the object - public readonly SyncList myList = new SyncList(); - } - - public class SyncListStructTest - { - [Test] - public void ListIsDirtyWhenModifingAndSettingStruct() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - // set up dirty callback - int serverListDirtyCalled = 0; - serverList.OnDirty = () => ++serverListDirtyCalled; - - SyncListTest.SerializeAllTo(serverList, clientList); - serverList.Add(new TestPlayer { item = new TestItem { price = 10 } }); - Assert.That(serverListDirtyCalled, Is.EqualTo(1)); - SyncListTest.SerializeDeltaTo(serverList, clientList); - serverListDirtyCalled = 0; - - TestPlayer player = serverList[0]; - player.item.price = 15; - serverList[0] = player; - - Assert.That(serverListDirtyCalled, Is.EqualTo(1)); - } - - [Test] - public void OldValueShouldNotBeNewValue() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - SyncListTest.SerializeAllTo(serverList, clientList); - serverList.Add(new TestPlayer { item = new TestItem { price = 10 } }); - SyncListTest.SerializeDeltaTo(serverList, clientList); - - TestPlayer player = serverList[0]; - player.item.price = 15; - serverList[0] = player; - - bool callbackCalled = false; - clientList.Callback += (SyncList.Operation op, int itemIndex, TestPlayer oldItem, TestPlayer newItem) => - { - Assert.That(op == SyncList.Operation.OP_SET, Is.True); - Assert.That(itemIndex, Is.EqualTo(0)); - Assert.That(oldItem.item.price, Is.EqualTo(10)); - Assert.That(newItem.item.price, Is.EqualTo(15)); - callbackCalled = true; - }; - - SyncListTest.SerializeDeltaTo(serverList, clientList); - Assert.IsTrue(callbackCalled); - } - } - - public struct TestPlayer - { - public TestItem item; - } - public struct TestItem - { - public float price; - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncListStructTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncListStructTest.cs.meta deleted file mode 100644 index b3a20facc..000000000 --- a/Assets/Mirror/Tests/Editor/SyncListStructTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1cad81f2aee838a4ababa9c8ee23a700 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncListTest.cs b/Assets/Mirror/Tests/Editor/SyncListTest.cs deleted file mode 100644 index 9e33ccec7..000000000 --- a/Assets/Mirror/Tests/Editor/SyncListTest.cs +++ /dev/null @@ -1,434 +0,0 @@ -using System; -using System.Collections.Generic; -using NUnit.Framework; - -namespace Mirror.Tests -{ - [TestFixture] - public class SyncListTest - { - SyncList serverSyncList; - SyncList clientSyncList; - int serverSyncListDirtyCalled; - int clientSyncListDirtyCalled; - - public static void SerializeAllTo(T fromList, T toList) where T : SyncObject - { - NetworkWriter writer = new NetworkWriter(); - fromList.OnSerializeAll(writer); - NetworkReader reader = new NetworkReader(writer.ToArray()); - toList.OnDeserializeAll(reader); - - int writeLength = writer.Position; - int readLength = reader.Position; - Assert.That(writeLength == readLength, $"OnSerializeAll and OnDeserializeAll calls write the same amount of data\n writeLength={writeLength}\n readLength={readLength}"); - - } - - public static void SerializeDeltaTo(T fromList, T toList) where T : SyncObject - { - NetworkWriter writer = new NetworkWriter(); - fromList.OnSerializeDelta(writer); - NetworkReader reader = new NetworkReader(writer.ToArray()); - toList.OnDeserializeDelta(reader); - fromList.ClearChanges(); - - int writeLength = writer.Position; - int readLength = reader.Position; - Assert.That(writeLength == readLength, $"OnSerializeDelta and OnDeserializeDelta calls write the same amount of data\n writeLength={writeLength}\n readLength={readLength}"); - } - - [SetUp] - public void SetUp() - { - serverSyncList = new SyncList(); - clientSyncList = new SyncList(); - - // add some data to the list - serverSyncList.Add("Hello"); - serverSyncList.Add("World"); - serverSyncList.Add("!"); - SerializeAllTo(serverSyncList, clientSyncList); - - // set up dirty callbacks for testing - // AFTER adding the example data. we already know we added that data. - serverSyncList.OnDirty = () => ++serverSyncListDirtyCalled; - clientSyncList.OnDirty = () => ++clientSyncListDirtyCalled; - serverSyncListDirtyCalled = 0; - clientSyncListDirtyCalled = 0; - } - - [Test] - public void TestInit() - { - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "World", "!" })); - } - - // test the '= List{1,2,3}' constructor. - // it calls .Add(1); .Add(2); .Add(3) in the constructor. - // (the OnDirty change broke this and we didn't have a test before) - [Test] - public void CurlyBracesConstructor() - { - SyncList list = new SyncList{1,2,3}; - Assert.That(list.Count, Is.EqualTo(3)); - } - - [Test] - public void TestAdd() - { - serverSyncList.Add("yay"); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "World", "!", "yay" })); - } - - [Test] - public void TestAddRange() - { - serverSyncList.AddRange(new[] { "One", "Two", "Three" }); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EqualTo(new[] { "Hello", "World", "!", "One", "Two", "Three" })); - } - - [Test] - public void TestClear() - { - serverSyncList.Clear(); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new string[] {})); - } - - [Test] - public void TestInsert() - { - serverSyncList.Insert(0, "yay"); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "yay", "Hello", "World", "!" })); - } - - [Test] - public void TestInsertRange() - { - serverSyncList.InsertRange(1, new[] { "One", "Two", "Three" }); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EqualTo(new[] { "Hello", "One", "Two", "Three", "World", "!" })); - } - - [Test] - public void TestSet() - { - serverSyncList[1] = "yay"; - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList[1], Is.EqualTo("yay")); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "yay", "!" })); - } - - [Test] - public void TestSetNull() - { - serverSyncList[1] = null; - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList[1], Is.EqualTo(null)); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", null, "!" })); - serverSyncList[1] = "yay"; - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "yay", "!" })); - } - - [Test] - public void TestRemoveAll() - { - serverSyncList.RemoveAll(entry => entry.Contains("l")); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "!" })); - } - - [Test] - public void TestRemoveAllNone() - { - serverSyncList.RemoveAll(entry => entry == "yay"); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "World", "!" })); - } - - [Test] - public void TestRemoveAt() - { - serverSyncList.RemoveAt(1); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "!" })); - } - - [Test] - public void TestRemove() - { - serverSyncList.Remove("World"); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "!" })); - } - - [Test] - public void TestFindIndex() - { - int index = serverSyncList.FindIndex(entry => entry == "World"); - Assert.That(index, Is.EqualTo(1)); - } - - [Test] - public void TestFind() - { - string element = serverSyncList.Find(entry => entry == "World"); - Assert.That(element, Is.EqualTo("World")); - } - - [Test] - public void TestNoFind() - { - string nonexistent = serverSyncList.Find(entry => entry == "yay"); - Assert.That(nonexistent, Is.Null); - } - - [Test] - public void TestFindAll() - { - List results = serverSyncList.FindAll(entry => entry.Contains("l")); - Assert.That(results, Is.EquivalentTo(new[] { "Hello", "World" })); - } - - [Test] - public void TestFindAllNonExistent() - { - List nonexistent = serverSyncList.FindAll(entry => entry == "yay"); - Assert.That(nonexistent, Is.Empty); - } - - [Test] - public void TestMultSync() - { - serverSyncList.Add("1"); - SerializeDeltaTo(serverSyncList, clientSyncList); - // add some delta and see if it applies - serverSyncList.Add("2"); - SerializeDeltaTo(serverSyncList, clientSyncList); - Assert.That(clientSyncList, Is.EquivalentTo(new[] { "Hello", "World", "!", "1", "2" })); - } - - [Test] - public void SyncListIntTest() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - serverList.Add(1); - serverList.Add(2); - serverList.Add(3); - SerializeDeltaTo(serverList, clientList); - - Assert.That(clientList, Is.EquivalentTo(new[] { 1, 2, 3 })); - } - - [Test] - public void SyncListBoolTest() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - serverList.Add(true); - serverList.Add(false); - serverList.Add(true); - SerializeDeltaTo(serverList, clientList); - - Assert.That(clientList, Is.EquivalentTo(new[] { true, false, true })); - } - - [Test] - public void SyncListUIntTest() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - serverList.Add(1U); - serverList.Add(2U); - serverList.Add(3U); - SerializeDeltaTo(serverList, clientList); - - Assert.That(clientList, Is.EquivalentTo(new[] { 1U, 2U, 3U })); - } - - [Test] - public void SyncListFloatTest() - { - SyncList serverList = new SyncList(); - SyncList clientList = new SyncList(); - - serverList.Add(1.0F); - serverList.Add(2.0F); - serverList.Add(3.0F); - SerializeDeltaTo(serverList, clientList); - - Assert.That(clientList, Is.EquivalentTo(new[] { 1.0F, 2.0F, 3.0F })); - } - - [Test] - public void CallbackTest() - { - bool called = false; - - clientSyncList.Callback += (op, index, oldItem, newItem) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncList.Operation.OP_ADD)); - Assert.That(index, Is.EqualTo(3)); - Assert.That(oldItem, Is.EqualTo(default(string))); - Assert.That(newItem, Is.EqualTo("yay")); - }; - - serverSyncList.Add("yay"); - SerializeDeltaTo(serverSyncList, clientSyncList); - - Assert.That(called, Is.True); - } - - [Test] - public void CallbackRemoveTest() - { - bool called = false; - - clientSyncList.Callback += (op, index, oldItem, newItem) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncList.Operation.OP_REMOVEAT)); - Assert.That(oldItem, Is.EqualTo("World")); - Assert.That(newItem, Is.EqualTo(default(string))); - }; - serverSyncList.Remove("World"); - SerializeDeltaTo(serverSyncList, clientSyncList); - - Assert.That(called, Is.True); - } - - [Test] - public void CallbackRemoveAtTest() - { - bool called = false; - - clientSyncList.Callback += (op, index, oldItem, newItem) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncList.Operation.OP_REMOVEAT)); - Assert.That(index, Is.EqualTo(1)); - Assert.That(oldItem, Is.EqualTo("World")); - Assert.That(newItem, Is.EqualTo(default(string))); - }; - - serverSyncList.RemoveAt(1); - SerializeDeltaTo(serverSyncList, clientSyncList); - - Assert.That(called, Is.True); - } - - [Test] - public void CountTest() - { - Assert.That(serverSyncList.Count, Is.EqualTo(3)); - } - - [Test] - public void ReadOnlyTest() - { - Assert.That(serverSyncList.IsReadOnly, Is.False); - Assert.That(clientSyncList.IsReadOnly, Is.True); - } - [Test] - public void WritingToReadOnlyThrows() - { - Assert.Throws(() => { clientSyncList.Add("fail"); }); - } - - [Test] - public void DirtyTest() - { - // Sync Delta to clear dirty - Assert.That(serverSyncListDirtyCalled, Is.EqualTo(0)); - SerializeDeltaTo(serverSyncList, clientSyncList); - - // nothing to send - Assert.That(serverSyncListDirtyCalled, Is.EqualTo(0)); - - // something has changed - serverSyncList.Add("1"); - Assert.That(serverSyncListDirtyCalled, Is.EqualTo(1)); - SerializeDeltaTo(serverSyncList, clientSyncList); - } - - [Test] - public void ObjectCanBeReusedAfterReset() - { - clientSyncList.Reset(); - - // make old client the host - SyncList hostList = clientSyncList; - SyncList clientList2 = new SyncList(); - - Assert.That(hostList.IsReadOnly, Is.False); - - // Check Add and Sync without errors - hostList.Add("hello"); - hostList.Add("world"); - SerializeDeltaTo(hostList, clientList2); - } - - [Test] - public void ResetShouldSetReadOnlyToFalse() - { - clientSyncList.Reset(); - - Assert.That(clientSyncList.IsReadOnly, Is.False); - } - - [Test] - public void ResetShouldClearChanges() - { - serverSyncList.Reset(); - - Assert.That(serverSyncList.GetChangeCount(), Is.Zero); - } - - [Test] - public void ResetShouldClearItems() - { - serverSyncList.Reset(); - - Assert.That(serverSyncList, Is.Empty); - } - - [Test] - public void IsRecording() - { - // shouldn't record changes if IsRecording() returns false - serverSyncList.ClearChanges(); - serverSyncList.IsRecording = () => false; - serverSyncList.Add("42"); - Assert.That(serverSyncList.GetChangeCount(), Is.EqualTo(0)); - } - } - - public static class SyncObjectTestMethods - { - public static uint GetChangeCount(this SyncObject syncObject) - { - using (PooledNetworkWriter writer = NetworkWriterPool.GetWriter()) - { - syncObject.OnSerializeDelta(writer); - - using (PooledNetworkReader reader = NetworkReaderPool.GetReader(writer.ToArraySegment())) - { - return reader.ReadUInt(); - } - } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncListTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncListTest.cs.meta deleted file mode 100644 index 9b55701a4..000000000 --- a/Assets/Mirror/Tests/Editor/SyncListTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a937d4274ff484d769209f2e0b0c1d8a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncSetTest.cs b/Assets/Mirror/Tests/Editor/SyncSetTest.cs deleted file mode 100644 index bb106c0ce..000000000 --- a/Assets/Mirror/Tests/Editor/SyncSetTest.cs +++ /dev/null @@ -1,322 +0,0 @@ -using System; -using System.Collections.Generic; -using NUnit.Framework; - -namespace Mirror.Tests -{ - [TestFixture] - public class SyncSetTest - { - SyncHashSet serverSyncSet; - SyncHashSet clientSyncSet; - int serverSyncSetDirtyCalled; - int clientSyncSetDirtyCalled; - - void SerializeAllTo(T fromList, T toList) where T : SyncObject - { - NetworkWriter writer = new NetworkWriter(); - fromList.OnSerializeAll(writer); - NetworkReader reader = new NetworkReader(writer.ToArray()); - toList.OnDeserializeAll(reader); - } - - void SerializeDeltaTo(T fromList, T toList) where T : SyncObject - { - NetworkWriter writer = new NetworkWriter(); - fromList.OnSerializeDelta(writer); - NetworkReader reader = new NetworkReader(writer.ToArray()); - toList.OnDeserializeDelta(reader); - fromList.ClearChanges(); - } - - [SetUp] - public void SetUp() - { - serverSyncSet = new SyncHashSet(); - clientSyncSet = new SyncHashSet(); - - // add some data to the list - serverSyncSet.Add("Hello"); - serverSyncSet.Add("World"); - serverSyncSet.Add("!"); - SerializeAllTo(serverSyncSet, clientSyncSet); - - // set up dirty callbacks for testing - // AFTER adding the example data. we already know we added that data. - serverSyncSet.OnDirty = () => ++serverSyncSetDirtyCalled; - clientSyncSet.OnDirty = () => ++clientSyncSetDirtyCalled; - serverSyncSetDirtyCalled = 0; - clientSyncSetDirtyCalled = 0; - } - - [Test] - public void TestInit() - { - Assert.That(serverSyncSet, Is.EquivalentTo(new[] { "Hello", "World", "!" })); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "Hello", "World", "!" })); - } - - // test the '= List{1,2,3}' constructor. - // it calls .Add(1); .Add(2); .Add(3) in the constructor. - // (the OnDirty change broke this and we didn't have a test before) - [Test] - public void CurlyBracesConstructor() - { - SyncHashSet set = new SyncHashSet{1,2,3}; - Assert.That(set.Count, Is.EqualTo(3)); - } - - [Test] - public void TestAdd() - { - serverSyncSet.Add("yay"); - Assert.That(serverSyncSetDirtyCalled, Is.EqualTo(1)); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "Hello", "World", "!", "yay" })); - } - - [Test] - public void TestClear() - { - serverSyncSet.Clear(); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new string[] {})); - } - - [Test] - public void TestRemove() - { - serverSyncSet.Remove("World"); - Assert.That(serverSyncSetDirtyCalled, Is.EqualTo(1)); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "Hello", "!" })); - } - - [Test] - public void TestMultSync() - { - serverSyncSet.Add("1"); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - // add some delta and see if it applies - serverSyncSet.Add("2"); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "Hello", "World", "!", "1", "2" })); - } - - [Test] - public void CallbackTest() - { - bool called = false; - - clientSyncSet.Callback += (op, item) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncHashSet.Operation.OP_ADD)); - Assert.That(item, Is.EqualTo("yay")); - }; - - serverSyncSet.Add("yay"); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - - Assert.That(called, Is.True); - } - - [Test] - public void CallbackRemoveTest() - { - bool called = false; - - clientSyncSet.Callback += (op, item) => - { - called = true; - - Assert.That(op, Is.EqualTo(SyncHashSet.Operation.OP_REMOVE)); - Assert.That(item, Is.EqualTo("World")); - }; - serverSyncSet.Remove("World"); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - - Assert.That(called, Is.True); - } - - [Test] - public void CountTest() - { - Assert.That(serverSyncSet.Count, Is.EqualTo(3)); - } - [Test] - public void TestExceptWith() - { - serverSyncSet.ExceptWith(new[] { "World", "Hello" }); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "!" })); - } - - [Test] - public void TestExceptWithSelf() - { - serverSyncSet.ExceptWith(serverSyncSet); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new String[] {})); - } - - [Test] - public void TestIntersectWith() - { - serverSyncSet.IntersectWith(new[] { "World", "Hello" }); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "World", "Hello" })); - } - - [Test] - public void TestIntersectWithSet() - { - serverSyncSet.IntersectWith(new HashSet { "World", "Hello" }); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "World", "Hello" })); - } - - [Test] - public void TestIsProperSubsetOf() - { - Assert.That(clientSyncSet.IsProperSubsetOf(new[] { "World", "Hello", "!", "pepe" })); - } - - [Test] - public void TestIsProperSubsetOfSet() - { - Assert.That(clientSyncSet.IsProperSubsetOf(new HashSet { "World", "Hello", "!", "pepe" })); - } - - [Test] - public void TestIsNotProperSubsetOf() - { - Assert.That(clientSyncSet.IsProperSubsetOf(new[] { "World", "!", "pepe" }), Is.False); - } - - [Test] - public void TestIsProperSuperSetOf() - { - Assert.That(clientSyncSet.IsProperSupersetOf(new[] { "World", "Hello" })); - } - - [Test] - public void TestIsSubsetOf() - { - Assert.That(clientSyncSet.IsSubsetOf(new[] { "World", "Hello", "!" })); - } - - [Test] - public void TestIsSupersetOf() - { - Assert.That(clientSyncSet.IsSupersetOf(new[] { "World", "Hello" })); - } - - [Test] - public void TestOverlaps() - { - Assert.That(clientSyncSet.Overlaps(new[] { "World", "my", "baby" })); - } - - [Test] - public void TestSetEquals() - { - Assert.That(clientSyncSet.SetEquals(new[] { "World", "Hello", "!" })); - } - - [Test] - public void TestSymmetricExceptWith() - { - serverSyncSet.SymmetricExceptWith(new HashSet { "Hello", "is" }); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "World", "is", "!" })); - } - - [Test] - public void TestSymmetricExceptWithSelf() - { - serverSyncSet.SymmetricExceptWith(serverSyncSet); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new String[] {})); - } - - [Test] - public void TestUnionWith() - { - serverSyncSet.UnionWith(new HashSet { "Hello", "is" }); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "World", "Hello", "is", "!" })); - } - - [Test] - public void TestUnionWithSelf() - { - serverSyncSet.UnionWith(serverSyncSet); - SerializeDeltaTo(serverSyncSet, clientSyncSet); - Assert.That(clientSyncSet, Is.EquivalentTo(new[] { "World", "Hello", "!" })); - } - - [Test] - public void ReadOnlyTest() - { - Assert.That(serverSyncSet.IsReadOnly, Is.False); - Assert.That(clientSyncSet.IsReadOnly, Is.True); - } - - [Test] - public void WritingToReadOnlyThrows() - { - Assert.Throws(() => { clientSyncSet.Add("5"); }); - } - - [Test] - public void ObjectCanBeReusedAfterReset() - { - clientSyncSet.Reset(); - - // make old client the host - SyncHashSet hostList = clientSyncSet; - SyncHashSet clientList2 = new SyncHashSet(); - - Assert.That(hostList.IsReadOnly, Is.False); - - // Check Add and Sync without errors - hostList.Add("1"); - hostList.Add("2"); - hostList.Add("3"); - SerializeDeltaTo(hostList, clientList2); - } - - [Test] - public void ResetShouldSetReadOnlyToFalse() - { - clientSyncSet.Reset(); - Assert.That(clientSyncSet.IsReadOnly, Is.False); - } - - [Test] - public void ResetShouldClearChanges() - { - serverSyncSet.Reset(); - Assert.That(serverSyncSet.GetChangeCount(), Is.Zero); - } - - [Test] - public void ResetShouldClearItems() - { - serverSyncSet.Reset(); - Assert.That(serverSyncSet, Is.Empty); - } - - [Test] - public void IsRecording() - { - // shouldn't record changes if IsRecording() returns false - serverSyncSet.ClearChanges(); - serverSyncSet.IsRecording = () => false; - serverSyncSet.Add("42"); - Assert.That(serverSyncSet.GetChangeCount(), Is.EqualTo(0)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncSetTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncSetTest.cs.meta deleted file mode 100644 index 7411ffedd..000000000 --- a/Assets/Mirror/Tests/Editor/SyncSetTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 36dbb64593fa546edb477df3d88b6e1a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs b/Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs deleted file mode 100644 index ee7163ad7..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs +++ /dev/null @@ -1,426 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.SyncVarAttributeTests -{ - class HookBehaviour : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public int value = 0; - - public event Action HookCalled; - - void OnValueChanged(int oldValue, int newValue) - { - HookCalled.Invoke(oldValue, newValue); - } - } - - class GameObjectHookBehaviour : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public GameObject value = null; - - public event Action HookCalled; - - void OnValueChanged(GameObject oldValue, GameObject newValue) - { - HookCalled.Invoke(oldValue, newValue); - } - } - - class NetworkIdentityHookBehaviour : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public NetworkIdentity value = null; - - public event Action HookCalled; - - void OnValueChanged(NetworkIdentity oldValue, NetworkIdentity newValue) - { - HookCalled.Invoke(oldValue, newValue); - } - } - - class NetworkBehaviourHookBehaviour : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public NetworkBehaviourHookBehaviour value = null; - - public event Action HookCalled; - - void OnValueChanged(NetworkBehaviourHookBehaviour oldValue, NetworkBehaviourHookBehaviour newValue) - { - HookCalled.Invoke(oldValue, newValue); - } - } - - class StaticHookBehaviour : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public int value = 0; - - public static event Action HookCalled; - - static void OnValueChanged(int oldValue, int newValue) - { - HookCalled.Invoke(oldValue, newValue); - } - } - - class VirtualHookBase : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public int value = 0; - - public event Action BaseHookCalled; - - protected virtual void OnValueChanged(int oldValue, int newValue) - { - BaseHookCalled.Invoke(oldValue, newValue); - } - } - - class VirtualOverrideHook : VirtualHookBase - { - public event Action OverrideHookCalled; - - protected override void OnValueChanged(int oldValue, int newValue) - { - OverrideHookCalled.Invoke(oldValue, newValue); - } - } - - abstract class AbstractHookBase : NetworkBehaviour - { - [SyncVar(hook = nameof(OnValueChanged))] - public int value = 0; - - protected abstract void OnValueChanged(int oldValue, int newValue); - } - - class AbstractHook : AbstractHookBase - { - public event Action HookCalled; - - protected override void OnValueChanged(int oldValue, int newValue) - { - HookCalled.Invoke(oldValue, newValue); - } - } - - public class SyncVarAttributeHookTest : SyncVarAttributeTestBase - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // start server & connect client because we need spawn functions - NetworkServer.Listen(1); - ConnectClientBlockingAuthenticatedAndReady(out _); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Hook_CalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out HookBehaviour serverObject, - out _, out _, out HookBehaviour clientObject); - - const int serverValue = 24; - - // change it on server - serverObject.value = serverValue; - - // hook should change it on client - int callCount = 0; - clientObject.HookCalled += (oldValue, newValue) => - { - callCount++; - Assert.That(oldValue, Is.EqualTo(0)); - Assert.That(newValue, Is.EqualTo(serverValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Hook_NotCalledWhenSyncingSameValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out HookBehaviour serverObject, - out _, out _, out HookBehaviour clientObject); - - const int clientValue = 16; - const int serverValue = 16; - - // set both to same values once - serverObject.value = serverValue; - clientObject.value = clientValue; - - // client hook - int callCount = 0; - clientObject.HookCalled += (oldValue, newValue) => - { - callCount++; - }; - - // hook shouldn't be called because both already have same value - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(callCount, Is.EqualTo(0)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void Hook_OnlyCalledOnClient(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out HookBehaviour serverObject, - out _, out _, out HookBehaviour clientObject); - - // set up hooks on server and client - int clientCalled = 0; - int serverCalled = 0; - clientObject.HookCalled += (oldValue, newValue) => ++clientCalled; - serverObject.HookCalled += (oldValue, newValue) => ++serverCalled; - - // change on server - ++serverObject.value; - //++clientObject.value; - - // sync. hook should've only been called on client. - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(clientCalled, Is.EqualTo(1)); - Assert.That(serverCalled, Is.EqualTo(0)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void StaticMethod_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out StaticHookBehaviour serverObject, - out _, out _, out StaticHookBehaviour clientObject); - - const int serverValue = 24; - - // change it on server - serverObject.value = serverValue; - - // hook should change it on client - int hookcallCount = 0; - StaticHookBehaviour.HookCalled += (oldValue, newValue) => - { - hookcallCount++; - Assert.That(oldValue, Is.EqualTo(0)); - Assert.That(newValue, Is.EqualTo(serverValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(hookcallCount, Is.EqualTo(1)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void GameObjectHook_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out GameObjectHookBehaviour serverObject, - out _, out _, out GameObjectHookBehaviour clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out GameObject serverValue, out _, - out GameObject clientValue, out _); - - // change it on server - clientObject.value = null; - serverObject.value = serverValue; - - // hook should change it on client - int callCount = 0; - clientObject.HookCalled += (oldValue, newValue) => - { - callCount++; - Assert.That(oldValue, Is.EqualTo(null)); - Assert.That(newValue, Is.EqualTo(clientValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void NetworkIdentityHook_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out NetworkIdentityHookBehaviour serverObject, - out _, out _, out NetworkIdentityHookBehaviour clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverValue, - out _, out NetworkIdentity clientValue); - - // change it on server - serverObject.value = serverValue; - clientObject.value = null; - - // hook should change it on client - int callCount = 0; - clientObject.HookCalled += (oldValue, newValue) => - { - callCount++; - Assert.That(oldValue, Is.EqualTo(null)); - Assert.That(newValue, Is.EqualTo(clientValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void NetworkBehaviourHook_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out NetworkBehaviourHookBehaviour serverObject, - out _, out _, out NetworkBehaviourHookBehaviour clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out _, out NetworkBehaviourHookBehaviour serverValue, - out _, out _, out NetworkBehaviourHookBehaviour clientValue); - - // change it on server - serverObject.value = serverValue; - clientObject.value = null; - - // hook should change it on client - int callCount = 0; - clientObject.HookCalled += (oldValue, newValue) => - { - callCount++; - Assert.That(oldValue, Is.EqualTo(null)); - Assert.That(newValue, Is.EqualTo(clientValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void VirtualHook_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out VirtualHookBase serverObject, - out _, out _, out VirtualHookBase clientObject); - - const int clientValue = 10; - const int serverValue = 24; - - // change it on server - serverObject.value = serverValue; - clientObject.value = clientValue; - - // hook should change it on client - int baseCallCount = 0; - clientObject.BaseHookCalled += (oldValue, newValue) => - { - baseCallCount++; - Assert.That(oldValue, Is.EqualTo(clientValue)); - Assert.That(newValue, Is.EqualTo(serverValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(baseCallCount, Is.EqualTo(1)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void VirtualOverrideHook_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out VirtualOverrideHook serverObject, - out _, out _, out VirtualOverrideHook clientObject); - - const int serverValue = 24; - - // change it on server - serverObject.value = serverValue; - - // hook should change it on client - int overrideCallCount = 0; - int baseCallCount = 0; - clientObject.OverrideHookCalled += (oldValue, newValue) => - { - overrideCallCount++; - Assert.That(oldValue, Is.EqualTo(0)); - Assert.That(newValue, Is.EqualTo(serverValue)); - }; - clientObject.BaseHookCalled += (oldValue, newValue) => - { - baseCallCount++; - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(overrideCallCount, Is.EqualTo(1)); - Assert.That(baseCallCount, Is.EqualTo(0)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void AbstractHook_HookCalledWhenSyncingChangedValue(bool intialState) - { - CreateNetworkedAndSpawn( - out _, out _, out AbstractHook serverObject, - out _, out _, out AbstractHook clientObject); - - const int clientValue = 10; - const int serverValue = 24; - - // change it on server - serverObject.value = serverValue; - clientObject.value = clientValue; - - // hook should change it on client - int callCount = 0; - clientObject.HookCalled += (oldValue, newValue) => - { - callCount++; - Assert.That(oldValue, Is.EqualTo(clientValue)); - Assert.That(newValue, Is.EqualTo(serverValue)); - }; - - bool written = SyncToClient(serverObject, clientObject, intialState); - Assert.IsTrue(written); - Assert.That(callCount, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs.meta deleted file mode 100644 index fbbf021cf..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarAttributeHookTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2e0f51ab2719c99408ae9c0466fdedc7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs b/Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs deleted file mode 100644 index bbaa3b861..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs +++ /dev/null @@ -1,438 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.SyncVarAttributeTests -{ - class MockPlayer : NetworkBehaviour - { - public struct Guild - { - public string name; - } - - [SyncVar] - public Guild guild; - } - - class SyncVarGameObject : NetworkBehaviour - { - [SyncVar] - public GameObject value; - } - class SyncVarNetworkIdentity : NetworkBehaviour - { - [SyncVar] - public NetworkIdentity value; - } - class SyncVarTransform : NetworkBehaviour - { - [SyncVar] - public Transform value; - } - class SyncVarNetworkBehaviour : NetworkBehaviour - { - [SyncVar] - public SyncVarNetworkBehaviour value; - } - class SyncVarAbstractNetworkBehaviour : NetworkBehaviour - { - public abstract class MockMonsterBase : NetworkBehaviour - { - public abstract string GetName(); - } - - public class MockZombie : MockMonsterBase - { - public override string GetName() => "Zombie"; - } - - public class MockWolf : MockMonsterBase - { - public override string GetName() => "Wolf"; - } - - [SyncVar] - public MockMonsterBase monster1; - - [SyncVar] - public MockMonsterBase monster2; - } - - public class SyncVarAttributeTest : SyncVarAttributeTestBase - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // start server & connect client because we need spawn functions - NetworkServer.Listen(1); - - // we are testing server->client syncs. - // so we need truly separted server & client, not host. - ConnectClientBlockingAuthenticatedAndReady(out _); - } - - [Test] - public void TestSettingStruct() - { - CreateNetworked(out _, out _, out MockPlayer player); - - // synchronize immediately - player.syncInterval = 0f; - - Assert.That(player.IsDirty(), Is.False, "First time object should not be dirty"); - - MockPlayer.Guild myGuild = new MockPlayer.Guild - { - name = "Back street boys" - }; - - player.guild = myGuild; - - Assert.That(player.IsDirty(), "Setting struct should mark object as dirty"); - player.ClearAllDirtyBits(); - Assert.That(player.IsDirty(), Is.False, "ClearAllDirtyBits() should clear dirty flag"); - - // clearing the guild should set dirty bit too - player.guild = default; - Assert.That(player.IsDirty(), "Clearing struct should mark object as dirty"); - } - - [Test] - public void TestSyncIntervalAndClearDirtyComponents() - { - CreateNetworked(out _, out _, out MockPlayer player); - player.lastSyncTime = NetworkTime.localTime; - // synchronize immediately - player.syncInterval = 1f; - - player.guild = new MockPlayer.Guild - { - name = "Back street boys" - }; - - Assert.That(player.IsDirty(), Is.False, "Sync interval not met, so not dirty yet"); - - // ClearDirtyComponents should do nothing since syncInterval is not - // elapsed yet - player.netIdentity.ClearDirtyComponentsDirtyBits(); - - // set lastSyncTime far enough back to be ready for syncing - player.lastSyncTime = NetworkTime.localTime - player.syncInterval; - - // should be dirty now - Assert.That(player.IsDirty(), Is.True, "Sync interval met, should be dirty"); - } - - [Test] - public void TestSyncIntervalAndClearAllComponents() - { - CreateNetworked(out _, out _, out MockPlayer player); - player.lastSyncTime = NetworkTime.localTime; - // synchronize immediately - player.syncInterval = 1f; - - player.guild = new MockPlayer.Guild - { - name = "Back street boys" - }; - - Assert.That(player.IsDirty(), Is.False, "Sync interval not met, so not dirty yet"); - - // ClearAllComponents should clear dirty even if syncInterval not - // elapsed yet - player.netIdentity.ClearAllComponentsDirtyBits(); - - // set lastSyncTime far enough back to be ready for syncing - player.lastSyncTime = NetworkTime.localTime - player.syncInterval; - - // should be dirty now - Assert.That(player.IsDirty(), Is.False, "Sync interval met, should still not be dirty"); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncsGameobject(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarGameObject serverObject, - out _, out _, out SyncVarGameObject clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out GameObject serverValue, out _, - out GameObject clientValue, out _); - - serverObject.value = serverValue; - clientObject.value = null; - - bool written = SyncToClient(serverObject, clientObject, initialState); - Assert.IsTrue(written); - Assert.That(clientObject.value, Is.EqualTo(clientValue)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncIdentity(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarNetworkIdentity serverObject, - out _, out _, out SyncVarNetworkIdentity clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverValue, - out _, out NetworkIdentity clientValue); - - serverObject.value = serverValue; - clientObject.value = null; - - bool written = SyncToClient(serverObject, clientObject, initialState); - Assert.IsTrue(written); - Assert.That(clientObject.value, Is.EqualTo(clientValue)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncTransform(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarTransform serverObject, - out _, out _, out SyncVarTransform clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverIdentity, - out _, out NetworkIdentity clientIdentity); - - Transform serverValue = serverIdentity.transform; - Transform clientValue = clientIdentity.transform; - - serverObject.value = serverValue; - clientObject.value = null; - - bool written = SyncToClient(serverObject, clientObject, initialState); - Assert.IsTrue(written); - Assert.That(clientObject.value, Is.EqualTo(clientValue)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncsBehaviour(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarNetworkBehaviour serverObject, - out _, out _, out SyncVarNetworkBehaviour clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out _, out SyncVarNetworkBehaviour serverValue, - out _, out _, out SyncVarNetworkBehaviour clientValue); - - serverObject.value = serverValue; - clientObject.value = null; - - bool written = SyncToClient(serverObject, clientObject, initialState); - Assert.IsTrue(written); - Assert.That(clientObject.value, Is.EqualTo(clientValue)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncsMultipleBehaviour(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarNetworkBehaviour serverObject, - out _, out _, out SyncVarNetworkBehaviour clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverIdentity, out SyncVarNetworkBehaviour serverBehaviour1, out SyncVarNetworkBehaviour serverBehaviour2, - out _, out NetworkIdentity clientIdentity, out SyncVarNetworkBehaviour clientBehaviour1, out SyncVarNetworkBehaviour clientBehaviour2); - - // create array/set indices - _ = serverIdentity.NetworkBehaviours; - - int index1 = serverBehaviour1.ComponentIndex; - int index2 = serverBehaviour2.ComponentIndex; - - // check components of same type have different indexes - Assert.That(index1, Is.Not.EqualTo(index2)); - - // check behaviour 1 can be synced - serverObject.value = serverBehaviour1; - clientObject.value = null; - - bool written1 = SyncToClient(serverObject, clientObject, initialState); - Assert.IsTrue(written1); - Assert.That(clientObject.value, Is.EqualTo(clientBehaviour1)); - - // check that behaviour 2 can be synced - serverObject.value = serverBehaviour2; - clientObject.value = null; - - bool written2 = SyncToClient(serverObject, clientObject, initialState); - Assert.IsTrue(written2); - Assert.That(clientObject.value, Is.EqualTo(clientBehaviour2)); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncVarCacheNetidForGameObject(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarGameObject serverObject, - out _, out _, out SyncVarGameObject clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out GameObject serverValue, out NetworkIdentity serverIdentity, - out GameObject clientValue, out NetworkIdentity clientIdentity); - - Assert.That(serverValue, Is.Not.Null, "getCreatedValue should not return null"); - - serverObject.value = serverValue; - clientObject.value = null; - - // write server data - bool written = ServerWrite(serverObject, initialState, out ArraySegment data, out int writeLength); - Assert.IsTrue(written, "did not write"); - - // remove identity from client, as if it walked out of range - NetworkClient.spawned.Remove(clientIdentity.netId); - - // read client data, this should be cached in field - ClientRead(clientObject, initialState, data, writeLength); - - // check field shows as null - Assert.That(clientObject.value, Is.EqualTo(null), "field should return null"); - - // add identity back to collection, as if it walked back into range - NetworkClient.spawned.Add(clientIdentity.netId, clientIdentity); - - // check field finds value - Assert.That(clientObject.value, Is.EqualTo(clientValue), "fields should return clientValue"); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncVarCacheNetidForIdentity(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarNetworkIdentity serverObject, - out _, out _, out SyncVarNetworkIdentity clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverValue, - out _, out NetworkIdentity clientValue); - - Assert.That(serverValue, Is.Not.Null, "getCreatedValue should not return null"); - - serverObject.value = serverValue; - clientObject.value = null; - - // write server data - bool written = ServerWrite(serverObject, initialState, out ArraySegment data, out int writeLength); - Assert.IsTrue(written, "did not write"); - - // remove identity from client, as if it walked out of range - NetworkClient.spawned.Remove(clientValue.netId); - - // read client data, this should be cached in field - ClientRead(clientObject, initialState, data, writeLength); - - // check field shows as null - Assert.That(clientObject.value, Is.EqualTo(null), "field should return null"); - - // add identity back to collection, as if it walked back into range - NetworkClient.spawned.Add(clientValue.netId, clientValue); - - // check field finds value - Assert.That(clientObject.value, Is.EqualTo(clientValue), "fields should return clientValue"); - } - - [Test] - [TestCase(true)] - [TestCase(false)] - public void SyncVarCacheNetidForBehaviour(bool initialState) - { - CreateNetworkedAndSpawn( - out _, out _, out SyncVarNetworkBehaviour serverObject, - out _, out _, out SyncVarNetworkBehaviour clientObject); - - // create spawned because we will look up netId in .spawned - CreateNetworkedAndSpawn( - out _, out NetworkIdentity serverIdentity, out SyncVarNetworkBehaviour serverValue, - out _, out NetworkIdentity clientIdentity, out SyncVarNetworkBehaviour clientValue); - - Assert.That(serverValue, Is.Not.Null, "getCreatedValue should not return null"); - - // set on server - serverObject.value = serverValue; - clientObject.value = null; - - // write server data - bool written = ServerWrite(serverObject, initialState, out ArraySegment data, out int writeLength); - Assert.IsTrue(written, "did not write"); - - // remove identity from client, as if it walked out of range - NetworkClient.spawned.Remove(clientIdentity.netId); - - // read client data, this should be cached in field - ClientRead(clientObject, initialState, data, writeLength); - - // check field shows as null - Assert.That(clientObject.value, Is.EqualTo(null), "field should return null"); - - // add identity back to collection, as if it walked back into range - NetworkClient.spawned.Add(clientIdentity.netId, clientIdentity); - - // check field finds value - Assert.That(clientObject.value, Is.EqualTo(clientValue), "fields should return clientValue"); - } - - [Test] - public void TestSyncingAbstractNetworkBehaviour() - { - // set up a "server" object - CreateNetworked(out _, out NetworkIdentity serverIdentity, out SyncVarAbstractNetworkBehaviour serverBehaviour); - - // spawn syncvar targets - CreateNetworked(out _, out NetworkIdentity wolfIdentity, out SyncVarAbstractNetworkBehaviour.MockWolf wolf); - CreateNetworked(out _, out NetworkIdentity zombieIdentity, out SyncVarAbstractNetworkBehaviour.MockZombie zombie); - - wolfIdentity.netId = 135; - zombieIdentity.netId = 246; - - serverBehaviour.monster1 = wolf; - serverBehaviour.monster2 = zombie; - - // serialize all the data as we would for the network - NetworkWriter ownerWriter = new NetworkWriter(); - // not really used in this Test - NetworkWriter observersWriter = new NetworkWriter(); - serverIdentity.OnSerializeAllSafely(true, ownerWriter, observersWriter); - - // set up a "client" object - CreateNetworked(out _, out NetworkIdentity clientIdentity, out SyncVarAbstractNetworkBehaviour clientBehaviour); - - // apply all the data from the server object - NetworkReader reader = new NetworkReader(ownerWriter.ToArray()); - clientIdentity.OnDeserializeAllSafely(reader, true); - - // check that the syncvars got updated - Assert.That(clientBehaviour.monster1, Is.EqualTo(serverBehaviour.monster1), "Data should be synchronized"); - Assert.That(clientBehaviour.monster2, Is.EqualTo(serverBehaviour.monster2), "Data should be synchronized"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs.meta deleted file mode 100644 index 3bfd55f15..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarAttributeTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7a1a87ad2c7e74dc69138ba36f583640 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs b/Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs deleted file mode 100644 index 033b2e25f..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class SyncVarAttributeTestBase : MirrorEditModeTest - { - // returns If data was written by OnSerialize - public static bool SyncToClient(T serverObject, T clientObject, bool initialState) where T : NetworkBehaviour - { - bool written = ServerWrite(serverObject, initialState, out ArraySegment data, out int writeLength); - ClientRead(clientObject, initialState, data, writeLength); - return written; - } - - public static bool ServerWrite(T serverObject, bool initialState, out ArraySegment data, out int writeLength) where T : NetworkBehaviour - { - NetworkWriter writer = new NetworkWriter(); - bool written = serverObject.OnSerialize(writer, initialState); - writeLength = writer.Position; - data = writer.ToArraySegment(); - return written; - } - - public static void ClientRead(T clientObject, bool initialState, ArraySegment data, int writeLength) where T : NetworkBehaviour - { - NetworkReader reader = new NetworkReader(data); - clientObject.OnDeserialize(reader, initialState); - - int readLength = reader.Position; - Assert.That(writeLength == readLength, - $"OnSerializeAll and OnDeserializeAll calls write the same amount of data\n" + - $" writeLength={writeLength}\n" + - $" readLength={readLength}"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs.meta deleted file mode 100644 index 63af154ed..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarAttributeTestBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6fbd8fff4a0795d49a0b122554ed6b13 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs b/Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs deleted file mode 100644 index 9224fbb7e..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs +++ /dev/null @@ -1,169 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class SyncVarGameObjectTests : MirrorTest - { - GameObject go; - NetworkIdentity identity; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // need a connected client & server so we can have spawned identities - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // need a spawned GameObject with a netId (we store by netId) - CreateNetworkedAndSpawn(out go, out identity); - Assert.That(identity.netId, !Is.EqualTo(0)); - } - - [TearDown] - public override void TearDown() => base.TearDown(); - - // make sure the GameObject ctor works, even though base is uint - [Test] - public void Constructor_GameObject() - { - SyncVarGameObject field = new SyncVarGameObject(go); - Assert.That(field.Value, Is.EqualTo(go)); - } - - // make sure the GameObject .Value works, even though base is uint - [Test] - public void Value_GameObject() - { - SyncVarGameObject field = new SyncVarGameObject(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = go; - Assert.That(field.Value, Is.EqualTo(go)); - } - - [Test] - public void ImplicitTo() - { - SyncVarGameObject field = new SyncVarGameObject(go); - // T = field implicit conversion should get .Value - GameObject value = field; - Assert.That(value, Is.EqualTo(go)); - } - - [Test] - public void ImplicitFrom_SetsValue() - { - // field = T implicit conversion should set .Value - SyncVarGameObject field = go; - Assert.That(field.Value, Is.EqualTo(go)); - } - - // make sure the GameObject hook works, even though base is uint. - [Test] - public void Hook() - { - int called = 0; - void OnChanged(GameObject oldValue, GameObject newValue) - { - ++called; - Assert.That(oldValue, Is.Null); - Assert.That(newValue, Is.EqualTo(go)); - } - - SyncVarGameObject field = new SyncVarGameObject(null, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = go; - Assert.That(called, Is.EqualTo(1)); - } - - // SyncField should check .Value for equality. - // two syncfields with same GameObject should be equal. - [Test] - public void EqualsTest() - { - SyncVarGameObject fieldA = new SyncVarGameObject(go); - SyncVarGameObject fieldB = new SyncVarGameObject(go); - SyncVarGameObject fieldC = new SyncVarGameObject(null); - Assert.That(fieldA.Equals(fieldB), Is.True); - Assert.That(fieldA.Equals(fieldC), Is.False); - } - - [Test] - public void PersistenceThroughDisappearance() - { - // field with identity - SyncVarGameObject field = new SyncVarGameObject(go); - - // remove from spawned, shouldn't be found anymore - NetworkServer.spawned.Remove(identity.netId); - Assert.That(field.Value, Is.EqualTo(null)); - - // add to spawned again - // add to spawned again, should be found again - NetworkServer.spawned[identity.netId] = identity; - Assert.That(field.Value, Is.EqualTo(go)); - } - - [Test] - public void SerializeAllWritesNetId() - { - SyncVarGameObject field = new SyncVarGameObject(go); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeAll(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(identity.netId)); - } - - [Test] - public void SerializeDeltaWritesNetId() - { - SyncVarGameObject field = new SyncVarGameObject(go); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeDelta(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(identity.netId)); - } - - [Test] - public void DeserializeAllReadsNetId() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(identity.netId); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarGameObject field = new SyncVarGameObject(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeAll(reader); - Assert.That(field.Value, Is.EqualTo(go)); - } - - [Test] - public void DeserializeDeltaReadsNetId() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(identity.netId); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarGameObject field = new SyncVarGameObject(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeDelta(reader); - Assert.That(field.Value, Is.EqualTo(go)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs.meta deleted file mode 100644 index 67956ffa4..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarGameObjectTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e09fed54f2b64402928a287b2fd8313f -timeCreated: 1632232605 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs b/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs deleted file mode 100644 index 3698796da..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs +++ /dev/null @@ -1,190 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - // SyncVarNetworkBehaviour for a abstract NetworkBehaviour - public class SyncVarNetworkBehaviourAbstractTests : MirrorTest - { - NetworkIdentity identity; - NetworkBehaviour component; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // need a connected client & server so we can have spawned identities - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // need a spawned NetworkIdentity with a netId (we store by netId) - // we need a valid NetworkBehaviour component. - // the class is abstract so we need to use EmptyBehaviour and cast back - CreateNetworkedAndSpawn(out _, out identity, out EmptyBehaviour inheritedComponent); - component = inheritedComponent; - Assert.That(identity.netId, !Is.EqualTo(0)); - } - - [TearDown] - public override void TearDown() => base.TearDown(); - - [Test] - public void Pack() - { - ulong packed = SyncVarNetworkBehaviour.Pack(0xAABBCCDD, 0x12); - Assert.That(packed, Is.EqualTo(0xAABBCCDD00000012)); - } - - [Test] - public void Unpack() - { - SyncVarNetworkBehaviour.Unpack(0xAABBCCDD00000012, out uint netId, out byte componentIndex); - Assert.That(netId, Is.EqualTo(0xAABBCCDD)); - Assert.That(componentIndex, Is.EqualTo(0x12)); - } - - // make sure the NetworkBehaviour ctor works, even though base is uint - [Test] - public void Constructor_NetworkBehaviour() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - Assert.That(field.Value, Is.EqualTo(component)); - } - - // make sure the NetworkBehaviour .Value works, even though base is uint - [Test] - public void Value_NetworkBehaviour() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = component; - Assert.That(field.Value, Is.EqualTo(component)); - } - - [Test] - public void PersistenceThroughDisappearance() - { - // field with NetworkBehaviour - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - - // remove from spawned, shouldn't be found anymore - NetworkServer.spawned.Remove(identity.netId); - Assert.That(field.Value, Is.EqualTo(null)); - - // add to spawned again, should be found again - NetworkServer.spawned[identity.netId] = identity; - Assert.That(field.Value, Is.EqualTo(component)); - } - - [Test] - public void ImplicitTo() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - // T = field implicit conversion should get .Value - NetworkBehaviour value = field; - Assert.That(value, Is.EqualTo(component)); - } - - [Test] - public void ImplicitFrom_SetsValue() - { - // field = T implicit conversion should set .Value - SyncVarNetworkBehaviour field = component; - Assert.That(field.Value, Is.EqualTo(component)); - } - - // make sure the NetworkBehaviour hook works, even though base is uint. - [Test] - public void Hook() - { - int called = 0; - void OnChanged(NetworkBehaviour oldValue, NetworkBehaviour newValue) - { - ++called; - Assert.That(oldValue, Is.Null); - Assert.That(newValue, Is.EqualTo(component)); - } - - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = component; - Assert.That(called, Is.EqualTo(1)); - } - - // SyncField should check .Value for equality. - // two syncfields with same NetworkBehaviour should be equal. - [Test] - public void EqualsTest() - { - SyncVarNetworkBehaviour fieldA = new SyncVarNetworkBehaviour(component); - SyncVarNetworkBehaviour fieldB = new SyncVarNetworkBehaviour(component); - SyncVarNetworkBehaviour fieldC = new SyncVarNetworkBehaviour(null); - Assert.That(fieldA.Equals(fieldB), Is.True); - Assert.That(fieldA.Equals(fieldC), Is.False); - } - - [Test] - public void SerializeAllWritesNetIdAndComponentIndex() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeAll(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(component.netId)); - Assert.That(reader.ReadByte(), Is.EqualTo(component.ComponentIndex)); - } - - [Test] - public void SerializeDeltaWritesNetIdAndComponentIndex() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeDelta(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(component.netId)); - Assert.That(reader.ReadByte(), Is.EqualTo(component.ComponentIndex)); - } - - [Test] - public void DeserializeAllReadsNetIdAndComponentIndex() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(component.netId); - writer.WriteByte((byte)component.ComponentIndex); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeAll(reader); - Assert.That(field.Value, Is.EqualTo(component)); - } - - [Test] - public void DeserializeDeltaReadsNetIdAndComponentIndex() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(component.netId); - writer.WriteByte((byte)component.ComponentIndex); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeDelta(reader); - Assert.That(field.Value, Is.EqualTo(component)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs.meta deleted file mode 100644 index 6f23f9237..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourAbstractTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3149b1d08c904a0092a504b4345afbd1 -timeCreated: 1633753766 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs b/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs deleted file mode 100644 index bf04a90ba..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs +++ /dev/null @@ -1,187 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - // SyncVarNetworkBehaviour for a class that inherits from NetworkBehaviour - public class SyncVarNetworkBehaviourInheritedTests : MirrorTest - { - NetworkIdentity identity; - EmptyBehaviour component; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // need a connected client & server so we can have spawned identities - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // need a spawned NetworkIdentity with a netId (we store by netId) - CreateNetworkedAndSpawn(out _, out identity, out component); - Assert.That(identity.netId, !Is.EqualTo(0)); - } - - [TearDown] - public override void TearDown() => base.TearDown(); - - [Test] - public void Pack() - { - ulong packed = SyncVarNetworkBehaviour.Pack(0xAABBCCDD, 0x12); - Assert.That(packed, Is.EqualTo(0xAABBCCDD00000012)); - } - - [Test] - public void Unpack() - { - SyncVarNetworkBehaviour.Unpack(0xAABBCCDD00000012, out uint netId, out byte componentIndex); - Assert.That(netId, Is.EqualTo(0xAABBCCDD)); - Assert.That(componentIndex, Is.EqualTo(0x12)); - } - - // make sure the NetworkBehaviour ctor works, even though base is uint - [Test] - public void Constructor_NetworkBehaviour() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - Assert.That(field.Value, Is.EqualTo(component)); - } - - // make sure the NetworkBehaviour .Value works, even though base is uint - [Test] - public void Value_NetworkBehaviour() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = component; - Assert.That(field.Value, Is.EqualTo(component)); - } - - [Test] - public void PersistenceThroughDisappearance() - { - // field with NetworkBehaviour - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - - // remove from spawned, shouldn't be found anymore - NetworkServer.spawned.Remove(identity.netId); - Assert.That(field.Value, Is.EqualTo(null)); - - // add to spawned again, should be found again - NetworkServer.spawned[identity.netId] = identity; - Assert.That(field.Value, Is.EqualTo(component)); - } - - [Test] - public void ImplicitTo() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - // T = field implicit conversion should get .Value - EmptyBehaviour value = field; - Assert.That(value, Is.EqualTo(component)); - } - - [Test] - public void ImplicitFrom_SetsValue() - { - // field = T implicit conversion should set .Value - SyncVarNetworkBehaviour field = component; - Assert.That(field.Value, Is.EqualTo(component)); - } - - // make sure the NetworkBehaviour hook works, even though base is uint. - [Test] - public void Hook() - { - int called = 0; - void OnChanged(EmptyBehaviour oldValue, EmptyBehaviour newValue) - { - ++called; - Assert.That(oldValue, Is.Null); - Assert.That(newValue, Is.EqualTo(component)); - } - - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = component; - Assert.That(called, Is.EqualTo(1)); - } - - // SyncField should check .Value for equality. - // two syncfields with same NetworkBehaviour should be equal. - [Test] - public void EqualsTest() - { - SyncVarNetworkBehaviour fieldA = new SyncVarNetworkBehaviour(component); - SyncVarNetworkBehaviour fieldB = new SyncVarNetworkBehaviour(component); - SyncVarNetworkBehaviour fieldC = new SyncVarNetworkBehaviour(null); - Assert.That(fieldA.Equals(fieldB), Is.True); - Assert.That(fieldA.Equals(fieldC), Is.False); - } - - [Test] - public void SerializeAllWritesNetIdAndComponentIndex() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeAll(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(component.netId)); - Assert.That(reader.ReadByte(), Is.EqualTo(component.ComponentIndex)); - } - - [Test] - public void SerializeDeltaWritesNetIdAndComponentIndex() - { - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(component); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeDelta(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(component.netId)); - Assert.That(reader.ReadByte(), Is.EqualTo(component.ComponentIndex)); - } - - [Test] - public void DeserializeAllReadsNetIdAndComponentIndex() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(component.netId); - writer.WriteByte((byte)component.ComponentIndex); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeAll(reader); - Assert.That(field.Value, Is.EqualTo(component)); - } - - [Test] - public void DeserializeDeltaReadsNetIdAndComponentIndex() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(component.netId); - writer.WriteByte((byte)component.ComponentIndex); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarNetworkBehaviour field = new SyncVarNetworkBehaviour(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeDelta(reader); - Assert.That(field.Value, Is.EqualTo(component)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs.meta deleted file mode 100644 index 67bbf683c..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarNetworkBehaviourInheritedTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 14b1e10f8534435aa611ea329253081b -timeCreated: 1632367114 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs b/Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs deleted file mode 100644 index 4e9304083..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs +++ /dev/null @@ -1,166 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Tests -{ - public class SyncVarNetworkIdentityTests : MirrorTest - { - NetworkIdentity identity; - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // need a connected client & server so we can have spawned identities - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - - // need a spawned NetworkIdentity with a netId (we store by netId) - CreateNetworkedAndSpawn(out _, out identity); - Assert.That(identity.netId, !Is.EqualTo(0)); - } - - [TearDown] - public override void TearDown() => base.TearDown(); - - // make sure the NetworkIdentity ctor works, even though base is uint - [Test] - public void Constructor_NetworkIdentity() - { - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(identity); - Assert.That(field.Value, Is.EqualTo(identity)); - } - - // make sure the NetworkIdentity .Value works, even though base is uint - [Test] - public void Value_NetworkIdentity() - { - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = identity; - Assert.That(field.Value, Is.EqualTo(identity)); - } - - [Test] - public void PersistenceThroughDisappearance() - { - // field with identity - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(identity); - - // remove from spawned, shouldn't be found anymore - NetworkServer.spawned.Remove(identity.netId); - Assert.That(field.Value, Is.EqualTo(null)); - - // add to spawned again, should be found again - NetworkServer.spawned[identity.netId] = identity; - Assert.That(field.Value, Is.EqualTo(identity)); - } - - [Test] - public void ImplicitTo() - { - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(identity); - // T = field implicit conversion should get .Value - NetworkIdentity value = field; - Assert.That(value, Is.EqualTo(identity)); - } - - [Test] - public void ImplicitFrom_SetsValue() - { - // field = T implicit conversion should set .Value - SyncVarNetworkIdentity field = identity; - Assert.That(field.Value, Is.EqualTo(identity)); - } - - // make sure the NetworkIdentity hook works, even though base is uint. - [Test] - public void Hook() - { - int called = 0; - void OnChanged(NetworkIdentity oldValue, NetworkIdentity newValue) - { - ++called; - Assert.That(oldValue, Is.Null); - Assert.That(newValue, Is.EqualTo(identity)); - } - - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(null, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = identity; - Assert.That(called, Is.EqualTo(1)); - } - - // SyncField should check .Value for equality. - // two syncfields with same NetworkIdentity should be equal. - [Test] - public void EqualsTest() - { - SyncVarNetworkIdentity fieldA = new SyncVarNetworkIdentity(identity); - SyncVarNetworkIdentity fieldB = new SyncVarNetworkIdentity(identity); - SyncVarNetworkIdentity fieldC = new SyncVarNetworkIdentity(null); - Assert.That(fieldA.Equals(fieldB), Is.True); - Assert.That(fieldA.Equals(fieldC), Is.False); - } - - [Test] - public void SerializeAllWritesNetId() - { - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(identity); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeAll(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(identity.netId)); - } - - [Test] - public void SerializeDeltaWritesNetId() - { - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(identity); - NetworkWriter writer = new NetworkWriter(); - field.OnSerializeDelta(writer); - - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - Assert.That(reader.ReadUInt(), Is.EqualTo(identity.netId)); - } - - [Test] - public void DeserializeAllReadsNetId() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(identity.netId); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeAll(reader); - Assert.That(field.Value, Is.EqualTo(identity)); - } - - [Test] - public void DeserializeDeltaReadsNetId() - { - NetworkWriter writer = new NetworkWriter(); - writer.WriteUInt(identity.netId); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - SyncVarNetworkIdentity field = new SyncVarNetworkIdentity(null); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.OnDeserializeDelta(reader); - Assert.That(field.Value, Is.EqualTo(identity)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs.meta deleted file mode 100644 index 7afbf3314..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarNetworkIdentityTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 064d7f97eae04da095f6b1ec23e66c2b -timeCreated: 1632209446 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/SyncVarTests.cs b/Assets/Mirror/Tests/Editor/SyncVarTests.cs deleted file mode 100644 index f8821579d..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarTests.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System.Text.RegularExpressions; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests -{ - public class SyncVarTests : MirrorTest - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // SyncVar hooks are only called while client is active for now. - // so we need an active client. - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - - // SyncField should recommend SyncFielGameObject instead - [Test] - public void SyncFieldGameObject_Recommendation() - { - // should show even if value is null since T is - LogAssert.Expect(LogType.Warning, new Regex($"Use explicit {nameof(SyncVarGameObject)}.*")); - SyncVar _ = new SyncVar(null); - } - - // SyncField should recommend SyncFielNetworkIdentity instead - [Test] - public void SyncFieldNetworkIdentity_Recommendation() - { - // should show even if value is null since T is - LogAssert.Expect(LogType.Warning, new Regex($"Use explicit {nameof(SyncVarNetworkIdentity)}.*")); - SyncVar _ = new SyncVar(null); - } - - // SyncField should recommend SyncFielNetworkBehaviour instead - [Test] - public void SyncFieldNetworkBehaviour_Recommendation() - { - // should show even if value is null since T is - LogAssert.Expect(LogType.Warning, new Regex($"Use explicit SyncVarNetworkBehaviour.*")); - SyncVar _ = new SyncVar(null); - } - - [Test] - public void SetValue_SetsValue() - { - // .Value is a property which does several things. - // make sure it .set actually sets the value - SyncVar field = 42; - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = 1337; - Assert.That(field.Value, Is.EqualTo(1337)); - } - - [Test] - public void SetValue_CallsOnDirty() - { - SyncVar field = 42; - int dirtyCalled = 0; - field.OnDirty = () => ++dirtyCalled; - - // setting SyncField.Value should call dirty - field.Value = 1337; - Assert.That(dirtyCalled, Is.EqualTo(1)); - } - - [Test] - public void SetValue_CallsOnDirty_OnlyIfValueChanged() - { - SyncVar field = 42; - int dirtyCalled = 0; - field.OnDirty = () => ++dirtyCalled; - - // setting same value should not call OnDirty again - field.Value = 42; - Assert.That(dirtyCalled, Is.EqualTo(0)); - } - - [Test] - public void ImplicitTo() - { - SyncVar field = new SyncVar(42); - // T = field implicit conversion should get .Value - int value = field; - Assert.That(value, Is.EqualTo(42)); - } - - [Test] - public void ImplicitFrom_SetsValue() - { - // field = T implicit conversion should set .Value - SyncVar field = 42; - Assert.That(field.Value, Is.EqualTo(42)); - } - - [Test] - public void Hook_IsCalled() - { - int called = 0; - void OnChanged(int oldValue, int newValue) - { - ++called; - Assert.That(oldValue, Is.EqualTo(42)); - Assert.That(newValue, Is.EqualTo(1337)); - } - - SyncVar field = new SyncVar(42, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - field.Value = 1337; - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void Hook_OnlyCalledIfValueChanged() - { - int called = 0; - void OnChanged(int oldValue, int newValue) - { - ++called; - Assert.That(oldValue, Is.EqualTo(42)); - Assert.That(newValue, Is.EqualTo(1337)); - } - - SyncVar field = new SyncVar(42, OnChanged); - // assign same value again. hook shouldn't be called again. - field.Value = 42; - Assert.That(called, Is.EqualTo(0)); - } - - [Test] - public void Hook_Set_DoesntDeadlock() - { - // Value.set calls the hook. - // calling Value.set inside the hook would deadlock. - // this needs to be prevented. - SyncVar field = null; - int called = 0; - void OnChanged(int oldValue, int newValue) - { - // setting a different value calls setter -> hook again - field.Value = 0; - ++called; - } - field = new SyncVar(42, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - // setting a different value will call the hook - field.Value = 1337; - // in the end, hook should've been called exactly once - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void DeserializeAll_CallsHook() - { - // create field with hook - int called = 0; - void OnChanged(int oldValue, int newValue) - { - ++called; - Assert.That(oldValue, Is.EqualTo(42)); - Assert.That(newValue, Is.EqualTo(1337)); - } - SyncVar field = new SyncVar(42, OnChanged); - - // avoid 'not initialized' exception - field.OnDirty = () => {}; - - // create reader with data - NetworkWriter writer = new NetworkWriter(); - writer.WriteInt(1337); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - // deserialize - field.OnDeserializeAll(reader); - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void DeserializeDelta_CallsHook() - { - // create field with hook - int called = 0; - void OnChanged(int oldValue, int newValue) - { - ++called; - Assert.That(oldValue, Is.EqualTo(42)); - Assert.That(newValue, Is.EqualTo(1337)); - } - SyncVar fieldWithHook = new SyncVar(42, OnChanged); - - // avoid 'not initialized' exception - fieldWithHook.OnDirty = () => {}; - - // create reader with data - NetworkWriter writer = new NetworkWriter(); - writer.WriteInt(1337); - NetworkReader reader = new NetworkReader(writer.ToArraySegment()); - - // deserialize - fieldWithHook.OnDeserializeDelta(reader); - Assert.That(called, Is.EqualTo(1)); - } - - [Test] - public void EqualsT() - { - // .Equals should compare .Value - SyncVar field = 42; - Assert.That(field.Equals(42), Is.True); - } - - [Test] - public void EqualsNull() - { - // .Equals(null) should always be false. so that == null works. - SyncVar field = 42; - Assert.That(field.Equals(null), Is.False); - } - - [Test] - public void EqualsEqualsT() - { - // == should compare .Value - SyncVar field = 42; - Assert.That(field == 42, Is.True); - } - - [Test] - public void ToString_CallsValueToString() - { - SyncVar field = 42; - Assert.That(field.ToString(), Is.EqualTo("42")); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/SyncVarTests.cs.meta b/Assets/Mirror/Tests/Editor/SyncVarTests.cs.meta deleted file mode 100644 index 078a619e5..000000000 --- a/Assets/Mirror/Tests/Editor/SyncVarTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e3e4fde08fe240f79ad665b57d2e71c2 -timeCreated: 1632056463 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs b/Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs deleted file mode 100644 index f4e565acf..000000000 --- a/Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class VirtualTargetRpc : NetworkBehaviour - { - public event Action onVirtualSendInt; - - [TargetRpc] - public virtual void TargetSendInt(int someInt) - { - onVirtualSendInt?.Invoke(someInt); - } - } - - class VirtualNoOverrideTargetRpc : VirtualTargetRpc {} - - class VirtualOverrideTargetRpc : VirtualTargetRpc - { - public event Action onOverrideSendInt; - - [TargetRpc] - public override void TargetSendInt(int someInt) - { - onOverrideSendInt?.Invoke(someInt); - } - } - - class VirtualOverrideTargetRpcWithBase : VirtualTargetRpc - { - public event Action onOverrideSendInt; - - [TargetRpc] - public override void TargetSendInt(int someInt) - { - base.TargetSendInt(someInt); - onOverrideSendInt?.Invoke(someInt); - } - } - - public class TargetRpcOverrideTest : RemoteTestBase - { - [Test] - public void VirtualRpcIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualTargetRpc hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.TargetSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - } - - [Test] - public void VirtualCommandWithNoOverrideIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualNoOverrideTargetRpc hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.TargetSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualRpcIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideTargetRpc hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.TargetSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(0)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - } - - [Test] - public void OverrideVirtualWithBaseCallsBothVirtualAndBase() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out VirtualOverrideTargetRpcWithBase hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int virtualCallCount = 0; - int overrideCallCount = 0; - hostBehaviour.onVirtualSendInt += incomingInt => - { - virtualCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.onOverrideSendInt += incomingInt => - { - overrideCallCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - - hostBehaviour.TargetSendInt(someInt); - ProcessMessages(); - Assert.That(virtualCallCount, Is.EqualTo(1)); - Assert.That(overrideCallCount, Is.EqualTo(1)); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs.meta b/Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs.meta deleted file mode 100644 index 8cb1e07da..000000000 --- a/Assets/Mirror/Tests/Editor/TargetRpcOverrideTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 56e76b5f8b5fe2d40ade963d179ef76e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/TargetRpcTest.cs b/Assets/Mirror/Tests/Editor/TargetRpcTest.cs deleted file mode 100644 index ab078ff5e..000000000 --- a/Assets/Mirror/Tests/Editor/TargetRpcTest.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.RemoteAttrributeTest -{ - class TargetRpcBehaviour : NetworkBehaviour - { - public event Action onSendInt; - - [TargetRpc] - public void SendInt(int someInt) - { - onSendInt?.Invoke(someInt); - } - - [TargetRpc] - public void SendIntWithTarget(NetworkConnection target, int someInt) - { - onSendInt?.Invoke(someInt); - } - } - - public class TargetRpcTest : RemoteTestBase - { - [Test] - public void TargetRpcIsCalled() - { - // spawn with owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour, NetworkServer.localConnection); - - const int someInt = 20; - - int callCount = 0; - hostBehaviour.onSendInt += incomingInt => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.SendInt(someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void TargetRpcIsCalledOnTarget() - { - // spawn without owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour); - - const int someInt = 20; - - int callCount = 0; - hostBehaviour.onSendInt += incomingInt => - { - callCount++; - Assert.That(incomingInt, Is.EqualTo(someInt)); - }; - hostBehaviour.SendIntWithTarget(NetworkServer.localConnection, someInt); - ProcessMessages(); - Assert.That(callCount, Is.EqualTo(1)); - } - - [Test] - public void ErrorForTargetRpcWithNoOwner() - { - // spawn without owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour); - - const int someInt = 20; - - hostBehaviour.onSendInt += incomingInt => - { - Assert.Fail("Event should not be invoked with error"); - }; - LogAssert.Expect(LogType.Error, $"TargetRPC {nameof(TargetRpcBehaviour.SendInt)} was given a null connection, make sure the object has an owner or you pass in the target connection"); - hostBehaviour.SendInt(someInt); - } - - [Test] - public void ErrorForTargetRpcWithNullArgment() - { - // spawn without owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour); - - const int someInt = 20; - - hostBehaviour.onSendInt += incomingInt => - { - Assert.Fail("Event should not be invoked with error"); - }; - LogAssert.Expect(LogType.Error, $"TargetRPC {nameof(TargetRpcBehaviour.SendIntWithTarget)} was given a null connection, make sure the object has an owner or you pass in the target connection"); - hostBehaviour.SendIntWithTarget(null, someInt); - } - - [Test] - public void ErrorForTargetRpcWhenNotGivenConnectionToClient() - { - // spawn without owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour); - - const int someInt = 20; - - hostBehaviour.onSendInt += incomingInt => - { - Assert.Fail("Event should not be invoked with error"); - }; - LogAssert.Expect(LogType.Error, $"TargetRPC {nameof(TargetRpcBehaviour.SendIntWithTarget)} requires a NetworkConnectionToClient but was given {typeof(FakeConnection).Name}"); - hostBehaviour.SendIntWithTarget(new FakeConnection(), someInt); - } - class FakeConnection : NetworkConnection - { - public override string address => throw new NotImplementedException(); - public override void Disconnect() => throw new NotImplementedException(); - internal override void Send(ArraySegment segment, int channelId = 0) => throw new NotImplementedException(); - protected override void SendToTransport(ArraySegment segment, int channelId = Channels.Reliable) => throw new NotImplementedException(); - } - - [Test] - public void ErrorForTargetRpcWhenServerNotActive() - { - // spawn without owner - CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour); - - const int someInt = 20; - - hostBehaviour.onSendInt += incomingInt => - { - Assert.Fail("Event should not be invoked with error"); - }; - NetworkServer.active = false; - LogAssert.Expect(LogType.Error, $"TargetRPC {nameof(TargetRpcBehaviour.SendInt)} called when server not active"); - hostBehaviour.SendInt(someInt); - } - - [Test] - public void ErrorForTargetRpcWhenObjetNotSpawned() - { - // create without spawning - CreateNetworked(out GameObject _, out NetworkIdentity _, out TargetRpcBehaviour hostBehaviour); - - const int someInt = 20; - - hostBehaviour.onSendInt += incomingInt => - { - Assert.Fail("Event should not be invoked with error"); - }; - LogAssert.Expect(LogType.Warning, $"TargetRpc {nameof(TargetRpcBehaviour.SendInt)} called on {hostBehaviour.name} but that object has not been spawned or has been unspawned"); - hostBehaviour.SendInt(someInt); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/TargetRpcTest.cs.meta b/Assets/Mirror/Tests/Editor/TargetRpcTest.cs.meta deleted file mode 100644 index 554ebb23c..000000000 --- a/Assets/Mirror/Tests/Editor/TargetRpcTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 53f71b8db0a8bac448b45ee86a0d355a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs.meta b/Assets/Mirror/Tests/Editor/TestPrefabs.meta deleted file mode 100644 index b181ac967..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c5e7ba67b40c16049a463d65940445b7 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab b/Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab deleted file mode 100644 index b445e7389..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab +++ /dev/null @@ -1,97 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &3117426950187087154 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 51440471024079650} - - component: {fileID: 5409067437793000088} - m_Layer: 0 - m_Name: PrefabWithChildrenForClientScene - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &51440471024079650 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3117426950187087154} - 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: 6537489145038351880} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5409067437793000088 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3117426950187087154} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 4227710719 - serverOnly: 0 - m_AssetId: - hasSpawned: 0 ---- !u!1 &3264653828050749140 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6537489145038351880} - - component: {fileID: 6548650892574975460} - m_Layer: 0 - m_Name: Child Network Identity - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6537489145038351880 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3264653828050749140} - 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: 51440471024079650} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6548650892574975460 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3264653828050749140} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 1033643234 - serverOnly: 0 - m_AssetId: - hasSpawned: 0 diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab.meta b/Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab.meta deleted file mode 100644 index d6d295014..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs/PrefabWithChildrenForClientScene.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a78e009e3f2dee44e8859516974ede43 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab b/Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab deleted file mode 100644 index 38f91abdd..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab +++ /dev/null @@ -1,49 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &9072865897540379920 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1476000898204696246} - - component: {fileID: 1423274632536207763} - m_Layer: 0 - m_Name: ValidPrefabForClientScene - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1476000898204696246 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9072865897540379920} - 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!114 &1423274632536207763 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9072865897540379920} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 1350197626 - serverOnly: 0 - m_AssetId: - hasSpawned: 0 diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab.meta b/Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab.meta deleted file mode 100644 index 4f06339ab..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs/ValidPrefabForClientScene.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 33169286da0313d45ab5bfccc6cf3775 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab b/Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab deleted file mode 100644 index 7dea950b9..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab +++ /dev/null @@ -1,32 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &6662908427314056913 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4633208118073782447} - m_Layer: 0 - m_Name: invalidPrefabForClientScene - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4633208118073782447 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6662908427314056913} - 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} diff --git a/Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab.meta b/Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab.meta deleted file mode 100644 index edf3b10fd..000000000 --- a/Assets/Mirror/Tests/Editor/TestPrefabs/invalidPrefabForClientScene.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 78f0a3f755d35324e959f3ecdd993fb0 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/UtilsTests.cs b/Assets/Mirror/Tests/Editor/UtilsTests.cs deleted file mode 100644 index cda272b2f..000000000 --- a/Assets/Mirror/Tests/Editor/UtilsTests.cs +++ /dev/null @@ -1,31 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -namespace Mirror.Tests -{ - public class UtilsTests - { - [Test] - public void GetTrueRandomUInt() - { - uint first = Utils.GetTrueRandomUInt(); - uint second = Utils.GetTrueRandomUInt(); - Assert.That(first, !Is.EqualTo(second)); - } - - [Test] - public void IsPointInScreen() - { - int width = Screen.width; - int height = Screen.height; - Assert.That(Utils.IsPointInScreen(new Vector2(-1, -1)), Is.False); - - Assert.That(Utils.IsPointInScreen(new Vector2(0, 0)), Is.True); - Assert.That(Utils.IsPointInScreen(new Vector2(width / 2, height / 2)), Is.True); - - Assert.That(Utils.IsPointInScreen(new Vector2(width, height / 2)), Is.False); - Assert.That(Utils.IsPointInScreen(new Vector2(width / 2, height)), Is.False); - Assert.That(Utils.IsPointInScreen(new Vector2(width + 1, height + 1)), Is.False); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/UtilsTests.cs.meta b/Assets/Mirror/Tests/Editor/UtilsTests.cs.meta deleted file mode 100644 index fef4a5ef1..000000000 --- a/Assets/Mirror/Tests/Editor/UtilsTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4334d1acdbce04172b3faaa632129ba7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver.meta b/Assets/Mirror/Tests/Editor/Weaver.meta deleted file mode 100644 index 700c49534..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 90415d9cedbb1f14795854e529289171 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj b/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj deleted file mode 100644 index 5fc5f018b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj +++ /dev/null @@ -1,280 +0,0 @@ - - - netstandard2.0 - _WeaverTests2.csproj - False - Temp~\obj\ - - - true - full - false - Temp~\bin\Debug\ - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_3_6;UNITY_2018_3;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;MIRROR;MIRROR_1726_OR_NEWER;MIRROR_3_0_OR_NEWER;MIRROR_3_12_OR_NEWER;MIRROR_4_0_OR_NEWER;MIRROR_5_0_OR_NEWER;MIRROR_6_0_OR_NEWER;MIRROR_7_0_OR_NEWER;MIRROR_8_0_OR_NEWER;MIRROR_9_0_OR_NEWER;MIRROR_10_0_OR_NEWER;MIRROR_11_0_OR_NEWER;MIRROR_12_0_OR_NEWER;MIRROR_13_0_OR_NEWER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER - prompt - 4 - 0169 - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - G:/UnityEditors/2018.3.6f1/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll - - - - - G:\UnityEditors\2018.3.6f1\Editor\Data\Managed/UnityEngine/UnityEngine.dll - - - G:\UnityEditors\2018.3.6f1\Editor\Data\Managed/UnityEditor.dll - - - G:\UnityEditors\2018.3.6f1\Editor\Data\Managed\UnityEngine\UnityEngine.TextRenderingModule.dll - - - - - {3AD0CCDA-2B85-9DF3-8D00-95C1C6C53989} - Mirror - - - {90A15647-DD13-BF94-74EC-7CAA0D39EE86} - WeaverTestExtraAssembly - - - - diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly.meta deleted file mode 100644 index 0938ea191..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c7ea1d20d9a008f479d65016372c9af9 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs deleted file mode 100644 index 57669332d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Mirror.Weaver.Tests.Extra -{ - public struct ComplexData - { - public AnotherData another; - public float q; - } - public struct AnotherData - { - public float a; - public float b; - public float c; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs.meta deleted file mode 100644 index d388cb7be..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/ComplexClass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 48d47c0cf65be8d438e25f7039e50855 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md deleted file mode 100644 index b00c220c4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md +++ /dev/null @@ -1,3 +0,0 @@ -We need this extra Assembly when testing multiple assembles. - -Weaver is currently unable to use reference to assembles that are not in `CompilationPipeline.GetAssemblies()` \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md.meta deleted file mode 100644 index 01a20a1e2..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4020f17b5b2fe4842bea9d1e7e6102d8 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs deleted file mode 100644 index bc8615589..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Mirror.Weaver.Tests.Extra -{ - public struct SomeData - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs.meta deleted file mode 100644 index 3e39abd3e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeData.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 502dcd3fe9ec0e04185f2afd167c7aad -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs deleted file mode 100644 index b93368de5..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Mirror.Weaver.Tests.Extra -{ - public class SomeDataClass - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs.meta deleted file mode 100644 index cf2961c97..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 13374a84968c7684782a54136703257d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs deleted file mode 100644 index b1fd9316a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Mirror.Weaver.Tests.Extra -{ - public class SomeDataClassWithConstructor - { - public int usefulNumber; - - public SomeDataClassWithConstructor() - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs.meta deleted file mode 100644 index a84b180df..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataClassWithConstructor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1e73b5c53b6d21b47ab1442e5ad2265a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs deleted file mode 100644 index d229527a8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Mirror.Weaver.Tests.Extra -{ - public struct SomeDataWithWriter - { - public int usefulNumber; - } - - public static class ReadWrite - { - public static void WriteSomeData(this NetworkWriter writer, SomeDataWithWriter itemData) - { - writer.WriteInt(itemData.usefulNumber); - } - public static SomeDataWithWriter ReadSomeData(this NetworkReader reader) - { - return new SomeDataWithWriter { usefulNumber = reader.ReadInt() }; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs.meta deleted file mode 100644 index 48e7de714..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/SomeDataWithWriter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 15ed55793bf39a04f9ef337575c3c6e8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef deleted file mode 100644 index 7098b96e8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "WeaverTestExtraAssembly", - "references": [ - "Mirror" - ], - "optionalUnityReferences": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [] -} \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef.meta b/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef.meta deleted file mode 100644 index 65c2e4b43..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/ExtraAssembly/WeaverTestExtraAssembly.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4887344a35d890449b35f8b1b0a3355a -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs deleted file mode 100644 index 1f4618a2f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using UnityEditor.Compilation; -using UnityEngine; - -namespace Mirror.Weaver.Tests -{ - public class WeaverAssembler : MonoBehaviour - { - static string _outputDirectory; - public static string OutputDirectory - { - get - { - if (string.IsNullOrEmpty(_outputDirectory)) - { - _outputDirectory = EditorHelper.FindPath(); - } - return _outputDirectory; - } - } - public static string OutputFile; - public static HashSet SourceFiles { get; private set; } - public static bool AllowUnsafe; - public static List CompilerMessages { get; private set; } - public static bool CompilerErrors { get; private set; } - public static bool DeleteOutputOnClear; - - // static constructor to initialize static properties - static WeaverAssembler() - { - SourceFiles = new HashSet(); - CompilerMessages = new List(); - } - - // Add a range of source files to compile - public static void AddSourceFiles(string[] sourceFiles) - { - foreach (string src in sourceFiles) - { - SourceFiles.Add(Path.Combine(OutputDirectory, src)); - } - } - - // Delete output dll / pdb / mdb - public static void DeleteOutput() - { - // "x.dll" shortest possible dll name - if (OutputFile.Length < 5) - { - return; - } - - string projPathFile = Path.Combine(OutputDirectory, OutputFile); - - try - { - File.Delete(projPathFile); - } - catch {} - - try - { - File.Delete(Path.ChangeExtension(projPathFile, ".pdb")); - } - catch {} - - try - { - File.Delete(Path.ChangeExtension(projPathFile, ".dll.mdb")); - } - catch {} - } - - // clear all settings except for referenced assemblies (which are cleared with ClearReferences) - public static void Clear() - { - if (DeleteOutputOnClear) - { - DeleteOutput(); - } - - CompilerErrors = false; - OutputFile = ""; - SourceFiles.Clear(); - CompilerMessages.Clear(); - AllowUnsafe = false; - DeleteOutputOnClear = false; - } - - public static void Build(Action OnWarning, Action OnError) - { - AssemblyBuilder assemblyBuilder = new AssemblyBuilder(Path.Combine(OutputDirectory, OutputFile), SourceFiles.ToArray()) - { - // "The type 'MonoBehaviour' is defined in an assembly that is not referenced" - referencesOptions = ReferencesOptions.UseEngineModules - }; - if (AllowUnsafe) - { - assemblyBuilder.compilerOptions.AllowUnsafeCode = true; - } - -#if UNITY_2020_3_OR_NEWER - // Unity automatically invokes ILPostProcessor after - // AssemblyBuilder.Build() (on windows at least. not on mac). - // => .buildFinished() below CompilerMessages would already contain - // the weaver messages, failing tests. - // => SyncVarTests->SyncVarSyncList fails too if ILPP was - // already applied by Unity, and we apply it again. - // - // we need to not run ILPP for WeaverTests assemblies here. - // -> we can't set member variables because Unity creates a new - // ILPP instance internally and invokes it - // -> define is passed through ILPP though, and avoids static state. - assemblyBuilder.additionalDefines = new []{ILPostProcessorHook.IgnoreDefine}; -#endif - - assemblyBuilder.buildFinished += delegate (string assemblyPath, CompilerMessage[] compilerMessages) - { - // CompilerMessages from compiling the original test assembly. - // note that we can see weaver messages here if Unity runs - // ILPostProcessor after AssemblyBuilder.Build(). - // => that's why we pass the ignore define above. - CompilerMessages.AddRange(compilerMessages); - foreach (CompilerMessage cm in compilerMessages) - { - if (cm.type == CompilerMessageType.Error) - { - Debug.LogError($"{cm.file}:{cm.line} -- {cm.message}"); - CompilerErrors = true; - } - } - -#if UNITY_2020_3_OR_NEWER - // on 2018/2019, CompilationFinishedHook weaves after building. - // on 2020, ILPostProcessor weaves after building. - // on windows, it runs after AssemblyBuilder.Build() - // on mac, it does not run after AssemblyBuidler.Build() - // => run it manually in all cases - // => this way we can feed result.Logs to test results too - // NOTE: we could simply call Weaver.Weave() here. - // but let's make all tests run through ILPP. - // just like regular projects would. - // helps catch issues early. - - // copy references from assemblyBuilder's references - List references = new List(); - if (assemblyBuilder.defaultReferences != null) - references.AddRange(assemblyBuilder.defaultReferences); - if (assemblyBuilder.additionalReferences != null) - references.AddRange(assemblyBuilder.additionalReferences); - - // invoke ILPostProcessor with an assembly from file. - // NOTE: code for creating and invoking the ILPostProcessor has - // to be in Weaver.dll where 'CompilationPipeline' is - // available due to name being of form 'Unity.*.CodeGen'. - // => we can't change tests to that Unity.*.CodeGen - // because some tests need to be weaved, but ILPP isn't - // ran on Unity.*.CodeGen assemblies itself. - ILPostProcessorFromFile.ILPostProcessFile(assemblyPath, references.ToArray(), OnWarning, OnError); -#endif - }; - - // Start build of assembly - if (!assemblyBuilder.Build()) - { - Debug.LogError($"Failed to start build of assembly {assemblyBuilder.assemblyPath}"); - return; - } - - while (assemblyBuilder.status != AssemblyBuilderStatus.Finished) - { - Thread.Sleep(10); - } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs.meta deleted file mode 100644 index d41b1b4f2..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverAssembler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 049ac5abfba3c0943a2694cd502fcc80 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs deleted file mode 100644 index 12896b330..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs +++ /dev/null @@ -1,58 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverClientRpcTests : WeaverTestsBuildFromTestName - { - [Test] - public void ClientRpcValid() - { - IsSuccess(); - } - - [Test] - public void ClientRpcCantBeStatic() - { - HasError("RpcCantBeStatic must not be static", - "System.Void WeaverClientRpcTests.ClientRpcCantBeStatic.ClientRpcCantBeStatic::RpcCantBeStatic()"); - } - - [Test] - public void VirtualClientRpc() - { - IsSuccess(); - } - - [Test] - public void OverrideVirtualClientRpc() - { - IsSuccess(); - } - - [Test] - public void AbstractClientRpc() - { - HasError("Abstract ClientRpc are currently not supported, use virtual method instead", - "System.Void WeaverClientRpcTests.AbstractClientRpc.AbstractClientRpc::RpcDoSomething()"); - } - - [Test] - public void OverrideAbstractClientRpc() - { - HasError("Abstract ClientRpc are currently not supported, use virtual method instead", - "System.Void WeaverClientRpcTests.OverrideAbstractClientRpc.BaseBehaviour::RpcDoSomething()"); - } - - [Test] - public void ClientRpcThatExcludesOwner() - { - IsSuccess(); - } - - [Test] - public void BehaviourCanBeSentInRpc() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs.meta deleted file mode 100644 index 4af734600..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1707821d15f4c5e4eb0446b0d2e4a260 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/AbstractClientRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/AbstractClientRpc.cs deleted file mode 100644 index ca91cc764..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/AbstractClientRpc.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientRpcTests.AbstractClientRpc -{ - abstract class AbstractClientRpc : NetworkBehaviour - { - [ClientRpc] - protected abstract void RpcDoSomething(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/BehaviourCanBeSentInRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/BehaviourCanBeSentInRpc.cs deleted file mode 100644 index c20bc69b5..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/BehaviourCanBeSentInRpc.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientRpcTests.BehaviourCanBeSentInRpc -{ - class BehaviourCanBeSentInRpc : NetworkBehaviour - { - [ClientRpc] - void RpcDoSomething(BehaviourCanBeSentInRpc value) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcCantBeStatic.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcCantBeStatic.cs deleted file mode 100644 index 49aa61fd2..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcCantBeStatic.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientRpcTests.ClientRpcCantBeStatic -{ - class ClientRpcCantBeStatic : NetworkBehaviour - { - [ClientRpc] - static void RpcCantBeStatic() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcThatExcludesOwner.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcThatExcludesOwner.cs deleted file mode 100644 index 77706bab4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcThatExcludesOwner.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientRpcTests.ClientRpcThatExcludesOwner -{ - class ClientRpcThatExcludesOwner : NetworkBehaviour - { - [ClientRpc(includeOwner = false)] - void RpcDoSomething() - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcValid.cs deleted file mode 100644 index 123d19f1d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/ClientRpcValid.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientRpcTests.ClientRpcValid -{ - class ClientRpcValid : NetworkBehaviour - { - [ClientRpc] - void RpcThatIsTotallyValid() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideAbstractClientRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideAbstractClientRpc.cs deleted file mode 100644 index 4310277d8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideAbstractClientRpc.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - - -namespace WeaverClientRpcTests.OverrideAbstractClientRpc -{ - class OverrideAbstractClientRpc : BaseBehaviour - { - [ClientRpc] - protected override void RpcDoSomething() - { - // do something - } - } - - abstract class BaseBehaviour : NetworkBehaviour - { - [ClientRpc] - protected abstract void RpcDoSomething(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideVirtualClientRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideVirtualClientRpc.cs deleted file mode 100644 index ea8742b6d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/OverrideVirtualClientRpc.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Mirror; - - -namespace WeaverClientRpcTests.OverrideVirtualClientRpc -{ - class OverrideVirtualClientRpc : baseBehaviour - { - [ClientRpc] - protected override void RpcDoSomething() - { - // do something - } - } - - class baseBehaviour : NetworkBehaviour - { - [ClientRpc] - protected virtual void RpcDoSomething() - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/VirtualClientRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/VirtualClientRpc.cs deleted file mode 100644 index 089f5e0af..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientRpcTests~/VirtualClientRpc.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientRpcTests.VirtualClientRpc -{ - class VirtualCommand : NetworkBehaviour - { - [ClientRpc] - protected virtual void RpcDoSomething() - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs deleted file mode 100644 index 7b318164d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System.IO; -using System.Linq; -using Mono.CecilX; -using Mono.CecilX.Cil; -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverClientServerAttributeTests : WeaverTestsBuildFromTestName - { - // Debug.Log on WeaverTypes to see the strings - const string NetworkServerGetActive = "System.Boolean Mirror.NetworkServer::get_active()"; - const string NetworkClientGetActive = "System.Boolean Mirror.NetworkClient::get_active()"; - - [Test] - public void NetworkBehaviourServer() - { - IsSuccess(); - CheckAddedCode(NetworkServerGetActive, "WeaverClientServerAttributeTests.NetworkBehaviourServer.NetworkBehaviourServer", "ServerOnlyMethod"); - } - - [Test] - public void ServerAttributeOnVirutalMethod() - { - IsSuccess(); - CheckAddedCode(NetworkServerGetActive, "WeaverClientServerAttributeTests.ServerAttributeOnVirutalMethod.ServerAttributeOnVirutalMethod", "ServerOnlyMethod"); - } - - [Test] - public void ServerAttributeOnAbstractMethod() - { - HasError("Server or Client Attributes can't be added to abstract method. Server and Client Attributes are not inherited so they need to be applied to the override methods instead.", - "System.Void WeaverClientServerAttributeTests.ServerAttributeOnAbstractMethod.ServerAttributeOnAbstractMethod::ServerOnlyMethod()"); - } - - [Test] - public void ServerAttributeOnOverrideMethod() - { - IsSuccess(); - CheckAddedCode(NetworkServerGetActive, "WeaverClientServerAttributeTests.ServerAttributeOnOverrideMethod.ServerAttributeOnOverrideMethod", "ServerOnlyMethod"); - } - - [Test] - public void NetworkBehaviourClient() - { - IsSuccess(); - CheckAddedCode(NetworkClientGetActive, "WeaverClientServerAttributeTests.NetworkBehaviourClient.NetworkBehaviourClient", "ClientOnlyMethod"); - } - - [Test] - public void ClientAttributeOnVirutalMethod() - { - IsSuccess(); - CheckAddedCode(NetworkClientGetActive, "WeaverClientServerAttributeTests.ClientAttributeOnVirutalMethod.ClientAttributeOnVirutalMethod", "ClientOnlyMethod"); - } - - [Test] - public void ClientAttributeOnAbstractMethod() - { - HasError("Server or Client Attributes can't be added to abstract method. Server and Client Attributes are not inherited so they need to be applied to the override methods instead.", - "System.Void WeaverClientServerAttributeTests.ClientAttributeOnAbstractMethod.ClientAttributeOnAbstractMethod::ClientOnlyMethod()"); - } - - [Test] - public void ClientAttributeOnOverrideMethod() - { - IsSuccess(); - CheckAddedCode(NetworkClientGetActive, "WeaverClientServerAttributeTests.ClientAttributeOnOverrideMethod.ClientAttributeOnOverrideMethod", "ClientOnlyMethod"); - } - - [Test] - public void StaticClassClient() - { - IsSuccess(); - CheckAddedCode(NetworkClientGetActive, "WeaverClientServerAttributeTests.StaticClassClient.StaticClassClient", "ClientOnlyMethod"); - } - - [Test] - public void RegularClassClient() - { - IsSuccess(); - CheckAddedCode(NetworkClientGetActive, "WeaverClientServerAttributeTests.RegularClassClient.RegularClassClient", "ClientOnlyMethod"); - } - - [Test] - public void MonoBehaviourClient() - { - IsSuccess(); - CheckAddedCode(NetworkClientGetActive, "WeaverClientServerAttributeTests.MonoBehaviourClient.MonoBehaviourClient", "ClientOnlyMethod"); - } - - [Test] - public void StaticClassServer() - { - IsSuccess(); - CheckAddedCode(NetworkServerGetActive, "WeaverClientServerAttributeTests.StaticClassServer.StaticClassServer", "ServerOnlyMethod"); - } - - [Test] - public void RegularClassServer() - { - IsSuccess(); - CheckAddedCode(NetworkServerGetActive, "WeaverClientServerAttributeTests.RegularClassServer.RegularClassServer", "ServerOnlyMethod"); - } - - [Test] - public void MonoBehaviourServer() - { - IsSuccess(); - CheckAddedCode(NetworkServerGetActive, "WeaverClientServerAttributeTests.MonoBehaviourServer.MonoBehaviourServer", "ServerOnlyMethod"); - } - - // Checks that first Instructions in MethodBody is addedString - static void CheckAddedCode(string addedString, string className, string methodName) - { - string assemblyName = Path.Combine(WeaverAssembler.OutputDirectory, WeaverAssembler.OutputFile); - using (AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyName)) - { - TypeDefinition type = assembly.MainModule.GetType(className); - MethodDefinition method = type.Methods.First(m => m.Name == methodName); - MethodBody body = method.Body; - - Instruction top = body.Instructions[0]; - - Assert.AreEqual(top.OpCode, OpCodes.Call); - Assert.AreEqual(top.Operand.ToString(), addedString); - } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs.meta deleted file mode 100644 index 7b9685839..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 54da10f79c18fad49818f5ebc546aa90 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnAbstractMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnAbstractMethod.cs deleted file mode 100644 index 8fd30cac0..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnAbstractMethod.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.ClientAttributeOnAbstractMethod -{ - abstract class ClientAttributeOnAbstractMethod : NetworkBehaviour - { - [Client] - protected abstract void ClientOnlyMethod(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnOverrideMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnOverrideMethod.cs deleted file mode 100644 index 619402086..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnOverrideMethod.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.ClientAttributeOnOverrideMethod -{ - class ClientAttributeOnOverrideMethod : BaseClass - { - [Client] - protected override void ClientOnlyMethod() - { - // test method - } - } - - class BaseClass : NetworkBehaviour - { - protected virtual void ClientOnlyMethod() - { - // test method - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnVirutalMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnVirutalMethod.cs deleted file mode 100644 index a541fc33e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ClientAttributeOnVirutalMethod.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.ClientAttributeOnVirutalMethod -{ - class ClientAttributeOnVirutalMethod : NetworkBehaviour - { - [Client] - protected virtual void ClientOnlyMethod() - { - // test method - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourClient.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourClient.cs deleted file mode 100644 index 9f9d381f9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourClient.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverClientServerAttributeTests.MonoBehaviourClient -{ - class MonoBehaviourClient : MonoBehaviour - { - [Client] - void ClientOnlyMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourServer.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourServer.cs deleted file mode 100644 index c5c77bd2e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/MonoBehaviourServer.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverClientServerAttributeTests.MonoBehaviourServer -{ - class MonoBehaviourServer : MonoBehaviour - { - [Server] - void ServerOnlyMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourClient.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourClient.cs deleted file mode 100644 index 3fc0ad730..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourClient.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.NetworkBehaviourClient -{ - class NetworkBehaviourClient : NetworkBehaviour - { - [Client] - void ClientOnlyMethod() - { - // test method - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourServer.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourServer.cs deleted file mode 100644 index c5b972f08..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/NetworkBehaviourServer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.NetworkBehaviourServer -{ - class NetworkBehaviourServer : NetworkBehaviour - { - [Server] - void ServerOnlyMethod() - { - // test method - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassClient.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassClient.cs deleted file mode 100644 index 0b3e6ebaf..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassClient.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.RegularClassClient -{ - class RegularClassClient - { - [Client] - void ClientOnlyMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassServer.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassServer.cs deleted file mode 100644 index 066bd968a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/RegularClassServer.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.RegularClassServer -{ - class RegularClassServer - { - [Server] - void ServerOnlyMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnAbstractMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnAbstractMethod.cs deleted file mode 100644 index 26e83bbc8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnAbstractMethod.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.ServerAttributeOnAbstractMethod -{ - abstract class ServerAttributeOnAbstractMethod : NetworkBehaviour - { - [Server] - protected abstract void ServerOnlyMethod(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnOverrideMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnOverrideMethod.cs deleted file mode 100644 index 82beea580..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnOverrideMethod.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.ServerAttributeOnOverrideMethod -{ - class ServerAttributeOnOverrideMethod : BaseClass - { - [Server] - protected override void ServerOnlyMethod() - { - // test method - } - } - - class BaseClass : NetworkBehaviour - { - protected virtual void ServerOnlyMethod() - { - // test method - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnVirutalMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnVirutalMethod.cs deleted file mode 100644 index 9e1cccee1..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/ServerAttributeOnVirutalMethod.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.ServerAttributeOnVirutalMethod -{ - class ServerAttributeOnVirutalMethod : NetworkBehaviour - { - [Server] - protected virtual void ServerOnlyMethod() - { - // test method - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassClient.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassClient.cs deleted file mode 100644 index 563bef3c1..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassClient.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.StaticClassClient -{ - static class StaticClassClient - { - [Client] - static void ClientOnlyMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassServer.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassServer.cs deleted file mode 100644 index 483eb239b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverClientServerAttributeTests~/StaticClassServer.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverClientServerAttributeTests.StaticClassServer -{ - static class StaticClassServer - { - [Server] - static void ServerOnlyMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs deleted file mode 100644 index 2c3a567b5..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs +++ /dev/null @@ -1,102 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverCommandTests : WeaverTestsBuildFromTestName - { - [Test] - public void CommandValid() - { - IsSuccess(); - } - - [Test] - public void CommandCantBeStatic() - { - HasError("CmdCantBeStatic must not be static", - "System.Void WeaverCommandTests.CommandCantBeStatic.CommandCantBeStatic::CmdCantBeStatic()"); - } - - [Test] - public void CommandThatIgnoresAuthority() - { - IsSuccess(); - } - - [Test] - public void CommandWithArguments() - { - IsSuccess(); - } - - [Test] - public void CommandThatIgnoresAuthorityWithSenderConnection() - { - IsSuccess(); - } - - [Test] - public void CommandWithSenderConnectionAndOtherArgs() - { - IsSuccess(); - } - - [Test] - public void ErrorForOptionalNetworkConnectionThatIsNotSenderConnection() - { - HasError("CmdFunction has invalid parameter connection, Cannot pass NetworkConnections. Instead use 'NetworkConnectionToClient conn = null' to get the sender's connection on the server", - "System.Void WeaverCommandTests.ErrorForOptionalNetworkConnectionThatIsNotSenderConnection.ErrorForOptionalNetworkConnectionThatIsNotSenderConnection::CmdFunction(Mirror.NetworkConnection)"); - } - - [Test] - public void ErrorForNetworkConnectionThatIsNotSenderConnection() - { - HasError("CmdFunction has invalid parameter connection, Cannot pass NetworkConnections. Instead use 'NetworkConnectionToClient conn = null' to get the sender's connection on the server", - "System.Void WeaverCommandTests.ErrorForNetworkConnectionThatIsNotSenderConnection.ErrorForNetworkConnectionThatIsNotSenderConnection::CmdFunction(Mirror.NetworkConnection)"); - } - - [Test] - public void VirtualCommand() - { - IsSuccess(); - } - - [Test] - public void OverrideVirtualCommand() - { - IsSuccess(); - } - - [Test] - public void OverrideVirtualCallBaseCommand() - { - IsSuccess(); - } - - [Test] - public void OverrideVirtualCallsBaseCommandWithMultipleBaseClasses() - { - IsSuccess(); - } - - [Test] - public void OverrideVirtualCallsBaseCommandWithOverride() - { - IsSuccess(); - } - - [Test] - public void AbstractCommand() - { - HasError("Abstract Commands are currently not supported, use virtual method instead", - "System.Void WeaverCommandTests.AbstractCommand.AbstractCommand::CmdDoSomething()"); - } - - [Test] - public void OverrideAbstractCommand() - { - HasError("Abstract Commands are currently not supported, use virtual method instead", - "System.Void WeaverCommandTests.OverrideAbstractCommand.BaseBehaviour::CmdDoSomething()"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs.meta deleted file mode 100644 index 4760a2ea7..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5d2e2e1e726925e4fab5f2460542844d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/AbstractCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/AbstractCommand.cs deleted file mode 100644 index ba1c2b5c9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/AbstractCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; - - -namespace WeaverCommandTests.AbstractCommand -{ - abstract class AbstractCommand : NetworkBehaviour - { - [Command] - protected abstract void CmdDoSomething(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandCantBeStatic.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandCantBeStatic.cs deleted file mode 100644 index e1ae6658f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandCantBeStatic.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.CommandCantBeStatic -{ - class CommandCantBeStatic : NetworkBehaviour - { - [Command] - static void CmdCantBeStatic() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthority.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthority.cs deleted file mode 100644 index d43697215..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthority.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.CommandThatIgnoresAuthority -{ - class CommandThatIgnoresAuthority : NetworkBehaviour - { - [Command(requiresAuthority = false)] - void CmdFunction() - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthorityWithSenderConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthorityWithSenderConnection.cs deleted file mode 100644 index 1b2161ac6..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandThatIgnoresAuthorityWithSenderConnection.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.CommandThatIgnoresAuthorityWithSenderConnection -{ - class CommandThatIgnoresAuthorityWithSenderConnection : NetworkBehaviour - { - [Command(requiresAuthority = false)] - void CmdFunction(NetworkConnectionToClient connection = null) - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandValid.cs deleted file mode 100644 index 5055cbf0f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandValid.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.CommandValid -{ - class CommandValid : NetworkBehaviour - { - [Command] - void CmdThatIsTotallyValid() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithArguments.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithArguments.cs deleted file mode 100644 index 416775729..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithArguments.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.CommandWithArguments -{ - class CommandWithArguments : NetworkBehaviour - { - [Command] - void CmdThatIsTotallyValid(int someNumber, NetworkIdentity someTarget) - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithSenderConnectionAndOtherArgs.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithSenderConnectionAndOtherArgs.cs deleted file mode 100644 index 7d4963fcb..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/CommandWithSenderConnectionAndOtherArgs.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.CommandWithSenderConnectionAndOtherArgs -{ - class CommandWithSenderConnectionAndOtherArgs : NetworkBehaviour - { - [Command(requiresAuthority = false)] - void CmdFunction(int someNumber, NetworkIdentity someTarget, NetworkConnectionToClient connection = null) - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForNetworkConnectionThatIsNotSenderConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForNetworkConnectionThatIsNotSenderConnection.cs deleted file mode 100644 index 1443a861b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForNetworkConnectionThatIsNotSenderConnection.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - - -namespace WeaverCommandTests.ErrorForNetworkConnectionThatIsNotSenderConnection -{ - class ErrorForNetworkConnectionThatIsNotSenderConnection : NetworkBehaviour - { - [Command(requiresAuthority = false)] - void CmdFunction(NetworkConnection connection) - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForOptionalNetworkConnectionThatIsNotSenderConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForOptionalNetworkConnectionThatIsNotSenderConnection.cs deleted file mode 100644 index b50c7f31d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/ErrorForOptionalNetworkConnectionThatIsNotSenderConnection.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.ErrorForOptionalNetworkConnectionThatIsNotSenderConnection -{ - class ErrorForOptionalNetworkConnectionThatIsNotSenderConnection : NetworkBehaviour - { - [Command(requiresAuthority = false)] - void CmdFunction(NetworkConnection connection = null) - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideAbstractCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideAbstractCommand.cs deleted file mode 100644 index ae6679d3a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideAbstractCommand.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - - -namespace WeaverCommandTests.OverrideAbstractCommand -{ - class OverrideAbstractCommand : BaseBehaviour - { - [Command] - protected override void CmdDoSomething() - { - // do something - } - } - - abstract class BaseBehaviour : NetworkBehaviour - { - [Command] - protected abstract void CmdDoSomething(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs deleted file mode 100644 index 0784e1700..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.OverrideVirtualCallBaseCommand -{ - class OverrideVirtualCallBaseCommand : baseBehaviour - { - [Command] - protected override void CmdDoSomething() - { - // do somethin - base.CmdDoSomething(); - } - } - - class baseBehaviour : NetworkBehaviour - { - [Command] - protected virtual void CmdDoSomething() - { - // do more stuff - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs deleted file mode 100644 index 842fa5561..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.OverrideVirtualCallsBaseCommandWithMultipleBaseClasses -{ - class OverrideVirtualCallsBaseCommandWithMultipleBaseClasses : middleBehaviour - { - [Command] - protected override void CmdDoSomething() - { - // do somethin - base.CmdDoSomething(); - } - } - - class middleBehaviour : baseBehaviour - { - } - - class baseBehaviour : NetworkBehaviour - { - [Command] - protected virtual void CmdDoSomething() - { - // do more stuff - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs deleted file mode 100644 index 35736d783..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.OverrideVirtualCallsBaseCommandWithOverride -{ - class OverrideVirtualCallsBaseCommandWithOverride : middleBehaviour - { - [Command] - protected override void CmdDoSomething() - { - // do something - base.CmdDoSomething(); - } - } - - - class middleBehaviour : baseBehaviour - { - [Command] - protected override void CmdDoSomething() - { - // do something else - base.CmdDoSomething(); - } - } - - class baseBehaviour : NetworkBehaviour - { - [Command] - protected virtual void CmdDoSomething() - { - // do more stuff - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs deleted file mode 100644 index c02684b24..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Mirror; - -namespace WeaverCommandTests.OverrideVirtualCommand -{ - class OverrideVirtualCommand : baseBehaviour - { - [Command] - protected override void CmdDoSomething() - { - // do something - } - } - - class baseBehaviour : NetworkBehaviour - { - [Command] - protected virtual void CmdDoSomething() - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/VirtualCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/VirtualCommand.cs deleted file mode 100644 index 493f23cc7..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/VirtualCommand.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - - -namespace WeaverCommandTests.VirtualCommand -{ - class VirtualCommand : NetworkBehaviour - { - [Command] - protected virtual void CmdDoSomething() - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs deleted file mode 100644 index 3d9b51240..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs +++ /dev/null @@ -1,19 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverGeneralTests : WeaverTestsBuildFromTestName - { - [Test] - public void RecursionCount() - { - IsSuccess(); - } - - [Test] - public void TestingScriptableObjectArraySerialization() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs.meta deleted file mode 100644 index cd88cdcef..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b531777359eb2fd4e97d78dea5d486ba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/RecursionCount.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/RecursionCount.cs deleted file mode 100644 index d5b55b723..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/RecursionCount.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Mirror; - -namespace WeaverGeneralTests.RecursionCount -{ - class RecursionCount : NetworkBehaviour - { - public class Potato0 - { - public int hamburgers = 17; - public Potato1 p1; - } - - public class Potato1 - { - public int hamburgers = 18; - public Potato0 p0; - } - - [SyncVar] - Potato0 recursionTime; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/TestingScriptableObjectArraySerialization.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/TestingScriptableObjectArraySerialization.cs deleted file mode 100644 index 654d64a0f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneralTests~/TestingScriptableObjectArraySerialization.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverGeneralTests.TestingScriptableObjectArraySerialization -{ - public static class CustomSerializer - { - public static void Writedata(this NetworkWriter writer, Data arg) - { - writer.WriteInt(arg.Var1); - } - - public static Data Readdata(this NetworkReader reader) - { - return new Data - { - Var1 = reader.ReadInt() - }; - } - } - - public class Data : ScriptableObject - { - public int Var1; - } - - public class TestingScriptableObjectArraySerialization : NetworkBehaviour - { - [Command] - public void - // This gonna give error saying-- Mirror.Weaver error: - // Cannot generate writer for scriptable object Data[]. Use a supported type or provide a custom writer - CmdwriteArraydata( - Data[] arg) - { - - //some code - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs deleted file mode 100644 index f9112fe09..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverGeneratedReaderWriterAnotherAssemblyTests : WeaverTestsBuildFromTestName - { - [Test] - public void CreatesForStructFromDifferentAssemblies() - { - IsSuccess(); - } - - [Test] - public void CreatesForClassFromDifferentAssemblies() - { - IsSuccess(); - } - - [Test] - public void CreatesForComplexTypeFromDifferentAssemblies() - { - IsSuccess(); - } - - [Test] - public void CreatesForTypeThatUsesDifferentAssemblies() - { - IsSuccess(); - } - - [Test] - public void CreatesForClassFromDifferentAssembliesWithValidConstructor() - { - IsSuccess(); - } - - [Test] - public void CanUseCustomReadWriteForTypesFromDifferentAssemblies() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs.meta deleted file mode 100644 index f3aff94b8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a2fc12fbf5fb9274dbeed361445f6cf3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CanUseCustomReadWriteForTypesFromDifferentAssemblies.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CanUseCustomReadWriteForTypesFromDifferentAssemblies.cs deleted file mode 100644 index 0673eb49d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CanUseCustomReadWriteForTypesFromDifferentAssemblies.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using Mirror.Weaver.Tests.Extra; - -namespace GeneratedReaderWriter.CanUseCustomReadWriteForTypesFromDifferentAssemblies -{ - public class CanUseCustomReadWriteForTypesFromDifferentAssemblies : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeDataWithWriter data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssemblies.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssemblies.cs deleted file mode 100644 index 78fc9b20b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssemblies.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using Mirror.Weaver.Tests.Extra; - -namespace GeneratedReaderWriter.CreatesForClassFromDifferentAssemblies -{ - public class CreatesForClassFromDifferentAssemblies : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeDataClass data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssembliesWithValidConstructor.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssembliesWithValidConstructor.cs deleted file mode 100644 index ddb3a95a4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForClassFromDifferentAssembliesWithValidConstructor.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using Mirror.Weaver.Tests.Extra; - -namespace GeneratedReaderWriter.CreatesForClassFromDifferentAssembliesWithValidConstructor -{ - public class CreatesForClassFromDifferentAssembliesWithValidConstructor : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeDataClassWithConstructor data) - { - // empty - } - } -} \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForComplexTypeFromDifferentAssemblies.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForComplexTypeFromDifferentAssemblies.cs deleted file mode 100644 index e9135dee6..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForComplexTypeFromDifferentAssemblies.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using Mirror.Weaver.Tests.Extra; - -namespace GeneratedReaderWriter.CreatesForComplexTypeFromDifferentAssemblies -{ - public class CreatesForComplexTypeFromDifferentAssemblies : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(ComplexData data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForStructFromDifferentAssemblies.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForStructFromDifferentAssemblies.cs deleted file mode 100644 index 6ce7e3c35..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForStructFromDifferentAssemblies.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using Mirror.Weaver.Tests.Extra; - -namespace GeneratedReaderWriter.CreatesForStructFromDifferentAssemblies -{ - public class CreatesForStructFromDifferentAssemblies : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeData data) - { - // empty - } - } -} \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForTypeThatUsesDifferentAssemblies.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForTypeThatUsesDifferentAssemblies.cs deleted file mode 100644 index f36998481..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterAnotherAssemblyTests~/CreatesForTypeThatUsesDifferentAssemblies.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Mirror; -using Mirror.Weaver.Tests.Extra; - -namespace GeneratedReaderWriter.CreatesForTypeThatUsesDifferentAssemblies -{ - public class CreatesForTypeThatUsesDifferentAssemblies : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(DataHolder data) - { - // empty - } - } - public struct DataHolder - { - public AnotherData another; - public float q; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs deleted file mode 100644 index ac1cddd0a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs +++ /dev/null @@ -1,218 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverGeneratedReaderWriterTests : WeaverTestsBuildFromTestName - { - [Test] - public void CreatesForStructs() - { - IsSuccess(); - } - - [Test] - public void CreatesForClass() - { - IsSuccess(); - } - - [Test] - public void CreatesForClassInherited() - { - IsSuccess(); - } - - [Test] - public void CreatesForClassWithValidConstructor() - { - IsSuccess(); - } - - [Test] - public void GivesErrorForClassWithNoValidConstructor() - { - HasError("SomeOtherData can't be deserialized because it has no default constructor. Don't use SomeOtherData in [SyncVar]s, Rpcs, Cmds, etc.", - "GeneratedReaderWriter.GivesErrorForClassWithNoValidConstructor.SomeOtherData"); - } - - [Test] - public void CreatesForInheritedFromScriptableObject() - { - IsSuccess(); - } - - [Test] - public void GivesErrorWhenUsingUnityAsset() - { - HasError("Material can't be deserialized because it has no default constructor. Don't use Material in [SyncVar]s, Rpcs, Cmds, etc.", - "UnityEngine.Material"); - } - - [Test] - public void GivesErrorWhenUsingObject() - { - // TODO: decide if we want to block sending of Object - // would only want to be send as an arg as a base type for an Inherited object - HasError("Cannot generate writer for Object. Use a supported type or provide a custom writer", - "UnityEngine.Object"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for Object. Use a supported type or provide a custom reader", - // "UnityEngine.Object"); - } - - [Test] - public void GivesErrorWhenUsingScriptableObject() - { - // TODO: decide if we want to block sending of ScripableObject - // would only want to be send as an arg as a base type for an Inherited object - HasError("Cannot generate writer for ScriptableObject. Use a supported type or provide a custom writer", - "UnityEngine.ScriptableObject"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for ScriptableObject. Use a supported type or provide a custom reader", - // "UnityEngine.ScriptableObject"); - } - - [Test] - public void GivesErrorWhenUsingMonoBehaviour() - { - HasError("Cannot generate writer for component type MonoBehaviour. Use a supported type or provide a custom writer", - "UnityEngine.MonoBehaviour"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for component type MonoBehaviour. Use a supported type or provide a custom reader", - // "UnityEngine.MonoBehaviour"); - } - - [Test] - public void GivesErrorWhenUsingTypeInheritedFromMonoBehaviour() - { - HasError("Cannot generate writer for component type MyBehaviour. Use a supported type or provide a custom writer", - "GeneratedReaderWriter.GivesErrorWhenUsingTypeInheritedFromMonoBehaviour.MyBehaviour"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for component type MyBehaviour. Use a supported type or provide a custom reader", - // "GeneratedReaderWriter.GivesErrorWhenUsingTypeInheritedFromMonoBehaviour.MyBehaviour"); - } - - [Test] - public void ExcludesNonSerializedFields() - { - // we test this by having a not allowed type in the class, but mark it with NonSerialized - IsSuccess(); - } - - [Test] - public void GivesErrorWhenUsingInterface() - { - HasError("Cannot generate writer for interface IData. Use a supported type or provide a custom writer", - "GeneratedReaderWriter.GivesErrorWhenUsingInterface.IData"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for interface IData. Use a supported type or provide a custom reader", - // "GeneratedReaderWriter.GivesErrorWhenUsingInterface.IData"); - } - - [Test] - public void CanUseCustomReadWriteForInterfaces() - { - IsSuccess(); - } - - [Test] - public void GivesErrorWhenUsingAbstractClass() - { - HasError("Cannot generate writer for abstract class DataBase. Use a supported type or provide a custom writer", - "GeneratedReaderWriter.GivesErrorWhenUsingAbstractClass.DataBase"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for abstract class DataBase. Use a supported type or provide a custom reader", - // "GeneratedReaderWriter.GivesErrorWhenUsingAbstractClass.DataBase"); - } - - [Test] - public void CanUseCustomReadWriteForAbstractClass() - { - IsSuccess(); - } - - [Test] - public void CreatesForEnums() - { - IsSuccess(); - } - - [Test] - public void CreatesForArraySegment() - { - IsSuccess(); - } - - [Test] - public void CreatesForStructArraySegment() - { - IsSuccess(); - } - - [Test] - public void GivesErrorForJaggedArray() - { - IsSuccess(); - } - - [Test] - public void GivesErrorForMultidimensionalArray() - { - HasError("Int32[0...,0...] is an unsupported type. Multidimensional arrays are not supported", - "System.Int32[0...,0...]"); - } - - [Test] - public void GivesErrorForInvalidArrayType() - { - HasError("Cannot generate writer for UnityEngine.MonoBehaviour[]. Use a supported type or provide a custom writer", - "UnityEngine.MonoBehaviour[]"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for Array because element MonoBehaviour does not have a reader. Use a supported type or provide a custom reader", - // "UnityEngine.MonoBehaviour[]"); - } - - [Test] - public void GivesErrorForInvalidArraySegmentType() - { - HasError("Cannot generate writer for System.ArraySegment`1. Use a supported type or provide a custom writer", - "System.ArraySegment`1"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for ArraySegment because element MonoBehaviour does not have a reader. Use a supported type or provide a custom reader", - // "System.ArraySegment`1"); - } - - [Test] - public void CreatesForList() - { - IsSuccess(); - } - - [Test] - public void CreatesForStructList() - { - IsSuccess(); - } - - [Test] - public void GivesErrorForInvalidListType() - { - HasError("Cannot generate writer for System.Collections.Generic.List`1. Use a supported type or provide a custom writer", - "System.Collections.Generic.List`1"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for List because element MonoBehaviour does not have a reader. Use a supported type or provide a custom reader", - // "System.Collections.Generic.List`1"); - } - - [Test, Ignore("Enable again when we don't have obsoletes in NetworkWriter anymore.")] - public void GivesWarningWhenRegisteringExistingExtensionMethod() - { - const string typeName = "GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.MyType"; - HasNoErrors(); - HasWarning($"Registering a Write method for {typeName} when one already exists", - "System.Void GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.ReadWriteExtension::WriteMyType2(Mirror.NetworkWriter,GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.MyType)"); - HasWarning($"Registering a Read method for {typeName} when one already exists", - "GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.MyType GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.ReadWriteExtension::ReadMyType2(Mirror.NetworkReader)"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs.meta deleted file mode 100644 index 53522fbf4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0ee83eef537268344880fa60f2c7a059 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForAbstractClass.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForAbstractClass.cs deleted file mode 100644 index 831ab34ae..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForAbstractClass.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.CanUseCustomReadWriteForAbstractClass -{ - public class CanUseCustomReadWriteForAbstractClass : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(DataBase data) - { - // empty - } - } - - public abstract class DataBase - { - public int someField; - public abstract int id { get; } - } - - public class SomeData : DataBase - { - public float anotherField; - public override int id => 1; - } - - public static class DataReadWrite - { - public static void WriteData(this NetworkWriter writer, DataBase data) - { - writer.WriteInt(data.id); - // write extra stuff depending on id here - writer.WriteInt(data.someField); - - if (data.id == 1) - { - SomeData someData = (SomeData)data; - writer.WriteFloat(someData.anotherField); - } - } - - public static DataBase ReadData(this NetworkReader reader) - { - int id = reader.ReadInt(); - - int someField = reader.ReadInt(); - DataBase data = null; - if (data.id == 1) - { - SomeData someData = new SomeData() - { - someField = someField - }; - // read extra stuff depending on id here - - someData.anotherField = reader.ReadFloat(); - - data = someData; - } - return data; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForInterfaces.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForInterfaces.cs deleted file mode 100644 index e80f22613..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CanUseCustomReadWriteForInterfaces.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.CanUseCustomReadWriteForInterfaces -{ - public class CanUseCustomReadWriteForInterfaces : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(IData data) - { - // empty - } - } - - public interface IData - { - int id { get; } - } - - public class SomeData : IData - { - public int id => 1; - } - - public static class DataReadWrite - { - public static void WriteData(this NetworkWriter writer, IData data) - { - writer.WriteInt(data.id); - // write extra stuff depending on id here - } - - public static IData ReadData(this NetworkReader reader) - { - int id = reader.ReadInt(); - // do something with id - - SomeData someData = new SomeData(); - // read extra stuff depending on id here - - return someData; - } - } - -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForArraySegment.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForArraySegment.cs deleted file mode 100644 index d43da5bf7..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForArraySegment.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Mirror; - -namespace GeneratedReaderWriter.CreatesForArraySegment -{ - public class CreatesForArraySegment : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(ArraySegment data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClass.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClass.cs deleted file mode 100644 index 8441d15ca..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClass.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.CreatesForClass -{ - public class CreatesForClass : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeOtherData data) - { - // empty - } - } - - public class SomeOtherData - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassInherited.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassInherited.cs deleted file mode 100644 index 81ad2cec1..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassInherited.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Mirror; - - -namespace GeneratedReaderWriter.CreatesForClassInherited -{ - public class CreatesForClassInherited : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeOtherData data) - { - // empty - } - } - - public class BaseData - { - public bool yes; - } - public class SomeOtherData : BaseData - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassWithValidConstructor.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassWithValidConstructor.cs deleted file mode 100644 index 8c8e604c9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForClassWithValidConstructor.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.CreatesForClassWithValidConstructor -{ - public class CreatesForClassWithValidConstructor : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeOtherData data) - { - // empty - } - } - - public class SomeOtherData - { - public int usefulNumber; - - public SomeOtherData() - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForEnums.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForEnums.cs deleted file mode 100644 index 379972c02..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForEnums.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.CreatesForEnums -{ - class CreatesForEnums : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(FunEnum data) - { - // empty - } - } - - public enum FunEnum - { - A, - B, - C, - D, - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForInheritedFromScriptableObject.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForInheritedFromScriptableObject.cs deleted file mode 100644 index bc28938ac..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForInheritedFromScriptableObject.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.CreatesForInheritedFromScriptableObject -{ - public class CreatesForInheritedFromScriptableObject : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(DataScriptableObject data) - { - // empty - } - } - - public class DataScriptableObject : ScriptableObject - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForList.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForList.cs deleted file mode 100644 index 12dabd46b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForList.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using Mirror; - -namespace GeneratedReaderWriter.CreatesForList -{ - public class CreatesForList : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(List data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructArraySegment.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructArraySegment.cs deleted file mode 100644 index 06e535949..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructArraySegment.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.CreatesForStructArraySegment -{ - public class CreatesForStructArraySegment : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(ArraySegment data) - { - // empty - } - } - - public struct MyStruct - { - public int someValue; - public Vector3 anotherValue; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructList.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructList.cs deleted file mode 100644 index 7b21dbd04..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructList.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.CreatesForStructList -{ - public class CreatesForStructList : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(List data) - { - // empty - } - } - - public struct MyStruct - { - public int someValue; - public Vector3 anotherValue; - } -} - diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructs.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructs.cs deleted file mode 100644 index 67ccb3e02..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/CreatesForStructs.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.CreatesForStructs -{ - public class CreatesForStructs : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeOtherData data) - { - // empty - } - } - - public struct SomeOtherData - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/ExcludesNonSerializedFields.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/ExcludesNonSerializedFields.cs deleted file mode 100644 index 89509f109..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/ExcludesNonSerializedFields.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.ExcludesNonSerializedFields -{ - public class ExcludesNonSerializedFields : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeDataUsingNonSerialized data) - { - // empty - } - } - - public struct SomeDataUsingNonSerialized - { - public int usefulNumber; - // Object is a not allowed type - [System.NonSerialized] public UnityEngine.Object obj; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForClassWithNoValidConstructor.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForClassWithNoValidConstructor.cs deleted file mode 100644 index 440bdf53a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForClassWithNoValidConstructor.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.GivesErrorForClassWithNoValidConstructor -{ - public class GivesErrorForClassWithNoValidConstructor : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(SomeOtherData data) - { - // empty - } - } - - public class SomeOtherData - { - public int usefulNumber; - - public SomeOtherData(int usefulNumber) - { - this.usefulNumber = usefulNumber; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArraySegmentType.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArraySegmentType.cs deleted file mode 100644 index d81c3ddbc..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArraySegmentType.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorForInvalidArraySegmentType -{ - public class GivesErrorForInvalidArraySegmentType : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(ArraySegment data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArrayType.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArrayType.cs deleted file mode 100644 index a63124e9d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidArrayType.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorForInvalidArrayType -{ - public class GivesErrorForInvalidArrayType : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(MonoBehaviour[] data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidListType.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidListType.cs deleted file mode 100644 index 8dfaeab11..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForInvalidListType.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorForInvalidListType -{ - public class GivesErrorForInvalidListType : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(List data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForJaggedArray.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForJaggedArray.cs deleted file mode 100644 index 236c54e4e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForJaggedArray.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.GivesErrorForJaggedArray -{ - public class GivesErrorForJaggedArray : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(int[][] data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForMultidimensionalArray.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForMultidimensionalArray.cs deleted file mode 100644 index 297fafa3f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorForMultidimensionalArray.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.GivesErrorForMultidimensionalArray -{ - public class GivesErrorForMultidimensionalArray : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(int[,] data) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingAbstractClass.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingAbstractClass.cs deleted file mode 100644 index a8929f446..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingAbstractClass.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingAbstractClass -{ - public class GivesErrorWhenUsingAbstractClass : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(DataBase data) - { - // empty - } - } - - public abstract class DataBase - { - public int someField; - public abstract int id { get; } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingInterface.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingInterface.cs deleted file mode 100644 index 2feaab8da..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingInterface.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingInterface -{ - public class GivesErrorWhenUsingInterface : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(IData data) - { - // empty - } - } - - public interface IData { } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingMonoBehaviour.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingMonoBehaviour.cs deleted file mode 100644 index 28ff7dcec..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingMonoBehaviour.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingMonoBehaviour -{ - public class GivesErrorWhenUsingMonoBehaviour : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(MonoBehaviour behaviour) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingObject.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingObject.cs deleted file mode 100644 index 753b8a80b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingObject.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingObject -{ - public class GivesErrorWhenUsingObject : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(Object obj) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingScriptableObject.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingScriptableObject.cs deleted file mode 100644 index fe0c3a55d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingScriptableObject.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingScriptableObject -{ - public class GivesErrorWhenUsingScriptableObject : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(ScriptableObject obj) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingTypeInheritedFromMonoBehaviour.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingTypeInheritedFromMonoBehaviour.cs deleted file mode 100644 index 628070d62..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingTypeInheritedFromMonoBehaviour.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingTypeInheritedFromMonoBehaviour -{ - public class GivesErrorWhenUsingTypeInheritedFromMonoBehaviour : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(MyBehaviour behaviour) - { - // empty - } - } - - public class MyBehaviour : MonoBehaviour - { - public int usefulNumber; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingUnityAsset.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingUnityAsset.cs deleted file mode 100644 index db2fbd8dd..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesErrorWhenUsingUnityAsset.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace GeneratedReaderWriter.GivesErrorWhenUsingUnityAsset -{ - public class GivesErrorForClassWithNoValidConstructor : NetworkBehaviour - { - [ClientRpc] - public void RpcDoSomething(Material material) - { - // empty - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesWarningWhenRegisteringExistingExtensionMethod.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesWarningWhenRegisteringExistingExtensionMethod.cs deleted file mode 100644 index 733589b79..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverGeneratedReaderWriterTests~/GivesWarningWhenRegisteringExistingExtensionMethod.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Mirror; - -namespace GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod -{ - public struct MyType - { - public int number; - } - - public static class ReadWriteExtension - { - public static void WriteMyType(this NetworkWriter writer, MyType data) - { - writer.WriteInt(data.number); - } - - public static void WriteMyType2(this NetworkWriter writer, MyType data) - { - writer.WriteInt(data.number); - } - - public static MyType ReadMyType(this NetworkReader reader) - { - return new MyType { number = reader.ReadInt() }; - } - - public static MyType ReadMyType2(this NetworkReader reader) - { - return new MyType { number = reader.ReadInt() }; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs deleted file mode 100644 index 10c4fb2b8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverMessageTests : WeaverTestsBuildFromTestName - { - [Test] - public void MessageValid() - { - IsSuccess(); - } - - [Test] - public void MessageWithBaseClass() - { - IsSuccess(); - } - - [Test] - public void MessageSelfReferencing() - { - IsSuccess(); - } - - [Test] - public void MessageMemberGeneric() - { - HasError("Cannot generate reader for generic variable HasGeneric`1. Use a supported type or provide a custom reader", - "WeaverMessageTests.MessageMemberGeneric.HasGeneric`1"); - HasError("invalidField has an unsupported type", - "WeaverMessageTests.MessageMemberGeneric.HasGeneric`1 WeaverMessageTests.MessageMemberGeneric.MessageMemberGeneric::invalidField"); - HasError("Cannot generate writer for generic type HasGeneric`1. Use a supported type or provide a custom writer", - "WeaverMessageTests.MessageMemberGeneric.HasGeneric`1"); - } - - [Test] - public void MessageMemberInterface() - { - HasError("Cannot generate reader for interface SuperCoolInterface. Use a supported type or provide a custom reader", - "WeaverMessageTests.MessageMemberInterface.SuperCoolInterface"); - HasError("invalidField has an unsupported type", - "WeaverMessageTests.MessageMemberInterface.SuperCoolInterface WeaverMessageTests.MessageMemberInterface.MessageMemberInterface::invalidField"); - HasError("Cannot generate writer for interface SuperCoolInterface. Use a supported type or provide a custom writer", - "WeaverMessageTests.MessageMemberInterface.SuperCoolInterface"); - } - - [Test] - public void MessageNestedInheritance() - { - IsSuccess(); - } - - [Test] - public void AbstractMessageMethods() - { - IsSuccess(); - } - } -} - diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs.meta deleted file mode 100644 index dae37dbf4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 29c6628d42055df42a471ce273c5a7c5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/AbstractMessageMethods.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/AbstractMessageMethods.cs deleted file mode 100644 index 0ca28ecea..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/AbstractMessageMethods.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - -namespace WeaverMessageTests.AbstractMessageMethods -{ - abstract class AbstractMessage : NetworkMessage - { - public abstract void Deserialize(NetworkReader reader); - public abstract void Serialize(NetworkWriter writer); - } - - class OverrideMessage : AbstractMessage - { - public int someValue; - - // Mirror will fill out these empty methods - - public override void Serialize(NetworkWriter writer) { } - public override void Deserialize(NetworkReader reader) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberGeneric.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberGeneric.cs deleted file mode 100644 index 9dcca9b9b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberGeneric.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace WeaverMessageTests.MessageMemberGeneric -{ - class HasGeneric { } - - class MessageMemberGeneric : NetworkMessage - { - public uint netId; - public Guid assetId; - public Vector3 position; - public Quaternion rotation; - public HasGeneric invalidField; - public byte[] payload; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberInterface.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberInterface.cs deleted file mode 100644 index 96c55221f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageMemberInterface.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace WeaverMessageTests.MessageMemberInterface -{ - interface SuperCoolInterface { } - - class MessageMemberInterface : NetworkMessage - { - public uint netId; - public Guid assetId; - public Vector3 position; - public Quaternion rotation; - public SuperCoolInterface invalidField; - public byte[] payload; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageNestedInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageNestedInheritance.cs deleted file mode 100644 index cd8113b94..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageNestedInheritance.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverMessageTests.MessageNestedInheritance -{ - public class Message : NetworkMessage - { - public class Request : Message - { - - } - - public class Response : Message - { - public int errorCode; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageSelfReferencing.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageSelfReferencing.cs deleted file mode 100644 index 9d861fe86..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageSelfReferencing.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace WeaverMessageTests.MessageSelfReferencing -{ - class MessageSelfReferencing : NetworkMessage - { - public uint netId; - public Guid assetId; - public Vector3 position; - public Quaternion rotation; - public MessageSelfReferencing selfReference = new MessageSelfReferencing(); - public byte[] payload; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageValid.cs deleted file mode 100644 index a4f130701..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageValid.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace WeaverMessageTests.MessageValid -{ - class MessageValid : NetworkMessage - { - public uint netId; - public Guid assetId; - public Vector3 position; - public Quaternion rotation; - public byte[] payload; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageWithBaseClass.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageWithBaseClass.cs deleted file mode 100644 index 31bae57e4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMessageTests~/MessageWithBaseClass.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Mirror; -using UnityEngine; - -namespace WeaverMessageTests.MessageWithBaseClass -{ - class MessageWithBaseClass : SomeBaseMessage - { - public uint netId; - public Guid assetId; - public Vector3 position; - public Quaternion rotation; - public byte[] payload; - } - - class SomeBaseMessage : NetworkMessage - { - public int myExtraType; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs deleted file mode 100644 index cf291210f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverMonoBehaviourTests : WeaverTestsBuildFromTestName - { - [Test] - public void MonoBehaviourValid() - { - IsSuccess(); - } - - [Test] - public void MonoBehaviourSyncVar() - { - HasError("SyncVar potato must be inside a NetworkBehaviour. MonoBehaviourSyncVar is not a NetworkBehaviour", - "System.Int32 WeaverMonoBehaviourTests.MonoBehaviourSyncVar.MonoBehaviourSyncVar::potato"); - } - - [Test] - public void MonoBehaviourSyncList() - { - HasError("potato is a SyncObject and must be inside a NetworkBehaviour. MonoBehaviourSyncList is not a NetworkBehaviour", - "Mirror.SyncList`1 WeaverMonoBehaviourTests.MonoBehaviourSyncList.MonoBehaviourSyncList::potato"); - } - - [Test] - public void MonoBehaviourCommand() - { - HasError("Command CmdThisCantBeOutsideNetworkBehaviour must be declared inside a NetworkBehaviour", - "System.Void WeaverMonoBehaviourTests.MonoBehaviourCommand.MonoBehaviourCommand::CmdThisCantBeOutsideNetworkBehaviour()"); - } - - [Test] - public void MonoBehaviourClientRpc() - { - HasError("ClientRpc RpcThisCantBeOutsideNetworkBehaviour must be declared inside a NetworkBehaviour", - "System.Void WeaverMonoBehaviourTests.MonoBehaviourClientRpc.MonoBehaviourClientRpc::RpcThisCantBeOutsideNetworkBehaviour()"); - } - - [Test] - public void MonoBehaviourTargetRpc() - { - HasError("TargetRpc TargetThisCantBeOutsideNetworkBehaviour must be declared inside a NetworkBehaviour", - "System.Void WeaverMonoBehaviourTests.MonoBehaviourTargetRpc.MonoBehaviourTargetRpc::TargetThisCantBeOutsideNetworkBehaviour(Mirror.NetworkConnection)"); - } - - [Test] - public void MonoBehaviourServer() - { - IsSuccess(); - } - - [Test] - public void MonoBehaviourServerCallback() - { - IsSuccess(); - } - - [Test] - public void MonoBehaviourClient() - { - IsSuccess(); - } - - [Test] - public void MonoBehaviourClientCallback() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs.meta deleted file mode 100644 index 9a127a7d8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 49f43099dd42441488962e7baf02a35e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClient.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClient.cs deleted file mode 100644 index a94b5e273..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClient.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourClient -{ - class MonoBehaviourClient : MonoBehaviour - { - [Client] - void ThisCantBeOutsideNetworkBehaviour() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientCallback.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientCallback.cs deleted file mode 100644 index 49c22323e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientCallback.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourClientCallback -{ - class MonoBehaviourClientCallback : MonoBehaviour - { - [ClientCallback] - void ThisCantBeOutsideNetworkBehaviour() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientRpc.cs deleted file mode 100644 index c85b92f12..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourClientRpc.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourClientRpc -{ - class MonoBehaviourClientRpc : MonoBehaviour - { - [ClientRpc] - void RpcThisCantBeOutsideNetworkBehaviour() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourCommand.cs deleted file mode 100644 index fd35c0551..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourCommand -{ - class MonoBehaviourCommand : MonoBehaviour - { - [Command] - void CmdThisCantBeOutsideNetworkBehaviour() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServer.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServer.cs deleted file mode 100644 index 548812654..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServer.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourServer -{ - class MonoBehaviourServer : MonoBehaviour - { - [Server] - void ThisCantBeOutsideNetworkBehaviour() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServerCallback.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServerCallback.cs deleted file mode 100644 index 1ce6075cb..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourServerCallback.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourServerCallback -{ - class MonoBehaviourServerCallback : MonoBehaviour - { - [ServerCallback] - void ThisCantBeOutsideNetworkBehaviour() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncList.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncList.cs deleted file mode 100644 index cba92f48d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncList.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourSyncList -{ - class MonoBehaviourSyncList : MonoBehaviour - { - SyncList potato; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncVar.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncVar.cs deleted file mode 100644 index 5727bab49..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourSyncVar.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourSyncVar -{ - class MonoBehaviourSyncVar : MonoBehaviour - { - [SyncVar] - int potato; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourTargetRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourTargetRpc.cs deleted file mode 100644 index 21318e671..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourTargetRpc.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourTargetRpc -{ - class MonoBehaviourTargetRpc : MonoBehaviour - { - [TargetRpc] - void TargetThisCantBeOutsideNetworkBehaviour(NetworkConnection nc) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourValid.cs deleted file mode 100644 index aff08cc67..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverMonoBehaviourTests~/MonoBehaviourValid.cs +++ /dev/null @@ -1,9 +0,0 @@ -using UnityEngine; - -namespace WeaverMonoBehaviourTests.MonoBehaviourValid -{ - class MonoBehaviourValid : MonoBehaviour - { - int monkeys = 12; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs deleted file mode 100644 index 95190497a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs +++ /dev/null @@ -1,282 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverNetworkBehaviourTests : WeaverTestsBuildFromTestName - { - [Test] - public void NetworkBehaviourValid() - { - IsSuccess(); - } - - [Test] - public void NetworkBehaviourAbstractBaseValid() - { - IsSuccess(); - } - - [Test] - public void NetworkBehaviourGeneric() - { - HasError("NetworkBehaviourGeneric`1 cannot have generic parameters", - "WeaverNetworkBehaviourTests.NetworkBehaviourGeneric.NetworkBehaviourGeneric`1"); - } - - [Test] - public void NetworkBehaviourCmdGenericParam() - { - HasError("CmdCantHaveGeneric cannot have generic parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdGenericParam.NetworkBehaviourCmdGenericParam::CmdCantHaveGeneric()"); - } - - [Test] - public void NetworkBehaviourCmdCoroutine() - { - HasError("CmdCantHaveCoroutine cannot be a coroutine", - "System.Collections.IEnumerator WeaverNetworkBehaviourTests.NetworkBehaviourCmdCoroutine.NetworkBehaviourCmdCoroutine::CmdCantHaveCoroutine()"); - } - - [Test] - public void NetworkBehaviourCmdVoidReturn() - { - HasError("CmdCantHaveNonVoidReturn cannot return a value. Make it void instead", - "System.Int32 WeaverNetworkBehaviourTests.NetworkBehaviourCmdVoidReturn.NetworkBehaviourCmdVoidReturn::CmdCantHaveNonVoidReturn()"); - } - - [Test] - public void NetworkBehaviourTargetRpcGenericParam() - { - HasError("TargetRpcCantHaveGeneric cannot have generic parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcGenericParam.NetworkBehaviourTargetRpcGenericParam::TargetRpcCantHaveGeneric()"); - } - - [Test] - public void NetworkBehaviourTargetRpcCoroutine() - { - HasError("TargetRpcCantHaveCoroutine cannot be a coroutine", - "System.Collections.IEnumerator WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcCoroutine.NetworkBehaviourTargetRpcCoroutine::TargetRpcCantHaveCoroutine()"); - } - - [Test] - public void NetworkBehaviourTargetRpcVoidReturn() - { - HasError("TargetRpcCantHaveNonVoidReturn cannot return a value. Make it void instead", - "System.Int32 WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcVoidReturn.NetworkBehaviourTargetRpcVoidReturn::TargetRpcCantHaveNonVoidReturn()"); - } - - [Test] - public void NetworkBehaviourTargetRpcParamOut() - { - HasError("TargetRpcCantHaveParamOut cannot have out parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamOut.NetworkBehaviourTargetRpcParamOut::TargetRpcCantHaveParamOut(Mirror.NetworkConnection,System.Int32&)"); - } - - [Test] - public void NetworkBehaviourTargetRpcParamOptional() - { - HasError("TargetRpcCantHaveParamOptional cannot have optional parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamOptional.NetworkBehaviourTargetRpcParamOptional::TargetRpcCantHaveParamOptional(Mirror.NetworkConnection,System.Int32)"); - } - - [Test] - public void NetworkBehaviourTargetRpcParamRef() - { - HasError("Cannot pass Int32& by reference", - "System.Int32&"); - HasError("TargetRpcCantHaveParamRef has invalid parameter monkeys", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamRef.NetworkBehaviourTargetRpcParamRef::TargetRpcCantHaveParamRef(Mirror.NetworkConnection,System.Int32&)"); - HasError("Cannot pass type Int32& by reference", - "System.Int32&"); - HasError("TargetRpcCantHaveParamRef has invalid parameter monkeys. Unsupported type System.Int32&, use a supported Mirror type instead", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamRef.NetworkBehaviourTargetRpcParamRef::TargetRpcCantHaveParamRef(Mirror.NetworkConnection,System.Int32&)"); - } - - [Test] - public void NetworkBehaviourTargetRpcParamAbstract() - { - HasError("Cannot generate writer for abstract class AbstractClass. Use a supported type or provide a custom writer", - "WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamAbstract.NetworkBehaviourTargetRpcParamAbstract/AbstractClass"); - // TODO change weaver to run checks for write/read at the same time - //HasError("AbstractClass can't be deserialized because it has no default constructor", - // "WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamAbstract.NetworkBehaviourTargetRpcParamAbstract/AbstractClass"); - } - - [Test] - public void NetworkBehaviourTargetRpcParamComponent() - { - HasError("Cannot generate writer for component type ComponentClass. Use a supported type or provide a custom writer", - "WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent/ComponentClass"); - HasError("TargetRpcCantHaveParamComponent has invalid parameter monkeyComp", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent::TargetRpcCantHaveParamComponent(Mirror.NetworkConnection,WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent/ComponentClass)"); - HasError("Cannot generate reader for component type ComponentClass. Use a supported type or provide a custom reader", - "WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent/ComponentClass"); - HasError("TargetRpcCantHaveParamComponent has invalid parameter monkeyComp. Unsupported type WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent/ComponentClass, use a supported Mirror type instead", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent::TargetRpcCantHaveParamComponent(Mirror.NetworkConnection,WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent.NetworkBehaviourTargetRpcParamComponent/ComponentClass)"); - } - - [Test] - public void NetworkBehaviourTargetRpcParamNetworkConnection() - { - IsSuccess(); - } - - [Test] - public void NetworkBehaviourTargetRpcDuplicateName() - { - HasError("Duplicate Target Rpc name TargetRpcCantHaveSameName", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcDuplicateName.NetworkBehaviourTargetRpcDuplicateName::TargetRpcCantHaveSameName(Mirror.NetworkConnection,System.Int32,System.Int32)"); - } - - [Test] - public void NetworkBehaviourClientRpcGenericParam() - { - HasError("RpcCantHaveGeneric cannot have generic parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcGenericParam.NetworkBehaviourClientRpcGenericParam::RpcCantHaveGeneric()"); - } - - [Test] - public void NetworkBehaviourClientRpcCoroutine() - { - HasError("RpcCantHaveCoroutine cannot be a coroutine", - "System.Collections.IEnumerator WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcCoroutine.NetworkBehaviourClientRpcCoroutine::RpcCantHaveCoroutine()"); - } - - [Test] - public void NetworkBehaviourClientRpcVoidReturn() - { - HasError("RpcCantHaveNonVoidReturn cannot return a value. Make it void instead", - "System.Int32 WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcVoidReturn.NetworkBehaviourClientRpcVoidReturn::RpcCantHaveNonVoidReturn()"); - } - - [Test] - public void NetworkBehaviourClientRpcParamOut() - { - HasError("RpcCantHaveParamOut cannot have out parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamOut.NetworkBehaviourClientRpcParamOut::RpcCantHaveParamOut(System.Int32&)"); - } - - [Test] - public void NetworkBehaviourClientRpcParamOptional() - { - HasError("RpcCantHaveParamOptional cannot have optional parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamOptional.NetworkBehaviourClientRpcParamOptional::RpcCantHaveParamOptional(System.Int32)"); - } - - [Test] - public void NetworkBehaviourClientRpcParamRef() - { - HasError("Cannot pass Int32& by reference", - "System.Int32&"); - HasError("RpcCantHaveParamRef has invalid parameter monkeys", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamRef.NetworkBehaviourClientRpcParamRef::RpcCantHaveParamRef(System.Int32&)"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot pass type Int32& by reference", - // "System.Int32&"); - //HasError("RpcCantHaveParamRef has invalid parameter monkeys. Unsupported type System.Int32&, use a supported Mirror type instead", - // "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamRef.NetworkBehaviourClientRpcParamRef::RpcCantHaveParamRef(System.Int32&)"); - } - - [Test] - public void NetworkBehaviourClientRpcParamAbstract() - { - HasError("Cannot generate writer for abstract class AbstractClass. Use a supported type or provide a custom writer", - "WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamAbstract.NetworkBehaviourClientRpcParamAbstract/AbstractClass"); - // TODO change weaver to run checks for write/read at the same time - //HasError("AbstractClass can't be deserialized because it has no default constructor", - // "WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamAbstract.NetworkBehaviourClientRpcParamAbstract/AbstractClass"); - } - - [Test] - public void NetworkBehaviourClientRpcParamComponent() - { - HasError("Cannot generate writer for component type ComponentClass. Use a supported type or provide a custom writer", - "WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent/ComponentClass"); - HasError("RpcCantHaveParamComponent has invalid parameter monkeyComp", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent::RpcCantHaveParamComponent(WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent/ComponentClass)"); - // TODO change weaver to run checks for write/read at the same time - //HasError("Cannot generate reader for component type ComponentClass. Use a supported type or provide a custom reader", - // "WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent/ComponentClass"); - //HasError("RpcCantHaveParamComponent has invalid parameter monkeyComp. Unsupported type WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent/ComponentClass, use a supported Mirror type instead", - // "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent::RpcCantHaveParamComponent(WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent.NetworkBehaviourClientRpcParamComponent/ComponentClass)"); - } - - [Test] - public void NetworkBehaviourClientRpcParamNetworkConnection() - { - HasError("RpcCantHaveParamOptional has invalid parameter monkeyCon. Cannot pass NetworkConnections", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamNetworkConnection.NetworkBehaviourClientRpcParamNetworkConnection::RpcCantHaveParamOptional(Mirror.NetworkConnection)"); - } - - [Test] - public void NetworkBehaviourClientRpcDuplicateName() - { - HasError("Duplicate ClientRpc name RpcCantHaveSameName", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcDuplicateName.NetworkBehaviourClientRpcDuplicateName::RpcCantHaveSameName(System.Int32,System.Int32)"); - } - - [Test] - public void NetworkBehaviourCmdParamOut() - { - HasError("CmdCantHaveParamOut cannot have out parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamOut.NetworkBehaviourCmdParamOut::CmdCantHaveParamOut(System.Int32&)"); - } - - [Test] - public void NetworkBehaviourCmdParamOptional() - { - HasError("CmdCantHaveParamOptional cannot have optional parameters", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamOptional.NetworkBehaviourCmdParamOptional::CmdCantHaveParamOptional(System.Int32)"); - } - - [Test] - public void NetworkBehaviourCmdParamRef() - { - HasError("Cannot pass Int32& by reference", - "System.Int32&"); - HasError("CmdCantHaveParamRef has invalid parameter monkeys", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamRef.NetworkBehaviourCmdParamRef::CmdCantHaveParamRef(System.Int32&)"); - HasError("Cannot pass type Int32& by reference", - "System.Int32&"); - HasError("CmdCantHaveParamRef has invalid parameter monkeys. Unsupported type System.Int32&, use a supported Mirror type instead", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamRef.NetworkBehaviourCmdParamRef::CmdCantHaveParamRef(System.Int32&)"); - } - - [Test] - public void NetworkBehaviourCmdParamAbstract() - { - HasError("Cannot generate writer for abstract class AbstractClass. Use a supported type or provide a custom writer", - "WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamAbstract.NetworkBehaviourCmdParamAbstract/AbstractClass"); - // TODO change weaver to run checks for write/read at the same time - //HasError("AbstractClass can't be deserialized because it has no default constructor", - // "WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamAbstract.NetworkBehaviourCmdParamAbstract/AbstractClass"); - } - - [Test] - public void NetworkBehaviourCmdParamComponent() - { - HasError("Cannot generate writer for component type ComponentClass. Use a supported type or provide a custom writer", - "WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent/ComponentClass"); - HasError("CmdCantHaveParamComponent has invalid parameter monkeyComp", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent::CmdCantHaveParamComponent(WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent/ComponentClass)"); - HasError("Cannot generate reader for component type ComponentClass. Use a supported type or provide a custom reader", - "WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent/ComponentClass"); - HasError("CmdCantHaveParamComponent has invalid parameter monkeyComp. Unsupported type WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent/ComponentClass, use a supported Mirror type instead", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent::CmdCantHaveParamComponent(WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent.NetworkBehaviourCmdParamComponent/ComponentClass)"); - } - - [Test] - public void NetworkBehaviourCmdParamNetworkConnection() - { - HasError("CmdCantHaveParamOptional has invalid parameter monkeyCon, Cannot pass NetworkConnections. Instead use 'NetworkConnectionToClient conn = null' to get the sender's connection on the server", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamNetworkConnection.NetworkBehaviourCmdParamNetworkConnection::CmdCantHaveParamOptional(Mirror.NetworkConnection)"); - } - - [Test] - public void NetworkBehaviourCmdDuplicateName() - { - HasError("Duplicate Command name CmdCantHaveSameName", - "System.Void WeaverNetworkBehaviourTests.NetworkBehaviourCmdDuplicateName.NetworkBehaviourCmdDuplicateName::CmdCantHaveSameName(System.Int32,System.Int32)"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs.meta deleted file mode 100644 index db360898f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f8a452672efda084f8743b29ae9592f7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourAbstractBaseValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourAbstractBaseValid.cs deleted file mode 100644 index 624e3fe44..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourAbstractBaseValid.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourAbstractBaseValid -{ - public abstract class EntityBase : NetworkBehaviour { } - - public class EntityConcrete : EntityBase - { - [SyncVar] - public int abstractDerivedSync; - } - - public class NetworkBehaviourAbstractBaseValid : EntityConcrete - { - [SyncVar] - public int concreteDerivedSync; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcCoroutine.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcCoroutine.cs deleted file mode 100644 index 0434b94fe..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcCoroutine.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections; -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcCoroutine -{ - class NetworkBehaviourClientRpcCoroutine : NetworkBehaviour - { - [ClientRpc] - public IEnumerator RpcCantHaveCoroutine() - { - yield return null; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcDuplicateName.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcDuplicateName.cs deleted file mode 100644 index 20e214a3e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcDuplicateName.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcDuplicateName -{ - class NetworkBehaviourClientRpcDuplicateName : NetworkBehaviour - { - [ClientRpc] - public void RpcCantHaveSameName(int abc) { } - - [ClientRpc] - public void RpcCantHaveSameName(int abc, int def) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcGenericParam.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcGenericParam.cs deleted file mode 100644 index 5cef7dc41..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcGenericParam.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcGenericParam -{ - class NetworkBehaviourClientRpcGenericParam : NetworkBehaviour - { - [ClientRpc] - public void RpcCantHaveGeneric() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamAbstract.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamAbstract.cs deleted file mode 100644 index a5c51de73..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamAbstract.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamAbstract -{ - class NetworkBehaviourClientRpcParamAbstract : NetworkBehaviour - { - public abstract class AbstractClass - { - int monkeys = 12; - } - - [ClientRpc] - public void RpcCantHaveParamAbstract(AbstractClass monkeys) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamComponent.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamComponent.cs deleted file mode 100644 index 1208e3822..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamComponent -{ - class NetworkBehaviourClientRpcParamComponent : NetworkBehaviour - { - public class ComponentClass : UnityEngine.Component - { - int monkeys = 12; - } - - [ClientRpc] - public void RpcCantHaveParamComponent(ComponentClass monkeyComp) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamNetworkConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamNetworkConnection.cs deleted file mode 100644 index 912c2f2ee..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamNetworkConnection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamNetworkConnection -{ - class NetworkBehaviourClientRpcParamNetworkConnection : NetworkBehaviour - { - [ClientRpc] - public void RpcCantHaveParamOptional(NetworkConnection monkeyCon) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOptional.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOptional.cs deleted file mode 100644 index 03215101c..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOptional.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamOptional -{ - class NetworkBehaviourClientRpcParamOptional : NetworkBehaviour - { - [ClientRpc] - public void RpcCantHaveParamOptional(int monkeys = 12) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOut.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOut.cs deleted file mode 100644 index 7225adb0b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamOut.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamOut -{ - class NetworkBehaviourClientRpcParamOut : NetworkBehaviour - { - [ClientRpc] - public void RpcCantHaveParamOut(out int monkeys) - { - monkeys = 12; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamRef.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamRef.cs deleted file mode 100644 index 3de256360..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcParamRef.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcParamRef -{ - class NetworkBehaviourClientRpcParamRef : NetworkBehaviour - { - [ClientRpc] - public void RpcCantHaveParamRef(ref int monkeys) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcVoidReturn.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcVoidReturn.cs deleted file mode 100644 index 75d31847a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourClientRpcVoidReturn.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourClientRpcVoidReturn -{ - class NetworkBehaviourClientRpcVoidReturn : NetworkBehaviour - { - [ClientRpc] - public int RpcCantHaveNonVoidReturn() - { - return 1; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdCoroutine.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdCoroutine.cs deleted file mode 100644 index 39bf66076..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdCoroutine.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections; -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdCoroutine -{ - class NetworkBehaviourCmdCoroutine : NetworkBehaviour - { - [Command] - public IEnumerator CmdCantHaveCoroutine() - { - yield return null; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdDuplicateName.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdDuplicateName.cs deleted file mode 100644 index f1ac1c8ab..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdDuplicateName.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdDuplicateName -{ - class NetworkBehaviourCmdDuplicateName : NetworkBehaviour - { - [Command] - public void CmdCantHaveSameName(int abc) { } - - [Command] - public void CmdCantHaveSameName(int abc, int def) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdGenericParam.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdGenericParam.cs deleted file mode 100644 index 2e10933f5..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdGenericParam.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdGenericParam -{ - class NetworkBehaviourCmdGenericParam : NetworkBehaviour - { - [Command] - public void CmdCantHaveGeneric() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamAbstract.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamAbstract.cs deleted file mode 100644 index d6bac6044..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamAbstract.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamAbstract -{ - class NetworkBehaviourCmdParamAbstract : NetworkBehaviour - { - public abstract class AbstractClass - { - int monkeys = 12; - } - - [Command] - public void CmdCantHaveParamAbstract(AbstractClass monkeys) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamComponent.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamComponent.cs deleted file mode 100644 index e39f8a313..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamComponent -{ - class NetworkBehaviourCmdParamComponent : NetworkBehaviour - { - public class ComponentClass : UnityEngine.Component - { - int monkeys = 12; - } - - [Command] - public void CmdCantHaveParamComponent(ComponentClass monkeyComp) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamNetworkConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamNetworkConnection.cs deleted file mode 100644 index 9ad198a1b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamNetworkConnection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamNetworkConnection -{ - class NetworkBehaviourCmdParamNetworkConnection : NetworkBehaviour - { - [Command] - public void CmdCantHaveParamOptional(NetworkConnection monkeyCon) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOptional.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOptional.cs deleted file mode 100644 index 509715d2a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOptional.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamOptional -{ - class NetworkBehaviourCmdParamOptional : NetworkBehaviour - { - [Command] - public void CmdCantHaveParamOptional(int monkeys = 12) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOut.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOut.cs deleted file mode 100644 index 2999339fe..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamOut.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamOut -{ - class NetworkBehaviourCmdParamOut : NetworkBehaviour - { - [Command] - public void CmdCantHaveParamOut(out int monkeys) - { - monkeys = 12; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamRef.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamRef.cs deleted file mode 100644 index 54fd0d0e4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdParamRef.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdParamRef -{ - class NetworkBehaviourCmdParamRef : NetworkBehaviour - { - [Command] - public void CmdCantHaveParamRef(ref int monkeys) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdVoidReturn.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdVoidReturn.cs deleted file mode 100644 index 1015efdee..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourCmdVoidReturn.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourCmdVoidReturn -{ - class NetworkBehaviourCmdVoidReturn : NetworkBehaviour - { - [Command] - public int CmdCantHaveNonVoidReturn() - { - return 1; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourGeneric.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourGeneric.cs deleted file mode 100644 index c6deba0bb..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourGeneric.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourGeneric -{ - class NetworkBehaviourGeneric : NetworkBehaviour - { - T genericsNotAllowed; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcCoroutine.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcCoroutine.cs deleted file mode 100644 index dbd8c13fe..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcCoroutine.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections; -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcCoroutine -{ - class NetworkBehaviourTargetRpcCoroutine : NetworkBehaviour - { - [TargetRpc] - public IEnumerator TargetRpcCantHaveCoroutine() - { - yield return null; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcDuplicateName.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcDuplicateName.cs deleted file mode 100644 index 4a26ff2e9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcDuplicateName.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcDuplicateName -{ - class NetworkBehaviourTargetRpcDuplicateName : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveSameName(NetworkConnection monkeyCon, int abc) { } - - [TargetRpc] - public void TargetRpcCantHaveSameName(NetworkConnection monkeyCon, int abc, int def) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcGenericParam.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcGenericParam.cs deleted file mode 100644 index c37431d67..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcGenericParam.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcGenericParam -{ - class NetworkBehaviourTargetRpcGenericParam : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveGeneric() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamAbstract.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamAbstract.cs deleted file mode 100644 index fb8938fb3..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamAbstract.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamAbstract -{ - class NetworkBehaviourTargetRpcParamAbstract : NetworkBehaviour - { - public abstract class AbstractClass - { - int monkeys = 12; - } - - [TargetRpc] - public void TargetRpcCantHaveParamAbstract(NetworkConnection monkeyCon, AbstractClass monkeys) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamComponent.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamComponent.cs deleted file mode 100644 index b2287761d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamComponent -{ - class NetworkBehaviourTargetRpcParamComponent : NetworkBehaviour - { - public class ComponentClass : UnityEngine.Component - { - int monkeys = 12; - } - - [TargetRpc] - public void TargetRpcCantHaveParamComponent(NetworkConnection monkeyCon, ComponentClass monkeyComp) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnection.cs deleted file mode 100644 index 9b5559176..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamNetworkConnection -{ - class NetworkBehaviourTargetRpcParamNetworkConnection : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveParamOptional(NetworkConnection monkeyCon) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnectionNotFirst.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnectionNotFirst.cs deleted file mode 100644 index 38466a3b8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamNetworkConnectionNotFirst.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamNetworkConnectionNotFirst -{ - class NetworkBehaviourTargetRpcParamNetworkConnectionNotFirst : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveParamOptional(int abc, NetworkConnection monkeyCon) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOptional.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOptional.cs deleted file mode 100644 index ea4655c52..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOptional.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamOptional -{ - class NetworkBehaviourTargetRpcParamOptional : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveParamOptional(NetworkConnection monkeyCon, int monkeys = 12) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOut.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOut.cs deleted file mode 100644 index 0892aa1a7..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamOut.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamOut -{ - class NetworkBehaviourTargetRpcParamOut : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveParamOut(NetworkConnection monkeyCon, out int monkeys) - { - monkeys = 12; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamRef.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamRef.cs deleted file mode 100644 index 3279878a0..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcParamRef.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcParamRef -{ - class NetworkBehaviourTargetRpcParamRef : NetworkBehaviour - { - [TargetRpc] - public void TargetRpcCantHaveParamRef(NetworkConnection monkeyCon, ref int monkeys) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcVoidReturn.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcVoidReturn.cs deleted file mode 100644 index e44356aa1..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourTargetRpcVoidReturn.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcVoidReturn -{ - class NetworkBehaviourTargetRpcVoidReturn : NetworkBehaviour - { - [TargetRpc] - public int TargetRpcCantHaveNonVoidReturn() - { - return 1; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourValid.cs deleted file mode 100644 index bb9f6c975..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverNetworkBehaviourTests~/NetworkBehaviourValid.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverNetworkBehaviourTests.NetworkBehaviourValid -{ - class MirrorTestPlayer : NetworkBehaviour - { - [SyncVar] - public int durpatron9000 = 12; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs deleted file mode 100644 index 352c73090..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs +++ /dev/null @@ -1,80 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - // Some tests for SyncObjects are in WeaverSyncListTests and apply to SyncDictionary too - public class WeaverSyncDictionaryTests : WeaverTestsBuildFromTestName - { - [Test] - public void SyncDictionary() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryGenericAbstractInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryGenericInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryStructKey() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryStructItem() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryErrorForGenericStructKey() - { - HasError("Cannot generate reader for generic variable MyGenericStruct`1. Use a supported type or provide a custom reader", - "WeaverSyncDictionaryTests.SyncDictionaryErrorForGenericStructKey.SyncDictionaryErrorForGenericStructKey/MyGenericStruct`1"); - HasError("Cannot generate writer for generic type MyGenericStruct`1. Use a supported type or provide a custom writer", - "WeaverSyncDictionaryTests.SyncDictionaryErrorForGenericStructKey.SyncDictionaryErrorForGenericStructKey/MyGenericStruct`1"); - } - - [Test] - public void SyncDictionaryErrorForGenericStructItem() - { - HasError("Cannot generate reader for generic variable MyGenericStruct`1. Use a supported type or provide a custom reader", - "WeaverSyncDictionaryTests.SyncDictionaryErrorForGenericStructItem.SyncDictionaryErrorForGenericStructItem/MyGenericStruct`1"); - HasError("Cannot generate writer for generic type MyGenericStruct`1. Use a supported type or provide a custom writer", - "WeaverSyncDictionaryTests.SyncDictionaryErrorForGenericStructItem.SyncDictionaryErrorForGenericStructItem/MyGenericStruct`1"); - } - - [Test] - public void SyncDictionaryGenericStructKeyWithCustomMethods() - { - IsSuccess(); - } - - [Test] - public void SyncDictionaryGenericStructItemWithCustomMethods() - { - IsSuccess(); - } - - [Test] - public void GenericSyncDictionaryCanBeUsed() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs.meta deleted file mode 100644 index a96f8c071..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de75571c46d27c34bb2c6a67d5eac558 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/GenericSyncDictionaryCanBeUsed.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/GenericSyncDictionaryCanBeUsed.cs deleted file mode 100644 index 1b85dd439..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/GenericSyncDictionaryCanBeUsed.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.GenericSyncDictionaryCanBeUsed -{ - class GenericSyncDictionaryCanBeUsed : NetworkBehaviour - { - readonly SomeSyncDictionary someDictionary; - - public class SomeSyncDictionary : SyncDictionary { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionary.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionary.cs deleted file mode 100644 index 0c1e03177..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionary.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionary -{ - class SyncDictionaryValid : NetworkBehaviour - { - public class SyncDictionaryIntString : SyncDictionary { } - - public readonly SyncDictionaryIntString Foo; - } - - -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructItem.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructItem.cs deleted file mode 100644 index 75e80b81d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructItem.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryErrorForGenericStructItem -{ - class SyncDictionaryErrorForGenericStructItem : NetworkBehaviour - { - struct MyGenericStruct - { - T genericpotato; - } - - class MyGenericStructDictionary : SyncDictionary> { }; - - readonly MyGenericStructDictionary harpseals; - } - -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructKey.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructKey.cs deleted file mode 100644 index 9b3b4bfd9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryErrorForGenericStructKey.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryErrorForGenericStructKey -{ - class SyncDictionaryErrorForGenericStructKey : NetworkBehaviour - { - readonly MyGenericStructDictionary harpseals; - - struct MyGenericStruct - { - T genericpotato; - } - - class MyGenericStructDictionary : SyncDictionary, int> { }; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericAbstractInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericAbstractInheritance.cs deleted file mode 100644 index fd62e9643..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericAbstractInheritance.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryGenericAbstractInheritance -{ - class SyncDictionaryGenericAbstractInheritance : NetworkBehaviour - { - readonly SomeDictionaryIntString dictionary = new SomeDictionaryIntString(); - - public abstract class SomeDictionary : SyncDictionary { } - - public class SomeDictionaryIntString : SomeDictionary { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericInheritance.cs deleted file mode 100644 index 47778b85a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericInheritance.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryGenericInheritance -{ - class SyncDictionaryGenericInheritance : NetworkBehaviour - { - readonly SomeDictionaryIntString dictionary = new SomeDictionaryIntString(); - - public class SomeDictionary : SyncDictionary { } - - public class SomeDictionaryIntString : SomeDictionary { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructItemWithCustomMethods.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructItemWithCustomMethods.cs deleted file mode 100644 index 049ee8f83..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructItemWithCustomMethods.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryGenericStructItemWithCustomMethods -{ - class SyncDictionaryGenericStructItemWithCustomMethods : NetworkBehaviour - { - readonly SyncDictionary> harpseals; - } - - public struct MyGenericStruct - { - public T genericpotato; - } - - public static class MyGenericStructDictionary - { - public static void WriteItem(this NetworkWriter writer, MyGenericStruct item) - { - writer.WriteFloat(item.genericpotato); - } - - public static MyGenericStruct ReadItem(this NetworkReader reader) - { - return new MyGenericStruct() { genericpotato = reader.ReadFloat() }; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructKeyWithCustomMethods.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructKeyWithCustomMethods.cs deleted file mode 100644 index a5942f22e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryGenericStructKeyWithCustomMethods.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryGenericStructKeyWithCustomMethods -{ - class SyncDictionaryGenericStructKeyWithCustomMethods : NetworkBehaviour - { - readonly SyncDictionary, int> harpseals; - } - - public struct MyGenericStruct - { - public T genericpotato; - } - - public static class MyGenericStructDictionary - { - public static void WriteKey(this NetworkWriter writer, MyGenericStruct item) - { - writer.WriteFloat(item.genericpotato); - } - - public static MyGenericStruct ReadKey(this NetworkReader reader) - { - return new MyGenericStruct() { genericpotato = reader.ReadFloat() }; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryInheritance.cs deleted file mode 100644 index 6d2f207fe..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryInheritance.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryInheritance -{ - class SyncDictionaryInheritance : NetworkBehaviour - { - readonly SuperDictionary dictionary = new SuperDictionary(); - - public class SomeDictionary : SyncDictionary { } - - public class SomeDictionaryIntString : SomeDictionary { } - - public class SuperDictionary : SomeDictionaryIntString - { - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructItem.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructItem.cs deleted file mode 100644 index 8a63b53fe..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructItem.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryStructItem -{ - class SyncDictionaryStructItem : NetworkBehaviour - { - readonly MyStructDictionary Foo; - - struct MyStruct - { - public int potato; - public float floatingpotato; - public double givemetwopotatoes; - } - class MyStructDictionary : SyncDictionary { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructKey.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructKey.cs deleted file mode 100644 index 7476a228d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncDictionaryTests~/SyncDictionaryStructKey.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncDictionaryTests.SyncDictionaryStructKey -{ - class SyncDictionaryStructKey : NetworkBehaviour - { - readonly MyStructDictionary Foo; - - struct MyStruct - { - public int potato; - public float floatingpotato; - public double givemetwopotatoes; - } - class MyStructDictionary : SyncDictionary { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs deleted file mode 100644 index 07c3aaa00..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs +++ /dev/null @@ -1,140 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverSyncListTests : WeaverTestsBuildFromTestName - { - [Test] - public void SyncList() - { - IsSuccess(); - } - - [Test] - public void SyncListByteValid() - { - IsSuccess(); - } - - [Test] - public void SyncListGenericAbstractInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncListGenericInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncListGenericInheritanceWithMultipleGeneric() - { - IsSuccess(); - } - - [Test] - public void SyncListInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncListMissingParamlessCtor() - { - IsSuccess(); - } - - [Test] - public void SyncListMissingParamlessCtorManuallyInitialized() - { - IsSuccess(); - } - - [Test] - public void SyncListNestedStruct() - { - IsSuccess(); - } - - [Test] - public void SyncListNestedInAbstractClass() - { - IsSuccess(); - } - - [Test] - public void SyncListNestedInAbstractClassWithInvalid() - { - // we need this negative test to make sure that SyncList is being processed - HasError("Cannot generate reader for Object. Use a supported type or provide a custom reader", - "UnityEngine.Object"); - HasError("target has an unsupported type", - "UnityEngine.Object WeaverSyncListTests.SyncListNestedInAbstractClassWithInvalid.SyncListNestedStructWithInvalid/SomeAbstractClass/MyNestedStruct::target"); - HasError("Cannot generate writer for Object. Use a supported type or provide a custom writer", - "UnityEngine.Object"); - } - - [Test] - public void SyncListNestedInStruct() - { - IsSuccess(); - } - - [Test] - public void SyncListNestedInStructWithInvalid() - { - // we need this negative test to make sure that SyncList is being processed - HasError("Cannot generate reader for Object. Use a supported type or provide a custom reader", - "UnityEngine.Object"); - HasError("target has an unsupported type", - "UnityEngine.Object WeaverSyncListTests.SyncListNestedInStructWithInvalid.SyncListNestedInStructWithInvalid/SomeData::target"); - HasError("Cannot generate writer for Object. Use a supported type or provide a custom writer", - "UnityEngine.Object"); - - } - - [Test] - public void SyncListStruct() - { - IsSuccess(); - } - - [Test] - public void SyncListErrorForGenericStruct() - { - HasError("Cannot generate reader for generic variable MyGenericStruct`1. Use a supported type or provide a custom reader", - "WeaverSyncListTests.SyncListErrorForGenericStruct.SyncListErrorForGenericStruct/MyGenericStruct`1"); - HasError("Cannot generate writer for generic type MyGenericStruct`1. Use a supported type or provide a custom writer", - "WeaverSyncListTests.SyncListErrorForGenericStruct.SyncListErrorForGenericStruct/MyGenericStruct`1"); - } - - [Test] - public void SyncListGenericStructWithCustomMethods() - { - IsSuccess(); - } - - [Test] - public void SyncListErrorForInterface() - { - HasError("Cannot generate reader for interface MyInterface. Use a supported type or provide a custom reader", - "WeaverSyncListTests.SyncListErrorForInterface.MyInterface"); - HasError("Cannot generate writer for interface MyInterface. Use a supported type or provide a custom writer", - "WeaverSyncListTests.SyncListErrorForInterface.MyInterface"); - } - - [Test] - public void SyncListInterfaceWithCustomMethods() - { - IsSuccess(); - } - - [Test] - public void GenericSyncListCanBeUsed() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs.meta deleted file mode 100644 index 4fff813e9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 40a07120cf158ca4e98a01d79c7b48e0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/GenericSyncListCanBeUsed.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/GenericSyncListCanBeUsed.cs deleted file mode 100644 index 86be36c42..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/GenericSyncListCanBeUsed.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.GenericSyncListCanBeUsed -{ - class GenericSyncListCanBeUsed : NetworkBehaviour - { - readonly SomeList someList; - - - public class SomeList : SyncList { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncList.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncList.cs deleted file mode 100644 index 174d28803..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncList.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncList -{ - class SyncList : NetworkBehaviour - { - public readonly SyncList Foo; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListByteValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListByteValid.cs deleted file mode 100644 index c073ca875..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListByteValid.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListByteValid -{ - class SyncListByteValid : NetworkBehaviour - { - class MyByteClass : SyncList { }; - - readonly MyByteClass Foo; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForGenericStruct.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForGenericStruct.cs deleted file mode 100644 index 3809172b4..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForGenericStruct.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListErrorForGenericStruct -{ - class SyncListErrorForGenericStruct : NetworkBehaviour - { - MyGenericStructList harpseals; - - - struct MyGenericStruct - { - T genericpotato; - } - - class MyGenericStructList : SyncList> { }; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForInterface.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForInterface.cs deleted file mode 100644 index 2e059b324..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListErrorForInterface.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListErrorForInterface -{ - class SyncListErrorForInterface : NetworkBehaviour - { - MyInterfaceList Foo; - } - interface MyInterface - { - int someNumber { get; set; } - } - class MyInterfaceList : SyncList { } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericAbstractInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericAbstractInheritance.cs deleted file mode 100644 index 8821f81aa..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericAbstractInheritance.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListGenericAbstractInheritance -{ - class SyncListGenericAbstractInheritance : NetworkBehaviour - { - readonly SomeListInt superSyncListString = new SomeListInt(); - - - public abstract class SomeList : SyncList { } - - public class SomeListInt : SomeList { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritance.cs deleted file mode 100644 index 5b1a56f86..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritance.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListGenericInheritance -{ - class SyncListGenericInheritance : NetworkBehaviour - { - readonly SomeListInt someList = new SomeListInt(); - - - public class SomeList : SyncList { } - - public class SomeListInt : SomeList { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritanceWithMultipleGeneric.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritanceWithMultipleGeneric.cs deleted file mode 100644 index c23619f51..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericInheritanceWithMultipleGeneric.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListGenericInheritanceWithMultipleGeneric -{ - /* - This test should pass - */ - class SyncListGenericInheritanceWithMultipleGeneric : NetworkBehaviour - { - readonly SomeListInt someList = new SomeListInt(); - - - public class SomeList : SyncList { } - - public class SomeListInt : SomeList { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericStructWithCustomMethods.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericStructWithCustomMethods.cs deleted file mode 100644 index 8273b4f61..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListGenericStructWithCustomMethods.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListGenericStructWithCustomMethods -{ - class SyncListGenericStructWithCustomMethods : NetworkBehaviour - { - readonly SyncList> harpseals; - } - - struct MyGenericStruct - { - public T genericpotato; - } - - static class MyGenericStructList - { - static void SerializeItem(this NetworkWriter writer, MyGenericStruct item) - { - writer.WriteFloat(item.genericpotato); - } - - static MyGenericStruct DeserializeItem(this NetworkReader reader) - { - return new MyGenericStruct() { genericpotato = reader.ReadFloat() }; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInheritance.cs deleted file mode 100644 index 4f92edd86..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInheritance.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListInheritance -{ - class SyncListInheritance : NetworkBehaviour - { - readonly SuperSyncList superSyncListString = new SuperSyncList(); - - - public class SuperSyncList : SyncList - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInterfaceWithCustomMethods.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInterfaceWithCustomMethods.cs deleted file mode 100644 index d94ffd9dc..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListInterfaceWithCustomMethods.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListInterfaceWithCustomMethods -{ - class SyncListInterfaceWithCustomMethods : NetworkBehaviour - { - readonly SyncList Foo; - } - - interface IMyInterface - { - int someNumber { get; set; } - } - - class MyUser : IMyInterface - { - public int someNumber { get; set; } - } - - static class MyInterfaceList - { - static void SerializeItem(this NetworkWriter writer, IMyInterface item) - { - writer.WriteInt(item.someNumber); - } - static IMyInterface DeserializeItem(this NetworkReader reader) - { - return new MyUser { someNumber = reader.ReadInt() }; - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtor.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtor.cs deleted file mode 100644 index e410c166a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtor.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListMissingParamlessCtor -{ - class SyncListMissingParamlessCtor : NetworkBehaviour - { - public readonly SyncListString2 Foo; - - public class SyncListString2 : SyncList - { - public SyncListString2(int phooey) { } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtorManuallyInitialized.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtorManuallyInitialized.cs deleted file mode 100644 index b16cd20d1..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListMissingParamlessCtorManuallyInitialized.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListMissingParamlessCtorManuallyInitialized -{ - class SyncListMissingParamlessCtorManuallyInitialized : NetworkBehaviour - { - public readonly SyncListString2 Foo = new SyncListString2(20); - - public class SyncListString2 : SyncList - { - public SyncListString2(int phooey) { } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClass.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClass.cs deleted file mode 100644 index 8d03d58dc..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClass.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListNestedInAbstractClass -{ - class SyncListNestedStruct : NetworkBehaviour - { - readonly SomeAbstractClass.MyNestedStructList Foo; - - public abstract class SomeAbstractClass - { - public struct MyNestedStruct - { - public int potato; - public float floatingpotato; - public double givemetwopotatoes; - } - public class MyNestedStructList : SyncList { } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClassWithInvalid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClassWithInvalid.cs deleted file mode 100644 index ed6566317..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInAbstractClassWithInvalid.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverSyncListTests.SyncListNestedInAbstractClassWithInvalid -{ - class SyncListNestedStructWithInvalid : NetworkBehaviour - { - readonly SomeAbstractClass.MyNestedStructList Foo; - - public abstract class SomeAbstractClass - { - public struct MyNestedStruct - { - public int potato; - public Object target; - } - public class MyNestedStructList : SyncList { } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStruct.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStruct.cs deleted file mode 100644 index e611f9ba6..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStruct.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListNestedInStruct -{ - class SyncListNestedStruct : NetworkBehaviour - { - readonly SomeData.SyncList Foo; - - public struct SomeData - { - public int usefulNumber; - public class SyncList : Mirror.SyncList { } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStructWithInvalid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStructWithInvalid.cs deleted file mode 100644 index 16c8c633e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedInStructWithInvalid.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverSyncListTests.SyncListNestedInStructWithInvalid -{ - class SyncListNestedInStructWithInvalid : NetworkBehaviour - { - readonly SomeData.SyncList Foo; - - public struct SomeData - { - public int usefulNumber; - public Object target; - - public class SyncList : Mirror.SyncList { } - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedStruct.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedStruct.cs deleted file mode 100644 index da834ad7b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListNestedStruct.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListNestedStruct -{ - class SyncListNestedStruct : NetworkBehaviour - { - readonly MyNestedStructList Foo; - - struct MyNestedStruct - { - public int potato; - public float floatingpotato; - public double givemetwopotatoes; - } - class MyNestedStructList : SyncList { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListStruct.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListStruct.cs deleted file mode 100644 index 82cd68988..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncListTests~/SyncListStruct.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncListTests.SyncListStruct -{ - class SyncListStruct : NetworkBehaviour - { - readonly MyStructList Foo; - - struct MyStruct - { - public int potato; - public float floatingpotato; - public double givemetwopotatoes; - } - class MyStructList : SyncList { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs deleted file mode 100644 index 84797608d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverSyncObjectsTests : WeaverTestsBuildFromTestName - { - [Test] - public void SyncObjectsExactlyMax() - { - IsSuccess(); - } - - [Test] - public void SyncObjectsMoreThanMax() - { - HasError("SyncObjectsMoreThanMax has > 64 SyncObjects (SyncLists etc). Consider refactoring your class into multiple components", - "WeaverSyncObjectsTest.SyncObjectsMoreThanMax.SyncObjectsMoreThanMax"); - } - - [Test] - public void RecommendsReadonly() - { - HasWarning("list should have a 'readonly' keyword in front of the variable because Mirror.SyncObjects always need to be initialized by the Weaver.", - "Mirror.SyncList`1 WeaverSyncObjectsTest.SyncObjectsMoreThanMax.RecommendsReadonly::list"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs.meta deleted file mode 100644 index dfafec92d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1aef13e7dbbc42df816347e4fb1ae8fd -timeCreated: 1631798559 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs deleted file mode 100644 index 477dd9ed7..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverSyncObjectsTest.SyncObjectsMoreThanMax -{ - public class RecommendsReadonly : NetworkBehaviour - { - // NOT readonly. should show weaver recommendation. - public SyncList list = new SyncList(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs.meta deleted file mode 100644 index be1b1d59b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/RecommendsReadonly.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 8d7133c3dad54d3dbe76f2f8be0803ec -timeCreated: 1632459283 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs deleted file mode 100644 index a7b5e7cc5..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Mirror; - -namespace WeaverSyncObjectsTest.SyncObjectsExactlyMax -{ - // SyncObjects mask is 64 bit. exactly 64 SyncObjects needs to work. - public class SyncObjectsExactlyMax : NetworkBehaviour - { - // from 1..64 - public readonly SyncList list1 = new SyncList(); - public readonly SyncList list2 = new SyncList(); - public readonly SyncList list3 = new SyncList(); - public readonly SyncList list4 = new SyncList(); - public readonly SyncList list5 = new SyncList(); - public readonly SyncList list6 = new SyncList(); - public readonly SyncList list7 = new SyncList(); - public readonly SyncList list8 = new SyncList(); - public readonly SyncList list9 = new SyncList(); - - public readonly SyncList list10 = new SyncList(); - public readonly SyncList list11 = new SyncList(); - public readonly SyncList list12 = new SyncList(); - public readonly SyncList list13 = new SyncList(); - public readonly SyncList list14 = new SyncList(); - public readonly SyncList list15 = new SyncList(); - public readonly SyncList list16 = new SyncList(); - public readonly SyncList list17 = new SyncList(); - public readonly SyncList list18 = new SyncList(); - public readonly SyncList list19 = new SyncList(); - - public readonly SyncList list20 = new SyncList(); - public readonly SyncList list21 = new SyncList(); - public readonly SyncList list22 = new SyncList(); - public readonly SyncList list23 = new SyncList(); - public readonly SyncList list24 = new SyncList(); - public readonly SyncList list25 = new SyncList(); - public readonly SyncList list26 = new SyncList(); - public readonly SyncList list27 = new SyncList(); - public readonly SyncList list28 = new SyncList(); - public readonly SyncList list29 = new SyncList(); - - public readonly SyncList list30 = new SyncList(); - public readonly SyncList list31 = new SyncList(); - public readonly SyncList list32 = new SyncList(); - public readonly SyncList list33 = new SyncList(); - public readonly SyncList list34 = new SyncList(); - public readonly SyncList list35 = new SyncList(); - public readonly SyncList list36 = new SyncList(); - public readonly SyncList list37 = new SyncList(); - public readonly SyncList list38 = new SyncList(); - public readonly SyncList list39 = new SyncList(); - - public readonly SyncList list40 = new SyncList(); - public readonly SyncList list41 = new SyncList(); - public readonly SyncList list42 = new SyncList(); - public readonly SyncList list43 = new SyncList(); - public readonly SyncList list44 = new SyncList(); - public readonly SyncList list45 = new SyncList(); - public readonly SyncList list46 = new SyncList(); - public readonly SyncList list47 = new SyncList(); - public readonly SyncList list48 = new SyncList(); - public readonly SyncList list49 = new SyncList(); - - public readonly SyncList list50 = new SyncList(); - public readonly SyncList list51 = new SyncList(); - public readonly SyncList list52 = new SyncList(); - public readonly SyncList list53 = new SyncList(); - public readonly SyncList list54 = new SyncList(); - public readonly SyncList list55 = new SyncList(); - public readonly SyncList list56 = new SyncList(); - public readonly SyncList list57 = new SyncList(); - public readonly SyncList list58 = new SyncList(); - public readonly SyncList list59 = new SyncList(); - - public readonly SyncList list60 = new SyncList(); - public readonly SyncList list61 = new SyncList(); - public readonly SyncList list62 = new SyncList(); - public readonly SyncList list63 = new SyncList(); - public readonly SyncList list64 = new SyncList(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs.meta deleted file mode 100644 index 85d7b4e00..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsExactlyMax.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 9013959e50bc44e9b2b691b85f61bd55 -timeCreated: 1631799264 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs deleted file mode 100644 index 7e2093b0d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs +++ /dev/null @@ -1,81 +0,0 @@ -using Mirror; - -namespace WeaverSyncObjectsTest.SyncObjectsMoreThanMax -{ - // SyncObjects mask is 64 bit. we can't have more than 64 SyncObjects. - public class SyncObjectsMoreThanMax : NetworkBehaviour - { - // from 1..65 - public readonly SyncList list1 = new SyncList(); - public readonly SyncList list2 = new SyncList(); - public readonly SyncList list3 = new SyncList(); - public readonly SyncList list4 = new SyncList(); - public readonly SyncList list5 = new SyncList(); - public readonly SyncList list6 = new SyncList(); - public readonly SyncList list7 = new SyncList(); - public readonly SyncList list8 = new SyncList(); - public readonly SyncList list9 = new SyncList(); - - public readonly SyncList list10 = new SyncList(); - public readonly SyncList list11 = new SyncList(); - public readonly SyncList list12 = new SyncList(); - public readonly SyncList list13 = new SyncList(); - public readonly SyncList list14 = new SyncList(); - public readonly SyncList list15 = new SyncList(); - public readonly SyncList list16 = new SyncList(); - public readonly SyncList list17 = new SyncList(); - public readonly SyncList list18 = new SyncList(); - public readonly SyncList list19 = new SyncList(); - - public readonly SyncList list20 = new SyncList(); - public readonly SyncList list21 = new SyncList(); - public readonly SyncList list22 = new SyncList(); - public readonly SyncList list23 = new SyncList(); - public readonly SyncList list24 = new SyncList(); - public readonly SyncList list25 = new SyncList(); - public readonly SyncList list26 = new SyncList(); - public readonly SyncList list27 = new SyncList(); - public readonly SyncList list28 = new SyncList(); - public readonly SyncList list29 = new SyncList(); - - public readonly SyncList list30 = new SyncList(); - public readonly SyncList list31 = new SyncList(); - public readonly SyncList list32 = new SyncList(); - public readonly SyncList list33 = new SyncList(); - public readonly SyncList list34 = new SyncList(); - public readonly SyncList list35 = new SyncList(); - public readonly SyncList list36 = new SyncList(); - public readonly SyncList list37 = new SyncList(); - public readonly SyncList list38 = new SyncList(); - public readonly SyncList list39 = new SyncList(); - - public readonly SyncList list40 = new SyncList(); - public readonly SyncList list41 = new SyncList(); - public readonly SyncList list42 = new SyncList(); - public readonly SyncList list43 = new SyncList(); - public readonly SyncList list44 = new SyncList(); - public readonly SyncList list45 = new SyncList(); - public readonly SyncList list46 = new SyncList(); - public readonly SyncList list47 = new SyncList(); - public readonly SyncList list48 = new SyncList(); - public readonly SyncList list49 = new SyncList(); - - public readonly SyncList list50 = new SyncList(); - public readonly SyncList list51 = new SyncList(); - public readonly SyncList list52 = new SyncList(); - public readonly SyncList list53 = new SyncList(); - public readonly SyncList list54 = new SyncList(); - public readonly SyncList list55 = new SyncList(); - public readonly SyncList list56 = new SyncList(); - public readonly SyncList list57 = new SyncList(); - public readonly SyncList list58 = new SyncList(); - public readonly SyncList list59 = new SyncList(); - - public readonly SyncList list60 = new SyncList(); - public readonly SyncList list61 = new SyncList(); - public readonly SyncList list62 = new SyncList(); - public readonly SyncList list63 = new SyncList(); - public readonly SyncList list64 = new SyncList(); - public readonly SyncList list65 = new SyncList(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs.meta deleted file mode 100644 index e44a2f523..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncObjectsTests~/SyncObjectsMoreThanMax.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 5f8ac61059614330bdcf0f9305c53136 -timeCreated: 1631798423 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs deleted file mode 100644 index 1ed833992..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - // Some tests for SyncObjects are in WeaverSyncListTests and apply to SyncDictionary too - public class WeaverSyncSetTests : WeaverTestsBuildFromTestName - { - [Test] - public void SyncSet() - { - IsSuccess(); - } - - [Test] - public void SyncSetByteValid() - { - IsSuccess(); - } - - [Test] - public void SyncSetGenericAbstractInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncSetGenericInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncSetInheritance() - { - IsSuccess(); - } - - [Test] - public void SyncSetStruct() - { - IsSuccess(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs.meta deleted file mode 100644 index 25b40d8a8..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6aeadedebed6110459fac293b9435e88 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSet.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSet.cs deleted file mode 100644 index e5d75e99a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSet.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Mirror; - -namespace WeaverSyncSetTests.SyncSet -{ - class SyncSet : NetworkBehaviour - { - public readonly SyncList Foo; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetByteValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetByteValid.cs deleted file mode 100644 index ac78ad2e9..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetByteValid.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; - -namespace WeaverSyncSetTests.SyncSetByteValid -{ - class SyncSetByteValid : NetworkBehaviour - { - class MyByteClass : SyncHashSet { }; - - readonly MyByteClass Foo; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericAbstractInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericAbstractInheritance.cs deleted file mode 100644 index fc895897d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericAbstractInheritance.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverSyncSetTests.SyncSetGenericAbstractInheritance -{ - class SyncSetGenericAbstractInheritance : NetworkBehaviour - { - readonly SomeSetInt superSyncSetString = new SomeSetInt(); - - public abstract class SomeSet : SyncHashSet { } - - public class SomeSetInt : SomeSet { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericInheritance.cs deleted file mode 100644 index 9ecdbfd79..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetGenericInheritance.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverSyncSetTests.SyncSetGenericInheritance -{ - class SyncSetGenericInheritance : NetworkBehaviour - { - readonly SomeSetInt someSet = new SomeSetInt(); - - public class SomeSet : SyncHashSet { } - - public class SomeSetInt : SomeSet { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetInheritance.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetInheritance.cs deleted file mode 100644 index 6ce3855c0..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetInheritance.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mirror; - -namespace WeaverSyncSetTests.SyncSetInheritance -{ - class SyncSetInheritance : NetworkBehaviour - { - readonly SuperSet superSet = new SuperSet(); - - public class SomeSet : SyncHashSet { } - - public class SuperSet : SomeSet { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetStruct.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetStruct.cs deleted file mode 100644 index 086d67c49..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncSetTests~/SyncSetStruct.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Mirror; - -namespace WeaverSyncSetTests.SyncSetStruct -{ - class SyncSetStruct : NetworkBehaviour - { - readonly MyStructSet Foo; - - struct MyStruct - { - public int potato; - public float floatingpotato; - public double givemetwopotatoes; - } - class MyStructSet : SyncHashSet { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs deleted file mode 100644 index ccb49cef2..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs +++ /dev/null @@ -1,82 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverSyncVarAttributeHookTests : WeaverTestsBuildFromTestName - { - [Test] - public void FindsPrivateHook() - { - IsSuccess(); - } - - [Test] - public void FindsPublicHook() - { - IsSuccess(); - } - - [Test] - public void FindsStaticHook() - { - IsSuccess(); - } - - [Test] - public void FindsHookWithGameObjects() - { - IsSuccess(); - } - - [Test] - public void FindsHookWithNetworkIdentity() - { - IsSuccess(); - } - - [Test] - public void FindsHookWithOtherOverloadsInOrder() - { - IsSuccess(); - } - - [Test] - public void FindsHookWithOtherOverloadsInReverseOrder() - { - IsSuccess(); - } - - static string OldNewMethodFormat(string hookName, string ValueType) - { - return string.Format("void {0}({1} oldValue, {1} newValue)", hookName, ValueType); - } - - [Test] - public void ErrorWhenNoHookFound() - { - HasError($"Could not find hook for 'health', hook name 'onChangeHealth'. Method signature should be {OldNewMethodFormat("onChangeHealth", "System.Int32")}", - "System.Int32 WeaverSyncVarHookTests.ErrorWhenNoHookFound.ErrorWhenNoHookFound::health"); - } - - [Test] - public void ErrorWhenNoHookWithCorrectParametersFound() - { - HasError($"Could not find hook for 'health', hook name 'onChangeHealth'. Method signature should be {OldNewMethodFormat("onChangeHealth", "System.Int32")}", - "System.Int32 WeaverSyncVarHookTests.ErrorWhenNoHookWithCorrectParametersFound.ErrorWhenNoHookWithCorrectParametersFound::health"); - } - - [Test] - public void ErrorForWrongTypeOldParameter() - { - HasError($"Wrong type for Parameter in hook for 'health', hook name 'onChangeHealth'. Method signature should be {OldNewMethodFormat("onChangeHealth", "System.Int32")}", - "System.Int32 WeaverSyncVarHookTests.ErrorForWrongTypeOldParameter.ErrorForWrongTypeOldParameter::health"); - } - - [Test] - public void ErrorForWrongTypeNewParameter() - { - HasError($"Wrong type for Parameter in hook for 'health', hook name 'onChangeHealth'. Method signature should be {OldNewMethodFormat("onChangeHealth", "System.Int32")}", - "System.Int32 WeaverSyncVarHookTests.ErrorForWrongTypeNewParameter.ErrorForWrongTypeNewParameter::health"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs.meta deleted file mode 100644 index 8b4b77a25..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8b8a829462efd04479519a188e458616 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeNewParameter.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeNewParameter.cs deleted file mode 100644 index bd2b6db7a..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeNewParameter.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.ErrorForWrongTypeNewParameter -{ - class ErrorForWrongTypeNewParameter : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - void onChangeHealth(int oldValue, float wrongNewValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeOldParameter.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeOldParameter.cs deleted file mode 100644 index 3e75887a0..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorForWrongTypeOldParameter.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.ErrorForWrongTypeOldParameter -{ - class ErrorForWrongTypeOldParameter : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - void onChangeHealth(float wrongOldValue, int newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookFound.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookFound.cs deleted file mode 100644 index 0e78f7213..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookFound.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.ErrorWhenNoHookFound -{ - class ErrorWhenNoHookFound : NetworkBehaviour - { - [SyncVar(hook = "onChangeHealth")] - int health; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookWithCorrectParametersFound.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookWithCorrectParametersFound.cs deleted file mode 100644 index 74592f053..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/ErrorWhenNoHookWithCorrectParametersFound.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.ErrorWhenNoHookWithCorrectParametersFound -{ - class ErrorWhenNoHookWithCorrectParametersFound : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - void onChangeHealth(int someOtherValue) - { - - } - - void onChangeHealth(int someOtherValue, int moreValue, bool anotherValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithGameObjects.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithGameObjects.cs deleted file mode 100644 index c15648e78..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithGameObjects.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverSyncVarHookTests.FindsHookWithGameObjects -{ - class FindsHookWithGameObjects : NetworkBehaviour - { - [SyncVar(hook = nameof(onTargetChanged))] - GameObject target; - - void onTargetChanged(GameObject oldValue, GameObject newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithNetworkIdentity.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithNetworkIdentity.cs deleted file mode 100644 index b9f5faa48..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithNetworkIdentity.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Mirror; - - -namespace WeaverSyncVarHookTests.FindsHookWithNetworkIdentity -{ - class FindsHookWithNetworkIdentity : NetworkBehaviour - { - [SyncVar(hook = nameof(onTargetChanged))] - NetworkIdentity target; - - void onTargetChanged(NetworkIdentity oldValue, NetworkIdentity newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInOrder.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInOrder.cs deleted file mode 100644 index adb9a3c2d..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInOrder.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverSyncVarHookTests.FindsHookWithOtherOverloadsInOrder -{ - class FindsHookWithOtherOverloadsInOrder : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - void onChangeHealth(int oldValue, int newValue) - { - - } - - void onChangeHealth(Vector3 anotherValue, bool secondArg) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInReverseOrder.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInReverseOrder.cs deleted file mode 100644 index 6b9aa1e30..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsHookWithOtherOverloadsInReverseOrder.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverSyncVarHookTests.FindsHookWithOtherOverloadsInReverseOrder -{ - class FindsHookWithOtherOverloadsInReverseOrder : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - void onChangeHealth(Vector3 anotherValue, bool secondArg) - { - - } - - void onChangeHealth(int oldValue, int newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPrivateHook.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPrivateHook.cs deleted file mode 100644 index c523785ed..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPrivateHook.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.FindsPrivateHook -{ - class FindsPrivateHook : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - void onChangeHealth(int oldValue, int newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPublicHook.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPublicHook.cs deleted file mode 100644 index 8252d2282..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsPublicHook.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.FindsPublicHook -{ - class FindsPublicHook : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - public void onChangeHealth(int oldValue, int newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsStaticHook.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsStaticHook.cs deleted file mode 100644 index dae2c8245..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeHookTests~/FindsStaticHook.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarHookTests.FindsStaticHook -{ - class FindsStaticHook : NetworkBehaviour - { - [SyncVar(hook = nameof(onChangeHealth))] - int health; - - static void onChangeHealth(int oldValue, int newValue) - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs deleted file mode 100644 index 753d44324..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs +++ /dev/null @@ -1,89 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverSyncVarAttributeTests : WeaverTestsBuildFromTestName - { - [Test] - public void SyncVarsValid() - { - IsSuccess(); - } - - [Test] - public void SyncVarsDerivedNetworkBehaviour() - { - IsSuccess(); - } - - [Test] - public void SyncVarsStatic() - { - HasError("invalidVar cannot be static", - "System.Int32 WeaverSyncVarTests.SyncVarsStatic.SyncVarsStatic::invalidVar"); - } - - [Test] - public void SyncVarsGenericParam() - { - HasError("Cannot generate writer for generic type MySyncVar`1. Use a supported type or provide a custom writer", - "WeaverSyncVarTests.SyncVarsGenericParam.SyncVarsGenericParam/MySyncVar`1"); - HasError("invalidVar has unsupported type. Use a supported Mirror type instead", - "WeaverSyncVarTests.SyncVarsGenericParam.SyncVarsGenericParam/MySyncVar`1 WeaverSyncVarTests.SyncVarsGenericParam.SyncVarsGenericParam::invalidVar"); - } - - [Test] - public void SyncVarsInterface() - { - HasError("Cannot generate writer for interface IMySyncVar. Use a supported type or provide a custom writer", - "WeaverSyncVarTests.SyncVarsInterface.SyncVarsInterface/IMySyncVar"); - HasError("invalidVar has unsupported type. Use a supported Mirror type instead", - "WeaverSyncVarTests.SyncVarsInterface.SyncVarsInterface/IMySyncVar WeaverSyncVarTests.SyncVarsInterface.SyncVarsInterface::invalidVar"); - } - - [Test] - public void SyncVarsUnityComponent() - { - HasError("Cannot generate writer for component type TextMesh. Use a supported type or provide a custom writer", - "UnityEngine.TextMesh"); - HasError("invalidVar has unsupported type. Use a supported Mirror type instead", - "UnityEngine.TextMesh WeaverSyncVarTests.SyncVarsUnityComponent.SyncVarsUnityComponent::invalidVar"); - } - - [Test] - public void SyncVarsCantBeArray() - { - HasError("thisShouldntWork has invalid type. Use SyncLists instead of arrays", - "System.Int32[] WeaverSyncVarTests.SyncVarsCantBeArray.SyncVarsCantBeArray::thisShouldntWork"); - } - - [Test] - public void SyncVarsSyncList() - { - // NOTE if this test fails without a warning: - // that happens if after WeaverAssembler->AssemblyBuilder.Build(), - // Unity invokes ILPostProcessor internally. - // and we invoke it from WeaverAssembler buildFinished again. - // => make sure that our ILPostProcessor does nto run on - // WeaverAssembler assemblies - HasNoErrors(); - HasWarning("syncobj has [SyncVar] attribute. SyncLists should not be marked with SyncVar", - "WeaverSyncVarTests.SyncVarsSyncList.SyncVarsSyncList/SyncObjImplementer WeaverSyncVarTests.SyncVarsSyncList.SyncVarsSyncList::syncobj"); - HasWarning("syncints has [SyncVar] attribute. SyncLists should not be marked with SyncVar", - "Mirror.SyncList`1 WeaverSyncVarTests.SyncVarsSyncList.SyncVarsSyncList::syncints"); - } - - [Test] - public void SyncVarsExactlyMax() - { - IsSuccess(); - } - - [Test] - public void SyncVarsMoreThanMax() - { - HasError("SyncVarsMoreThanMax has > 64 SyncVars. Consider refactoring your class into multiple components", - "WeaverSyncVarTests.SyncVarsMoreThanMax.SyncVarsMoreThanMax"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs.meta deleted file mode 100644 index 770100cfe..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c619cb5c467af2a4dafb611d50b84cbf -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsCantBeArray.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsCantBeArray.cs deleted file mode 100644 index 7f346da6f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsCantBeArray.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsCantBeArray -{ - class SyncVarsCantBeArray : NetworkBehaviour - { - [SyncVar] - int[] thisShouldntWork = new int[100]; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsDerivedNetworkBehaviour.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsDerivedNetworkBehaviour.cs deleted file mode 100644 index fd97fca85..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsDerivedNetworkBehaviour.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsDerivedNetworkBehaviour -{ - class MyBehaviour : NetworkBehaviour - { - public int abc = 123; - } - class SyncVarsDerivedNetworkBehaviour : NetworkBehaviour - { - [SyncVar] - MyBehaviour invalidVar; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs deleted file mode 100644 index 97f4c4de0..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs +++ /dev/null @@ -1,74 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsExactlyMax -{ - // SyncVar dirty mask is 64 bit. exactly 64 should work. - class SyncVarsExactlyMax : NetworkBehaviour - { - // 1..64 - [SyncVar] int var1; - [SyncVar] int var2; - [SyncVar] int var3; - [SyncVar] int var4; - [SyncVar] int var5; - [SyncVar] int var6; - [SyncVar] int var7; - [SyncVar] int var8; - [SyncVar] int var9; - [SyncVar] int var10; - [SyncVar] int var11; - [SyncVar] int var12; - [SyncVar] int var13; - [SyncVar] int var14; - [SyncVar] int var15; - [SyncVar] int var16; - [SyncVar] int var17; - [SyncVar] int var18; - [SyncVar] int var19; - [SyncVar] int var20; - [SyncVar] int var21; - [SyncVar] int var22; - [SyncVar] int var23; - [SyncVar] int var24; - [SyncVar] int var25; - [SyncVar] int var26; - [SyncVar] int var27; - [SyncVar] int var28; - [SyncVar] int var29; - [SyncVar] int var30; - [SyncVar] int var31; - [SyncVar] int var32; - [SyncVar] int var33; - [SyncVar] int var34; - [SyncVar] int var35; - [SyncVar] int var36; - [SyncVar] int var37; - [SyncVar] int var38; - [SyncVar] int var39; - [SyncVar] int var40; - [SyncVar] int var41; - [SyncVar] int var42; - [SyncVar] int var43; - [SyncVar] int var44; - [SyncVar] int var45; - [SyncVar] int var46; - [SyncVar] int var47; - [SyncVar] int var48; - [SyncVar] int var49; - [SyncVar] int var50; - [SyncVar] int var51; - [SyncVar] int var52; - [SyncVar] int var53; - [SyncVar] int var54; - [SyncVar] int var55; - [SyncVar] int var56; - [SyncVar] int var57; - [SyncVar] int var58; - [SyncVar] int var59; - [SyncVar] int var60; - [SyncVar] int var61; - [SyncVar] int var62; - [SyncVar] int var63; - [SyncVar] int var64; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs.meta deleted file mode 100644 index bda0ddfc0..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsExactlyMax.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ecee7f6e569f44afbaa0b6c1cbf2d16c -timeCreated: 1631799739 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsGenericParam.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsGenericParam.cs deleted file mode 100644 index b965e711b..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsGenericParam.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsGenericParam -{ - class SyncVarsGenericParam : NetworkBehaviour - { - struct MySyncVar - { - T abc; - } - - [SyncVar] - MySyncVar invalidVar = new MySyncVar(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsInterface.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsInterface.cs deleted file mode 100644 index c32cb3092..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsInterface.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsInterface -{ - class SyncVarsInterface : NetworkBehaviour - { - interface IMySyncVar - { - void interfaceMethod(); - } - [SyncVar] - IMySyncVar invalidVar; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsMoreThanMax.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsMoreThanMax.cs deleted file mode 100644 index 7f9fde206..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsMoreThanMax.cs +++ /dev/null @@ -1,74 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsMoreThanMax -{ - // SyncVar dirty mask is 64 bit. more than 64 should show an error. - class SyncVarsMoreThanMax : NetworkBehaviour - { - [SyncVar] int var1; - [SyncVar] int var2; - [SyncVar] int var3; - [SyncVar] int var4; - [SyncVar] int var5; - [SyncVar] int var6; - [SyncVar] int var7; - [SyncVar] int var8; - [SyncVar] int var9; - [SyncVar] int var10; - [SyncVar] int var11; - [SyncVar] int var12; - [SyncVar] int var13; - [SyncVar] int var14; - [SyncVar] int var15; - [SyncVar] int var16; - [SyncVar] int var17; - [SyncVar] int var18; - [SyncVar] int var19; - [SyncVar] int var20; - [SyncVar] int var21; - [SyncVar] int var22; - [SyncVar] int var23; - [SyncVar] int var24; - [SyncVar] int var25; - [SyncVar] int var26; - [SyncVar] int var27; - [SyncVar] int var28; - [SyncVar] int var29; - [SyncVar] int var30; - [SyncVar] int var31; - [SyncVar] int var32; - [SyncVar] int var33; - [SyncVar] int var34; - [SyncVar] int var35; - [SyncVar] int var36; - [SyncVar] int var37; - [SyncVar] int var38; - [SyncVar] int var39; - [SyncVar] int var40; - [SyncVar] int var41; - [SyncVar] int var42; - [SyncVar] int var43; - [SyncVar] int var44; - [SyncVar] int var45; - [SyncVar] int var46; - [SyncVar] int var47; - [SyncVar] int var48; - [SyncVar] int var49; - [SyncVar] int var50; - [SyncVar] int var51; - [SyncVar] int var52; - [SyncVar] int var53; - [SyncVar] int var54; - [SyncVar] int var55; - [SyncVar] int var56; - [SyncVar] int var57; - [SyncVar] int var58; - [SyncVar] int var59; - [SyncVar] int var60; - [SyncVar] int var61; - [SyncVar] int var62; - [SyncVar] int var63; - [SyncVar] int var64; - [SyncVar] int var65; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsStatic.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsStatic.cs deleted file mode 100644 index a89a71f32..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsStatic.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsStatic -{ - class SyncVarsStatic : NetworkBehaviour - { - [SyncVar] - static int invalidVar = 123; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsSyncList.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsSyncList.cs deleted file mode 100644 index 9851fc4ce..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsSyncList.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Mirror; -using System; - -namespace WeaverSyncVarTests.SyncVarsSyncList -{ - - class SyncVarsSyncList : NetworkBehaviour - { - public class SyncObjImplementer : SyncObject - { - public override void ClearChanges() { } - public override void OnSerializeAll(NetworkWriter writer) { } - public override void OnSerializeDelta(NetworkWriter writer) { } - public override void OnDeserializeAll(NetworkReader reader) { } - public override void OnDeserializeDelta(NetworkReader reader) { } - public override void Reset() { } - } - - [SyncVar] - SyncObjImplementer syncobj; - - [SyncVar] - SyncList syncints; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsUnityComponent.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsUnityComponent.cs deleted file mode 100644 index 05dfcacbb..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsUnityComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; -using UnityEngine; - -namespace WeaverSyncVarTests.SyncVarsUnityComponent -{ - class SyncVarsUnityComponent : NetworkBehaviour - { - [SyncVar] - TextMesh invalidVar; - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsValid.cs deleted file mode 100644 index 710181819..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncVarAttributeTests~/SyncVarsValid.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Mirror; - -namespace WeaverSyncVarTests.SyncVarsValid -{ - class SyncVarsValid : NetworkBehaviour - { - [SyncVar(hook = nameof(OnChangeHealth))] - int health; - - [SyncVar] int var2; - [SyncVar] int var3; - [SyncVar] int var4; - [SyncVar] int var5; - [SyncVar] int var6; - [SyncVar] int var7; - [SyncVar] int var8; - [SyncVar] int var9; - [SyncVar] int var10; - [SyncVar] int var11; - [SyncVar] int var12; - [SyncVar] int var13; - [SyncVar] int var14; - [SyncVar] int var15; - [SyncVar] int var16; - [SyncVar] int var17; - [SyncVar] int var18; - [SyncVar] int var19; - [SyncVar] int var20; - [SyncVar] int var21; - [SyncVar] int var22; - [SyncVar] int var23; - [SyncVar] int var24; - [SyncVar] int var25; - [SyncVar] int var26; - [SyncVar] int var27; - [SyncVar] int var28; - [SyncVar] int var29; - [SyncVar] int var30; - [SyncVar] int var31; - [SyncVar] int var32; - [SyncVar] int var33; - [SyncVar] int var34; - [SyncVar] int var35; - [SyncVar] int var36; - [SyncVar] int var37; - [SyncVar] int var38; - [SyncVar] int var39; - [SyncVar] int var40; - [SyncVar] int var41; - [SyncVar] int var42; - [SyncVar] int var43; - [SyncVar] int var44; - [SyncVar] int var45; - [SyncVar] int var46; - [SyncVar] int var47; - [SyncVar] int var48; - [SyncVar] int var49; - [SyncVar] int var50; - [SyncVar] int var51; - [SyncVar] int var52; - [SyncVar] int var53; - [SyncVar] int var54; - [SyncVar] int var55; - [SyncVar] int var56; - [SyncVar] int var57; - [SyncVar] int var58; - [SyncVar] int var59; - [SyncVar] int var60; - [SyncVar] int var61; - [SyncVar] int var62; - [SyncVar] int var63; - - public void TakeDamage(int amount) - { - if (!isServer) - return; - - health -= amount; - } - - void OnChangeHealth(int oldHealth, int newHealth) - { - // do things with your health bar - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs deleted file mode 100644 index 625d4ba34..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public class WeaverTargetRpcTests : WeaverTestsBuildFromTestName - { - [Test] - public void TargetRpcValid() - { - IsSuccess(); - } - - [Test] - public void ErrorWhenTargetRpcIsStatic() - { - HasError("TargetCantBeStatic must not be static", - "System.Void WeaverTargetRpcTests.ErrorWhenTargetRpcIsStatic.ErrorWhenTargetRpcIsStatic::TargetCantBeStatic(Mirror.NetworkConnection)"); - } - - [Test] - public void TargetRpcCanSkipNetworkConnection() - { - IsSuccess(); - } - - [Test] - public void TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection() - { - IsSuccess(); - } - - [Test] - public void ErrorWhenNetworkConnectionIsNotTheFirstParameter() - { - HasError("TargetRpcMethod has invalid parameter nc. Cannot pass NetworkConnections", - "System.Void WeaverTargetRpcTests.ErrorWhenNetworkConnectionIsNotTheFirstParameter.ErrorWhenNetworkConnectionIsNotTheFirstParameter::TargetRpcMethod(System.Int32,Mirror.NetworkConnection)"); - } - - [Test] - public void VirtualTargetRpc() - { - IsSuccess(); - } - - [Test] - public void OverrideVirtualTargetRpc() - { - IsSuccess(); - } - - [Test] - public void AbstractTargetRpc() - { - HasError("Abstract TargetRpc are currently not supported, use virtual method instead", - "System.Void WeaverTargetRpcTests.AbstractTargetRpc.AbstractTargetRpc::TargetDoSomething()"); - } - - [Test] - public void OverrideAbstractTargetRpc() - { - HasError("Abstract TargetRpc are currently not supported, use virtual method instead", - "System.Void WeaverTargetRpcTests.OverrideAbstractTargetRpc.BaseBehaviour::TargetDoSomething()"); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs.meta deleted file mode 100644 index e31608660..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9e7275e59ed5b274eac8299115b54a56 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/AbstractTargetRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/AbstractTargetRpc.cs deleted file mode 100644 index 4cc89278e..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/AbstractTargetRpc.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Mirror; - - -namespace WeaverTargetRpcTests.AbstractTargetRpc -{ - abstract class AbstractTargetRpc : NetworkBehaviour - { - [TargetRpc] - protected abstract void TargetDoSomething(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenNetworkConnectionIsNotTheFirstParameter.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenNetworkConnectionIsNotTheFirstParameter.cs deleted file mode 100644 index 60201be5f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenNetworkConnectionIsNotTheFirstParameter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverTargetRpcTests.ErrorWhenNetworkConnectionIsNotTheFirstParameter -{ - class ErrorWhenNetworkConnectionIsNotTheFirstParameter : NetworkBehaviour - { - [TargetRpc] - void TargetRpcMethod(int potatoesRcool, NetworkConnection nc) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenTargetRpcIsStatic.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenTargetRpcIsStatic.cs deleted file mode 100644 index 3cd686759..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/ErrorWhenTargetRpcIsStatic.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverTargetRpcTests.ErrorWhenTargetRpcIsStatic -{ - class ErrorWhenTargetRpcIsStatic : NetworkBehaviour - { - [TargetRpc] - static void TargetCantBeStatic(NetworkConnection nc) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideAbstractTargetRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideAbstractTargetRpc.cs deleted file mode 100644 index 63b7fe794..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideAbstractTargetRpc.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Mirror; - - -namespace WeaverTargetRpcTests.OverrideAbstractTargetRpc -{ - class OverrideAbstractTargetRpc : BaseBehaviour - { - [TargetRpc] - protected override void TargetDoSomething() - { - // do something - } - } - - abstract class BaseBehaviour : NetworkBehaviour - { - [TargetRpc] - protected abstract void TargetDoSomething(); - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideVirtualTargetRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideVirtualTargetRpc.cs deleted file mode 100644 index 546b91ddc..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/OverrideVirtualTargetRpc.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Mirror; - - -namespace WeaverTargetRpcTests.OverrideVirtualTargetRpc -{ - class OverrideVirtualTargetRpc : baseBehaviour - { - [TargetRpc] - protected override void TargetDoSomething() - { - // do something - } - } - - class baseBehaviour : NetworkBehaviour - { - [TargetRpc] - protected virtual void TargetDoSomething() - { - - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection.cs deleted file mode 100644 index ca7b08ae3..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverTargetRpcTests.TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection -{ - class TargetRpcCanHaveOtherParametersWhileSkipingNetworkConnection : NetworkBehaviour - { - [TargetRpc] - void TargetRpcMethod(int usefulNumber) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanSkipNetworkConnection.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanSkipNetworkConnection.cs deleted file mode 100644 index ec0858925..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcCanSkipNetworkConnection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverTargetRpcTests.TargetRpcCanSkipNetworkConnection -{ - class TargetRpcCanSkipNetworkConnection : NetworkBehaviour - { - [TargetRpc] - void TargetRpcMethod() { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcValid.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcValid.cs deleted file mode 100644 index 38e046054..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/TargetRpcValid.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Mirror; - -namespace WeaverTargetRpcTests.TargetRpcValid -{ - class TargetRpcValid : NetworkBehaviour - { - [TargetRpc] - void TargetThatIsTotallyValid(NetworkConnection nc) { } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/VirtualTargetRpc.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/VirtualTargetRpc.cs deleted file mode 100644 index dd00afd41..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTargetRpcTests~/VirtualTargetRpc.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Mirror; - - -namespace WeaverTargetRpcTests.VirtualTargetRpc -{ - class VirtualTargetRpc : NetworkBehaviour - { - [TargetRpc] - protected virtual void TargetDoSomething() - { - // do something - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs deleted file mode 100644 index 8259249cb..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Weaver.Tests -{ - [TestFixture] - [Category("Weaver")] - public abstract class WeaverTests - { - protected List weaverErrors = new List(); - void HandleWeaverError(string msg) - { - LogAssert.ignoreFailingMessages = true; - Debug.LogError(msg); - LogAssert.ignoreFailingMessages = false; - - weaverErrors.Add(msg); - } - - protected List weaverWarnings = new List(); - void HandleWeaverWarning(string msg) - { - Debug.LogWarning(msg); - weaverWarnings.Add(msg); - } - - protected void BuildAndWeaveTestAssembly(string className, string testName) - { - string testSourceDirectory = className + "~"; - WeaverAssembler.OutputFile = Path.Combine(testSourceDirectory, testName + ".dll"); - WeaverAssembler.AddSourceFiles(new string[] { Path.Combine(testSourceDirectory, testName + ".cs") }); - WeaverAssembler.Build(HandleWeaverWarning, HandleWeaverError); - - Assert.That(WeaverAssembler.CompilerErrors, Is.False); - foreach (string error in weaverErrors) - { - // ensure all errors have a location - Assert.That(error, Does.Match(@"\(at .*\)$")); - } - } - - [OneTimeSetUp] - public void FixtureSetup() - { -#if !UNITY_2020_3_OR_NEWER - // CompilationFinishedHook is used for tests pre-2020 ILPostProcessor - CompilationFinishedHook.UnityLogEnabled = false; - CompilationFinishedHook.OnWeaverError += HandleWeaverError; - CompilationFinishedHook.OnWeaverWarning += HandleWeaverWarning; -#endif - } - - [OneTimeTearDown] - public void FixtureCleanup() - { -#if !UNITY_2020_3_OR_NEWER - // CompilationFinishedHook is used for tests pre-2020 ILPostProcessor - CompilationFinishedHook.OnWeaverError -= HandleWeaverError; - CompilationFinishedHook.OnWeaverWarning -= HandleWeaverWarning; - CompilationFinishedHook.UnityLogEnabled = true; -#endif - } - - [TearDown] - public void TestCleanup() - { - WeaverAssembler.DeleteOutputOnClear = true; - WeaverAssembler.Clear(); - - weaverWarnings.Clear(); - weaverErrors.Clear(); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs.meta deleted file mode 100644 index a98d9222f..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c3f52dab9c479dd4586d0aceeb2390f0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs deleted file mode 100644 index 7dd48f609..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Linq; -using NUnit.Framework; - -namespace Mirror.Weaver.Tests -{ - public abstract class WeaverTestsBuildFromTestName : WeaverTests - { - [SetUp] - public virtual void TestSetup() - { - string className = TestContext.CurrentContext.Test.ClassName.Split('.').Last(); - - BuildAndWeaveTestAssembly(className, TestContext.CurrentContext.Test.Name); - } - - protected void IsSuccess() - { - Assert.That(weaverErrors, Is.Empty); - Assert.That(weaverWarnings, Is.Empty); - } - - protected void HasNoErrors() - { - Assert.That(weaverErrors, Is.Empty); - } - - protected void HasError(string messsage, string atType) - { - Assert.That(weaverErrors, Contains.Item($"{messsage} (at {atType})")); - } - - protected void HasWarning(string messsage, string atType) - { - Assert.That(weaverWarnings, Contains.Item($"{messsage} (at {atType})")); - } - } -} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs.meta b/Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs.meta deleted file mode 100644 index bbaf34125..000000000 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverTestsBuildFromTestName.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: aa404c2d6a88488f9b6e42a87b01cd61 -timeCreated: 1629525351 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Runtime.meta b/Assets/Mirror/Tests/Runtime.meta deleted file mode 100644 index 41c7a7c0b..000000000 --- a/Assets/Mirror/Tests/Runtime.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 925dd1ba8ae9d4a969a57221e025309c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs b/Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs deleted file mode 100644 index 22197d033..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime.ClientSceneTests -{ - public class TestListenerBehaviour : NetworkBehaviour - { - // If object is destroyed then both OnDisable and OnDestroy will be called - public event Action onDestroyCalled; - public event Action onDisableCalled; - - public void OnDisable() => onDisableCalled?.Invoke(); - void OnDestroy() => onDestroyCalled?.Invoke(); - } - - // A network Behaviour that changes NetworkIdentity.spawned in OnDisable - public class BadBehaviour : NetworkBehaviour - { - public void OnDisable() - { - GameObject go = new GameObject(); - NetworkIdentity netId = go.AddComponent(); - const int id = 32032; - netId.netId = id; - - NetworkClient.spawned.Add(id, netId); - } - } - - public class ClientSceneTests_DestroyAllClientObjects : MirrorPlayModeTest - { - Dictionary unspawnHandlers => NetworkClient.unspawnHandlers; - - [UnitySetUp] - public override IEnumerator UnitySetUp() - { - yield return base.UnitySetUp(); - - // start server & client and wait 1 frame - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - yield return null; - } - - [UnityTearDown] - public override IEnumerator UnityTearDown() - { - unspawnHandlers.Clear(); - base.TearDown(); - yield return null; - } - - TestListenerBehaviour CreateAndAddObject(ulong sceneId) - { - CreateNetworkedAndSpawn(out GameObject go, out NetworkIdentity identity, out TestListenerBehaviour listener); - identity.sceneId = sceneId; - return listener; - } - - [UnityTest] - public IEnumerator DestroysAllNetworkPrefabsInScene() - { - // sceneId 0 is prefab - TestListenerBehaviour listener1 = CreateAndAddObject(0); - TestListenerBehaviour listener2 = CreateAndAddObject(0); - - int destroyCalled1 = 0; - int destroyCalled2 = 0; - - listener1.onDestroyCalled += () => destroyCalled1++; - listener2.onDestroyCalled += () => destroyCalled2++; - - NetworkClient.DestroyAllClientObjects(); - - // wait for frame to make sure unity events are called - yield return null; - - Assert.That(destroyCalled1, Is.EqualTo(1)); - Assert.That(destroyCalled2, Is.EqualTo(1)); - } - - [UnityTest] - public IEnumerator DisablesAllNetworkSceneObjectsInScene() - { - // sceneId 0 is prefab - TestListenerBehaviour listener1 = CreateAndAddObject(101); - TestListenerBehaviour listener2 = CreateAndAddObject(102); - - int disableCalled1 = 0; - int disableCalled2 = 0; - - listener1.onDisableCalled += () => disableCalled1++; - listener2.onDisableCalled += () => disableCalled2++; - - int destroyCalled1 = 0; - int destroyCalled2 = 0; - - listener1.onDestroyCalled += () => destroyCalled1++; - listener2.onDestroyCalled += () => destroyCalled2++; - - NetworkClient.DestroyAllClientObjects(); - - // wait for frame to make sure unity events are called - yield return null; - - Assert.That(disableCalled1, Is.EqualTo(1)); - Assert.That(disableCalled2, Is.EqualTo(1)); - - Assert.That(destroyCalled1, Is.EqualTo(0), "Scene objects should not be destroyed"); - Assert.That(destroyCalled2, Is.EqualTo(0), "Scene objects should not be destroyed"); - } - - [Test] - public void CallsUnspawnHandlerInsteadOfDestroy() - { - // sceneId 0 is prefab - TestListenerBehaviour listener1 = CreateAndAddObject(0); - TestListenerBehaviour listener2 = CreateAndAddObject(0); - - Guid guid1 = Guid.NewGuid(); - Guid guid2 = Guid.NewGuid(); - - int unspawnCalled1 = 0; - int unspawnCalled2 = 0; - - unspawnHandlers.Add(guid1, x => unspawnCalled1++); - unspawnHandlers.Add(guid2, x => unspawnCalled2++); - listener1.GetComponent().assetId = guid1; - listener2.GetComponent().assetId = guid2; - - int disableCalled1 = 0; - int disableCalled2 = 0; - - listener1.onDisableCalled += () => disableCalled1++; - listener2.onDisableCalled += () => disableCalled2++; - - NetworkClient.DestroyAllClientObjects(); - - Assert.That(unspawnCalled1, Is.EqualTo(1)); - Assert.That(unspawnCalled2, Is.EqualTo(1)); - - Assert.That(disableCalled1, Is.EqualTo(0), "Object with UnspawnHandler should not be destroyed"); - Assert.That(disableCalled2, Is.EqualTo(0), "Object with UnspawnHandler should not be destroyed"); - } - - [Test] - public void ClearsSpawnedList() - { - // sceneId 0 is prefab - TestListenerBehaviour listener1 = CreateAndAddObject(0); - TestListenerBehaviour listener2 = CreateAndAddObject(0); - - NetworkClient.DestroyAllClientObjects(); - - Assert.That(NetworkClient.spawned, Is.Empty); - } - - [Test] - public void CatchesAndLogsExeptionWhenSpawnedListIsChanged() - { - // create spawned (needs to be added to .spawned!) - CreateNetworkedAndSpawn(out GameObject badGameObject, out NetworkIdentity identity, out BadBehaviour bad); - - LogAssert.Expect(LogType.Exception, new Regex("InvalidOperationException")); - LogAssert.Expect(LogType.Error, "Could not DestroyAllClientObjects because spawned list was modified during loop, make sure you are not modifying NetworkIdentity.spawned by calling NetworkServer.Destroy or NetworkServer.Spawn in OnDestroy or OnDisable."); - NetworkClient.DestroyAllClientObjects(); - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs.meta b/Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs.meta deleted file mode 100644 index 420611c3f..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_DestroyAllClientObjects.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a5f4e31bf3f4dc4fa194eabc2cf80bd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs b/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs deleted file mode 100644 index 91e306f92..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Collections; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime.ClientSceneTests -{ - public class ClientSceneTests_LocalPlayer : ClientSceneTestsBase - { - [SetUp] - public override void SetUp() - { - base.SetUp(); - - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - - [UnityTest] - public IEnumerator LocalPlayerIsSetToNullAfterDestroy() - { - // need spawned local player - CreateNetworkedAndSpawnPlayer(out GameObject go, out _, NetworkServer.localConnection); - - // need to have localPlayer set for this test - Assert.That(NetworkClient.localPlayer, !Is.Null); - - // destroy, wait one frame, localPlayer should be cleared - GameObject.Destroy(go); - yield return null; - Assert.IsTrue(NetworkClient.localPlayer is null, "local player should be set to c# null"); - } - - [UnityTest] - public IEnumerator DestroyingOtherObjectDoesntEffectLocalPlayer() - { - // need spawned not-local-player - CreateNetworkedAndSpawn(out _, out NetworkIdentity notPlayer); - - // need spawned local player - CreateNetworkedAndSpawnPlayer(out _, out NetworkIdentity player, NetworkServer.localConnection); - - // need to have localPlayer set for this test - Assert.That(NetworkClient.localPlayer, !Is.Null); - - // destroy, wait one frame, localPlayer should remain - GameObject.Destroy(notPlayer); - yield return null; - Assert.IsTrue(NetworkClient.localPlayer != null, "local player should not be cleared"); - Assert.IsTrue(NetworkClient.localPlayer == player, "local player should still be equal to player"); - } - - [UnityTest] - public IEnumerator LocalPlayerIsSetToNullAfterDestroyMessage() - { - // need spawned local player - CreateNetworkedAndSpawnPlayer(out _, out NetworkIdentity identity, NetworkServer.localConnection); - - // need to have localPlayer set for this test - Assert.That(NetworkClient.localPlayer, !Is.Null); - - // OnObjectDestroy, wait one frame, localPlayer should be cleared - NetworkClient.OnObjectDestroy(new ObjectDestroyMessage{netId = identity.netId}); - yield return null; - Assert.IsTrue(NetworkClient.localPlayer is null, "local player should be set to c# null"); - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs.meta b/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs.meta deleted file mode 100644 index b57c8bd6a..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7c087df10f51b674f94f84ba30a303f4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs b/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs deleted file mode 100644 index ddc5af61a..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Collections; -using NUnit.Framework; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime -{ - public class ClientSceneTest_LocalPlayer_AsHost : MirrorPlayModeTest - { - [UnitySetUp] - public override IEnumerator UnitySetUp() - { - yield return base.UnitySetUp(); - - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - } - - [UnityTest] - public IEnumerator LocalPlayerIsSetToNullAfterNetworkDestroy() - { - // need spawned local player - CreateNetworkedAndSpawnPlayer(out _, out NetworkIdentity identity, NetworkServer.localConnection); - - // need to have localPlayer set for this test - Assert.That(NetworkClient.localPlayer, !Is.Null); - - // unspawn, wait one frame, localPlayer should be cleared - NetworkServer.Destroy(identity.gameObject); - yield return null; - Assert.IsTrue(NetworkClient.localPlayer is null, "local player should be set to c# null"); - } - - [UnityTest] - public IEnumerator LocalPlayerIsSetToNullAfterNetworkUnspawn() - { - // need spawned local player - CreateNetworkedAndSpawnPlayer(out _, out NetworkIdentity identity, NetworkServer.localConnection); - - // need to have localPlayer set for this test - Assert.That(NetworkClient.localPlayer, !Is.Null); - - // unspawn, wait one frame, localPlayer should be cleared - NetworkServer.UnSpawn(identity.gameObject); - yield return null; - Assert.IsTrue(NetworkClient.localPlayer is null, "local player should be set to c# null"); - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs.meta b/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs.meta deleted file mode 100644 index e9837dd30..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_LocalPlayer_AsHost.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6baedb85368e4347876f7b8b7c5110cb -timeCreated: 1622030080 \ No newline at end of file diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs b/Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs deleted file mode 100644 index 4e50852ca..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs +++ /dev/null @@ -1,72 +0,0 @@ -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime.ClientSceneTests -{ - public class ClientSceneTests_Runtime_RegisterPrefab : ClientSceneTests_RegisterPrefabBase - { - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void Handler_AddsSpawnHandlerToDictionaryForRuntimeObject(RegisterPrefabOverload overload) - { - // create a scene object - CreateNetworked(out GameObject runtimeObject, out NetworkIdentity networkIdentity); - - Debug.Assert(networkIdentity.sceneId == 0, "SceneId was not set to 0"); - Debug.Assert(runtimeObject.GetComponent().sceneId == 0, "SceneId was not set to 0"); - - //test - CallRegisterPrefab(runtimeObject, overload); - Assert.IsTrue(NetworkClient.spawnHandlers.ContainsKey(anotherGuid)); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate)] - public void ErrorForEmptyGuid(RegisterPrefabOverload overload) - { - // create a scene object - CreateNetworked(out GameObject runtimeObject, out _); - - //test - string msg = OverloadWithHandler(overload) - ? $"Can not Register handler for '{runtimeObject.name}' because it had empty assetid. If this is a scene Object use RegisterSpawnHandler instead" - : $"Can not Register '{runtimeObject.name}' because it had empty assetid. If this is a scene Object use RegisterSpawnHandler instead"; - - LogAssert.Expect(LogType.Error, msg); - CallRegisterPrefab(runtimeObject, overload); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_NewAssetId)] - public void PrefabNewGuid_AddsRuntimeObjectToDictionary(RegisterPrefabOverload overload) - { - // create a scene object - CreateNetworked(out GameObject runtimeObject, out NetworkIdentity networkIdentity); - - //test - CallRegisterPrefab(runtimeObject, overload); - - Assert.IsTrue(NetworkClient.prefabs.ContainsKey(anotherGuid)); - Assert.AreEqual(NetworkClient.prefabs[anotherGuid], runtimeObject); - - Assert.AreEqual(networkIdentity.assetId, anotherGuid); - } - - [Test] - [TestCase(RegisterPrefabOverload.Prefab_SpawnDelegate_NewAssetId)] - [TestCase(RegisterPrefabOverload.Prefab_SpawnHandlerDelegate_NewAssetId)] - public void Handler_AddsUnSpawnHandlerToDictionaryForRuntimeObject(RegisterPrefabOverload overload) - { - // create a scene object - CreateNetworked(out GameObject runtimeObject, out _); - - //test - CallRegisterPrefab(runtimeObject, overload); - Assert.IsTrue(NetworkClient.unspawnHandlers.ContainsKey(anotherGuid)); - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs.meta b/Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs.meta deleted file mode 100644 index 218c110c4..000000000 --- a/Assets/Mirror/Tests/Runtime/ClientSceneTests_Runtime_RegisterPrefab.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c47e4b8fb9faba04792f9e4764a9c929 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef b/Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef deleted file mode 100644 index f852e83f7..000000000 --- a/Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "Mirror.Tests.Runtime", - "references": [ - "Mirror", - "Mirror.Components", - "Mirror.Tests.Common" - ], - "optionalUnityReferences": [ - "TestAssemblies" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "NSubstitute.dll", - "Castle.Core.dll", - "System.Threading.Tasks.Extensions.dll" - ], - "autoReferenced": true, - "defineConstraints": [] -} \ No newline at end of file diff --git a/Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef.meta b/Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef.meta deleted file mode 100644 index fb6f3e343..000000000 --- a/Assets/Mirror/Tests/Runtime/Mirror.Tests.Runtime.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b8767e8f08282414ea6026200077ad4c -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs b/Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs deleted file mode 100644 index e92433b73..000000000 --- a/Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System.Collections; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime -{ - public class NetworkIdentityTests : MirrorPlayModeTest - { - GameObject gameObject; - NetworkIdentity identity; - - [UnitySetUp] - public override IEnumerator UnitySetUp() - { - yield return base.UnitySetUp(); - CreateNetworked(out gameObject, out identity); - yield return null; - } - - // prevents https://github.com/vis2k/Mirror/issues/1484 - [UnityTest] - public IEnumerator OnDestroyIsServerTrue() - { - // call OnStartServer so that isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // destroy it - // note: we need runtime .Destroy instead of edit mode .DestroyImmediate - // because we can't check isServer after DestroyImmediate - GameObject.Destroy(gameObject); - - // make sure that isServer is still true so we can save players etc. - Assert.That(identity.isServer, Is.True); - - yield return null; - // Confirm it has been destroyed - Assert.That(identity == null, Is.True); - } - - [UnityTest] - public IEnumerator OnDestroyIsServerTrueWhenNetworkServerDestroyIsCalled() - { - // call OnStartServer so that isServer is true - identity.OnStartServer(); - Assert.That(identity.isServer, Is.True); - - // destroy it - NetworkServer.Destroy(gameObject); - - // make sure that isServer is still true so we can save players etc. - Assert.That(identity.isServer, Is.True); - - yield return null; - // Confirm it has been destroyed - Assert.That(identity == null, Is.True); - } - - // imer: There's currently an issue with dropped/skipped serializations - // once a server has been running for around a week, this test should - // highlight the potential cause - [UnityTest] - public IEnumerator TestSerializationWithLargeTimestamps() - { - // 14 * 24 hours per day * 60 minutes per hour * 60 seconds per minute = 14 days - // NOTE: change this to 'float' to see the tests fail - int tick = 14 * 24 * 60 * 60; - NetworkIdentitySerialization serialization = identity.GetSerializationAtTick(tick); - // advance tick - ++tick; - NetworkIdentitySerialization serializationNew = identity.GetSerializationAtTick(tick); - - // if the serialization has been changed the tickTimeStamp should have moved - Assert.That(serialization.tick == serializationNew.tick, Is.False); - yield break; - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs.meta b/Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs.meta deleted file mode 100644 index 9f6cfef8d..000000000 --- a/Assets/Mirror/Tests/Runtime/NetworkIdentityTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ef23592667dfe46948980606ccbe1860 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs b/Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs deleted file mode 100644 index 8186f92d5..000000000 --- a/Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Collections; -using NUnit.Framework; -using UnityEngine.SceneManagement; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime -{ - public class NetworkManagerTests - { - Scene activeScene; - - IEnumerator RunIsActiveSceneTest(string sceneToCheck, bool expected) - { - // wait for first frame to make sure scene is loaded - yield return null; - activeScene = SceneManager.GetActiveScene(); - - bool isActive = NetworkManager.IsSceneActive(sceneToCheck); - Assert.That(isActive, Is.EqualTo(expected)); - } - - [UnityTest] - public IEnumerator IsActiveSceneWorksWithSceneName() - { - yield return RunIsActiveSceneTest(activeScene.name, true); - yield return RunIsActiveSceneTest("NotActiveScene", false); - } - [UnityTest] - public IEnumerator IsActiveSceneWorksWithScenePath() - { - yield return RunIsActiveSceneTest(activeScene.path, true); - yield return RunIsActiveSceneTest("Assets/Mirror/Tests/Runtime/Scenes/NotActiveScene.unity", false); - } - [UnityTest] - public IEnumerator IsActiveSceneIsFalseForScenesWithSameNameButDifferentPath() - { - yield return RunIsActiveSceneTest($"Another/Path/To/{activeScene.path}", false); - } - [UnityTest] - public IEnumerator IsActiveSceneIsFalseForEmptyString() - { - yield return RunIsActiveSceneTest("", false); - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs.meta b/Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs.meta deleted file mode 100644 index 592ff091c..000000000 --- a/Assets/Mirror/Tests/Runtime/NetworkManagerTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4cd917fdc9c513d438db90185784d87d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs b/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs deleted file mode 100644 index 03559af62..000000000 --- a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System.Collections; -using NUnit.Framework; -using UnityEditor; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Mirror.Tests.Runtime -{ - [TestFixture] - public class NetworkServerRuntimeTest : MirrorPlayModeTest - { - [UnitySetUp] - public override IEnumerator UnitySetUp() - { - yield return base.UnitySetUp(); - - // start server & client and wait 1 frame - NetworkServer.Listen(1); - ConnectHostClientBlockingAuthenticatedAndReady(); - yield return null; - } - - [UnityTest] - public IEnumerator DestroyPlayerForConnectionTest() - { - // create spawned player - CreateNetworkedAndSpawnPlayer(out GameObject player, out _, NetworkServer.localConnection); - - // destroy player for connection, wait 1 frame to unspawn and destroy - NetworkServer.DestroyPlayerForConnection(NetworkServer.localConnection); - yield return null; - - Assert.That(player == null, "Player should be destroyed with DestroyPlayerForConnection"); - } - - [UnityTest] - public IEnumerator RemovePlayerForConnectionTest() - { - // create spawned player - CreateNetworkedAndSpawnPlayer(out GameObject player, out _, NetworkServer.localConnection); - - // remove player for connection, wait 1 frame to unspawn - NetworkServer.RemovePlayerForConnection(NetworkServer.localConnection, false); - yield return null; - - Assert.That(player, Is.Not.Null, "Player should be not be destroyed"); - Assert.That(NetworkServer.localConnection.identity == null, "identity should be null"); - - // respawn player - NetworkServer.AddPlayerForConnection(NetworkServer.localConnection, player); - Assert.That(NetworkServer.localConnection.identity != null, "identity should not be null"); - } - - [UnityTest] - public IEnumerator Shutdown_DestroysAllSpawnedPrefabs() - { - // setup - NetworkServer.Listen(1); - - const string ValidPrefabAssetGuid = "33169286da0313d45ab5bfccc6cf3775"; - GameObject prefab = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(ValidPrefabAssetGuid)); - - NetworkIdentity identity1 = SpawnPrefab(prefab); - NetworkIdentity identity2 = SpawnPrefab(prefab); - - // shutdown, wait 1 frame for unity to destroy objects - NetworkServer.Shutdown(); - yield return null; - - // check that objects were destroyed - // need to use untiy `==` check - Assert.IsTrue(identity1 == null); - Assert.IsTrue(identity2 == null); - - Assert.That(NetworkServer.spawned, Is.Empty); - } - - NetworkIdentity SpawnPrefab(GameObject prefab) - { - GameObject clone1 = GameObject.Instantiate(prefab); - NetworkServer.Spawn(clone1); - NetworkIdentity identity1 = clone1.GetComponent(); - Assert.IsTrue(NetworkServer.spawned.ContainsValue(identity1)); - return identity1; - } - - [Test] - public void Shutdown_DisablesAllSpawnedPrefabs() - { - // setup - NetworkServer.Listen(1); - - // spawn two scene objects - CreateNetworkedAndSpawn(out _, out NetworkIdentity identity1); - CreateNetworkedAndSpawn(out _, out NetworkIdentity identity2); - identity1.sceneId = (ulong)identity1.GetHashCode(); - identity2.sceneId = (ulong)identity2.GetHashCode(); - - // test - NetworkServer.Shutdown(); - - // check that objects were disabled - // need to use untiy `==` check - Assert.IsTrue(identity1 != null); - Assert.IsTrue(identity2 != null); - Assert.IsFalse(identity1.gameObject.activeSelf); - Assert.IsFalse(identity1.gameObject.activeSelf); - - Assert.That(NetworkServer.spawned, Is.Empty); - } - } -} diff --git a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs.meta b/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs.meta deleted file mode 100644 index 431c107b0..000000000 --- a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a94e088c9596a284cb2cb960746ef2ce -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/Scenes.meta b/Assets/Mirror/Tests/Runtime/Scenes.meta deleted file mode 100644 index 0e9d6f423..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 69531c106ae23bc438f789d213c11fce -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity b/Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity deleted file mode 100644 index be02d2d12..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity +++ /dev/null @@ -1,381 +0,0 @@ -%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.44657898, g: 0.4964133, b: 0.5748178, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 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: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &8790187 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8790189} - - component: {fileID: 8790188} - 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 &8790188 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8790187} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - 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_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &8790189 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8790187} - 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 &324336641 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 324336643} - - component: {fileID: 324336642} - m_Layer: 0 - m_Name: SceneNetworkIdentity - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &324336642 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 324336641} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 3353204156 - serverOnly: 0 - m_AssetId: - hasSpawned: 0 ---- !u!4 &324336643 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 324336641} - 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!1 &417599908 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 417599911} - - component: {fileID: 417599910} - - component: {fileID: 417599909} - 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 &417599909 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 417599908} - m_Enabled: 1 ---- !u!20 &417599910 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 417599908} - 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_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_GateFitMode: 2 - 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 &417599911 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 417599908} - 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!1001 &330407922257146537 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 4064655512664549480, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_Name - value: TestNetworkManager - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8279465151912833971, guid: b243904f0fa5b04418e0e135533686b0, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: b243904f0fa5b04418e0e135533686b0, type: 3} diff --git a/Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity.meta b/Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity.meta deleted file mode 100644 index 65474c733..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes/SceneObjectSpawningTestsScene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 11c6caa4a9760bf4a909e72138dfb8e5 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab b/Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab deleted file mode 100644 index 1eabd8217..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab +++ /dev/null @@ -1,114 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &4064655512664549480 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8279465151912833971} - - component: {fileID: 1233094718765946942} - - component: {fileID: 2509988586038888270} - m_Layer: 0 - m_Name: TestNetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8279465151912833971 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4064655512664549480} - 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!114 &1233094718765946942 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4064655512664549480} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8aab4c8111b7c411b9b92cf3dbc5bd4e, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 0 - runInBackground: 0 - startOnHeadless: 0 - showDebugMessages: 0 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 2509988586038888270} - networkAddress: localhost - maxConnections: 4 - disconnectInactiveConnections: 0 - disconnectInactiveTimeout: 60 - authenticator: {fileID: 0} - playerPrefab: {fileID: 796411093575107534, guid: 5d01c4bf42a9b434dac396c2ba1aea10, - type: 3} - autoCreatePlayer: 0 - playerSpawnMethod: 0 - spawnPrefabs: [] ---- !u!114 &2509988586038888270 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4064655512664549480} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6131cf1e8a1c14ef5b5253f86f3fc9c9, type: 3} - m_Name: - m_EditorClassIdentifier: - OnClientConnected: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnClientDataReceived: - m_PersistentCalls: - m_Calls: [] - m_TypeName: Mirror.ClientDataReceivedEvent, Mirror, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - OnClientError: - m_PersistentCalls: - m_Calls: [] - m_TypeName: Mirror.UnityEventException, Mirror, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - OnClientDisconnected: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnServerConnected: - m_PersistentCalls: - m_Calls: [] - m_TypeName: Mirror.UnityEventInt, Mirror, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - OnServerDataReceived: - m_PersistentCalls: - m_Calls: [] - m_TypeName: Mirror.ServerDataReceivedEvent, Mirror, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - OnServerError: - m_PersistentCalls: - m_Calls: [] - m_TypeName: Mirror.UnityEventIntException, Mirror, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - OnServerDisconnected: - m_PersistentCalls: - m_Calls: [] - m_TypeName: Mirror.UnityEventInt, Mirror, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null diff --git a/Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab.meta b/Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab.meta deleted file mode 100644 index ac5d48478..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes/TestNetworkManager.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b243904f0fa5b04418e0e135533686b0 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab b/Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab deleted file mode 100644 index 77421a8c5..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab +++ /dev/null @@ -1,48 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &796411093575107534 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6042682300829753709} - - component: {fileID: 9021640260471491865} - m_Layer: 0 - m_Name: TestPlayer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6042682300829753709 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 796411093575107534} - 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!114 &9021640260471491865 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 796411093575107534} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - m_AssetId: 5d01c4bf42a9b434dac396c2ba1aea10 diff --git a/Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab.meta b/Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab.meta deleted file mode 100644 index 949e8a566..000000000 --- a/Assets/Mirror/Tests/Runtime/Scenes/TestPlayer.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5d01c4bf42a9b434dac396c2ba1aea10 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From a52f8adbd860a0676c9408ede9bf05a6152e4ada Mon Sep 17 00:00:00 2001 From: MrGadget1024 Date: Sun, 9 Jan 2022 05:35:28 -0500 Subject: [PATCH 02/27] Deleted Examples folder --- Assets/Mirror/Examples.meta | 8 - Assets/Mirror/Examples/AdditiveLevels.meta | 8 - .../Examples/AdditiveLevels/Materials.meta | 8 - .../AdditiveLevels/Materials/CubeSphere.mat | 77 - .../Materials/CubeSphere.mat.meta | 8 - .../AdditiveLevels/Materials/Ground.mat | 77 - .../AdditiveLevels/Materials/Ground.mat.meta | 8 - .../AdditiveLevels/Materials/Player.mat | 77 - .../AdditiveLevels/Materials/Player.mat.meta | 8 - .../AdditiveLevels/Materials/Portal.mat | 78 - .../AdditiveLevels/Materials/Portal.mat.meta | 8 - .../AdditiveLevels/Materials/Skybox.mat | 104 - .../AdditiveLevels/Materials/Skybox.mat.meta | 9 - .../AdditiveLevels/Materials/StartPoint.mat | 78 - .../Materials/StartPoint.mat.meta | 8 - .../Examples/AdditiveLevels/Prefabs.meta | 8 - .../AdditiveLevels/Prefabs/Cube.prefab | 131 - .../AdditiveLevels/Prefabs/Cube.prefab.meta | 7 - .../AdditiveLevels/Prefabs/Plane.prefab | 152 - .../AdditiveLevels/Prefabs/Plane.prefab.meta | 7 - .../AdditiveLevels/Prefabs/Player.prefab | 355 -- .../AdditiveLevels/Prefabs/Player.prefab.meta | 7 - .../AdditiveLevels/Prefabs/Portal.prefab | 322 -- .../AdditiveLevels/Prefabs/Portal.prefab.meta | 7 - .../AdditiveLevels/Prefabs/Sphere.prefab | 131 - .../AdditiveLevels/Prefabs/Sphere.prefab.meta | 7 - .../AdditiveLevels/Prefabs/StartPoint.prefab | 81 - .../Prefabs/StartPoint.prefab.meta | 7 - .../Mirror/Examples/AdditiveLevels/ReadMe.txt | 1 - .../Examples/AdditiveLevels/ReadMe.txt.meta | 7 - .../Examples/AdditiveLevels/Scenes.meta | 8 - .../AdditiveLevels/Scenes/Offline.unity | 495 --- .../AdditiveLevels/Scenes/Offline.unity.meta | 7 - .../AdditiveLevels/Scenes/Online.meta | 8 - .../AdditiveLevels/Scenes/Online.unity | 751 ---- .../AdditiveLevels/Scenes/Online.unity.meta | 7 - .../Scenes/Online/LightingData.asset | Bin 19648 -> 0 bytes .../Scenes/Online/LightingData.asset.meta | 8 - .../Scenes/Online/ReflectionProbe-0.exr | Bin 115342 -> 0 bytes .../Scenes/Online/ReflectionProbe-0.exr.meta | 92 - .../AdditiveLevels/Scenes/SubLevel1.unity | 1021 ----- .../Scenes/SubLevel1.unity.meta | 7 - .../AdditiveLevels/Scenes/SubLevel2.unity | 820 ---- .../Scenes/SubLevel2.unity.meta | 7 - .../Examples/AdditiveLevels/Scripts.meta | 8 - .../Scripts/AdditiveLevelsNetworkManager.cs | 187 - .../AdditiveLevelsNetworkManager.cs.meta | 11 - .../AdditiveLevels/Scripts/FadeInOut.cs | 60 - .../AdditiveLevels/Scripts/FadeInOut.cs.meta | 11 - .../Scripts/LookAtMainCamera.cs | 14 - .../Scripts/LookAtMainCamera.cs.meta | 11 - .../Scripts/PhysicsSimulator.cs | 40 - .../Scripts/PhysicsSimulator.cs.meta | 11 - .../AdditiveLevels/Scripts/PlayerCamera.cs | 41 - .../Scripts/PlayerCamera.cs.meta | 11 - .../Scripts/PlayerController.cs | 95 - .../Scripts/PlayerController.cs.meta | 11 - .../Examples/AdditiveLevels/Scripts/Portal.cs | 91 - .../AdditiveLevels/Scripts/Portal.cs.meta | 11 - .../AdditiveLevels/Scripts/RandomColor.cs | 36 - .../Scripts/RandomColor.cs.meta | 11 - .../Examples/AdditiveLevels/Textures.meta | 9 - .../AdditiveLevels/Textures/Back_Tex.jpeg | Bin 68766 -> 0 bytes .../Textures/Back_Tex.jpeg.meta | 92 - .../AdditiveLevels/Textures/Down_Tex.jpeg | Bin 75605 -> 0 bytes .../Textures/Down_Tex.jpeg.meta | 92 - .../AdditiveLevels/Textures/Front_Tex.jpeg | Bin 72964 -> 0 bytes .../Textures/Front_Tex.jpeg.meta | 92 - .../AdditiveLevels/Textures/Left_Tex.jpeg | Bin 68026 -> 0 bytes .../Textures/Left_Tex.jpeg.meta | 92 - .../AdditiveLevels/Textures/Right_Tex.jpeg | Bin 70199 -> 0 bytes .../Textures/Right_Tex.jpeg.meta | 92 - .../AdditiveLevels/Textures/Up_Tex.jpeg | Bin 69705 -> 0 bytes .../AdditiveLevels/Textures/Up_Tex.jpeg.meta | 92 - Assets/Mirror/Examples/AdditiveScenes.meta | 8 - .../AdditiveScenes/AnimationControllers.meta | 8 - .../AnimationControllers/Tank.controller | 156 - .../AnimationControllers/Tank.controller.meta | 8 - .../Examples/AdditiveScenes/Materials.meta | 8 - .../AdditiveScenes/Materials/Capsule.mat | 77 - .../AdditiveScenes/Materials/Capsule.mat.meta | 8 - .../AdditiveScenes/Materials/Cube.mat | 77 - .../AdditiveScenes/Materials/Cube.mat.meta | 8 - .../AdditiveScenes/Materials/Cylinder.mat | 77 - .../Materials/Cylinder.mat.meta | 8 - .../AdditiveScenes/Materials/Player.mat | 77 - .../AdditiveScenes/Materials/Player.mat.meta | 8 - .../AdditiveScenes/Materials/Quad.mat | 77 - .../AdditiveScenes/Materials/Quad.mat.meta | 8 - .../AdditiveScenes/Materials/Shelter.mat | 77 - .../AdditiveScenes/Materials/Shelter.mat.meta | 8 - .../AdditiveScenes/Materials/Sphere.mat | 77 - .../AdditiveScenes/Materials/Sphere.mat.meta | 8 - .../AdditiveScenes/Materials/Zone.mat | 78 - .../AdditiveScenes/Materials/Zone.mat.meta | 8 - .../Examples/AdditiveScenes/Prefabs.meta | 8 - .../AdditiveScenes/Prefabs/Capsule.prefab | 145 - .../Prefabs/Capsule.prefab.meta | 7 - .../AdditiveScenes/Prefabs/Cube.prefab | 144 - .../AdditiveScenes/Prefabs/Cube.prefab.meta | 7 - .../AdditiveScenes/Prefabs/Cylinder.prefab | 145 - .../Prefabs/Cylinder.prefab.meta | 7 - .../AdditiveScenes/Prefabs/Player.prefab | 371 -- .../AdditiveScenes/Prefabs/Player.prefab.meta | 7 - .../AdditiveScenes/Prefabs/Sphere.prefab | 144 - .../AdditiveScenes/Prefabs/Sphere.prefab.meta | 7 - .../AdditiveScenes/Prefabs/Tank.prefab | 581 --- .../AdditiveScenes/Prefabs/Tank.prefab.meta | 7 - .../AdditiveScenes/Prefabs/Zone.prefab | 60 - .../AdditiveScenes/Prefabs/Zone.prefab.meta | 7 - .../Mirror/Examples/AdditiveScenes/README.md | 24 - .../Examples/AdditiveScenes/README.md.meta | 7 - .../Examples/AdditiveScenes/Scenes.meta | 8 - .../AdditiveScenes/Scenes/MainScene.unity | 2098 ---------- .../Scenes/MainScene.unity.meta | 7 - .../AdditiveScenes/Scenes/SubScene.unity | 937 ----- .../AdditiveScenes/Scenes/SubScene.unity.meta | 7 - .../Examples/AdditiveScenes/Scripts.meta | 8 - .../Scripts/AdditiveNetworkManager.cs | 68 - .../Scripts/AdditiveNetworkManager.cs.meta | 11 - .../AdditiveScenes/Scripts/PlayerCamera.cs | 41 - .../Scripts/PlayerCamera.cs.meta | 11 - .../Scripts/PlayerController.cs | 95 - .../Scripts/PlayerController.cs.meta | 11 - .../AdditiveScenes/Scripts/RandomColor.cs | 32 - .../Scripts/RandomColor.cs.meta | 11 - .../Scripts/ShootingTankBehaviour.cs | 59 - .../Scripts/ShootingTankBehaviour.cs.meta | 11 - .../AdditiveScenes/Scripts/ZoneHandler.cs | 37 - .../Scripts/ZoneHandler.cs.meta | 11 - Assets/Mirror/Examples/Basic.meta | 8 - Assets/Mirror/Examples/Basic/Prefabs.meta | 8 - .../Examples/Basic/Prefabs/Player.prefab | 72 - .../Examples/Basic/Prefabs/Player.prefab.meta | 7 - .../Examples/Basic/Prefabs/PlayerUI.prefab | 250 -- .../Basic/Prefabs/PlayerUI.prefab.meta | 7 - Assets/Mirror/Examples/Basic/README.md | 16 - Assets/Mirror/Examples/Basic/README.md.meta | 7 - Assets/Mirror/Examples/Basic/Scenes.meta | 8 - .../Examples/Basic/Scenes/Example.unity | 723 ---- .../Examples/Basic/Scenes/Example.unity.meta | 7 - Assets/Mirror/Examples/Basic/Scripts.meta | 8 - .../Examples/Basic/Scripts/BasicNetManager.cs | 35 - .../Basic/Scripts/BasicNetManager.cs.meta | 11 - .../Mirror/Examples/Basic/Scripts/CanvasUI.cs | 21 - .../Examples/Basic/Scripts/CanvasUI.cs.meta | 11 - .../Mirror/Examples/Basic/Scripts/Player.cs | 173 - .../Examples/Basic/Scripts/Player.cs.meta | 11 - .../Mirror/Examples/Basic/Scripts/PlayerUI.cs | 45 - .../Examples/Basic/Scripts/PlayerUI.cs.meta | 11 - Assets/Mirror/Examples/Benchmark.meta | 8 - .../Mirror/Examples/Benchmark/Materials.meta | 8 - .../Examples/Benchmark/Materials/Red.mat | 77 - .../Examples/Benchmark/Materials/Red.mat.meta | 8 - .../Examples/Benchmark/Materials/White.mat | 77 - .../Benchmark/Materials/White.mat.meta | 8 - Assets/Mirror/Examples/Benchmark/Prefabs.meta | 8 - .../Examples/Benchmark/Prefabs/Monster.prefab | 147 - .../Benchmark/Prefabs/Monster.prefab.meta | 7 - .../Examples/Benchmark/Prefabs/Player.prefab | 145 - .../Benchmark/Prefabs/Player.prefab.meta | 7 - Assets/Mirror/Examples/Benchmark/Scenes.meta | 8 - .../Examples/Benchmark/Scenes/Scene.unity | 470 --- .../Benchmark/Scenes/Scene.unity.meta | 7 - Assets/Mirror/Examples/Benchmark/Scripts.meta | 8 - .../Scripts/BenchmarkNetworkManager.cs | 51 - .../Scripts/BenchmarkNetworkManager.cs.meta | 11 - .../Benchmark/Scripts/MonsterMovement.cs | 54 - .../Benchmark/Scripts/MonsterMovement.cs.meta | 11 - .../Benchmark/Scripts/PlayerMovement.cs | 20 - .../Benchmark/Scripts/PlayerMovement.cs.meta | 11 - Assets/Mirror/Examples/Chat.meta | 8 - Assets/Mirror/Examples/Chat/Prefabs.meta | 8 - .../Examples/Chat/Prefabs/Player.prefab | 64 - .../Examples/Chat/Prefabs/Player.prefab.meta | 7 - Assets/Mirror/Examples/Chat/Scenes.meta | 8 - Assets/Mirror/Examples/Chat/Scenes/Main.unity | 3464 ----------------- .../Examples/Chat/Scenes/Main.unity.meta | 7 - Assets/Mirror/Examples/Chat/Scripts.meta | 8 - .../Chat/Scripts/ChatAuthenticator.cs | 212 - .../Chat/Scripts/ChatAuthenticator.cs.meta | 11 - .../Chat/Scripts/ChatNetworkManager.cs | 36 - .../Chat/Scripts/ChatNetworkManager.cs.meta | 11 - Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs | 80 - .../Examples/Chat/Scripts/ChatUI.cs.meta | 11 - .../Mirror/Examples/Chat/Scripts/LoginUI.cs | 29 - .../Examples/Chat/Scripts/LoginUI.cs.meta | 11 - Assets/Mirror/Examples/Chat/Scripts/Player.cs | 30 - .../Examples/Chat/Scripts/Player.cs.meta | 11 - Assets/Mirror/Examples/Discovery.meta | 8 - Assets/Mirror/Examples/Discovery/Prefabs.meta | 8 - .../Examples/Discovery/Prefabs/Player.prefab | 110 - .../Discovery/Prefabs/Player.prefab.meta | 7 - Assets/Mirror/Examples/Discovery/Scenes.meta | 8 - .../Examples/Discovery/Scenes/Scene.unity | 731 ---- .../Discovery/Scenes/Scene.unity.meta | 7 - Assets/Mirror/Examples/Mirror.Examples.asmdef | 17 - .../Examples/Mirror.Examples.asmdef.meta | 7 - .../Examples/MultipleAdditiveScenes.meta | 8 - .../MultipleAdditiveScenes/Materials.meta | 8 - .../Materials/Physics.meta | 8 - .../Physics/Icosphere.physicMaterial | 14 - .../Physics/Icosphere.physicMaterial.meta | 8 - .../Materials/Physics/Player.physicMaterial | 14 - .../Physics/Player.physicMaterial.meta | 8 - .../Physics/RoomBounce.physicMaterial | 14 - .../Physics/RoomBounce.physicMaterial.meta | 8 - .../Materials/Render.meta | 8 - .../Materials/Render/PlayArea.mat | 77 - .../Materials/Render/PlayArea.mat.meta | 8 - .../Materials/Render/Player.mat | 77 - .../Materials/Render/Player.mat.meta | 8 - .../Materials/Render/Prize.mat | 77 - .../Materials/Render/Prize.mat.meta | 8 - .../MultipleAdditiveScenes/Models.meta | 8 - .../Models/Icosphere.meta | 8 - .../Models/Icosphere/Icosphere.obj | 119 - .../Models/Icosphere/Icosphere.obj.meta | 104 - .../Models/Icosphere/Materials.meta | 8 - .../Models/Icosphere/Materials/Icosphere.mat | 77 - .../Icosphere/Materials/Icosphere.mat.meta | 8 - .../MultipleAdditiveScenes/Prefabs.meta | 8 - .../Prefabs/Icosphere.prefab | 221 -- .../Prefabs/Icosphere.prefab.meta | 7 - .../Prefabs/Player.prefab | 375 -- .../Prefabs/Player.prefab.meta | 8 - .../Prefabs/Prize.prefab | 196 - .../Prefabs/Prize.prefab.meta | 8 - .../Examples/MultipleAdditiveScenes/README.md | 34 - .../MultipleAdditiveScenes/README.md.meta | 7 - .../MultipleAdditiveScenes/Scenes.meta | 8 - .../MultipleAdditiveScenes/Scenes/Game.unity | 753 ---- .../Scenes/Game.unity.meta | 7 - .../MultipleAdditiveScenes/Scenes/Main.unity | 801 ---- .../Scenes/Main.unity.meta | 7 - .../MultipleAdditiveScenes/Scripts.meta | 8 - .../Scripts/MultiSceneNetManager.cs | 151 - .../Scripts/MultiSceneNetManager.cs.meta | 11 - .../Scripts/PhysicsCollision.cs | 44 - .../Scripts/PhysicsCollision.cs.meta | 11 - .../Scripts/PhysicsSimulator.cs | 40 - .../Scripts/PhysicsSimulator.cs.meta | 11 - .../Scripts/PlayerCamera.cs | 41 - .../Scripts/PlayerCamera.cs.meta | 11 - .../Scripts/PlayerController.cs | 96 - .../Scripts/PlayerController.cs.meta | 11 - .../Scripts/PlayerScore.cs | 30 - .../Scripts/PlayerScore.cs.meta | 11 - .../Scripts/RandomColor.cs | 32 - .../Scripts/RandomColor.cs.meta | 11 - .../MultipleAdditiveScenes/Scripts/Reward.cs | 52 - .../Scripts/Reward.cs.meta | 11 - .../MultipleAdditiveScenes/Scripts/Spawner.cs | 26 - .../Scripts/Spawner.cs.meta | 11 - Assets/Mirror/Examples/MultipleMatches.meta | 8 - .../Examples/MultipleMatches/Prefabs.meta | 8 - .../MultipleMatches/Prefabs/CellGUI.prefab | 144 - .../Prefabs/CellGUI.prefab.meta | 7 - .../Prefabs/MatchController.prefab | 2169 ----------- .../Prefabs/MatchController.prefab.meta | 7 - .../MultipleMatches/Prefabs/MatchGUI.prefab | 293 -- .../Prefabs/MatchGUI.prefab.meta | 7 - .../Prefabs/MatchPlayer.prefab | 65 - .../Prefabs/MatchPlayer.prefab.meta | 7 - .../MultipleMatches/Prefabs/PlayerGUI.prefab | 182 - .../Prefabs/PlayerGUI.prefab.meta | 7 - .../Mirror/Examples/MultipleMatches/README.md | 9 - .../Examples/MultipleMatches/README.md.meta | 7 - .../Examples/MultipleMatches/Scenes.meta | 8 - .../MultipleMatches/Scenes/Main.unity | 2982 -------------- .../MultipleMatches/Scenes/Main.unity.meta | 7 - .../Examples/MultipleMatches/Scripts.meta | 8 - .../Scripts/CanvasController.cs | 678 ---- .../Scripts/CanvasController.cs.meta | 11 - .../MultipleMatches/Scripts/CellGUI.cs | 46 - .../MultipleMatches/Scripts/CellGUI.cs.meta | 11 - .../Scripts/MatchController.cs | 313 -- .../Scripts/MatchController.cs.meta | 11 - .../MultipleMatches/Scripts/MatchGUI.cs | 44 - .../MultipleMatches/Scripts/MatchGUI.cs.meta | 11 - .../MultipleMatches/Scripts/MatchMessages.cs | 118 - .../Scripts/MatchMessages.cs.meta | 11 - .../Scripts/MatchNetworkManager.cs | 123 - .../Scripts/MatchNetworkManager.cs.meta | 11 - .../MultipleMatches/Scripts/PlayerGUI.cs | 16 - .../MultipleMatches/Scripts/PlayerGUI.cs.meta | 11 - .../MultipleMatches/Scripts/RoomGUI.cs | 48 - .../MultipleMatches/Scripts/RoomGUI.cs.meta | 11 - Assets/Mirror/Examples/Pong.meta | 8 - .../Examples/Pong/PhysicsMaterials.meta | 8 - .../BallMaterial.physicsMaterial2D | 10 - .../BallMaterial.physicsMaterial2D.meta | 8 - Assets/Mirror/Examples/Pong/Prefabs.meta | 8 - .../Mirror/Examples/Pong/Prefabs/Ball.prefab | 197 - .../Examples/Pong/Prefabs/Ball.prefab.meta | 8 - .../Examples/Pong/Prefabs/Racket.prefab | 197 - .../Examples/Pong/Prefabs/Racket.prefab.meta | 8 - Assets/Mirror/Examples/Pong/Scenes.meta | 8 - .../Mirror/Examples/Pong/Scenes/Scene.unity | 906 ----- .../Examples/Pong/Scenes/Scene.unity.meta | 8 - Assets/Mirror/Examples/Pong/Scripts.meta | 8 - Assets/Mirror/Examples/Pong/Scripts/Ball.cs | 61 - .../Mirror/Examples/Pong/Scripts/Ball.cs.meta | 12 - .../Pong/Scripts/NetworkManagerPong.cs | 45 - .../Pong/Scripts/NetworkManagerPong.cs.meta | 11 - Assets/Mirror/Examples/Pong/Scripts/Player.cs | 19 - .../Examples/Pong/Scripts/Player.cs.meta | 12 - Assets/Mirror/Examples/Pong/Sprites.meta | 8 - Assets/Mirror/Examples/Pong/Sprites/Ball.png | Bin 2791 -> 0 bytes .../Examples/Pong/Sprites/Ball.png.meta | 88 - .../Examples/Pong/Sprites/DottedLine.png | Bin 2799 -> 0 bytes .../Examples/Pong/Sprites/DottedLine.png.meta | 88 - .../Mirror/Examples/Pong/Sprites/Racket.png | Bin 2800 -> 0 bytes .../Examples/Pong/Sprites/Racket.png.meta | 88 - .../Examples/Pong/Sprites/WallHorizontal.png | Bin 2796 -> 0 bytes .../Pong/Sprites/WallHorizontal.png.meta | 88 - .../Examples/Pong/Sprites/WallVertical.png | Bin 2800 -> 0 bytes .../Pong/Sprites/WallVertical.png.meta | 88 - Assets/Mirror/Examples/RigidbodyPhysics.meta | 8 - .../Examples/RigidbodyPhysics/Materials.meta | 8 - .../RigidbodyPhysics/Materials/Blue.mat | 77 - .../RigidbodyPhysics/Materials/Blue.mat.meta | 8 - .../RigidbodyPhysics/Materials/Floor.mat | 77 - .../RigidbodyPhysics/Materials/Floor.mat.meta | 8 - .../RigidbodyPhysics/Materials/Green.mat | 77 - .../RigidbodyPhysics/Materials/Green.mat.meta | 8 - .../RigidbodyPhysics/Materials/Red.mat | 77 - .../RigidbodyPhysics/Materials/Red.mat.meta | 8 - .../RigidbodyPhysics/PhysicMaterials.meta | 8 - .../PhysicMaterials/Ball.physicMaterial | 14 - .../PhysicMaterials/Ball.physicMaterial.meta | 8 - .../PhysicMaterials/Floor.physicMaterial | 14 - .../PhysicMaterials/Floor.physicMaterial.meta | 8 - .../Examples/RigidbodyPhysics/Prefabs.meta | 8 - .../Prefabs/Empty Player.prefab | 49 - .../Prefabs/Empty Player.prefab.meta | 7 - .../Examples/RigidbodyPhysics/Scenes.meta | 8 - .../RigidbodyPhysics/Scenes/BounceScene.unity | 1582 -------- .../Scenes/BounceScene.unity.meta | 7 - .../Examples/RigidbodyPhysics/Scripts.meta | 8 - .../RigidbodyPhysics/Scripts/AddForce.cs | 29 - .../RigidbodyPhysics/Scripts/AddForce.cs.meta | 11 - Assets/Mirror/Examples/Room.meta | 8 - Assets/Mirror/Examples/Room/Materials.meta | 8 - .../Examples/Room/Materials/PlayArea.mat | 77 - .../Examples/Room/Materials/PlayArea.mat.meta | 8 - .../Mirror/Examples/Room/Materials/Player.mat | 77 - .../Examples/Room/Materials/Player.mat.meta | 8 - .../Mirror/Examples/Room/Materials/Prize.mat | 77 - .../Examples/Room/Materials/Prize.mat.meta | 8 - .../Examples/Room/Materials/Textures.meta | 8 - .../Room/Materials/Textures/Wall01.tga | Bin 1048620 -> 0 bytes .../Room/Materials/Textures/Wall01.tga.meta | 88 - .../Room/Materials/Textures/Wall01_n.tga | Bin 1048620 -> 0 bytes .../Room/Materials/Textures/Wall01_n.tga.meta | 88 - Assets/Mirror/Examples/Room/Prefabs.meta | 8 - .../Examples/Room/Prefabs/GamePlayer.prefab | 372 -- .../Room/Prefabs/GamePlayer.prefab.meta | 8 - .../Mirror/Examples/Room/Prefabs/Prize.prefab | 194 - .../Examples/Room/Prefabs/Prize.prefab.meta | 8 - .../Examples/Room/Prefabs/RoomPlayer.prefab | 66 - .../Room/Prefabs/RoomPlayer.prefab.meta | 8 - Assets/Mirror/Examples/Room/README.md | 28 - Assets/Mirror/Examples/Room/README.md.meta | 7 - Assets/Mirror/Examples/Room/Scenes.meta | 8 - .../Examples/Room/Scenes/OfflineScene.unity | 312 -- .../Room/Scenes/OfflineScene.unity.meta | 7 - .../Examples/Room/Scenes/OnlineScene.unity | 822 ---- .../Room/Scenes/OnlineScene.unity.meta | 7 - .../Examples/Room/Scenes/RoomScene.unity | 187 - .../Examples/Room/Scenes/RoomScene.unity.meta | 7 - Assets/Mirror/Examples/Room/Scripts.meta | 8 - .../Room/Scripts/NetworkRoomManagerExt.cs | 87 - .../Scripts/NetworkRoomManagerExt.cs.meta | 11 - .../Room/Scripts/NetworkRoomPlayerExt.cs | 39 - .../Room/Scripts/NetworkRoomPlayerExt.cs.meta | 11 - .../Examples/Room/Scripts/PlayerCamera.cs | 41 - .../Room/Scripts/PlayerCamera.cs.meta | 11 - .../Examples/Room/Scripts/PlayerController.cs | 95 - .../Room/Scripts/PlayerController.cs.meta | 11 - .../Examples/Room/Scripts/PlayerScore.cs | 18 - .../Examples/Room/Scripts/PlayerScore.cs.meta | 11 - .../Examples/Room/Scripts/RandomColor.cs | 32 - .../Examples/Room/Scripts/RandomColor.cs.meta | 11 - Assets/Mirror/Examples/Room/Scripts/Reward.cs | 54 - .../Examples/Room/Scripts/Reward.cs.meta | 11 - .../Mirror/Examples/Room/Scripts/Spawner.cs | 23 - .../Examples/Room/Scripts/Spawner.cs.meta | 11 - Assets/Mirror/Examples/Tanks.meta | 8 - Assets/Mirror/Examples/Tanks/Models.meta | 8 - .../Models/(Public Domain) Recon_Tank.meta | 8 - .../(Public Domain) Recon_Tank/BaseColor.png | Bin 939498 -> 0 bytes .../BaseColor.png.meta | 88 - .../Controller.controller | 272 -- .../Controller.controller.meta | 8 - .../(Public Domain) Recon_Tank/Emissive.png | Bin 80294 -> 0 bytes .../Emissive.png.meta | 88 - .../(Public Domain) Recon_Tank/Metallic.png | Bin 62860 -> 0 bytes .../Metallic.png.meta | 88 - .../(Public Domain) Recon_Tank/Normal.png | Bin 666342 -> 0 bytes .../Normal.png.meta | 88 - .../Recon_Tank - License.txt | 7 - .../Recon_Tank - License.txt.meta | 7 - .../TankMaterial.mat | 82 - .../TankMaterial.mat.meta | 8 - .../(Public Domain) Recon_Tank/reconTank.fbx | Bin 224204 -> 0 bytes .../reconTank.fbx.meta | 239 -- Assets/Mirror/Examples/Tanks/Prefabs.meta | 8 - .../Examples/Tanks/Prefabs/Projectile.prefab | 273 -- .../Tanks/Prefabs/Projectile.prefab.meta | 7 - .../Mirror/Examples/Tanks/Prefabs/Tank.prefab | 508 --- .../Examples/Tanks/Prefabs/Tank.prefab.meta | 8 - Assets/Mirror/Examples/Tanks/Scenes.meta | 8 - .../Mirror/Examples/Tanks/Scenes/Scene.meta | 8 - .../Mirror/Examples/Tanks/Scenes/Scene.unity | 640 --- .../Examples/Tanks/Scenes/Scene.unity.meta | 7 - .../Examples/Tanks/Scenes/Scene/NavMesh.asset | Bin 5444 -> 0 bytes .../Tanks/Scenes/Scene/NavMesh.asset.meta | 8 - Assets/Mirror/Examples/Tanks/Scripts.meta | 8 - .../Examples/Tanks/Scripts/FaceCamera.cs | 14 - .../Examples/Tanks/Scripts/FaceCamera.cs.meta | 3 - .../Examples/Tanks/Scripts/Projectile.cs | 38 - .../Examples/Tanks/Scripts/Projectile.cs.meta | 11 - Assets/Mirror/Examples/Tanks/Scripts/Tank.cs | 93 - .../Examples/Tanks/Scripts/Tank.cs.meta | 11 - Assets/Mirror/Examples/Tanks/Textures.meta | 8 - ...lic Domain) Dirt Hand Painted Texture.meta | 8 - .../Dirt Hand Painted Texture - License.txt | 5 - ...rt Hand Painted Texture - License.txt.meta | 7 - .../Dirt.mat | 82 - .../Dirt.mat.meta | 8 - .../dirt.png | Bin 105829 -> 0 bytes .../dirt.png.meta | 88 - .../Tanks/Textures/ProjectileMaterial.mat | 77 - .../Textures/ProjectileMaterial.mat.meta | 8 - 435 files changed, 40947 deletions(-) delete mode 100644 Assets/Mirror/Examples.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/LightingData.asset delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/LightingData.asset.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/ReflectionProbe-0.exr delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/ReflectionProbe-0.exr.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Back_Tex.jpeg delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Back_Tex.jpeg.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Down_Tex.jpeg delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Down_Tex.jpeg.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Left_Tex.jpeg delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Left_Tex.jpeg.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Right_Tex.jpeg delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Right_Tex.jpeg.meta delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Up_Tex.jpeg delete mode 100644 Assets/Mirror/Examples/AdditiveLevels/Textures/Up_Tex.jpeg.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/AnimationControllers.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/AnimationControllers/Tank.controller delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/AnimationControllers/Tank.controller.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Capsule.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Capsule.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Cube.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Cube.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Cylinder.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Cylinder.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Player.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Player.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Quad.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Quad.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Shelter.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Shelter.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Sphere.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Sphere.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Zone.mat delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Materials/Zone.mat.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Capsule.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Capsule.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Cube.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Cube.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Cylinder.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Cylinder.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Sphere.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Sphere.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Tank.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Tank.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Zone.prefab delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Prefabs/Zone.prefab.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/README.md delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/README.md.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scenes.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs.meta delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs delete mode 100644 Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs.meta delete mode 100644 Assets/Mirror/Examples/Basic.meta delete mode 100644 Assets/Mirror/Examples/Basic/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Basic/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/Basic/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab delete mode 100644 Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab.meta delete mode 100644 Assets/Mirror/Examples/Basic/README.md delete mode 100644 Assets/Mirror/Examples/Basic/README.md.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scenes/Example.unity delete mode 100644 Assets/Mirror/Examples/Basic/Scenes/Example.unity.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scripts.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/Player.cs delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/Player.cs.meta delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs delete mode 100644 Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs.meta delete mode 100644 Assets/Mirror/Examples/Benchmark.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Materials.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Materials/Red.mat delete mode 100644 Assets/Mirror/Examples/Benchmark/Materials/Red.mat.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Materials/White.mat delete mode 100644 Assets/Mirror/Examples/Benchmark/Materials/White.mat.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab delete mode 100644 Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity delete mode 100644 Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs.meta delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs delete mode 100644 Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs.meta delete mode 100644 Assets/Mirror/Examples/Chat.meta delete mode 100644 Assets/Mirror/Examples/Chat/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Chat/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/Chat/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scenes/Main.unity delete mode 100644 Assets/Mirror/Examples/Chat/Scenes/Main.unity.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scripts.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs.meta delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/Player.cs delete mode 100644 Assets/Mirror/Examples/Chat/Scripts/Player.cs.meta delete mode 100644 Assets/Mirror/Examples/Discovery.meta delete mode 100644 Assets/Mirror/Examples/Discovery/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/Discovery/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Discovery/Scenes/Scene.unity delete mode 100644 Assets/Mirror/Examples/Discovery/Scenes/Scene.unity.meta delete mode 100644 Assets/Mirror/Examples/Mirror.Examples.asmdef delete mode 100644 Assets/Mirror/Examples/Mirror.Examples.asmdef.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/README.md delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/README.md.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs delete mode 100644 Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/README.md delete mode 100644 Assets/Mirror/Examples/MultipleMatches/README.md.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scenes.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchController.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchController.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchGUI.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchGUI.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchMessages.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchMessages.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchNetworkManager.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/MatchNetworkManager.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/PlayerGUI.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/PlayerGUI.cs.meta delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/RoomGUI.cs delete mode 100644 Assets/Mirror/Examples/MultipleMatches/Scripts/RoomGUI.cs.meta delete mode 100644 Assets/Mirror/Examples/Pong.meta delete mode 100644 Assets/Mirror/Examples/Pong/PhysicsMaterials.meta delete mode 100644 Assets/Mirror/Examples/Pong/PhysicsMaterials/BallMaterial.physicsMaterial2D delete mode 100644 Assets/Mirror/Examples/Pong/PhysicsMaterials/BallMaterial.physicsMaterial2D.meta delete mode 100644 Assets/Mirror/Examples/Pong/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Pong/Prefabs/Ball.prefab delete mode 100644 Assets/Mirror/Examples/Pong/Prefabs/Ball.prefab.meta delete mode 100644 Assets/Mirror/Examples/Pong/Prefabs/Racket.prefab delete mode 100644 Assets/Mirror/Examples/Pong/Prefabs/Racket.prefab.meta delete mode 100644 Assets/Mirror/Examples/Pong/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Pong/Scenes/Scene.unity delete mode 100644 Assets/Mirror/Examples/Pong/Scenes/Scene.unity.meta delete mode 100644 Assets/Mirror/Examples/Pong/Scripts.meta delete mode 100644 Assets/Mirror/Examples/Pong/Scripts/Ball.cs delete mode 100644 Assets/Mirror/Examples/Pong/Scripts/Ball.cs.meta delete mode 100644 Assets/Mirror/Examples/Pong/Scripts/NetworkManagerPong.cs delete mode 100644 Assets/Mirror/Examples/Pong/Scripts/NetworkManagerPong.cs.meta delete mode 100644 Assets/Mirror/Examples/Pong/Scripts/Player.cs delete mode 100644 Assets/Mirror/Examples/Pong/Scripts/Player.cs.meta delete mode 100644 Assets/Mirror/Examples/Pong/Sprites.meta delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/Ball.png delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/Ball.png.meta delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/DottedLine.png delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/DottedLine.png.meta delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/Racket.png delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/Racket.png.meta delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/WallHorizontal.png delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/WallHorizontal.png.meta delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/WallVertical.png delete mode 100644 Assets/Mirror/Examples/Pong/Sprites/WallVertical.png.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Blue.mat delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Blue.mat.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Floor.mat delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Floor.mat.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Green.mat delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Green.mat.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Red.mat delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Materials/Red.mat.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/PhysicMaterials.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/PhysicMaterials/Ball.physicMaterial delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/PhysicMaterials/Ball.physicMaterial.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/PhysicMaterials/Floor.physicMaterial delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/PhysicMaterials/Floor.physicMaterial.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Prefabs/Empty Player.prefab delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Prefabs/Empty Player.prefab.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Scenes.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Scenes/BounceScene.unity delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Scenes/BounceScene.unity.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Scripts.meta delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Scripts/AddForce.cs delete mode 100644 Assets/Mirror/Examples/RigidbodyPhysics/Scripts/AddForce.cs.meta delete mode 100644 Assets/Mirror/Examples/Room.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials/PlayArea.mat delete mode 100644 Assets/Mirror/Examples/Room/Materials/PlayArea.mat.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials/Player.mat delete mode 100644 Assets/Mirror/Examples/Room/Materials/Player.mat.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials/Prize.mat delete mode 100644 Assets/Mirror/Examples/Room/Materials/Prize.mat.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials/Textures.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials/Textures/Wall01.tga delete mode 100644 Assets/Mirror/Examples/Room/Materials/Textures/Wall01.tga.meta delete mode 100644 Assets/Mirror/Examples/Room/Materials/Textures/Wall01_n.tga delete mode 100644 Assets/Mirror/Examples/Room/Materials/Textures/Wall01_n.tga.meta delete mode 100644 Assets/Mirror/Examples/Room/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Room/Prefabs/GamePlayer.prefab delete mode 100644 Assets/Mirror/Examples/Room/Prefabs/GamePlayer.prefab.meta delete mode 100644 Assets/Mirror/Examples/Room/Prefabs/Prize.prefab delete mode 100644 Assets/Mirror/Examples/Room/Prefabs/Prize.prefab.meta delete mode 100644 Assets/Mirror/Examples/Room/Prefabs/RoomPlayer.prefab delete mode 100644 Assets/Mirror/Examples/Room/Prefabs/RoomPlayer.prefab.meta delete mode 100644 Assets/Mirror/Examples/Room/README.md delete mode 100644 Assets/Mirror/Examples/Room/README.md.meta delete mode 100644 Assets/Mirror/Examples/Room/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Room/Scenes/OfflineScene.unity delete mode 100644 Assets/Mirror/Examples/Room/Scenes/OfflineScene.unity.meta delete mode 100644 Assets/Mirror/Examples/Room/Scenes/OnlineScene.unity delete mode 100644 Assets/Mirror/Examples/Room/Scenes/OnlineScene.unity.meta delete mode 100644 Assets/Mirror/Examples/Room/Scenes/RoomScene.unity delete mode 100644 Assets/Mirror/Examples/Room/Scenes/RoomScene.unity.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/NetworkRoomManagerExt.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/NetworkRoomManagerExt.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/NetworkRoomPlayerExt.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/NetworkRoomPlayerExt.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/PlayerCamera.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/PlayerCamera.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/PlayerController.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/PlayerController.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/PlayerScore.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/PlayerScore.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/RandomColor.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/RandomColor.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/Reward.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/Reward.cs.meta delete mode 100644 Assets/Mirror/Examples/Room/Scripts/Spawner.cs delete mode 100644 Assets/Mirror/Examples/Room/Scripts/Spawner.cs.meta delete mode 100644 Assets/Mirror/Examples/Tanks.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/BaseColor.png delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/BaseColor.png.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Controller.controller delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Controller.controller.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Emissive.png delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Emissive.png.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Metallic.png delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Metallic.png.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Normal.png delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Normal.png.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Recon_Tank - License.txt delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/Recon_Tank - License.txt.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/TankMaterial.mat delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/TankMaterial.mat.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/reconTank.fbx delete mode 100644 Assets/Mirror/Examples/Tanks/Models/(Public Domain) Recon_Tank/reconTank.fbx.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Prefabs.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Prefabs/Projectile.prefab delete mode 100644 Assets/Mirror/Examples/Tanks/Prefabs/Projectile.prefab.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Prefabs/Tank.prefab delete mode 100644 Assets/Mirror/Examples/Tanks/Prefabs/Tank.prefab.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scenes.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scenes/Scene.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scenes/Scene.unity delete mode 100644 Assets/Mirror/Examples/Tanks/Scenes/Scene.unity.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scenes/Scene/NavMesh.asset delete mode 100644 Assets/Mirror/Examples/Tanks/Scenes/Scene/NavMesh.asset.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts/FaceCamera.cs delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts/FaceCamera.cs.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts/Projectile.cs delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts/Projectile.cs.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts/Tank.cs delete mode 100644 Assets/Mirror/Examples/Tanks/Scripts/Tank.cs.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Textures.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture/Dirt Hand Painted Texture - License.txt delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture/Dirt Hand Painted Texture - License.txt.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture/Dirt.mat delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture/Dirt.mat.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture/dirt.png delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/(Public Domain) Dirt Hand Painted Texture/dirt.png.meta delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/ProjectileMaterial.mat delete mode 100644 Assets/Mirror/Examples/Tanks/Textures/ProjectileMaterial.mat.meta diff --git a/Assets/Mirror/Examples.meta b/Assets/Mirror/Examples.meta deleted file mode 100644 index b594a8195..000000000 --- a/Assets/Mirror/Examples.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a08b1f591326642d1b140fc818c9c6b1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels.meta b/Assets/Mirror/Examples/AdditiveLevels.meta deleted file mode 100644 index d8d63821b..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c2da9e7acc6ad1648b0ff0849ef4c283 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials.meta deleted file mode 100644 index 7a5d3cd9f..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 60c31680133898d43822d2d9eae56494 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat b/Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat deleted file mode 100644 index 653113277..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: CubeSphere - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0, g: 0, b: 0, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat.meta deleted file mode 100644 index 1bfa5479a..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/CubeSphere.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 38950807c6bf6454dbef567827b770b6 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat b/Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat deleted file mode 100644 index 7dd07ac23..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Ground - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0.027055884, g: 0.09279272, b: 0.3018868, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat.meta deleted file mode 100644 index 9541526d5..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Ground.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 20d755ab53045e545ab0b6e59c710ed9 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat b/Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat deleted file mode 100644 index a394fe1d7..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Player - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0, g: 0, b: 0, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat.meta deleted file mode 100644 index 281bb037c..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Player.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6b7039502d1528a4db29c4d43d159b01 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat b/Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat deleted file mode 100644 index f0d5fcea9..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat +++ /dev/null @@ -1,78 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Portal - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _ALPHAPREMULTIPLY_ON _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: 3000 - stringTagMap: - RenderType: Transparent - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 10 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 3 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 0 - m_Colors: - - _Color: {r: 0.54901963, g: 0.54901963, b: 1, a: 0.23529412} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat.meta deleted file mode 100644 index 989054fc4..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Portal.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3500dce637708024da2f2e45e4f71cd3 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat b/Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat deleted file mode 100644 index 7d59ae980..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat +++ /dev/null @@ -1,104 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Skybox - m_Shader: {fileID: 104, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BackTex: - m_Texture: {fileID: 2800000, guid: 1566af6e663684dbd85aa5fb32fd9148, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DownTex: - m_Texture: {fileID: 2800000, guid: 9ffeeee1accdc4b4faf2b3e27b226340, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _FrontTex: - m_Texture: {fileID: 2800000, guid: ca928ef0e269448ba82388eb41d48544, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _LeftTex: - m_Texture: {fileID: 2800000, guid: e5a0eeef6a2514a78b267405d686fe09, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _RightTex: - m_Texture: {fileID: 2800000, guid: 4c8911efa34c845f28fbac86385a1b41, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _UpTex: - m_Texture: {fileID: 2800000, guid: bd9ad886b003944169e7ce1286756940, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _Exposure: 1 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _Rotation: 0 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _Tint: {r: 0.5, g: 0.5, b: 0.5, a: 0.5} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat.meta deleted file mode 100644 index 53c5d1585..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/Skybox.mat.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 81f714daf7144784b8a2f42f1cd30927 -timeCreated: 1497127647 -licenseType: Store -NativeFormatImporter: - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat b/Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat deleted file mode 100644 index 7ec88f508..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat +++ /dev/null @@ -1,78 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: StartPoint - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _ALPHAPREMULTIPLY_ON _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: 3000 - stringTagMap: - RenderType: Transparent - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 10 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 3 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 0 - m_Colors: - - _Color: {r: 1, g: 0.6236605, b: 0, a: 0.5372549} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat.meta b/Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat.meta deleted file mode 100644 index 5f7c12617..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Materials/StartPoint.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ec3b6ac9651c31248bcfbf695e6f597a -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs.meta deleted file mode 100644 index 0bb6a54c5..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d9d4b9adc9613a04fb715c64d3d2dcf8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab deleted file mode 100644 index a2500541e..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab +++ /dev/null @@ -1,131 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &3181899219042528418 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3181899219042528419} - - component: {fileID: 3181899219042528430} - - component: {fileID: 3181899219042528417} - - component: {fileID: 3181899219042528416} - - component: {fileID: -1828993248307539358} - - component: {fileID: 96969086124788804} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3181899219042528419 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3181899219042528418} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0.5, 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 &3181899219042528430 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3181899219042528418} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3181899219042528417 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3181899219042528418} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 38950807c6bf6454dbef567827b770b6, type: 2} - 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 ---- !u!65 &3181899219042528416 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3181899219042528418} - 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 &-1828993248307539358 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3181899219042528418} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: 7c6a0a278eba11e44b9a86cd4da603df - hasSpawned: 0 ---- !u!114 &96969086124788804 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3181899219042528418} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a91a718a70d01b347b75cb768a6f1a92, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - color: - serializedVersion: 2 - rgba: 4278190080 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab.meta deleted file mode 100644 index e5705b163..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Cube.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7c6a0a278eba11e44b9a86cd4da603df -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab deleted file mode 100644 index 9270e1f55..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab +++ /dev/null @@ -1,152 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &7349408984269008055 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7349408984269008052} - - component: {fileID: 7349408984269008059} - - component: {fileID: 7349408984269008058} - - component: {fileID: 7349408984269008053} - - component: {fileID: 7349408984269008063} - - component: {fileID: 7349408984269008062} - - component: {fileID: 7349408984269008057} - - component: {fileID: 7349408984269008056} - m_Layer: 0 - m_Name: Plane - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7349408984269008052 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 50, y: 1, z: 50} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &7349408984269008059 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7349408984269008058 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 20d755ab53045e545ab0b6e59c710ed9, type: 2} - 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 ---- !u!64 &7349408984269008053 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!65 &7349408984269008063 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 20, z: 0.05} - m_Center: {x: 0, y: 10, z: -0.5} ---- !u!65 &7349408984269008062 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.05, y: 20, z: 1} - m_Center: {x: -0.5, y: 10, z: 0} ---- !u!65 &7349408984269008057 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.05, y: 20, z: 1} - m_Center: {x: 0.5, y: 10, z: 0} ---- !u!65 &7349408984269008056 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7349408984269008055} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 20, z: 0.05} - m_Center: {x: 0, y: 10, z: 0.5} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab.meta deleted file mode 100644 index 98f04d36b..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Plane.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4fdcc4aa5c669b348a5954a92f5e8e89 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab deleted file mode 100644 index 340e315a7..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab +++ /dev/null @@ -1,355 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1724664263041697580 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7513987664611104733} - - component: {fileID: 3866048407219963700} - - component: {fileID: 6667391912482377964} - m_Layer: 0 - m_Name: Visor - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7513987664611104733 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1724664263041697580} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0.39999998, z: 0.5} - m_LocalScale: {x: 0.5, y: 0.1, z: 0.2} - m_Children: [] - m_Father: {fileID: 962190737825349125} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &3866048407219963700 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1724664263041697580} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6667391912482377964 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1724664263041697580} - 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_RenderingLayerMask: 4294967295 - 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: 0 - 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 ---- !u!1 &5620029719931856626 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 962190737825349125} - - component: {fileID: 8168211270351413936} - - component: {fileID: 5601443051240418659} - m_Layer: 0 - m_Name: Capsule - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &962190737825349125 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5620029719931856626} - 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: 7513987664611104733} - m_Father: {fileID: 464867598898769114} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &8168211270351413936 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5620029719931856626} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &5601443051240418659 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5620029719931856626} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 6b7039502d1528a4db29c4d43d159b01, type: 2} - 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 ---- !u!1 &7619140271685878370 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 464867598898769114} - - component: {fileID: 5674344380471455553} - - component: {fileID: -4914236621144254103} - - component: {fileID: -903079073849018483} - - component: {fileID: -1734969889957956087} - - component: {fileID: 5462452979215896872} - - component: {fileID: -2422551836510166228} - - component: {fileID: 1763152038191860132} - - component: {fileID: 1747637013460943425} - m_Layer: 8 - m_Name: Player - m_TagString: Player - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &464867598898769114 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1.08, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 962190737825349125} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5674344380471455553 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: 9f0094c1325091d42a558274b947221f - hasSpawned: 0 ---- !u!114 &-4914236621144254103 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - clientAuthority: 1 - sendInterval: 0.05 - syncPosition: 1 - syncRotation: 1 - syncScale: 0 - interpolatePosition: 1 - interpolateRotation: 1 - interpolateScale: 0 - bufferTimeMultiplier: 1 - bufferSizeLimit: 64 - catchupThreshold: 4 - catchupMultiplier: 0.1 - onlySyncOnChange: 1 - bufferResetMultiplier: 5 - positionSensitivity: 0.01 - rotationSensitivity: 0.01 - scaleSensitivity: 0.01 - showGizmos: 0 - showOverlay: 0 - overlayColor: {r: 0, g: 0, b: 0, a: 0.5} ---- !u!114 &-903079073849018483 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 22976424f775a0f4a8531e6713ff6de2, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 ---- !u!114 &-1734969889957956087 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 05e10150710dde14b83d3c8f5aa853c2, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - characterController: {fileID: 5462452979215896872} - moveSpeed: 8 - turnSensitivity: 5 - maxTurnSpeed: 100 - horizontal: 0 - vertical: 0 - turn: 0 - jumpSpeed: 0 - isGrounded: 1 - isFalling: 0 - velocity: {x: 0, y: 0, z: 0} ---- !u!143 &5462452979215896872 -CharacterController: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 0 - serializedVersion: 2 - m_Height: 2 - m_Radius: 0.5 - m_SlopeLimit: 45 - m_StepOffset: 0.3 - m_SkinWidth: 0.08 - m_MinMoveDistance: 0.001 - m_Center: {x: 0, y: 0, z: 0} ---- !u!136 &-2422551836510166228 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!54 &1763152038191860132 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &1747637013460943425 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7619140271685878370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a91a718a70d01b347b75cb768a6f1a92, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - color: - serializedVersion: 2 - rgba: 4278190080 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab.meta deleted file mode 100644 index 9ec1c9e4f..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Player.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9f0094c1325091d42a558274b947221f -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab deleted file mode 100644 index 48e24191c..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab +++ /dev/null @@ -1,322 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1098173225717622925 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1098173225717622921} - - component: {fileID: 1098173225717622922} - - component: {fileID: 1098173225717622923} - - component: {fileID: 1098173225717622924} - - component: {fileID: 3141292696673982546} - - component: {fileID: 5948271423698091598} - m_Layer: 9 - m_Name: Portal - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1098173225717622921 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1098173225717622925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: 0} - m_LocalScale: {x: 2, y: 2, z: 2} - m_Children: - - {fileID: 1355348187805494562} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1098173225717622922 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1098173225717622925} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &1098173225717622923 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1098173225717622925} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 3500dce637708024da2f2e45e4f71cd3, type: 2} - 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 ---- !u!136 &1098173225717622924 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1098173225717622925} - m_Material: {fileID: 0} - m_IsTrigger: 1 - m_Enabled: 1 - m_Radius: 0.2 - m_Height: 1 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &3141292696673982546 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1098173225717622925} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: c624c75494b4d7d4086b9212f897e56a - hasSpawned: 0 ---- !u!114 &5948271423698091598 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1098173225717622925} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0e680878006965146a8f9d85834c4d1c, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - destinationScene: - startPosition: {x: 0, y: 0, z: 0} - label: {fileID: 5446595135713311426} ---- !u!1 &5961932215084527574 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1355348187805494562} - - component: {fileID: 5428053421152709616} - - component: {fileID: 4525528713057871397} - - component: {fileID: 5446595135713311426} - - component: {fileID: 3243959486819493908} - m_Layer: 9 - m_Name: Label_TMP - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1355348187805494562 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5961932215084527574} - 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: 1098173225717622921} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 1.5} - m_SizeDelta: {x: 20, y: 5} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!23 &5428053421152709616 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5961932215084527574} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - 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 ---- !u!222 &4525528713057871397 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5961932215084527574} - m_CullTransparentMesh: 0 ---- !u!114 &5446595135713311426 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5961932215084527574} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Sublevel2 - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4288619804 - m_fontColor: {r: 0.108668566, g: 0.14359462, b: 0.6226415, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 4 - m_fontSizeBase: 4 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 5 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 1 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 0 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_renderer: {fileID: 5428053421152709616} - m_maskType: 0 - _SortingLayer: 0 - _SortingLayerID: 0 - _SortingOrder: 0 ---- !u!114 &3243959486819493908 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5961932215084527574} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cc58300ee45438a418d9e32957fdc0c0, type: 3} - m_Name: - m_EditorClassIdentifier: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab.meta deleted file mode 100644 index d43ce42c3..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Portal.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c624c75494b4d7d4086b9212f897e56a -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab deleted file mode 100644 index fdc50b454..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab +++ /dev/null @@ -1,131 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &2188792038427236743 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2188792038427236742} - - component: {fileID: 2188792038427236747} - - component: {fileID: 2188792038427236744} - - component: {fileID: 2188792038427236745} - - component: {fileID: -5172514306435102607} - - component: {fileID: 1758063572567377699} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2188792038427236742 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2188792038427236743} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0.5, 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 &2188792038427236747 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2188792038427236743} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &2188792038427236744 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2188792038427236743} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 38950807c6bf6454dbef567827b770b6, type: 2} - 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 ---- !u!135 &2188792038427236745 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2188792038427236743} - 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!114 &-5172514306435102607 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2188792038427236743} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: e588080aa542be54d9ca9d5c734dc9ee - hasSpawned: 0 ---- !u!114 &1758063572567377699 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2188792038427236743} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a91a718a70d01b347b75cb768a6f1a92, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - color: - serializedVersion: 2 - rgba: 4278190080 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab.meta deleted file mode 100644 index 95d16da0b..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/Sphere.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e588080aa542be54d9ca9d5c734dc9ee -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab deleted file mode 100644 index dc890d623..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab +++ /dev/null @@ -1,81 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &7582855647636897216 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7582855647636897223} - - component: {fileID: 7582855647636897221} - - component: {fileID: 7582855647636897222} - m_Layer: 0 - m_Name: StartPoint - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7582855647636897223 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7582855647636897216} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 2, y: 0.05, z: 2} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &7582855647636897221 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7582855647636897216} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7582855647636897222 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7582855647636897216} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: ec3b6ac9651c31248bcfbf695e6f597a, type: 2} - 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 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab.meta b/Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab.meta deleted file mode 100644 index ceaf231d7..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Prefabs/StartPoint.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 849c125c9d8094249b3c664da1cd143a -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt b/Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt deleted file mode 100644 index 9f5f0f187..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt +++ /dev/null @@ -1 +0,0 @@ -Setup details at https://mirror-networking.gitbook.io/docs/examples/additive-levels \ No newline at end of file diff --git a/Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt.meta b/Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt.meta deleted file mode 100644 index c88343809..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/ReadMe.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e0b006e68a5390c42a2ac1413c98e72f -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes.meta deleted file mode 100644 index 2817b8a7b..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7a6d39d823db54d43925eb65b4ffec55 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity deleted file mode 100644 index cc0e17ab2..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity +++ /dev/null @@ -1,495 +0,0 @@ -%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, g: 0, b: 0, 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: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 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: 1 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - 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_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &185921126 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 185921129} - - component: {fileID: 185921128} - - component: {fileID: 185921127} - 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 &185921127 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 185921126} - m_Enabled: 1 ---- !u!20 &185921128 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 185921126} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, 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 &185921129 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 185921126} - 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 &1040404844 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1040404847} - - component: {fileID: 1040404846} - - component: {fileID: 1040404845} - m_Layer: 5 - m_Name: Panel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1040404845 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1040404844} - 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, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 - 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 &1040404846 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1040404844} - m_CullTransparentMesh: 0 ---- !u!224 &1040404847 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1040404844} - 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: 1300359894} - 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!1 &1074858613 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1074858617} - - component: {fileID: 1074858616} - - component: {fileID: 1074858615} - - component: {fileID: 1074858614} - - component: {fileID: 1074858618} - m_Layer: 0 - m_Name: Network - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1074858614 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1074858613} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3} - m_Name: - m_EditorClassIdentifier: - offsetX: 0 - offsetY: 0 ---- !u!114 &1074858615 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1074858613} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - NonAlloc: 1 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &1074858616 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1074858613} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 01eafa8309a0894479f0f87ae1a9c30f, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 1 - PersistNetworkManagerToOfflineScene: 0 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity - onlineScene: Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity - transport: {fileID: 1074858615} - networkAddress: localhost - maxConnections: 100 - authenticator: {fileID: 0} - playerPrefab: {fileID: 7619140271685878370, guid: 9f0094c1325091d42a558274b947221f, - type: 3} - autoCreatePlayer: 0 - playerSpawnMethod: 1 - spawnPrefabs: [] - additiveScenes: - - Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity - - Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity - fadeInOut: {fileID: 1300359890} ---- !u!4 &1074858617 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1074858613} - 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: 1300359894} - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1074858618 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1074858613} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b979f26c95d34324ba005bfacfa9c4fc, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1300359889 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1300359894} - - component: {fileID: 1300359893} - - component: {fileID: 1300359892} - - component: {fileID: 1300359890} - m_Layer: 5 - m_Name: FadeCanvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1300359890 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1300359889} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 363a8867bb9c7b845a73233566df8c1e, type: 3} - m_Name: - m_EditorClassIdentifier: - speed: 1 - fadeImage: {fileID: 1040404845} - fadeColor: {r: 0, g: 0, b: 0, a: 1} ---- !u!114 &1300359892 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1300359889} - 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 ---- !u!223 &1300359893 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1300359889} - 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 &1300359894 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1300359889} - 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: 1040404847} - m_Father: {fileID: 1074858617} - 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: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity.meta deleted file mode 100644 index 13352b4c6..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Offline.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9959d9d8e637be64dab77006a85135c1 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.meta deleted file mode 100644 index 133371f65..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e73939c6462fca44d9c1fa826ff5c072 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity deleted file mode 100644 index 4b02b95a1..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity +++ /dev/null @@ -1,751 +0,0 @@ -%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: 1 - m_FogColor: {r: 0.0627451, g: 0.08235294, b: 0.18431373, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0, g: 0, b: 0, 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: 2100000, guid: 81f714daf7144784b8a2f42f1cd30927, type: 2} - 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.043674428, g: 0.044857424, b: 0.059592403, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 112000002, guid: 7868b86bff1943140826320e66c66468, - type: 2} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &203151409 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 203151411} - - component: {fileID: 203151410} - m_Layer: 0 - m_Name: Directional Light (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &203151410 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203151409} - 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: 0.5 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 0.5 - 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: 0 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &203151411 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203151409} - m_LocalRotation: {x: 0.55403227, y: -0.21201213, z: 0.14845248, w: 0.79124016} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 70, y: -30, z: 0} ---- !u!1 &413994573 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 413994576} - - component: {fileID: 413994575} - - component: {fileID: 413994574} - 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 &413994574 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 413994573} - m_Enabled: 1 ---- !u!20 &413994575 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 413994573} - 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 &413994576 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 413994573} - m_LocalRotation: {x: 0, y: -0.2658926, z: 0, w: 0.9640027} - m_LocalPosition: {x: 3.84, y: 1.91, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: -30.84, z: 0} ---- !u!1 &499382192 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 499382200} - - component: {fileID: 499382199} - - component: {fileID: 499382197} - - component: {fileID: 499382196} - - component: {fileID: 499382195} - - component: {fileID: 499382194} - - component: {fileID: 499382193} - m_Layer: 0 - m_Name: SafetyPlane - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!65 &499382193 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 10, y: 10, z: 0.1} - m_Center: {x: 0, y: 5, z: 5} ---- !u!65 &499382194 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.1, y: 10, z: 10} - m_Center: {x: 5, y: 5, z: 0} ---- !u!65 &499382195 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.1, y: 10, z: 10} - m_Center: {x: -5, y: 5, z: 0} ---- !u!65 &499382196 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 10, y: 10, z: 0.1} - m_Center: {x: 0, y: 5, z: -5} ---- !u!64 &499382197 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!33 &499382199 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &499382200 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 499382192} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 3, y: 1, z: 3} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1110529627 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1110529629} - - component: {fileID: 1110529628} - m_Layer: 0 - m_Name: Directional Light (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &1110529628 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1110529627} - 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: 0.5 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 0.5 - 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: 0 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1110529629 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1110529627} - m_LocalRotation: {x: 0.9848078, y: -0, z: -0, w: -0.17364809} - 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: 200, y: 0, z: 0} ---- !u!1 &1309024824 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1309024826} - - component: {fileID: 1309024825} - m_Layer: 0 - m_Name: Directional Light (4) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &1309024825 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1309024824} - 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: 0.5 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 0.5 - 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: 0 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1309024826 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1309024824} - m_LocalRotation: {x: 0.28678825, y: -0.70940644, z: -0.4967319, w: -0.4095759} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 290, y: 120, z: 0} ---- !u!1 &1606864533 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1606864535} - - component: {fileID: 1606864534} - m_Layer: 0 - m_Name: Directional Light (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &1606864534 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1606864533} - 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: 0.5 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 0.5 - 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: 0 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1606864535 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1606864533} - m_LocalRotation: {x: 0.9063079, y: 0, z: 0, w: 0.42261827} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 130, y: 0, z: 0} ---- !u!1 &1841150988 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1841150991} - - component: {fileID: 1841150990} - - component: {fileID: 1841150989} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1841150989 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1841150988} - 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 &1841150990 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1841150988} - 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 &1841150991 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1841150988} - 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} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity.meta deleted file mode 100644 index 5713db861..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 3c63960543989ea41ba3d3fb04d6dcf3 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/LightingData.asset b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/LightingData.asset deleted file mode 100644 index ce15e19854518fe30a4f1d88515271f3d686d6ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19648 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 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/ReflectionProbe-0.exr.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/ReflectionProbe-0.exr.meta deleted file mode 100644 index ebde034b9..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/Online/ReflectionProbe-0.exr.meta +++ /dev/null @@ -1,92 +0,0 @@ -fileFormatVersion: 2 -guid: 433b69cd38057f84bb82796761c1be49 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 1 - seamlessCubemap: 1 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 2 - aniso: 0 - mipBias: 0 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 2 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 100 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity b/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity deleted file mode 100644 index 95a98ef9b..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity +++ /dev/null @@ -1,1021 +0,0 @@ -%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.18028378, g: 0.22571412, b: 0.30692285, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - 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: 112000006, guid: 7868b86bff1943140826320e66c66468, - type: 2} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &126437272 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 126437274} - - component: {fileID: 126437273} - m_Layer: 0 - m_Name: Environment - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &126437273 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 126437272} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 1317994002 - serverOnly: 0 - visible: 0 - m_AssetId: - hasSpawned: 0 ---- !u!4 &126437274 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 126437272} - 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: 1373387508} - - {fileID: 1445828407} - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &472411619 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 472411620} - - component: {fileID: 472411621} - m_Layer: 0 - m_Name: StartPosition - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &472411620 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 472411619} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -6, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1518259679} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &472411621 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 472411619} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &493146027 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 493146028} - - component: {fileID: 493146029} - m_Layer: 0 - m_Name: StartPosition - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &493146028 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 493146027} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -9, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1518259679} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &493146029 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 493146027} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &939597736 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 939597737} - m_Layer: 0 - m_Name: Cubes - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &939597737 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 939597736} - 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: 3181899219847070119} - - {fileID: 1294796099} - - {fileID: 2120764046} - - {fileID: 1071886464} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1071886463 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 939597737} - m_Modifications: - - target: {fileID: -1828993248307539358, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: sceneId - value: 656062201 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528418, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_Name - value: Cube - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.x - value: 7 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 7c6a0a278eba11e44b9a86cd4da603df, type: 3} ---- !u!4 &1071886464 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - m_PrefabInstance: {fileID: 1071886463} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1224119056 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1224119057} - - component: {fileID: 1224119058} - m_Layer: 0 - m_Name: StartPosition - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1224119057 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1224119056} - 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: 1518259679} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1224119058 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1224119056} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1001 &1294796098 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 939597737} - m_Modifications: - - target: {fileID: -1828993248307539358, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: sceneId - value: 3113436280 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528418, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_Name - value: Cube - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.x - value: -1 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 7c6a0a278eba11e44b9a86cd4da603df, type: 3} ---- !u!4 &1294796099 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - m_PrefabInstance: {fileID: 1294796098} - m_PrefabAsset: {fileID: 0} ---- !u!4 &1373387508 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - m_PrefabInstance: {fileID: 7582855648999245619} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1445828406 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 126437274} - m_Modifications: - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008055, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_Name - value: Plane - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, type: 3} ---- !u!4 &1445828407 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - m_PrefabInstance: {fileID: 1445828406} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1513281386 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1513281387} - - component: {fileID: 1513281388} - m_Layer: 0 - m_Name: StartPosition - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1513281387 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1513281386} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1518259679} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1513281388 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1513281386} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1518259678 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1518259679} - m_Layer: 0 - m_Name: StartPosttions - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1518259679 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1518259678} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1.1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 493146028} - - {fileID: 472411620} - - {fileID: 1513281387} - - {fileID: 1224119057} - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1842934413 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1842934415} - - component: {fileID: 1842934414} - m_Layer: 0 - m_Name: PhysicsSimulator - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1842934414 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1842934413} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 472efbe031bc80a499ea2a1003ac7452, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1842934415 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1842934413} - 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!1001 &2120764045 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 939597737} - m_Modifications: - - target: {fileID: -1828993248307539358, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: sceneId - value: 3424948259 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528418, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_Name - value: Cube - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.x - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 7c6a0a278eba11e44b9a86cd4da603df, type: 3} ---- !u!4 &2120764046 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - m_PrefabInstance: {fileID: 2120764045} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1098173225757504847 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalPosition.x - value: -10 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalPosition.z - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622925, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_Name - value: Portal - objectReference: {fileID: 0} - - target: {fileID: 3141292696673982546, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: sceneId - value: 1143465467 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: startPosition.x - value: -5 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: startPosition.y - value: 1.1 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: startPosition.z - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: destinationScene - value: Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: c624c75494b4d7d4086b9212f897e56a, type: 3} ---- !u!1001 &3181899219847070118 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 939597737} - m_Modifications: - - target: {fileID: -1828993248307539358, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: sceneId - value: 3043478025 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528418, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_Name - value: Cube - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.x - value: -5 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 7c6a0a278eba11e44b9a86cd4da603df, type: 3} ---- !u!4 &3181899219847070119 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 3181899219042528419, guid: 7c6a0a278eba11e44b9a86cd4da603df, - type: 3} - m_PrefabInstance: {fileID: 3181899219847070118} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &7582855648999245619 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 126437274} - m_Modifications: - - target: {fileID: 7582855647636897216, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_Name - value: StartPoint - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalPosition.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalPosition.z - value: -10 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 849c125c9d8094249b3c664da1cd143a, type: 3} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity.meta deleted file mode 100644 index 0b2651c57..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 91c0fa5f4542be14dbad5c838292056b -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity b/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity deleted file mode 100644 index de14d14f5..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity +++ /dev/null @@ -1,820 +0,0 @@ -%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.18028378, g: 0.22571412, b: 0.30692285, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - 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: 112000004, guid: 7868b86bff1943140826320e66c66468, - type: 2} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1001 &571924470 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalPosition.x - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalPosition.z - value: -10 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622921, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1098173225717622925, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: m_Name - value: Portal - objectReference: {fileID: 0} - - target: {fileID: 3141292696673982546, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: sceneId - value: 1073849646 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: originScene - value: Assets/DungeonTest/Scenes/Level2.unity - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: startPosition.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: startPosition.y - value: 1.1 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: startPosition.z - value: -10 - objectReference: {fileID: 0} - - target: {fileID: 5948271423698091598, guid: c624c75494b4d7d4086b9212f897e56a, - type: 3} - propertyPath: destinationScene - value: Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel1.unity - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: c624c75494b4d7d4086b9212f897e56a, type: 3} ---- !u!1001 &1071886463 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1514693545} - m_Modifications: - - target: {fileID: -5172514306435102607, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: sceneId - value: 2068572849 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236743, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_Name - value: Sphere - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e588080aa542be54d9ca9d5c734dc9ee, type: 3} ---- !u!4 &1071886464 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - m_PrefabInstance: {fileID: 1071886463} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1294796098 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1514693545} - m_Modifications: - - target: {fileID: -5172514306435102607, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: sceneId - value: 131067959 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.x - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236743, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_Name - value: Sphere - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e588080aa542be54d9ca9d5c734dc9ee, type: 3} ---- !u!4 &1294796099 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - m_PrefabInstance: {fileID: 1294796098} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1514693544 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1514693545} - m_Layer: 0 - m_Name: Spheres - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1514693545 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1514693544} - 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: 2188792038635513490} - - {fileID: 1294796099} - - {fileID: 2120764046} - - {fileID: 1071886464} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1842934413 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1842934415} - - component: {fileID: 1842934414} - m_Layer: 0 - m_Name: PhysicsSimulator - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1842934414 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1842934413} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 472efbe031bc80a499ea2a1003ac7452, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1842934415 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1842934413} - 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!1 &1932534637 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1932534639} - - component: {fileID: 1932534638} - m_Layer: 0 - m_Name: Environment - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1932534638 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1932534637} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 159404139 - serverOnly: 0 - visible: 0 - m_AssetId: - hasSpawned: 0 ---- !u!4 &1932534639 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1932534637} - 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: 1999985658} - - {fileID: 6358973573665600640} - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1999985657 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1932534639} - m_Modifications: - - target: {fileID: 7582855647636897216, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_Name - value: StartPoint - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalPosition.x - value: -5 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalPosition.z - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 849c125c9d8094249b3c664da1cd143a, type: 3} ---- !u!4 &1999985658 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 7582855647636897223, guid: 849c125c9d8094249b3c664da1cd143a, - type: 3} - m_PrefabInstance: {fileID: 1999985657} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &2120764045 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1514693545} - m_Modifications: - - target: {fileID: -5172514306435102607, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: sceneId - value: 1581864539 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236743, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_Name - value: Sphere - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e588080aa542be54d9ca9d5c734dc9ee, type: 3} ---- !u!4 &2120764046 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - m_PrefabInstance: {fileID: 2120764045} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &2188792038635513489 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1514693545} - m_Modifications: - - target: {fileID: -5172514306435102607, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: sceneId - value: 3873206969 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.x - value: -7 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2188792038427236743, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - propertyPath: m_Name - value: Sphere - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e588080aa542be54d9ca9d5c734dc9ee, type: 3} ---- !u!4 &2188792038635513490 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 2188792038427236742, guid: e588080aa542be54d9ca9d5c734dc9ee, - type: 3} - m_PrefabInstance: {fileID: 2188792038635513489} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &6358973573665600639 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1932534639} - m_Modifications: - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7349408984269008055, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - propertyPath: m_Name - value: Plane - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, type: 3} ---- !u!4 &6358973573665600640 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 7349408984269008052, guid: 4fdcc4aa5c669b348a5954a92f5e8e89, - type: 3} - m_PrefabInstance: {fileID: 6358973573665600639} - m_PrefabAsset: {fileID: 0} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity.meta b/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity.meta deleted file mode 100644 index 6296895e5..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scenes/SubLevel2.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e8e2dc8c3ef824b468c6f6e1980a4b27 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts.meta deleted file mode 100644 index 4e40c32d6..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: daf19edd647d8ae4ead9cb46f24f5424 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs deleted file mode 100644 index 6cb2184a5..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs +++ /dev/null @@ -1,187 +0,0 @@ -using System.Collections; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace Mirror.Examples.AdditiveLevels -{ - [AddComponentMenu("")] - public class AdditiveLevelsNetworkManager : NetworkManager - { - [Header("Additive Scenes - First is start scene")] - - [Scene, Tooltip("Add additive scenes here.\nFirst entry will be players' start scene")] - public string[] additiveScenes; - - [Header("Fade Control - See child FadeCanvas")] - - [Tooltip("Reference to FadeInOut script on child FadeCanvas")] - public FadeInOut fadeInOut; - - // This is set true after server loads all subscene instances - bool subscenesLoaded; - - // This is managed in LoadAdditive, UnloadAdditive, and checked in OnClientSceneChanged - bool isInTransition; - - #region Scene Management - - /// - /// Called on the server when a scene is completed loaded, when the scene load was initiated by the server with ServerChangeScene(). - /// - /// The name of the new scene. - public override void OnServerSceneChanged(string sceneName) - { - // This fires after server fully changes scenes, e.g. offline to online - // If server has just loaded the Container (online) scene, load the subscenes on server - if (sceneName == onlineScene) - StartCoroutine(ServerLoadSubScenes()); - } - - IEnumerator ServerLoadSubScenes() - { - foreach (string additiveScene in additiveScenes) - yield return SceneManager.LoadSceneAsync(additiveScene, new LoadSceneParameters - { - loadSceneMode = LoadSceneMode.Additive, - localPhysicsMode = LocalPhysicsMode.Physics3D // change this to .Physics2D for a 2D game - }); - - subscenesLoaded = true; - } - - /// - /// Called from ClientChangeScene immediately before SceneManager.LoadSceneAsync is executed - /// This allows client to do work / cleanup / prep before the scene changes. - /// - /// Name of the scene that's about to be loaded - /// Scene operation that's about to happen - /// true to indicate that scene loading will be handled through overrides - public override void OnClientChangeScene(string sceneName, SceneOperation sceneOperation, bool customHandling) - { - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} OnClientChangeScene {sceneName} {sceneOperation}"); - - if (sceneOperation == SceneOperation.UnloadAdditive) - StartCoroutine(UnloadAdditive(sceneName)); - - if (sceneOperation == SceneOperation.LoadAdditive) - StartCoroutine(LoadAdditive(sceneName)); - } - - IEnumerator LoadAdditive(string sceneName) - { - isInTransition = true; - - // This will return immediately if already faded in - // e.g. by UnloadAdditive above or by default startup state - yield return fadeInOut.FadeIn(); - - // host client is on server...don't load the additive scene again - if (mode == NetworkManagerMode.ClientOnly) - { - // Start loading the additive subscene - loadingSceneAsync = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); - - while (loadingSceneAsync != null && !loadingSceneAsync.isDone) - yield return null; - } - - // Reset these to false when ready to proceed - NetworkClient.isLoadingScene = false; - isInTransition = false; - - OnClientSceneChanged(); - - yield return fadeInOut.FadeOut(); - } - - IEnumerator UnloadAdditive(string sceneName) - { - isInTransition = true; - - // This will return immediately if already faded in - // e.g. by LoadAdditive above or by default startup state - yield return fadeInOut.FadeIn(); - - if (mode == NetworkManagerMode.ClientOnly) - { - yield return SceneManager.UnloadSceneAsync(sceneName); - yield return Resources.UnloadUnusedAssets(); - } - - // Reset these to false when ready to proceed - NetworkClient.isLoadingScene = false; - isInTransition = false; - - OnClientSceneChanged(); - - // There is no call to FadeOut here on purpose. - // Expectation is that a LoadAdditive will follow - // that will call FadeOut after that scene loads. - } - - /// - /// Called on clients when a scene has completed loaded, when the scene load was initiated by the server. - /// Scene changes can cause player objects to be destroyed. The default implementation of OnClientSceneChanged in the NetworkManager is to add a player object for the connection if no player object exists. - /// - /// The network connection that the scene change message arrived on. - public override void OnClientSceneChanged() - { - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} OnClientSceneChanged {isInTransition}"); - - // Only call the base method if not in a transition. - // This will be called from DoTransition after setting doingTransition to false - // but will also be called first by Mirror when the scene loading finishes. - if (!isInTransition) - base.OnClientSceneChanged(); - } - - #endregion - - #region Server System Callbacks - - /// - /// Called on the server when a client is ready. - /// The default implementation of this function calls NetworkServer.SetClientReady() to continue the network setup process. - /// - /// Connection from client. - public override void OnServerReady(NetworkConnection conn) - { - //Debug.Log($"OnServerReady {conn} {conn.identity}"); - - // This fires from a Ready message client sends to server after loading the online scene - base.OnServerReady(conn); - - if (conn.identity == null) - StartCoroutine(AddPlayerDelayed(conn)); - } - - // This delay is mostly for the host player that loads too fast for the - // server to have subscenes async loaded from OnServerSceneChanged ahead of it. - IEnumerator AddPlayerDelayed(NetworkConnection conn) - { - // Wait for server to async load all subscenes for game instances - while (!subscenesLoaded) - yield return null; - - // Send Scene msg to client telling it to load the first additive scene - conn.Send(new SceneMessage { sceneName = additiveScenes[0], sceneOperation = SceneOperation.LoadAdditive, customHandling = true }); - - // We have Network Start Positions in first additive scene...pick one - Transform start = GetStartPosition(); - - // Instantiate player as child of start position - this will place it in the additive scene - // This also lets player object "inherit" pos and rot from start position transform - GameObject player = Instantiate(playerPrefab, start); - // now set parent null to get it out from under the Start Position object - player.transform.SetParent(null); - - // Wait for end of frame before adding the player to ensure Scene Message goes first - yield return new WaitForEndOfFrame(); - - // Finally spawn the player object for this connection - NetworkServer.AddPlayerForConnection(conn, player); - } - - #endregion - } -} \ No newline at end of file diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs.meta deleted file mode 100644 index af10a3c29..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/AdditiveLevelsNetworkManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 01eafa8309a0894479f0f87ae1a9c30f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs deleted file mode 100644 index c378980d0..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Collections; -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.AdditiveLevels -{ - public class FadeInOut : MonoBehaviour - { - // set these in the inspector - [Range(1, 100), Tooltip("Speed of fade in / out: lower is slower")] - public byte speed = 1; - - [Tooltip("Reference to Image component on child panel")] - public Image fadeImage; - - [Tooltip("Color to use during scene transition")] - public Color fadeColor = Color.black; - - WaitForSeconds waitForSeconds; - - void Awake() - { - waitForSeconds = new WaitForSeconds(speed * 0.01f); - } - - public IEnumerator FadeIn() - { - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} FadeIn - fading image in {fadeImage.color.a}"); - - float alpha = fadeImage.color.a; - - while (alpha < 1) - { - yield return waitForSeconds; - alpha += 0.01f; - fadeColor.a = alpha; - fadeImage.color = fadeColor; - } - - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} FadeIn - done fading"); - } - - public IEnumerator FadeOut() - { - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} FadeOut - fading image out {fadeImage.color.a}"); - - float alpha = fadeImage.color.a; - - while (alpha > 0) - { - yield return waitForSeconds; - alpha -= 0.01f; - fadeColor.a = alpha; - fadeImage.color = fadeColor; - } - - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} FadeOut - done fading"); - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs.meta deleted file mode 100644 index c54328fe2..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/FadeInOut.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 363a8867bb9c7b845a73233566df8c1e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs deleted file mode 100644 index 22954164f..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs +++ /dev/null @@ -1,14 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveLevels -{ - // This script is attached to portal labels to keep them facing the camera - public class LookAtMainCamera : MonoBehaviour - { - // LateUpdate so that all camera updates are finished. - void LateUpdate() - { - transform.forward = Camera.main.transform.forward; - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs.meta deleted file mode 100644 index 34a99785d..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/LookAtMainCamera.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cc58300ee45438a418d9e32957fdc0c0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs deleted file mode 100644 index 7b0da7aa6..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs +++ /dev/null @@ -1,40 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveLevels -{ - public class PhysicsSimulator : MonoBehaviour - { - PhysicsScene physicsScene; - PhysicsScene2D physicsScene2D; - - bool simulatePhysicsScene; - bool simulatePhysicsScene2D; - - void Awake() - { - if (NetworkServer.active) - { - physicsScene = gameObject.scene.GetPhysicsScene(); - simulatePhysicsScene = physicsScene.IsValid() && physicsScene != Physics.defaultPhysicsScene; - - physicsScene2D = gameObject.scene.GetPhysicsScene2D(); - simulatePhysicsScene2D = physicsScene2D.IsValid() && physicsScene2D != Physics2D.defaultPhysicsScene; - } - else - { - enabled = false; - } - } - - void FixedUpdate() - { - if (!NetworkServer.active) return; - - if (simulatePhysicsScene) - physicsScene.Simulate(Time.fixedDeltaTime); - - if (simulatePhysicsScene2D) - physicsScene2D.Simulate(Time.fixedDeltaTime); - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs.meta deleted file mode 100644 index b683f9a82..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PhysicsSimulator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 472efbe031bc80a499ea2a1003ac7452 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs deleted file mode 100644 index 356589a6a..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs +++ /dev/null @@ -1,41 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; - -// This sets up the scene camera for the local player - -namespace Mirror.Examples.AdditiveLevels -{ - public class PlayerCamera : NetworkBehaviour - { - Camera mainCam; - - void Awake() - { - mainCam = Camera.main; - } - - public override void OnStartLocalPlayer() - { - if (mainCam != null) - { - // configure and make camera a child of player with 3rd person offset - mainCam.orthographic = false; - mainCam.transform.SetParent(transform); - mainCam.transform.localPosition = new Vector3(0f, 3f, -8f); - mainCam.transform.localEulerAngles = new Vector3(10f, 0f, 0f); - } - } - - public override void OnStopClient() - { - if (isLocalPlayer && mainCam != null) - { - mainCam.transform.SetParent(null); - SceneManager.MoveGameObjectToScene(mainCam.gameObject, SceneManager.GetActiveScene()); - mainCam.orthographic = true; - mainCam.transform.localPosition = new Vector3(0f, 70f, 0f); - mainCam.transform.localEulerAngles = new Vector3(90f, 0f, 0f); - } - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs.meta deleted file mode 100644 index c70cb63e2..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerCamera.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 22976424f775a0f4a8531e6713ff6de2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs deleted file mode 100644 index 8cabd66e1..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs +++ /dev/null @@ -1,95 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveLevels -{ - [RequireComponent(typeof(CapsuleCollider))] - [RequireComponent(typeof(CharacterController))] - [RequireComponent(typeof(NetworkTransform))] - [RequireComponent(typeof(Rigidbody))] - public class PlayerController : NetworkBehaviour - { - public CharacterController characterController; - - [Header("Movement Settings")] - public float moveSpeed = 8f; - public float turnSensitivity = 5f; - public float maxTurnSpeed = 100f; - - [Header("Diagnostics")] - public float horizontal; - public float vertical; - public float turn; - public float jumpSpeed; - public bool isGrounded = true; - public bool isFalling; - public Vector3 velocity; - - void OnValidate() - { - if (characterController == null) - characterController = GetComponent(); - - characterController.enabled = false; - GetComponent().isKinematic = true; - GetComponent().clientAuthority = true; - } - - public override void OnStartLocalPlayer() - { - characterController.enabled = true; - } - - void Update() - { - if (!isLocalPlayer || characterController == null || !characterController.enabled) - return; - - horizontal = Input.GetAxis("Horizontal"); - vertical = Input.GetAxis("Vertical"); - - // Q and E cancel each other out, reducing the turn to zero - if (Input.GetKey(KeyCode.Q)) - turn = Mathf.MoveTowards(turn, -maxTurnSpeed, turnSensitivity); - if (Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, maxTurnSpeed, turnSensitivity); - if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, 0, turnSensitivity); - if (!Input.GetKey(KeyCode.Q) && !Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, 0, turnSensitivity); - - if (isGrounded) - isFalling = false; - - if ((isGrounded || !isFalling) && jumpSpeed < 1f && Input.GetKey(KeyCode.Space)) - { - jumpSpeed = Mathf.Lerp(jumpSpeed, 1f, 0.5f); - } - else if (!isGrounded) - { - isFalling = true; - jumpSpeed = 0; - } - } - - void FixedUpdate() - { - if (!isLocalPlayer || characterController == null || !characterController.enabled) - return; - - transform.Rotate(0f, turn * Time.fixedDeltaTime, 0f); - - Vector3 direction = new Vector3(horizontal, jumpSpeed, vertical); - direction = Vector3.ClampMagnitude(direction, 1f); - direction = transform.TransformDirection(direction); - direction *= moveSpeed; - - if (jumpSpeed > 0) - characterController.Move(direction * Time.fixedDeltaTime); - else - characterController.SimpleMove(direction); - - isGrounded = characterController.isGrounded; - velocity = characterController.velocity; - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs.meta deleted file mode 100644 index eebb2a34e..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/PlayerController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 05e10150710dde14b83d3c8f5aa853c2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs deleted file mode 100644 index e0df00ca5..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Collections; -using System.IO; -using System.Text.RegularExpressions; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace Mirror.Examples.AdditiveLevels -{ - public class Portal : NetworkBehaviour - { - [Scene, Tooltip("Which scene to send player from here")] - public string destinationScene; - - [Tooltip("Where to spawn player in Destination Scene")] - public Vector3 startPosition; - - [Tooltip("Reference to child TMP label")] - public TMPro.TextMeshPro label; - - [SyncVar(hook = nameof(OnLabelTextChanged))] - public string labelText; - - public void OnLabelTextChanged(string _, string newValue) - { - label.text = labelText; - } - - // This is approximately the fade time - WaitForSeconds waitForFade = new WaitForSeconds(2f); - - public override void OnStartServer() - { - labelText = Path.GetFileNameWithoutExtension(destinationScene); - - // Simple Regex to insert spaces before capitals, numbers - labelText = Regex.Replace(labelText, @"\B[A-Z0-9]+", " $0"); - } - - // Note that I have created layers called Player(8) and Portal(9) and set them - // up in the Physics collision matrix so only Player collides with Portal. - void OnTriggerEnter(Collider other) - { - // tag check in case you didn't set up the layers and matrix as noted above - if (!other.CompareTag("Player")) return; - - //Debug.Log($"{System.DateTime.Now:HH:mm:ss:fff} Portal::OnTriggerEnter {gameObject.name} in {gameObject.scene.name}"); - - // applies to host client on server and remote clients - if (other.TryGetComponent(out PlayerController playerController)) - playerController.enabled = false; - - if (isServer) - StartCoroutine(SendPlayerToNewScene(other.gameObject)); - } - - [ServerCallback] - IEnumerator SendPlayerToNewScene(GameObject player) - { - if (player.TryGetComponent(out NetworkIdentity identity)) - { - NetworkConnectionToClient conn = identity.connectionToClient; - if (conn == null) yield break; - - // Tell client to unload previous subscene. No custom handling for this. - conn.Send(new SceneMessage { sceneName = gameObject.scene.path, sceneOperation = SceneOperation.UnloadAdditive, customHandling = true }); - - yield return waitForFade; - - //Debug.Log($"SendPlayerToNewScene RemovePlayerForConnection {conn} netId:{conn.identity.netId}"); - NetworkServer.RemovePlayerForConnection(conn, false); - - // reposition player on server and client - player.transform.position = startPosition; - player.transform.LookAt(Vector3.up); - - // Move player to new subscene. - SceneManager.MoveGameObjectToScene(player, SceneManager.GetSceneByPath(destinationScene)); - - // Tell client to load the new subscene with custom handling (see NetworkManager::OnClientChangeScene). - conn.Send(new SceneMessage { sceneName = destinationScene, sceneOperation = SceneOperation.LoadAdditive, customHandling = true }); - - //Debug.Log($"SendPlayerToNewScene AddPlayerForConnection {conn} netId:{conn.identity.netId}"); - NetworkServer.AddPlayerForConnection(conn, player); - - // host client would have been disabled by OnTriggerEnter above - if (NetworkClient.localPlayer != null && NetworkClient.localPlayer.TryGetComponent(out PlayerController playerController)) - playerController.enabled = true; - } - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs.meta deleted file mode 100644 index 92289a99b..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/Portal.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0e680878006965146a8f9d85834c4d1c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs b/Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs deleted file mode 100644 index e82613e5a..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs +++ /dev/null @@ -1,36 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveLevels -{ - public class RandomColor : NetworkBehaviour - { - // Color32 packs to 4 bytes - [SyncVar(hook = nameof(SetColor))] - public Color32 color = Color.black; - - // Unity clones the material when GetComponent().material is called - // Cache it here and destroy it in OnDestroy to prevent a memory leak - Material cachedMaterial; - - void SetColor(Color32 _, Color32 newColor) - { - if (cachedMaterial == null) cachedMaterial = GetComponentInChildren().material; - cachedMaterial.color = newColor; - } - - void OnDestroy() - { - Destroy(cachedMaterial); - } - - public override void OnStartServer() - { - base.OnStartServer(); - - // This script is on players that are respawned repeatedly - // so once the color has been set, don't change it. - if (color == Color.black) - color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f); - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs.meta b/Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs.meta deleted file mode 100644 index 516f25598..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Scripts/RandomColor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a91a718a70d01b347b75cb768a6f1a92 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Textures.meta b/Assets/Mirror/Examples/AdditiveLevels/Textures.meta deleted file mode 100644 index 9335d0d09..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Textures.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: a1ac2873c4eb8d64db33d7df8acb9188 -folderAsset: yes -timeCreated: 1497127550 -licenseType: Store -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Textures/Back_Tex.jpeg b/Assets/Mirror/Examples/AdditiveLevels/Textures/Back_Tex.jpeg deleted file mode 100644 index f5d4c11bf1076159b76e975884ef051a67ea76f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68766 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 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Textures/Down_Tex.jpeg.meta b/Assets/Mirror/Examples/AdditiveLevels/Textures/Down_Tex.jpeg.meta deleted file mode 100644 index d04aca2f3..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Textures/Down_Tex.jpeg.meta +++ /dev/null @@ -1,92 +0,0 @@ -fileFormatVersion: 2 -guid: 9ffeeee1accdc4b4faf2b3e27b226340 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: -1 - wrapV: -1 - wrapW: -1 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg b/Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg deleted file mode 100644 index 5e91f3f23b0d1583f50cf4268a7c71ce0a3978c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72964 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 diff --git a/Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg.meta b/Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg.meta deleted file mode 100644 index 36658d008..000000000 --- a/Assets/Mirror/Examples/AdditiveLevels/Textures/Front_Tex.jpeg.meta +++ /dev/null @@ -1,92 +0,0 @@ -fileFormatVersion: 2 -guid: ca928ef0e269448ba82388eb41d48544 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: -1 - wrapV: -1 - wrapW: -1 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveLevels/Textures/Left_Tex.jpeg b/Assets/Mirror/Examples/AdditiveLevels/Textures/Left_Tex.jpeg deleted file mode 100644 index 5f7de24d423d12697a8d207d36ad986479daad53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68026 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

    +>rMOvL;uV}qp-&>li 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

    (iYbRfbpta)i7 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 ImBxSn*> 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%0D_2!&w$???@3A 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 Build and Run - -Start up to 3 built instances: These will all be client players. - -Press Play in the Editor and click Host (Server + Client) in the HUD -- This will be the host and the 1st player of up to 4. You can also use Server Only if you prefer. - -Click Client in the built instances. -- WASDQE keys to move & turn your player capsule. -- There are objects in the corners of the scene hidden by Proximity Checkers. -- The big area in the middle is where the subscene will be loaded when you get near the shelter. -- There are also networked objects inside the subscene, also with Proximity Checkers. -- Since subscenes are only loaded for individual clients, other clients that are outside the middle Zone won't see what those in the subscene can see. -- If you play a built instance as Host or Server and play as client in the editor, you'll see the subscene content load and unload in the hierarchy as you move in and out of the middle Zone. diff --git a/Assets/Mirror/Examples/AdditiveScenes/README.md.meta b/Assets/Mirror/Examples/AdditiveScenes/README.md.meta deleted file mode 100644 index 470c34f8e..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0a023e0d7315ac74094703ab69348733 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scenes.meta b/Assets/Mirror/Examples/AdditiveScenes/Scenes.meta deleted file mode 100644 index 79b44f1e0..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e989860f377e7764bb7787086ef44ea4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity b/Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity deleted file mode 100644 index c230c5b76..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity +++ /dev/null @@ -1,2098 +0,0 @@ -%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.17276844, g: 0.21589246, b: 0.2978263, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 10 - m_AtlasSize: 512 - 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: 0 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 256 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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: 112000004, guid: b287b2046ddc6af4b9ddc48ab35ca3cb, - type: 2} - m_UseShadowmask: 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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &34755345 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 34755346} - - component: {fileID: 34755348} - - component: {fileID: 34755347} - m_Layer: 0 - m_Name: VisibleRangeCapsule - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &34755346 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 34755345} - m_LocalRotation: {x: 0, y: 0.3826836, z: -0, w: -0.92387944} - m_LocalPosition: {x: 20, y: 1, z: -20} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 47225731} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 315, z: 0} ---- !u!23 &34755347 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 34755345} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &34755348 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 34755345} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &47225730 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 47225731} - m_Layer: 0 - m_Name: ProximityVisualizers - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &47225731 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 47225730} - 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: 1727677799} - - {fileID: 62078680} - - {fileID: 589935541} - - {fileID: 34755346} - m_Father: {fileID: 909502395} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &62078679 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 62078680} - - component: {fileID: 62078682} - - component: {fileID: 62078681} - m_Layer: 0 - m_Name: VisibleRangeCylinder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &62078680 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 62078679} - m_LocalRotation: {x: 0, y: 0.9238796, z: -0, w: -0.38268325} - m_LocalPosition: {x: 20, y: 1, z: 20} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 47225731} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 225, z: 0} ---- !u!23 &62078681 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 62078679} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &62078682 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 62078679} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1001 &160176455 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 909502395} - m_Modifications: - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalPosition.x - value: -20 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalPosition.z - value: -20 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalRotation.w - value: 0.92387956 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalRotation.y - value: 0.38268343 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 45 - objectReference: {fileID: 0} - - target: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 160176457, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_Name - value: Tank - objectReference: {fileID: 0} - - target: {fileID: 160176459, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: sceneId - value: 1579907432 - objectReference: {fileID: 0} - - target: {fileID: 160176459, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_AssetId - value: ab222ed73ada1ac4ba2f61e843d7627c - objectReference: {fileID: 0} - - target: {fileID: 160176459, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_SceneId - value: 705590806 - objectReference: {fileID: 0} - - target: {fileID: 160176459, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} - propertyPath: m_LocalPlayerAuthority - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ab222ed73ada1ac4ba2f61e843d7627c, type: 3} ---- !u!4 &160176456 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 160176456, guid: ab222ed73ada1ac4ba2f61e843d7627c, - type: 3} - m_PrefabInstance: {fileID: 160176455} - m_PrefabAsset: {fileID: 0} ---- !u!1 &178547537 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 178547538} - - component: {fileID: 178547539} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &178547538 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 178547537} - m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: 0, y: 1.08, z: 20} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1172568542} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!114 &178547539 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 178547537} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &534669902 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 534669905} - - component: {fileID: 534669904} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &534669904 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 534669902} - 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: 1 - orthographic size: 40 - m_Depth: 0 - 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 &534669905 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 70, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!1 &589935540 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 589935541} - - component: {fileID: 589935543} - - component: {fileID: 589935542} - m_Layer: 0 - m_Name: VisibleRangeTank - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &589935541 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589935540} - m_LocalRotation: {x: 0, y: 0.38268343, z: 0, w: 0.92387956} - m_LocalPosition: {x: -20, y: 1, z: -20} - m_LocalScale: {x: 20, y: 20, z: 20} - m_Children: [] - m_Father: {fileID: 47225731} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 45, z: 0} ---- !u!23 &589935542 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589935540} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &589935543 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589935540} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &612284967 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 612284968} - - component: {fileID: 612284971} - - component: {fileID: 612284970} - - component: {fileID: 612284969} - m_Layer: 0 - m_Name: Pillar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &612284968 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 612284967} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 8, y: 3, z: -8} - m_LocalScale: {x: 1, y: 3, z: 1} - m_Children: [] - m_Father: {fileID: 1608696205} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!136 &612284969 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 612284967} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5000001 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} ---- !u!23 &612284970 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 612284967} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: aef230244d219314fb8453f0365b8176, type: 2} - 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: 0 - 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 ---- !u!33 &612284971 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 612284967} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &652875644 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 652875645} - - component: {fileID: 652875646} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &652875645 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 652875644} - m_LocalRotation: {x: 0, y: 0.7071068, z: -0, w: -0.7071068} - m_LocalPosition: {x: 20, y: 1.08, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1172568542} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 270, z: 0} ---- !u!114 &652875646 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 652875644} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &691846569 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 691846570} - - component: {fileID: 691846571} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &691846570 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 691846569} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1.08, z: -20} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1172568542} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &691846571 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 691846569} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1001 &748207074 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 909502395} - m_Modifications: - - target: {fileID: 855244094988030905, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_Name - value: Sphere - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.x - value: -20 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.z - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.w - value: 0.38268343 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.92387956 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 135 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030911, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: sceneId - value: 744240842 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030911, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_AssetId - value: f6d08eb9a8e35d84fa30a7e3ae64181a - objectReference: {fileID: 0} - - target: {fileID: 855244094988030911, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_SceneId - value: 529586728 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, type: 3} ---- !u!4 &748207075 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - m_PrefabInstance: {fileID: 748207074} - m_PrefabAsset: {fileID: 0} ---- !u!1 &794922164 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 794922165} - - component: {fileID: 794922168} - - component: {fileID: 794922167} - - component: {fileID: 794922166} - m_Layer: 0 - m_Name: Roof - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &794922165 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794922164} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 6, z: 0} - m_LocalScale: {x: 20, y: 0.2, z: 20} - m_Children: [] - m_Father: {fileID: 1608696205} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!65 &794922166 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794922164} - 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!23 &794922167 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794922164} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: aef230244d219314fb8453f0365b8176, type: 2} - 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: 0 - 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 ---- !u!33 &794922168 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794922164} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &856402103 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 856402104} - - component: {fileID: 856402107} - - component: {fileID: 856402106} - - component: {fileID: 856402105} - m_Layer: 0 - m_Name: Pillar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &856402104 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 856402103} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -8, y: 3, z: 8} - m_LocalScale: {x: 1, y: 3, z: 1} - m_Children: [] - m_Father: {fileID: 1608696205} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!136 &856402105 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 856402103} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5000001 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} ---- !u!23 &856402106 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 856402103} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: aef230244d219314fb8453f0365b8176, type: 2} - 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: 0 - 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 ---- !u!33 &856402107 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 856402103} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1001 &901271862 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 909502395} - m_Modifications: - - target: {fileID: 6852530814182375312, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_Name - value: Cylinder - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalPosition.x - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalPosition.z - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.w - value: -0.38268325 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.9238796 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 225 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375318, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: sceneId - value: 4277306991 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375318, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_SceneId - value: 568164022 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 12a4c14e672c00b4b840f937d824b890, type: 3} ---- !u!4 &901271863 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - m_PrefabInstance: {fileID: 901271862} - m_PrefabAsset: {fileID: 0} ---- !u!1 &909502394 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 909502395} - m_Layer: 0 - m_Name: Prefabs - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &909502395 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 909502394} - 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: 748207075} - - {fileID: 901271863} - - {fileID: 160176456} - - {fileID: 1284471874} - - {fileID: 47225731} - m_Father: {fileID: 0} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1047741290 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1047741291} - - component: {fileID: 1047741294} - - component: {fileID: 1047741293} - - component: {fileID: 1047741292} - m_Layer: 0 - m_Name: Pillar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1047741291 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1047741290} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -8, y: 3, z: -8} - m_LocalScale: {x: 1, y: 3, z: 1} - m_Children: [] - m_Father: {fileID: 1608696205} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!136 &1047741292 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1047741290} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5000001 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} ---- !u!23 &1047741293 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1047741290} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: aef230244d219314fb8453f0365b8176, type: 2} - 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: 0 - 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 ---- !u!33 &1047741294 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1047741290} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1072006166 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 160176457, guid: ab222ed73ada1ac4ba2f61e843d7627c, - type: 3} - m_PrefabInstance: {fileID: 160176455} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1072006167 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1072006166} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b2e242ee38a14076a39934172a19079b, type: 3} - m_Name: - m_EditorClassIdentifier: - visRange: 10 ---- !u!1 &1172568541 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1172568542} - m_Layer: 0 - m_Name: StartPositions - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1172568542 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172568541} - 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: 178547538} - - {fileID: 1816951100} - - {fileID: 652875645} - - {fileID: 691846570} - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &1284471874 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - m_PrefabInstance: {fileID: 1076878375580925077} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1405375878 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1405375880} - - component: {fileID: 1405375879} - 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 &1405375879 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1405375878} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 0.9622642, g: 0.90969414, b: 0.748932, a: 1} - m_Intensity: 0.8 - 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: 0.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_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1405375880 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1405375878} - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 1, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!1 &1461518024 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1461518032} - - component: {fileID: 1461518031} - - component: {fileID: 1461518030} - - component: {fileID: 1461518029} - - component: {fileID: 1461518028} - - component: {fileID: 1461518027} - - component: {fileID: 1461518026} - - component: {fileID: 1461518025} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!65 &1461518025 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 0.01, z: 3} - m_Center: {x: 0, y: -0.5, z: -1.5} ---- !u!65 &1461518026 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 0.01, z: 3} - m_Center: {x: 0, y: 0.5, z: -1.5} ---- !u!65 &1461518027 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.01, y: 1, z: 3} - m_Center: {x: 0.5, y: 0, z: -1.5} ---- !u!65 &1461518028 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.01, y: 1, z: 3} - m_Center: {x: -0.5, y: 0, z: -1.5} ---- !u!64 &1461518029 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &1461518030 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 6eb3f3ba66756364d8b94e662e7e8af5, type: 2} - 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: 0 - 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 ---- !u!33 &1461518031 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1461518032 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1461518024} - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 50, y: 50, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!1 &1462312433 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1462312434} - - component: {fileID: 1462312437} - - component: {fileID: 1462312436} - - component: {fileID: 1462312435} - m_Layer: 0 - m_Name: Pillar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1462312434 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1462312433} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 8, y: 3, z: 8} - m_LocalScale: {x: 1, y: 3, z: 1} - m_Children: [] - m_Father: {fileID: 1608696205} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!136 &1462312435 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1462312433} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5000001 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} ---- !u!23 &1462312436 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1462312433} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: aef230244d219314fb8453f0365b8176, type: 2} - 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: 0 - 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 ---- !u!33 &1462312437 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1462312433} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1608696204 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1608696205} - m_Layer: 0 - m_Name: Shelter - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1608696205 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1608696204} - 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: 1047741291} - - {fileID: 612284968} - - {fileID: 1462312434} - - {fileID: 856402104} - - {fileID: 794922165} - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1630383476 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1630383479} - - component: {fileID: 1630383478} - - component: {fileID: 1630383477} - m_Layer: 0 - m_Name: ZoneVisualizer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!23 &1630383477 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1630383476} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 0 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &1630383478 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1630383476} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1630383479 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1630383476} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 32, y: 32, z: 32} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1661834277 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1661834279} - - component: {fileID: 1661834281} - - component: {fileID: 1661834278} - - component: {fileID: 1661834280} - - component: {fileID: 1661834282} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!114 &1661834278 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1661834277} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 34d1daf9e7dbcb64aa647cb332054ea6, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 0 - PersistNetworkManagerToOfflineScene: 0 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 1661834280} - networkAddress: localhost - maxConnections: 100 - disconnectInactiveConnections: 0 - disconnectInactiveTimeout: 60 - authenticator: {fileID: 0} - playerPrefab: {fileID: 8872462076811691049, guid: a5bdca0a2315d43499be7dcef473fbc7, - type: 3} - autoCreatePlayer: 1 - playerSpawnMethod: 1 - spawnPrefabs: [] - Zone: {fileID: 3460729395543957449, guid: de939020b5e2aa5489ebcc4002d75d54, type: 3} - subScenes: - - Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity ---- !u!4 &1661834279 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1661834277} - 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: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1661834280 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1661834277} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - NonAlloc: 1 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &1661834281 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1661834277} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3} - m_Name: - m_EditorClassIdentifier: - showGUI: 1 - offsetX: 0 - offsetY: 0 ---- !u!114 &1661834282 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1661834277} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8f60becab051427fbdd3c8ac9ab4712b, type: 3} - m_Name: - m_EditorClassIdentifier: - visRange: 5 - rebuildInterval: 0.1 ---- !u!1 &1727677796 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1727677799} - - component: {fileID: 1727677798} - - component: {fileID: 1727677797} - m_Layer: 0 - m_Name: VisibleRangeSphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!23 &1727677797 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727677796} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &1727677798 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727677796} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1727677799 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727677796} - m_LocalRotation: {x: 0, y: 0.92387956, z: 0, w: 0.38268343} - m_LocalPosition: {x: -20, y: 1, z: 20} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 47225731} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 135, z: 0} ---- !u!1 &1816951099 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1816951100} - - component: {fileID: 1816951101} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1816951100 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1816951099} - m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} - m_LocalPosition: {x: -20, y: 1.08, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1172568542} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} ---- !u!114 &1816951101 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1816951099} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1001 &1076878375580925077 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 909502395} - m_Modifications: - - target: {fileID: 1076878374699499732, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_Name - value: Capsule - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499732, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_StaticEditorFlags - value: 4294967295 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalPosition.x - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalPosition.z - value: -20 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.w - value: -0.92387944 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.3826836 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 315 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2648107611936813301, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: sceneId - value: 2757245015 - objectReference: {fileID: 0} - - target: {fileID: 2648107611936813301, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_SceneId - value: 2061538488 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e1971f4a8c7661546bc509b44bd91b80, type: 3} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity.meta b/Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity.meta deleted file mode 100644 index a2317505b..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scenes/MainScene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7a0eee2f518e9dc4fb628d96dc452faf -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity b/Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity deleted file mode 100644 index 37161b3bd..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity +++ /dev/null @@ -1,937 +0,0 @@ -%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.12731749, g: 0.13414757, b: 0.1210787, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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: 112000002, guid: b287b2046ddc6af4b9ddc48ab35ca3cb, - type: 2} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &21610633 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 21610634} - - component: {fileID: 21610636} - - component: {fileID: 21610635} - m_Layer: 0 - m_Name: VisibleRangeCapsule - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &21610634 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21610633} - m_LocalRotation: {x: 0, y: 0.92387956, z: 0, w: 0.38268343} - m_LocalPosition: {x: 3, y: 1, z: -3} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 1690140971} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 135, z: 0} ---- !u!23 &21610635 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21610633} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &21610636 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21610633} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1001 &174598777 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1076878374699499732, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_Name - value: Capsule - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499732, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_StaticEditorFlags - value: 4294967295 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalPosition.x - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalPosition.z - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.w - value: 0.38268343 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.92387956 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 135 - objectReference: {fileID: 0} - - target: {fileID: 1076878374699499735, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2648107611936813301, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: sceneId - value: 3231330715 - objectReference: {fileID: 0} - - target: {fileID: 2648107611936813301, guid: e1971f4a8c7661546bc509b44bd91b80, - type: 3} - propertyPath: m_SceneId - value: 15452677 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: forceHidden - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: castLayers.m_Bits - value: 256 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e1971f4a8c7661546bc509b44bd91b80, type: 3} ---- !u!1 &222935521 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 222935522} - - component: {fileID: 222935524} - - component: {fileID: 222935523} - m_Layer: 0 - m_Name: VisibleRangeSphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &222935522 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 222935521} - m_LocalRotation: {x: 0, y: 0.3826836, z: -0, w: -0.92387944} - m_LocalPosition: {x: -3, y: 1, z: 3} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 1690140971} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 315, z: 0} ---- !u!23 &222935523 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 222935521} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &222935524 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 222935521} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &507729669 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 507729670} - - component: {fileID: 507729672} - - component: {fileID: 507729671} - m_Layer: 0 - m_Name: VisibleRangeCylinder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &507729670 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 507729669} - m_LocalRotation: {x: 0, y: 0.38268343, z: 0, w: 0.92387956} - m_LocalPosition: {x: 3, y: 1, z: 3} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 1690140971} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 45, z: 0} ---- !u!23 &507729671 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 507729669} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &507729672 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 507729669} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1690140970 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1690140971} - m_Layer: 0 - m_Name: ProximityVisualizers - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1690140971 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1690140970} - 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: 1722279649} - - {fileID: 21610634} - - {fileID: 222935522} - - {fileID: 507729670} - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1722279648 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1722279649} - - component: {fileID: 1722279651} - - component: {fileID: 1722279650} - m_Layer: 0 - m_Name: VisibleRangeCube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &1722279649 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1722279648} - m_LocalRotation: {x: 0, y: 0.9238796, z: -0, w: -0.38268325} - m_LocalPosition: {x: -3, y: 1, z: -3} - m_LocalScale: {x: 10, y: 10, z: 10} - m_Children: [] - m_Father: {fileID: 1690140971} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 225, z: 0} ---- !u!23 &1722279650 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1722279648} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a7c679cf124f7ae46a0291ea35848554, type: 2} - 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: 0 - 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 ---- !u!33 &1722279651 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1722279648} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1001 &855244095324068329 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 855244094988030905, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_Name - value: Sphere - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.x - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.z - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.w - value: -0.92387944 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.3826836 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 315 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: forceHidden - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: castLayers.m_Bits - value: 256 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.x - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalPosition.z - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.w - value: -0.92387944 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.3826836 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 315 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030909, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030911, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: sceneId - value: 1396685688 - objectReference: {fileID: 0} - - target: {fileID: 855244094988030911, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_SceneId - value: 11893259 - objectReference: {fileID: 0} - - target: {fileID: 855244096231524078, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_CastShadows - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244096231524078, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_ReceiveShadows - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 855244096231524078, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, - type: 3} - propertyPath: m_ReflectionProbeUsage - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: f6d08eb9a8e35d84fa30a7e3ae64181a, type: 3} ---- !u!1001 &5623359707641229621 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 5623359706949397433, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_CastShadows - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359706949397433, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_ReceiveShadows - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359706949397433, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_ReflectionProbeUsage - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648404, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: sceneId - value: 86995073 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648404, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_SceneId - value: 4733130 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalPosition.x - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalPosition.z - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.w - value: -0.38268325 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.9238796 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 225 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: forceHidden - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: castLayers.m_Bits - value: 256 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalPosition.x - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalPosition.z - value: -3 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.w - value: -0.38268325 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.9238796 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 225 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648426, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648430, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_Icon - value: - objectReference: {fileID: 0} - - target: {fileID: 5623359707189648430, guid: 4ff300cf6bb3c6342a9552c4f18788c8, - type: 3} - propertyPath: m_Name - value: Cube - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 4ff300cf6bb3c6342a9552c4f18788c8, type: 3} ---- !u!1001 &6852530815080958608 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 6852530814182375312, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_Name - value: Cylinder - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalPosition.x - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalPosition.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalPosition.z - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.w - value: 0.92387956 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.y - value: 0.38268343 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 45 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375316, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375318, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: sceneId - value: 3262924414 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: forceHidden - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: castLayers.m_Bits - value: 256 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375318, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: sceneId - value: 3262924414 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375318, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_AssetId - value: 12a4c14e672c00b4b840f937d824b890 - objectReference: {fileID: 0} - - target: {fileID: 6852530814182375318, guid: 12a4c14e672c00b4b840f937d824b890, - type: 3} - propertyPath: m_SceneId - value: 4633990 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 12a4c14e672c00b4b840f937d824b890, type: 3} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity.meta b/Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity.meta deleted file mode 100644 index 94a2050c2..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scenes/SubScene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7f4fd683fc6d866418c95f99977533a6 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts.meta deleted file mode 100644 index cb97b3255..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f9c36b0deb5d9b245b7c97e3d6eeed29 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs b/Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs deleted file mode 100644 index 756a5dca9..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Collections; -using UnityEngine; -using UnityEngine.SceneManagement; - -/* - Documentation: https://mirror-networking.gitbook.io/docs/components/network-manager - API Reference: https://mirror-networking.com/docs/api/Mirror.NetworkManager.html -*/ - -namespace Mirror.Examples.AdditiveScenes -{ - [AddComponentMenu("")] - public class AdditiveNetworkManager : NetworkManager - { - [Tooltip("Trigger Zone Prefab")] - public GameObject Zone; - - [Scene] - [Tooltip("Add all sub-scenes to this list")] - public string[] subScenes; - - public override void OnStartServer() - { - base.OnStartServer(); - - // load all subscenes on the server only - StartCoroutine(LoadSubScenes()); - - // Instantiate Zone Handler on server only - Instantiate(Zone); - } - - public override void OnStopServer() - { - StartCoroutine(UnloadScenes()); - } - - public override void OnStopClient() - { - StartCoroutine(UnloadScenes()); - } - - IEnumerator LoadSubScenes() - { - Debug.Log("Loading Scenes"); - - foreach (string sceneName in subScenes) - { - yield return SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); - // Debug.Log($"Loaded {sceneName}"); - } - } - - IEnumerator UnloadScenes() - { - Debug.Log("Unloading Subscenes"); - - foreach (string sceneName in subScenes) - if (SceneManager.GetSceneByName(sceneName).IsValid() || SceneManager.GetSceneByPath(sceneName).IsValid()) - { - yield return SceneManager.UnloadSceneAsync(sceneName); - // Debug.Log($"Unloaded {sceneName}"); - } - - yield return Resources.UnloadUnusedAssets(); - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs.meta deleted file mode 100644 index 0df3fb306..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/AdditiveNetworkManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 34d1daf9e7dbcb64aa647cb332054ea6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs b/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs deleted file mode 100644 index 66baee6c0..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs +++ /dev/null @@ -1,41 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; - -// This sets up the scene camera for the local player - -namespace Mirror.Examples.AdditiveScenes -{ - public class PlayerCamera : NetworkBehaviour - { - Camera mainCam; - - void Awake() - { - mainCam = Camera.main; - } - - public override void OnStartLocalPlayer() - { - if (mainCam != null) - { - // configure and make camera a child of player with 3rd person offset - mainCam.orthographic = false; - mainCam.transform.SetParent(transform); - mainCam.transform.localPosition = new Vector3(0f, 3f, -8f); - mainCam.transform.localEulerAngles = new Vector3(10f, 0f, 0f); - } - } - - public override void OnStopClient() - { - if (isLocalPlayer && mainCam != null) - { - mainCam.transform.SetParent(null); - SceneManager.MoveGameObjectToScene(mainCam.gameObject, SceneManager.GetActiveScene()); - mainCam.orthographic = true; - mainCam.transform.localPosition = new Vector3(0f, 70f, 0f); - mainCam.transform.localEulerAngles = new Vector3(90f, 0f, 0f); - } - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs.meta deleted file mode 100644 index 36a243fc1..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerCamera.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 437e9ed1a55931845bef07e2f5ef57e0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs b/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs deleted file mode 100644 index f27163ed4..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs +++ /dev/null @@ -1,95 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveScenes -{ - [RequireComponent(typeof(CapsuleCollider))] - [RequireComponent(typeof(CharacterController))] - [RequireComponent(typeof(NetworkTransform))] - [RequireComponent(typeof(Rigidbody))] - public class PlayerController : NetworkBehaviour - { - public CharacterController characterController; - - void OnValidate() - { - if (characterController == null) - characterController = GetComponent(); - - characterController.enabled = false; - GetComponent().isKinematic = true; - GetComponent().clientAuthority = true; - } - - public override void OnStartLocalPlayer() - { - characterController.enabled = true; - } - - [Header("Movement Settings")] - public float moveSpeed = 8f; - public float turnSensitivity = 5f; - public float maxTurnSpeed = 100f; - - [Header("Diagnostics")] - public float horizontal; - public float vertical; - public float turn; - public float jumpSpeed; - public bool isGrounded = true; - public bool isFalling; - public Vector3 velocity; - - void Update() - { - if (!isLocalPlayer || characterController == null || !characterController.enabled) - return; - - horizontal = Input.GetAxis("Horizontal"); - vertical = Input.GetAxis("Vertical"); - - // Q and E cancel each other out, reducing the turn to zero - if (Input.GetKey(KeyCode.Q)) - turn = Mathf.MoveTowards(turn, -maxTurnSpeed, turnSensitivity); - if (Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, maxTurnSpeed, turnSensitivity); - if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, 0, turnSensitivity); - if (!Input.GetKey(KeyCode.Q) && !Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, 0, turnSensitivity); - - if (isGrounded) - isFalling = false; - - if ((isGrounded || !isFalling) && jumpSpeed < 1f && Input.GetKey(KeyCode.Space)) - { - jumpSpeed = Mathf.Lerp(jumpSpeed, 1f, 0.5f); - } - else if (!isGrounded) - { - isFalling = true; - jumpSpeed = 0; - } - } - - void FixedUpdate() - { - if (!isLocalPlayer || characterController == null || !characterController.enabled) - return; - - transform.Rotate(0f, turn * Time.fixedDeltaTime, 0f); - - Vector3 direction = new Vector3(horizontal, jumpSpeed, vertical); - direction = Vector3.ClampMagnitude(direction, 1f); - direction = transform.TransformDirection(direction); - direction *= moveSpeed; - - if (jumpSpeed > 0) - characterController.Move(direction * Time.fixedDeltaTime); - else - characterController.SimpleMove(direction); - - isGrounded = characterController.isGrounded; - velocity = characterController.velocity; - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs.meta deleted file mode 100644 index 5deced647..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/PlayerController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e8f68561248aaca4fb96847ce24742ee -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs b/Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs deleted file mode 100644 index 42f1b580a..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs +++ /dev/null @@ -1,32 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveScenes -{ - public class RandomColor : NetworkBehaviour - { - public override void OnStartServer() - { - base.OnStartServer(); - color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f); - } - - // Color32 packs to 4 bytes - [SyncVar(hook = nameof(SetColor))] - public Color32 color = Color.black; - - // Unity clones the material when GetComponent().material is called - // Cache it here and destroy it in OnDestroy to prevent a memory leak - Material cachedMaterial; - - void SetColor(Color32 _, Color32 newColor) - { - if (cachedMaterial == null) cachedMaterial = GetComponentInChildren().material; - cachedMaterial.color = newColor; - } - - void OnDestroy() - { - Destroy(cachedMaterial); - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs.meta deleted file mode 100644 index 2c0008b8b..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/RandomColor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 42d1f80407105ee4f960f0b51e89452d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs b/Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs deleted file mode 100644 index 449232492..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs +++ /dev/null @@ -1,59 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveScenes -{ - // This script demonstrates the NetworkAnimator and how to leverage - // the built-in observers system to track players. - // Note that all ProximityCheckers should be restricted to the Player layer. - public class ShootingTankBehaviour : NetworkBehaviour - { - [SyncVar] - public Quaternion rotation; - - NetworkAnimator networkAnimator; - - [ServerCallback] - void Start() - { - networkAnimator = GetComponent(); - } - - [Range(0, 1)] - public float turnSpeed = 0.1f; - - void Update() - { - if (isServer && netIdentity.observers.Count > 0) - ShootNearestPlayer(); - - if (isClient) - transform.rotation = Quaternion.Slerp(transform.rotation, rotation, turnSpeed); - } - - [Server] - void ShootNearestPlayer() - { - GameObject target = null; - float distance = 100f; - - foreach (NetworkConnection networkConnection in netIdentity.observers.Values) - { - GameObject tempTarget = networkConnection.identity.gameObject; - float tempDistance = Vector3.Distance(tempTarget.transform.position, transform.position); - - if (target == null || distance > tempDistance) - { - target = tempTarget; - distance = tempDistance; - } - } - - if (target != null) - { - transform.LookAt(target.transform.position + Vector3.down); - rotation = transform.rotation; - networkAnimator.SetTrigger("Fire"); - } - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs.meta deleted file mode 100644 index 90771ab99..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ShootingTankBehaviour.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7a25c54cd35eb284eb6b8ed19cf60443 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs b/Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs deleted file mode 100644 index 180b27182..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs +++ /dev/null @@ -1,37 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.AdditiveScenes -{ - // This script is attached to a prefab called Zone that is on the Player layer - // AdditiveNetworkManager, in OnStartServer, instantiates the prefab only on the server. - // It never exists for clients (other than host client if there is one). - // The prefab has a Sphere Collider with isTrigger = true. - // These OnTrigger events only run on the server and will only send a message to the - // client that entered the Zone to load the subscene assigned to the subscene property. - public class ZoneHandler : MonoBehaviour - { - [Scene] - [Tooltip("Assign the sub-scene to load for this zone")] - public string subScene; - - [ServerCallback] - void OnTriggerEnter(Collider other) - { - // Debug.Log($"Loading {subScene}"); - - NetworkIdentity networkIdentity = other.gameObject.GetComponent(); - SceneMessage message = new SceneMessage{ sceneName = subScene, sceneOperation = SceneOperation.LoadAdditive }; - networkIdentity.connectionToClient.Send(message); - } - - [ServerCallback] - void OnTriggerExit(Collider other) - { - // Debug.Log($"Unloading {subScene}"); - - NetworkIdentity networkIdentity = other.gameObject.GetComponent(); - SceneMessage message = new SceneMessage{ sceneName = subScene, sceneOperation = SceneOperation.UnloadAdditive }; - networkIdentity.connectionToClient.Send(message); - } - } -} diff --git a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs.meta b/Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs.meta deleted file mode 100644 index 126d072d7..000000000 --- a/Assets/Mirror/Examples/AdditiveScenes/Scripts/ZoneHandler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 884ed76587eb5854abe6b428b791fdcd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic.meta b/Assets/Mirror/Examples/Basic.meta deleted file mode 100644 index 653ea786b..000000000 --- a/Assets/Mirror/Examples/Basic.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0ea49fcefbc864e19a94091a170fc06c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Prefabs.meta b/Assets/Mirror/Examples/Basic/Prefabs.meta deleted file mode 100644 index 234c22a6d..000000000 --- a/Assets/Mirror/Examples/Basic/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4f821a97809492a479cac0843442e245 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Prefabs/Player.prefab b/Assets/Mirror/Examples/Basic/Prefabs/Player.prefab deleted file mode 100644 index b9a33ea3f..000000000 --- a/Assets/Mirror/Examples/Basic/Prefabs/Player.prefab +++ /dev/null @@ -1,72 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &897184729387425976 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 897184729387425978} - - component: {fileID: 897184729387425977} - - component: {fileID: 8550999602067651493} - m_Layer: 0 - m_Name: Player - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &897184729387425978 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 897184729387425976} - 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!114 &897184729387425977 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 897184729387425976} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: dc2c4328591bef748abb8df795c17202 - hasSpawned: 0 ---- !u!114 &8550999602067651493 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 897184729387425976} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a472ac3ae1701d149861871cf416a46d, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - playerUIPrefab: {fileID: 5152941909035078397, guid: 22f1fa3a0aff72b46a371f667bb4fb30, - type: 3} - playerNumber: 0 - playerData: 0 - playerColor: - serializedVersion: 2 - rgba: 4294967295 diff --git a/Assets/Mirror/Examples/Basic/Prefabs/Player.prefab.meta b/Assets/Mirror/Examples/Basic/Prefabs/Player.prefab.meta deleted file mode 100644 index a943869b9..000000000 --- a/Assets/Mirror/Examples/Basic/Prefabs/Player.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: dc2c4328591bef748abb8df795c17202 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab b/Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab deleted file mode 100644 index 2dda39c57..000000000 --- a/Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab +++ /dev/null @@ -1,250 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &507587715476979468 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7941985369064644521} - - component: {fileID: 263176703837159862} - - component: {fileID: 862087973501639025} - m_Layer: 5 - m_Name: PlayerDataText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7941985369064644521 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 507587715476979468} - 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: 5939842025755258307} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 60, y: -45} - m_SizeDelta: {x: 120, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &263176703837159862 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 507587715476979468} - m_CullTransparentMesh: 0 ---- !u!114 &862087973501639025 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 507587715476979468} - 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: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 22 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 1 - m_VerticalOverflow: 1 - m_LineSpacing: 1 - m_Text: 'Data: 000' ---- !u!1 &5152941909035078397 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5939842025755258307} - - component: {fileID: 6858069060858394075} - - component: {fileID: 1130938342127810670} - - component: {fileID: 1800193220786703771} - m_Layer: 5 - m_Name: PlayerUI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5939842025755258307 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5152941909035078397} - 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: 290719538378481902} - - {fileID: 7941985369064644521} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 120, y: 60} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6858069060858394075 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5152941909035078397} - m_CullTransparentMesh: 0 ---- !u!114 &1130938342127810670 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5152941909035078397} - 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, g: 0, b: 0, a: 0} - m_RaycastTarget: 0 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 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!114 &1800193220786703771 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5152941909035078397} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 64acca8c87e5ceb44bcbd56ef21e2950, type: 3} - m_Name: - m_EditorClassIdentifier: - image: {fileID: 1130938342127810670} - playerNameText: {fileID: 2551726036882886172} - playerDataText: {fileID: 862087973501639025} ---- !u!1 &5516013313779480533 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 290719538378481902} - - component: {fileID: 1473077327790139714} - - component: {fileID: 2551726036882886172} - m_Layer: 5 - m_Name: PlayerNameText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &290719538378481902 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5516013313779480533} - 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: 5939842025755258307} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 60, y: -15} - m_SizeDelta: {x: 120, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1473077327790139714 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5516013313779480533} - m_CullTransparentMesh: 0 ---- !u!114 &2551726036882886172 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5516013313779480533} - 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: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 22 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 1 - m_VerticalOverflow: 1 - m_LineSpacing: 1 - m_Text: Player 00 diff --git a/Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab.meta b/Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab.meta deleted file mode 100644 index c6a8284aa..000000000 --- a/Assets/Mirror/Examples/Basic/Prefabs/PlayerUI.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 22f1fa3a0aff72b46a371f667bb4fb30 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/README.md b/Assets/Mirror/Examples/Basic/README.md deleted file mode 100644 index 5b39b3aa6..000000000 --- a/Assets/Mirror/Examples/Basic/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Basic Example - -This is a bare bones example of a running game with Network Manager and UI prefab players: - -1. Remove all scenes from Build Settings, then add the Example scene alone. - -2. Open the Example scene and build the project. - -3. In the editor, click Play, and Server + Client or Server Only...it will be listening on port 7777. - - If you clicked Host (Server + Client), the host player will appear as Player 00. - -4. Run one or more instances (up to 16 total players) of the built application. - -5. Click Client on each instance. - -6. Now you will see all players in the editor and the clients, all with data being updated and synchronized. diff --git a/Assets/Mirror/Examples/Basic/README.md.meta b/Assets/Mirror/Examples/Basic/README.md.meta deleted file mode 100644 index d4e17158a..000000000 --- a/Assets/Mirror/Examples/Basic/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 67177defd4d334a549e535f10506cc66 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scenes.meta b/Assets/Mirror/Examples/Basic/Scenes.meta deleted file mode 100644 index 0c751c648..000000000 --- a/Assets/Mirror/Examples/Basic/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 16f46473489d3364badc2f37c4db8634 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scenes/Example.unity b/Assets/Mirror/Examples/Basic/Scenes/Example.unity deleted file mode 100644 index 66697db03..000000000 --- a/Assets/Mirror/Examples/Basic/Scenes/Example.unity +++ /dev/null @@ -1,723 +0,0 @@ -%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, g: 0, b: 0, 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: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 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: 1 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &249891953 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 249891957} - - component: {fileID: 249891954} - - component: {fileID: 249891956} - - component: {fileID: 249891955} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &249891954 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 249891953} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3} - m_Name: - m_EditorClassIdentifier: - offsetX: 0 - offsetY: 0 ---- !u!114 &249891955 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 249891953} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - NonAlloc: 0 - ReliableMaxMessageSize: 4811624 - UnreliableMaxMessageSize: 1199 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &249891956 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 249891953} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 20460c43f0320ed4baf8c1dcf953eafa, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 0 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 249891955} - networkAddress: localhost - maxConnections: 100 - authenticator: {fileID: 0} - playerPrefab: {fileID: 897184729387425976, guid: dc2c4328591bef748abb8df795c17202, - type: 3} - autoCreatePlayer: 1 - playerSpawnMethod: 1 - spawnPrefabs: [] ---- !u!4 &249891957 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 249891953} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -10, y: 4, z: 5} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &288173824 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 288173827} - - component: {fileID: 288173826} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &288173826 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 288173824} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 1 - 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 &288173827 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 288173824} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -1} - 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 &379082678 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 379082679} - - component: {fileID: 379082681} - - component: {fileID: 379082682} - - component: {fileID: 379082680} - - component: {fileID: 379082683} - m_Layer: 5 - m_Name: PlayersPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &379082679 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 379082678} - 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: 864730913} - 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: 2.5} - m_SizeDelta: {x: -10, y: -15} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &379082680 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 379082678} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 5 - m_Right: 5 - m_Top: 5 - m_Bottom: 5 - m_ChildAlignment: 0 - m_StartCorner: 0 - m_StartAxis: 0 - m_CellSize: {x: 120, y: 65} - m_Spacing: {x: 20, y: 20} - m_Constraint: 0 - m_ConstraintCount: 2 ---- !u!222 &379082681 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 379082678} - m_CullTransparentMesh: 0 ---- !u!114 &379082682 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 379082678} - 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, g: 0, b: 0, a: 0.039215688} - m_RaycastTarget: 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!114 &379082683 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 379082678} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &533055200 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 533055204} - - component: {fileID: 533055203} - - component: {fileID: 533055202} - - component: {fileID: 533055201} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &533055201 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533055200} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 266fac335be17a243af86e88de84766d, type: 3} - m_Name: - m_EditorClassIdentifier: - mainPanel: {fileID: 1712119861} - playersPanel: {fileID: 379082679} ---- !u!114 &533055202 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533055200} - 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 ---- !u!223 &533055203 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533055200} - 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 &533055204 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533055200} - 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: 1712119861} - m_Father: {fileID: 0} - m_RootOrder: 2 - 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!1 &864730912 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 864730913} - - component: {fileID: 864730916} - - component: {fileID: 864730914} - m_Layer: 5 - m_Name: BorderPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &864730913 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 864730912} - 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: 379082679} - m_Father: {fileID: 1712119861} - 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: -55} - m_SizeDelta: {x: -40, y: -150} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &864730914 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 864730912} - 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: 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: 0 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &864730916 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 864730912} - m_CullTransparentMesh: 0 ---- !u!1 &1356257340 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1356257343} - - component: {fileID: 1356257342} - - component: {fileID: 1356257341} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1356257341 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1356257340} - 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 &1356257342 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1356257340} - 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 &1356257343 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1356257340} - 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!1 &1712119860 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1712119861} - - component: {fileID: 1712119863} - - component: {fileID: 1712119862} - m_Layer: 5 - m_Name: MainPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1712119861 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1712119860} - 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: 864730913} - m_Father: {fileID: 533055204} - 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 &1712119862 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1712119860} - 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, g: 0, b: 0, a: 0} - m_RaycastTarget: 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 &1712119863 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1712119860} - m_CullTransparentMesh: 0 diff --git a/Assets/Mirror/Examples/Basic/Scenes/Example.unity.meta b/Assets/Mirror/Examples/Basic/Scenes/Example.unity.meta deleted file mode 100644 index 25c602eb9..000000000 --- a/Assets/Mirror/Examples/Basic/Scenes/Example.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b30904751905d3f4dacde62ac85ec7c2 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scripts.meta b/Assets/Mirror/Examples/Basic/Scripts.meta deleted file mode 100644 index 5cc0800b2..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9c5291659f25af9409bbc25a2d37d628 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs b/Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs deleted file mode 100644 index afa1fce35..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs +++ /dev/null @@ -1,35 +0,0 @@ -using UnityEngine; - -/* - Documentation: https://mirror-networking.gitbook.io/docs/components/network-manager - API Reference: https://mirror-networking.com/docs/api/Mirror.NetworkManager.html -*/ - -namespace Mirror.Examples.Basic -{ - [AddComponentMenu("")] - public class BasicNetManager : NetworkManager - { - ///

    - /// Called on the server when a client adds a new player with NetworkClient.AddPlayer. - /// The default implementation for this function creates a new player object from the playerPrefab. - /// - /// Connection from client. - public override void OnServerAddPlayer(NetworkConnection conn) - { - base.OnServerAddPlayer(conn); - Player.ResetPlayerNumbers(); - } - - /// - /// Called on the server when a client disconnects. - /// This is called on the Server when a Client disconnects from the Server. Use an override to decide what should happen when a disconnection is detected. - /// - /// Connection from client. - public override void OnServerDisconnect(NetworkConnection conn) - { - base.OnServerDisconnect(conn); - Player.ResetPlayerNumbers(); - } - } -} diff --git a/Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs.meta b/Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs.meta deleted file mode 100644 index 35918e92a..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/BasicNetManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 20460c43f0320ed4baf8c1dcf953eafa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs b/Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs deleted file mode 100644 index d5c8987ab..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs +++ /dev/null @@ -1,21 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.Basic -{ - public class CanvasUI : MonoBehaviour - { - [Tooltip("Assign Main Panel so it can be turned on from Player:OnStartClient")] - public RectTransform mainPanel; - - [Tooltip("Assign Players Panel for instantiating PlayerUI as child")] - public RectTransform playersPanel; - - // static instance that can be referenced directly from Player script - public static CanvasUI instance; - - void Awake() - { - instance = this; - } - } -} diff --git a/Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs.meta b/Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs.meta deleted file mode 100644 index 30ad0779a..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/CanvasUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 266fac335be17a243af86e88de84766d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scripts/Player.cs b/Assets/Mirror/Examples/Basic/Scripts/Player.cs deleted file mode 100644 index 582874622..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/Player.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace Mirror.Examples.Basic -{ - public class Player : NetworkBehaviour - { - // Events that the PlayerUI will subscribe to - public event System.Action OnPlayerNumberChanged; - public event System.Action OnPlayerColorChanged; - public event System.Action OnPlayerDataChanged; - - // Players List to manage playerNumber - static readonly List playersList = new List(); - - [Header("Player UI")] - public GameObject playerUIPrefab; - GameObject playerUIObject; - - #region SyncVars - - [Header("SyncVars")] - - /// - /// This is appended to the player name text, e.g. "Player 01" - /// - [SyncVar(hook = nameof(PlayerNumberChanged))] - public byte playerNumber = 0; - - /// - /// Random color for the playerData text, assigned in OnStartServer - /// - [SyncVar(hook = nameof(PlayerColorChanged))] - public Color32 playerColor = Color.white; - - /// - /// This is updated by UpdateData which is called from OnStartServer via InvokeRepeating - /// - [SyncVar(hook = nameof(PlayerDataChanged))] - public ushort playerData = 0; - - // This is called by the hook of playerNumber SyncVar above - void PlayerNumberChanged(byte _, byte newPlayerNumber) - { - OnPlayerNumberChanged?.Invoke(newPlayerNumber); - } - - // This is called by the hook of playerColor SyncVar above - void PlayerColorChanged(Color32 _, Color32 newPlayerColor) - { - OnPlayerColorChanged?.Invoke(newPlayerColor); - } - - // This is called by the hook of playerData SyncVar above - void PlayerDataChanged(ushort _, ushort newPlayerData) - { - OnPlayerDataChanged?.Invoke(newPlayerData); - } - - #endregion - - #region Server - - /// - /// This is invoked for NetworkBehaviour objects when they become active on the server. - /// This could be triggered by NetworkServer.Listen() for objects in the scene, or by NetworkServer.Spawn() for objects that are dynamically created. - /// This will be called for objects on a "host" as well as for object on a dedicated server. - /// - public override void OnStartServer() - { - base.OnStartServer(); - - // Add this to the static Players List - playersList.Add(this); - - // set the Player Color SyncVar - playerColor = Random.ColorHSV(0f, 1f, 0.9f, 0.9f, 1f, 1f); - - // set the initial player data - playerData = (ushort)Random.Range(100, 1000); - - // Start generating updates - InvokeRepeating(nameof(UpdateData), 1, 1); - } - - // This is called from BasicNetManager OnServerAddPlayer and OnServerDisconnect - // Player numbers are reset whenever a player joins / leaves - [ServerCallback] - internal static void ResetPlayerNumbers() - { - byte playerNumber = 0; - foreach (Player player in playersList) - player.playerNumber = playerNumber++; - } - - // This only runs on the server, called from OnStartServer via InvokeRepeating - [ServerCallback] - void UpdateData() - { - playerData = (ushort)Random.Range(100, 1000); - } - - /// - /// Invoked on the server when the object is unspawned - /// Useful for saving object data in persistent storage - /// - public override void OnStopServer() - { - CancelInvoke(); - playersList.Remove(this); - } - - #endregion - - #region Client - - /// - /// Called when the local player object has been set up. - /// This happens after OnStartClient(), as it is triggered by an ownership message from the server. This is an appropriate place to activate components or functionality that should only be active for the local player, such as cameras and input. - /// - public override void OnStartLocalPlayer() - { - // Activate the main panel - CanvasUI.instance.mainPanel.gameObject.SetActive(true); - } - - /// - /// Called on every NetworkBehaviour when it is activated on a client. - /// Objects on the host have this function called, as there is a local client on the host. The values of SyncVars on object are guaranteed to be initialized correctly with the latest state from the server when this function is called on the client. - /// - public override void OnStartClient() - { - // Instantiate the player UI as child of the Players Panel - playerUIObject = Instantiate(playerUIPrefab, CanvasUI.instance.playersPanel); - PlayerUI playerUI = playerUIObject.GetComponent(); - - // wire up all events to handlers in PlayerUI - OnPlayerNumberChanged = playerUI.OnPlayerNumberChanged; - OnPlayerColorChanged = playerUI.OnPlayerColorChanged; - OnPlayerDataChanged = playerUI.OnPlayerDataChanged; - - // Invoke all event handlers with the initial data from spawn payload - OnPlayerNumberChanged.Invoke(playerNumber); - OnPlayerColorChanged.Invoke(playerColor); - OnPlayerDataChanged.Invoke(playerData); - - // Set isLocalPlayer for this Player in UI for background shading - if (isLocalPlayer) - playerUI.SetLocalPlayer(); - } - - /// - /// This is invoked on clients when the server has caused this object to be destroyed. - /// This can be used as a hook to invoke effects or do client specific cleanup. - /// - public override void OnStopClient() - { - // disconnect event handlers - OnPlayerNumberChanged = null; - OnPlayerColorChanged = null; - OnPlayerDataChanged = null; - - // Remove this player's UI object - Destroy(playerUIObject); - - // Disable the main panel for local player - if (isLocalPlayer) - CanvasUI.instance.mainPanel.gameObject.SetActive(false); - } - - #endregion - } -} diff --git a/Assets/Mirror/Examples/Basic/Scripts/Player.cs.meta b/Assets/Mirror/Examples/Basic/Scripts/Player.cs.meta deleted file mode 100644 index cf15827ef..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/Player.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a472ac3ae1701d149861871cf416a46d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs b/Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs deleted file mode 100644 index 2d41ce498..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs +++ /dev/null @@ -1,45 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.Basic -{ - public class PlayerUI : MonoBehaviour - { - [Header("Player Components")] - public Image image; - - [Header("Child Text Objects")] - public Text playerNameText; - public Text playerDataText; - - /// - /// Caches the controlling Player object, subscribes to its events - /// - /// Player object that controls this UI - /// true if the Player object is the Local Player - public void SetLocalPlayer() - { - // add a visual background for the local player in the UI - image.color = new Color(1f, 1f, 1f, 0.1f); - } - - // This value can change as clients leave and join - public void OnPlayerNumberChanged(byte newPlayerNumber) - { - playerNameText.text = string.Format("Player {0:00}", newPlayerNumber); - } - - // Random color set by Player::OnStartServer - public void OnPlayerColorChanged(Color32 newPlayerColor) - { - playerNameText.color = newPlayerColor; - } - - // This updates from Player::UpdateData via InvokeRepeating on server - public void OnPlayerDataChanged(ushort newPlayerData) - { - // Show the data in the UI - playerDataText.text = string.Format("Data: {0:000}", newPlayerData); - } - } -} diff --git a/Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs.meta b/Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs.meta deleted file mode 100644 index b7c07b747..000000000 --- a/Assets/Mirror/Examples/Basic/Scripts/PlayerUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 64acca8c87e5ceb44bcbd56ef21e2950 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark.meta b/Assets/Mirror/Examples/Benchmark.meta deleted file mode 100644 index 73801dfcf..000000000 --- a/Assets/Mirror/Examples/Benchmark.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1a0b6db5b77ec4177a6e47b68ea7d064 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Materials.meta b/Assets/Mirror/Examples/Benchmark/Materials.meta deleted file mode 100644 index 12a3156e7..000000000 --- a/Assets/Mirror/Examples/Benchmark/Materials.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ba4e4f7749e6b437aac187bd7625cf28 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Materials/Red.mat b/Assets/Mirror/Examples/Benchmark/Materials/Red.mat deleted file mode 100644 index 5c2496899..000000000 --- a/Assets/Mirror/Examples/Benchmark/Materials/Red.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Red - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _EMISSION - m_LightmapFlags: 0 - m_EnableInstancingVariants: 1 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 0, b: 0, a: 1} - - _EmissionColor: {r: 0.3254902, g: 0.3254902, b: 0.3254902, a: 1} diff --git a/Assets/Mirror/Examples/Benchmark/Materials/Red.mat.meta b/Assets/Mirror/Examples/Benchmark/Materials/Red.mat.meta deleted file mode 100644 index 9e6528871..000000000 --- a/Assets/Mirror/Examples/Benchmark/Materials/Red.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 451c5da2c5056496297cffba02216286 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Materials/White.mat b/Assets/Mirror/Examples/Benchmark/Materials/White.mat deleted file mode 100644 index aaf30878a..000000000 --- a/Assets/Mirror/Examples/Benchmark/Materials/White.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: White - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _EMISSION - m_LightmapFlags: 0 - m_EnableInstancingVariants: 1 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0.3254902, g: 0.3254902, b: 0.3254902, a: 1} diff --git a/Assets/Mirror/Examples/Benchmark/Materials/White.mat.meta b/Assets/Mirror/Examples/Benchmark/Materials/White.mat.meta deleted file mode 100644 index 0a9db55eb..000000000 --- a/Assets/Mirror/Examples/Benchmark/Materials/White.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ff8f106e5c9e34da28ad9cee6edb2255 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Prefabs.meta b/Assets/Mirror/Examples/Benchmark/Prefabs.meta deleted file mode 100644 index 2cdde64ec..000000000 --- a/Assets/Mirror/Examples/Benchmark/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 29276b4f741904266bb3eb6331bee4ab -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab b/Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab deleted file mode 100644 index 3625c3dbc..000000000 --- a/Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab +++ /dev/null @@ -1,147 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &449802645721213856 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2697352357490696306} - - component: {fileID: 8695142844114820487} - - component: {fileID: 6692327599609520039} - - component: {fileID: 1078519278818213949} - - component: {fileID: 3679374677650722848} - - component: {fileID: 8309506939003697769} - m_Layer: 0 - m_Name: Monster - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2697352357490696306 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - 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 &8695142844114820487 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6692327599609520039 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 451c5da2c5056496297cffba02216286, type: 2} - 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: 0 - 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 ---- !u!114 &1078519278818213949 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: 30b8f251d03d84284b70601e691d474f - hasSpawned: 0 ---- !u!114 &3679374677650722848 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - clientAuthority: 0 - sendInterval: 0.05 - syncPosition: 1 - syncRotation: 0 - syncScale: 0 - interpolatePosition: 1 - interpolateRotation: 0 - interpolateScale: 0 - bufferTimeMultiplier: 1 - bufferSizeLimit: 64 - catchupThreshold: 4 - catchupMultiplier: 0.1 - showGizmos: 0 - showOverlay: 0 - overlayColor: {r: 0, g: 0, b: 0, a: 0.5} ---- !u!114 &8309506939003697769 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9cddc2e496c474e538a494465be0192a, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - speed: 1 - movementProbability: 0.5 - movementDistance: 20 diff --git a/Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab.meta b/Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab.meta deleted file mode 100644 index 766ed7797..000000000 --- a/Assets/Mirror/Examples/Benchmark/Prefabs/Monster.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 30b8f251d03d84284b70601e691d474f -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab b/Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab deleted file mode 100644 index a7e4fdde7..000000000 --- a/Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab +++ /dev/null @@ -1,145 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &449802645721213856 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2697352357490696306} - - component: {fileID: 8695142844114820487} - - component: {fileID: 6692327599609520039} - - component: {fileID: 1078519278818213949} - - component: {fileID: 3679374677650722848} - - component: {fileID: 644305951047116972} - m_Layer: 0 - m_Name: Player - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2697352357490696306 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - 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 &8695142844114820487 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6692327599609520039 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: ff8f106e5c9e34da28ad9cee6edb2255, type: 2} - 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: 0 - 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 ---- !u!114 &1078519278818213949 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: e1299008405d14b17b1ca459a6cd44a2 - hasSpawned: 0 ---- !u!114 &3679374677650722848 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - clientAuthority: 1 - sendInterval: 0.05 - syncPosition: 1 - syncRotation: 0 - syncScale: 0 - interpolatePosition: 1 - interpolateRotation: 0 - interpolateScale: 0 - bufferTimeMultiplier: 1 - bufferSizeLimit: 64 - catchupThreshold: 4 - catchupMultiplier: 0.1 - showGizmos: 0 - showOverlay: 0 - overlayColor: {r: 0, g: 0, b: 0, a: 0.5} ---- !u!114 &644305951047116972 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 449802645721213856} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c482338c8cc6d4a3cba81934c0151972, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - speed: 20 diff --git a/Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab.meta b/Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab.meta deleted file mode 100644 index cb898f87b..000000000 --- a/Assets/Mirror/Examples/Benchmark/Prefabs/Player.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e1299008405d14b17b1ca459a6cd44a2 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Scenes.meta b/Assets/Mirror/Examples/Benchmark/Scenes.meta deleted file mode 100644 index f73c63635..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1507ce547cd6a42ddb4ba60c3552dc48 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity b/Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity deleted file mode 100644 index e29e9c8f0..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity +++ /dev/null @@ -1,470 +0,0 @@ -%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: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 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, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 23800000, guid: 0bc607fa2e315482ebe98797e844e11f, type: 2} ---- !u!1 &88936773 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 88936777} - - component: {fileID: 88936776} - - component: {fileID: 88936774} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &88936774 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9021b6cc314944290986ab6feb48db79, type: 3} - m_Name: - m_EditorClassIdentifier: - height: 150 - maxLogCount: 50 - hotKey: 293 ---- !u!20 &88936776 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.39215687, g: 0.58431375, b: 0.92941177, a: 1} - 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: 35 - 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 &88936777 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_LocalRotation: {x: 0.38268343, y: 0, z: 0, w: 0.92387956} - m_LocalPosition: {x: 0, y: 50, z: -80} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 45, y: 0, z: 0} ---- !u!1 &535739935 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 535739936} - - component: {fileID: 535739937} - m_Layer: 0 - m_Name: SpawnPosition - m_TagString: Untagged - m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &535739936 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535739935} - 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 &535739937 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535739935} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1282001517 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1282001518} - - component: {fileID: 1282001520} - - component: {fileID: 1282001519} - - component: {fileID: 1282001521} - - component: {fileID: 1282001522} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1282001518 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - 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: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1282001519 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3} - m_Name: - m_EditorClassIdentifier: - offsetX: 0 - offsetY: 0 ---- !u!114 &1282001520 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f0f6e2c4566084948a433ee5285d3fb7, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 1 - PersistNetworkManagerToOfflineScene: 0 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 1282001521} - networkAddress: localhost - maxConnections: 1000 - authenticator: {fileID: 0} - playerPrefab: {fileID: 449802645721213856, guid: e1299008405d14b17b1ca459a6cd44a2, - type: 3} - autoCreatePlayer: 1 - playerSpawnMethod: 1 - spawnPrefabs: - - {fileID: 449802645721213856, guid: 30b8f251d03d84284b70601e691d474f, type: 3} - spawnPrefab: {fileID: 449802645721213856, guid: 30b8f251d03d84284b70601e691d474f, - type: 3} - spawnAmount: 1000 - interleave: 1 ---- !u!114 &1282001521 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - NonAlloc: 1 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &1282001522 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 39adc6e09d5544ed955a50ce8600355a, type: 3} - m_Name: - m_EditorClassIdentifier: - visRange: 200 - rebuildInterval: 1 - checkMethod: 0 - showSlider: 1 ---- !u!1 &2054208274 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2054208276} - - component: {fileID: 2054208275} - 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 &2054208275 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054208274} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 0.8 - 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_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &2054208276 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054208274} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 0, 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} diff --git a/Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity.meta b/Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity.meta deleted file mode 100644 index 4a3c47e5e..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scenes/Scene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 3b956c7d68b6144dd8e6c36636e25b52 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Scripts.meta b/Assets/Mirror/Examples/Benchmark/Scripts.meta deleted file mode 100644 index 72470267c..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 56ec73164c7f24072b822ed0d1e4d03e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs b/Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs deleted file mode 100644 index ba547121a..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs +++ /dev/null @@ -1,51 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.Benchmark -{ - public class BenchmarkNetworkManager : NetworkManager - { - [Header("Spawns")] - public GameObject spawnPrefab; - public int spawnAmount = 5000; - public float interleave = 1; - - void SpawnAll() - { - // calculate sqrt so we can spawn N * N = Amount - float sqrt = Mathf.Sqrt(spawnAmount); - - // calculate spawn xz start positions - // based on spawnAmount * distance - float offset = -sqrt / 2 * interleave; - - // spawn exactly the amount, not one more. - int spawned = 0; - for (int spawnX = 0; spawnX < sqrt; ++spawnX) - { - for (int spawnZ = 0; spawnZ < sqrt; ++spawnZ) - { - // spawn exactly the amount, not any more - // (our sqrt method isn't 100% precise) - if (spawned < spawnAmount) - { - // instantiate & position - GameObject go = Instantiate(spawnPrefab); - float x = offset + spawnX * interleave; - float z = offset + spawnZ * interleave; - go.transform.position = new Vector3(x, 0, z); - - // spawn - NetworkServer.Spawn(go); - ++spawned; - } - } - } - } - - public override void OnStartServer() - { - base.OnStartServer(); - SpawnAll(); - } - } -} diff --git a/Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs.meta b/Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs.meta deleted file mode 100644 index 6355efedf..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts/BenchmarkNetworkManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f0f6e2c4566084948a433ee5285d3fb7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs b/Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs deleted file mode 100644 index 2ef7fae93..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs +++ /dev/null @@ -1,54 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.Benchmark -{ - public class MonsterMovement : NetworkBehaviour - { - public float speed = 1; - public float movementProbability = 0.5f; - public float movementDistance = 20; - - bool moving; - Vector3 start; - Vector3 destination; - - public override void OnStartServer() - { - start = transform.position; - } - - [ServerCallback] - void Update() - { - if (moving) - { - if (Vector3.Distance(transform.position, destination) <= 0.01f) - { - moving = false; - } - else - { - transform.position = Vector3.MoveTowards(transform.position, destination, speed * Time.deltaTime); - } - } - else - { - float r = Random.value; - if (r < movementProbability * Time.deltaTime) - { - Vector2 circlePos = Random.insideUnitCircle; - Vector3 dir = new Vector3(circlePos.x, 0, circlePos.y); - Vector3 dest = transform.position + dir * movementDistance; - - // within move dist around start? - // (don't want to wander off) - if (Vector3.Distance(start, dest) <= movementDistance) - { - destination = dest; - moving = true; - } - } - } - } - } -} diff --git a/Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs.meta b/Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs.meta deleted file mode 100644 index e4aea0317..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts/MonsterMovement.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9cddc2e496c474e538a494465be0192a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs b/Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs deleted file mode 100644 index 68651232b..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs +++ /dev/null @@ -1,20 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.Benchmark -{ - public class PlayerMovement : NetworkBehaviour - { - public float speed = 5; - - void Update() - { - if (!isLocalPlayer) return; - - float h = Input.GetAxis("Horizontal"); - float v = Input.GetAxis("Vertical"); - - Vector3 dir = new Vector3(h, 0, v); - transform.position += dir.normalized * (Time.deltaTime * speed); - } - } -} diff --git a/Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs.meta b/Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs.meta deleted file mode 100644 index a520ac78d..000000000 --- a/Assets/Mirror/Examples/Benchmark/Scripts/PlayerMovement.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c482338c8cc6d4a3cba81934c0151972 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat.meta b/Assets/Mirror/Examples/Chat.meta deleted file mode 100644 index 1b51dde6e..000000000 --- a/Assets/Mirror/Examples/Chat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 92165d23a248449f58d0be75d794a127 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Prefabs.meta b/Assets/Mirror/Examples/Chat/Prefabs.meta deleted file mode 100644 index f3f82c479..000000000 --- a/Assets/Mirror/Examples/Chat/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 55a4e4e8824ec4e329adf12e2cfb02a4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Prefabs/Player.prefab b/Assets/Mirror/Examples/Chat/Prefabs/Player.prefab deleted file mode 100644 index c4fb98f13..000000000 --- a/Assets/Mirror/Examples/Chat/Prefabs/Player.prefab +++ /dev/null @@ -1,64 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &5075528875289742095 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3351063249001228125} - - component: {fileID: 718303009120396421} - - component: {fileID: 114398755512196590} - m_Layer: 0 - m_Name: Player - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3351063249001228125 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5075528875289742095} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 718.76324, y: 411.311, z: -4.8041315} - 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!114 &718303009120396421 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5075528875289742095} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3addc5ad220944ed6888319897606739, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - playerName: ---- !u!114 &114398755512196590 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5075528875289742095} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - serverOnly: 0 - m_AssetId: - m_SceneId: 0 diff --git a/Assets/Mirror/Examples/Chat/Prefabs/Player.prefab.meta b/Assets/Mirror/Examples/Chat/Prefabs/Player.prefab.meta deleted file mode 100644 index 0429ce460..000000000 --- a/Assets/Mirror/Examples/Chat/Prefabs/Player.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e5905ffa27de84009b346b49d518ba03 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scenes.meta b/Assets/Mirror/Examples/Chat/Scenes.meta deleted file mode 100644 index ac2b33e1b..000000000 --- a/Assets/Mirror/Examples/Chat/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 71f6f21bb51d14dc0b231a8488826aac -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scenes/Main.unity b/Assets/Mirror/Examples/Chat/Scenes/Main.unity deleted file mode 100644 index ef20276c5..000000000 --- a/Assets/Mirror/Examples/Chat/Scenes/Main.unity +++ /dev/null @@ -1,3464 +0,0 @@ -%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.012745098, g: 0.07450981, b: 0.19901961, 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: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 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: 1 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &20782995 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 20782996} - - component: {fileID: 20782998} - - component: {fileID: 20782997} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &20782996 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 20782995} - 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: 851154180} - 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 &20782997 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 20782995} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 2 - m_BestFit: 0 - m_MinSize: 2 - 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 &20782998 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 20782995} - m_CullTransparentMesh: 0 ---- !u!1 &75860995 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 75860996} - - component: {fileID: 75860999} - - component: {fileID: 75860998} - - component: {fileID: 75860997} - m_Layer: 5 - m_Name: Chat - m_TagString: ChatWindow - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &75860996 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 75860995} - 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: 762534976} - - {fileID: 1231350850} - - {fileID: 1286463573} - - {fileID: 1863915625} - m_Father: {fileID: 719573003} - 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: -40.000008, y: -40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &75860997 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 75860995} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5019608} - m_EffectDistance: {x: 10, y: -10} - m_UseGraphicAlpha: 1 ---- !u!114 &75860998 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 75860995} - 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: 0.92941177} - m_RaycastTarget: 1 - 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 &75860999 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 75860995} - m_CullTransparentMesh: 0 ---- !u!1 &90143746 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 90143747} - - component: {fileID: 90143749} - - component: {fileID: 90143748} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &90143747 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90143746} - 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: 1231350850} - 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 &90143748 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90143746} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 1 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!222 &90143749 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90143746} - m_CullTransparentMesh: 0 ---- !u!1 &107824418 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 107824419} - - component: {fileID: 107824421} - - component: {fileID: 107824420} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &107824419 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 107824418} - 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: 1063265579} - 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 &107824420 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 107824418} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Start Client ---- !u!222 &107824421 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 107824418} - m_CullTransparentMesh: 0 ---- !u!1 &423302019 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 423302020} - - component: {fileID: 423302023} - - component: {fileID: 423302022} - - component: {fileID: 423302021} - m_Layer: 5 - m_Name: Scrollbar Vertical - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &423302020 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 423302019} - 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: 731902021} - m_Father: {fileID: 1863915625} - 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 &423302021 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 423302019} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1616857743} - m_HandleRect: {fileID: 1616857742} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &423302022 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 423302019} - 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_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 &423302023 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 423302019} - m_CullTransparentMesh: 0 ---- !u!1 &576238261 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 576238262} - - component: {fileID: 576238264} - - component: {fileID: 576238263} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &576238262 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 576238261} - 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: 851154180} - 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 &576238263 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 576238261} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - 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 &576238264 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 576238261} - m_CullTransparentMesh: 0 ---- !u!1 &591385423 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 591385424} - - component: {fileID: 591385426} - - component: {fileID: 591385425} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &591385424 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 591385423} - 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: 1027272348} - 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 &591385425 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 591385423} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - 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 &591385426 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 591385423} - m_CullTransparentMesh: 0 ---- !u!1 &719572997 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 719573003} - - component: {fileID: 719573002} - - component: {fileID: 719573001} - - component: {fileID: 719573000} - - component: {fileID: 719572999} - - component: {fileID: 719572998} - m_Layer: 5 - m_Name: ChatUI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &719572998 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719572997} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2c102f62d739545269250f48327d4429, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - chatMessage: {fileID: 1231350851} - chatHistory: {fileID: 827598817} - scrollbar: {fileID: 423302021} - localPlayerName: ---- !u!114 &719572999 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719572997} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 2564614208 - serverOnly: 0 - visible: 0 - m_AssetId: - hasSpawned: 0 ---- !u!114 &719573000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719572997} - 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: 823 ---- !u!114 &719573001 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719572997} - 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 ---- !u!223 &719573002 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719572997} - 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 &719573003 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719572997} - 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: 75860996} - 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!1 &719610385 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 719610386} - - component: {fileID: 719610388} - - component: {fileID: 719610387} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &719610386 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719610385} - 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: 1231350850} - 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 &719610387 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719610385} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 2 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Enter text... ---- !u!222 &719610388 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719610385} - m_CullTransparentMesh: 0 ---- !u!1 &731902020 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 731902021} - 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 &731902021 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 731902020} - 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: 1616857742} - m_Father: {fileID: 423302020} - 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 &762534975 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 762534976} - - component: {fileID: 762534978} - - component: {fileID: 762534977} - m_Layer: 5 - m_Name: Header - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &762534976 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 762534975} - 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: 75860996} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -30} - m_SizeDelta: {x: 300, y: 40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &762534977 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 762534975} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 40 - m_Alignment: 1 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Mirror Chat Example ---- !u!222 &762534978 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 762534975} - m_CullTransparentMesh: 0 ---- !u!1 &780870085 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 780870086} - - component: {fileID: 780870089} - - component: {fileID: 780870088} - - component: {fileID: 780870087} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &780870086 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 780870085} - 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: 1335915325} - m_Father: {fileID: 1863915625} - 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: -17, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &780870087 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 780870085} - 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_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 &780870088 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 780870085} - m_CullTransparentMesh: 0 ---- !u!114 &780870089 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 780870085} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &827598815 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 827598816} - - component: {fileID: 827598818} - - component: {fileID: 827598817} - m_Layer: 5 - m_Name: ChatHistory - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &827598816 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 827598815} - 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: 1335915325} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 556, y: -5} - m_SizeDelta: {x: 1102, y: 22} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &827598817 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 827598815} - 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: 0 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 1 - m_LineSpacing: 1 - m_Text: ---- !u!222 &827598818 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 827598815} - m_CullTransparentMesh: 0 ---- !u!1 &851154179 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 851154180} - - component: {fileID: 851154183} - - component: {fileID: 851154182} - - component: {fileID: 851154181} - m_Layer: 5 - m_Name: UsernameInput - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &851154180 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851154179} - 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: 20782996} - - {fileID: 576238262} - m_Father: {fileID: 1499096249} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 381, y: -175} - m_SizeDelta: {x: 250, y: 40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &851154181 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851154179} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 851154182} - m_TextComponent: {fileID: 576238263} - m_Placeholder: {fileID: 20782997} - 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_Target: {fileID: 1783103024} - m_MethodName: SetPlayername - m_Mode: 0 - 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_Target: {fileID: 1453327789} - m_MethodName: ToggleButtons - m_Mode: 0 - 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_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 &851154182 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851154179} - 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_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 &851154183 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851154179} - m_CullTransparentMesh: 0 ---- !u!1 &1018203013 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1018203014} - - component: {fileID: 1018203016} - - component: {fileID: 1018203015} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1018203014 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1018203013} - 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: 1286463573} - 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 &1018203015 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1018203013} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 2 - 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 &1018203016 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1018203013} - m_CullTransparentMesh: 0 ---- !u!1 &1027272347 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1027272348} - - component: {fileID: 1027272351} - - component: {fileID: 1027272350} - - component: {fileID: 1027272349} - m_Layer: 5 - m_Name: NetworkAddressInput - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1027272348 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1027272347} - 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: 1170876675} - - {fileID: 591385424} - m_Father: {fileID: 1499096249} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 381, y: -126} - m_SizeDelta: {x: 250, y: 40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1027272349 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1027272347} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1027272350} - m_TextComponent: {fileID: 591385425} - m_Placeholder: {fileID: 1170876676} - 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_Target: {fileID: 1783103025} - m_MethodName: SetHostname - m_Mode: 0 - 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_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 &1027272350 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1027272347} - 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_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 &1027272351 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1027272347} - m_CullTransparentMesh: 0 ---- !u!1 &1063265578 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1063265579} - - component: {fileID: 1063265582} - - component: {fileID: 1063265581} - - component: {fileID: 1063265580} - m_Layer: 5 - m_Name: ClientButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1063265579 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1063265578} - 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: 107824419} - m_Father: {fileID: 1499096249} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 415, y: -254} - m_SizeDelta: {x: 220, y: 60} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1063265580 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1063265578} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 0 - m_TargetGraphic: {fileID: 1063265581} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1453327784} - m_MethodName: SetActive - m_Mode: 6 - 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_Target: {fileID: 1783103025} - m_MethodName: StartClient - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 1 - m_CallState: 2 ---- !u!114 &1063265581 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1063265578} - 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_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 &1063265582 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1063265578} - m_CullTransparentMesh: 0 ---- !u!1 &1170876674 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1170876675} - - component: {fileID: 1170876677} - - component: {fileID: 1170876676} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1170876675 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1170876674} - 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: 1027272348} - 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 &1170876676 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1170876674} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 2 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: localhost ---- !u!222 &1170876677 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1170876674} - m_CullTransparentMesh: 0 ---- !u!1 &1231350849 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1231350850} - - component: {fileID: 1231350853} - - component: {fileID: 1231350852} - - component: {fileID: 1231350851} - m_Layer: 5 - m_Name: MessageField - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1231350850 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1231350849} - 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: 719610386} - - {fileID: 90143747} - m_Father: {fileID: 75860996} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 26, y: 12} - m_SizeDelta: {x: -176.4, y: 41} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1231350851 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1231350849} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1231350852} - m_TextComponent: {fileID: 90143748} - m_Placeholder: {fileID: 719610387} - 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_Target: {fileID: 719572998} - m_MethodName: OnEndEdit - m_Mode: 0 - 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_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 &1231350852 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1231350849} - 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_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 &1231350853 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1231350849} - m_CullTransparentMesh: 0 ---- !u!1 &1286463572 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1286463573} - - component: {fileID: 1286463576} - - component: {fileID: 1286463575} - - component: {fileID: 1286463574} - m_Layer: 5 - m_Name: SendButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1286463573 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1286463572} - 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: 1018203014} - m_Father: {fileID: 75860996} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -26, y: 12} - m_SizeDelta: {x: 116.9, y: 41} - m_Pivot: {x: 1, y: 0} ---- !u!114 &1286463574 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1286463572} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1286463575} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 719572998} - m_MethodName: SendMessage - 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 &1286463575 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1286463572} - 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_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 &1286463576 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1286463572} - m_CullTransparentMesh: 0 ---- !u!1 &1335915324 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1335915325} - - component: {fileID: 1335915327} - - component: {fileID: 1335915326} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1335915325 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1335915324} - 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: 827598816} - m_Father: {fileID: 780870086} - 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: 1, y: 0} - m_SizeDelta: {x: -1, y: -595} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1335915326 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1335915324} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!114 &1335915327 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1335915324} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 5 - m_Right: 5 - m_Top: 5 - m_Bottom: 5 - m_ChildAlignment: 0 - m_Spacing: 2 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 ---- !u!1 &1453327784 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1453327788} - - component: {fileID: 1453327787} - - component: {fileID: 1453327786} - - component: {fileID: 1453327785} - - component: {fileID: 1453327789} - m_Layer: 5 - m_Name: LoginUI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1453327785 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1453327784} - 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: 823 ---- !u!114 &1453327786 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1453327784} - 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 ---- !u!223 &1453327787 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1453327784} - 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 &1453327788 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1453327784} - 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: 1499096249} - m_Father: {fileID: 0} - 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: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1453327789 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1453327784} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7a77ca56c9d91af4b81b73a9907d6112, type: 3} - m_Name: - m_EditorClassIdentifier: - usernameInput: {fileID: 851154181} - hostButton: {fileID: 1904406266} - clientButton: {fileID: 1063265580} - errorText: {fileID: 1580038555} ---- !u!1 &1481045372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1481045373} - - component: {fileID: 1481045375} - - component: {fileID: 1481045374} - m_Layer: 5 - m_Name: UsernameLabel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1481045373 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1481045372} - 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: 1499096249} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 172, y: -175} - m_SizeDelta: {x: 160, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1481045374 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1481045372} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - 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 &1481045375 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1481045372} - m_CullTransparentMesh: 0 ---- !u!1 &1499096248 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1499096249} - - component: {fileID: 1499096252} - - component: {fileID: 1499096251} - - component: {fileID: 1499096250} - m_Layer: 5 - m_Name: Server - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1499096249 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1499096248} - 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: 1909588651} - - {fileID: 1995652016} - - {fileID: 1027272348} - - {fileID: 1481045373} - - {fileID: 851154180} - - {fileID: 1904406265} - - {fileID: 1063265579} - - {fileID: 1580038557} - m_Father: {fileID: 1453327788} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 600, y: 400} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1499096250 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1499096248} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} - m_EffectDistance: {x: 10, y: -10} - m_UseGraphicAlpha: 1 ---- !u!114 &1499096251 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1499096248} - 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: 0.92941177} - m_RaycastTarget: 1 - 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 &1499096252 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1499096248} - m_CullTransparentMesh: 0 ---- !u!1 &1569758148 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1569758149} - - component: {fileID: 1569758151} - - component: {fileID: 1569758150} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1569758149 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1569758148} - 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: 1904406265} - 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 &1569758150 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1569758148} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Start Host ---- !u!222 &1569758151 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1569758148} - m_CullTransparentMesh: 0 ---- !u!1 &1580038554 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1580038557} - - component: {fileID: 1580038556} - - component: {fileID: 1580038555} - m_Layer: 5 - m_Name: ErrorText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &1580038555 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1580038554} - 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: 1, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!222 &1580038556 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1580038554} - m_CullTransparentMesh: 0 ---- !u!224 &1580038557 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1580038554} - 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: 1499096249} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -340} - m_SizeDelta: {x: 440, y: 40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1616857741 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1616857742} - - component: {fileID: 1616857744} - - component: {fileID: 1616857743} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1616857742 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1616857741} - 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: 731902021} - 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!114 &1616857743 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1616857741} - 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_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 &1616857744 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1616857741} - m_CullTransparentMesh: 0 ---- !u!1 &1667679449 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1667679451} - - component: {fileID: 1667679450} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!108 &1667679450 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1667679449} - 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_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1667679451 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1667679449} - 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 &1783103022 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1783103026} - - component: {fileID: 1783103025} - - component: {fileID: 1783103023} - - component: {fileID: 1783103024} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1783103023 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1783103022} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - MaxRetransmit: 40 - NonAlloc: 1 - ReliableMaxMessageSize: 298449 - UnreliableMaxMessageSize: 1199 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &1783103024 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1783103022} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6e2e6b40604520d408bef0a5243a58cd, type: 3} - m_Name: - m_EditorClassIdentifier: - OnServerAuthenticated: - m_PersistentCalls: - m_Calls: [] - OnClientAuthenticated: - m_PersistentCalls: - m_Calls: [] - playerName: ---- !u!114 &1783103025 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1783103022} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0cd72391a563461f88eb3ddf120efef, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 1 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 1783103023} - networkAddress: localhost - maxConnections: 100 - authenticator: {fileID: 1783103024} - playerPrefab: {fileID: 5075528875289742095, guid: e5905ffa27de84009b346b49d518ba03, - type: 3} - autoCreatePlayer: 1 - playerSpawnMethod: 0 - spawnPrefabs: [] ---- !u!4 &1783103026 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1783103022} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3.78, y: 0, z: -4.03} - 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!1 &1863915624 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1863915625} - - component: {fileID: 1863915628} - - component: {fileID: 1863915627} - - component: {fileID: 1863915626} - m_Layer: 5 - m_Name: Scroll View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1863915625 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1863915624} - 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: 780870086} - - {fileID: 423302020} - m_Father: {fileID: 75860996} - m_RootOrder: 3 - 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: 5} - m_SizeDelta: {x: -51.999992, y: -110} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1863915626 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1863915624} - 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: 0.392} - m_RaycastTarget: 1 - 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 &1863915627 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1863915624} - m_CullTransparentMesh: 0 ---- !u!114 &1863915628 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1863915624} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 1335915325} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 1 - m_Elasticity: 0.01 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 100 - m_Viewport: {fileID: 780870086} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 423302021} - m_HorizontalScrollbarVisibility: 2 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: -3 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!1 &1897504366 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1897504369} - - component: {fileID: 1897504368} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &1897504368 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1897504366} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.19215688, g: 0.3019608, b: 0.47450984, a: 1} - 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 &1897504369 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1897504366} - 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 &1904406264 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1904406265} - - component: {fileID: 1904406268} - - component: {fileID: 1904406267} - - component: {fileID: 1904406266} - m_Layer: 5 - m_Name: HostButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1904406265 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1904406264} - 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: 1569758149} - m_Father: {fileID: 1499096249} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 185, y: -254} - m_SizeDelta: {x: 220, y: 60} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1904406266 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1904406264} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 0 - m_TargetGraphic: {fileID: 1904406267} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1453327784} - m_MethodName: SetActive - m_Mode: 6 - 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_Target: {fileID: 1783103025} - m_MethodName: StartHost - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 1 - m_CallState: 2 ---- !u!114 &1904406267 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1904406264} - 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_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 &1904406268 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1904406264} - m_CullTransparentMesh: 0 ---- !u!1 &1909588650 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1909588651} - - component: {fileID: 1909588653} - - component: {fileID: 1909588652} - m_Layer: 5 - m_Name: Header - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1909588651 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1909588650} - 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: 1499096249} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -55} - m_SizeDelta: {x: 350, y: 40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1909588652 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1909588650} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 35 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 40 - m_Alignment: 1 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Mirror Chat Example ---- !u!222 &1909588653 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1909588650} - m_CullTransparentMesh: 0 ---- !u!1 &1923358029 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1923358032} - - component: {fileID: 1923358031} - - component: {fileID: 1923358030} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1923358030 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1923358029} - 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 &1923358031 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1923358029} - 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 &1923358032 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1923358029} - 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 &1995652015 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1995652016} - - component: {fileID: 1995652018} - - component: {fileID: 1995652017} - m_Layer: 5 - m_Name: ServerLabel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1995652016 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1995652015} - 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: 1499096249} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 172, y: -126} - m_SizeDelta: {x: 160, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1995652017 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1995652015} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 24 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 'Server:' ---- !u!222 &1995652018 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1995652015} - m_CullTransparentMesh: 0 diff --git a/Assets/Mirror/Examples/Chat/Scenes/Main.unity.meta b/Assets/Mirror/Examples/Chat/Scenes/Main.unity.meta deleted file mode 100644 index d381d8c51..000000000 --- a/Assets/Mirror/Examples/Chat/Scenes/Main.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f4e8d4de4484e44bba666f2d1f66c73e -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scripts.meta b/Assets/Mirror/Examples/Chat/Scripts.meta deleted file mode 100644 index 71858f4e9..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 81da49d71176c41169a24259df78e50a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs b/Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs deleted file mode 100644 index e87989273..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using Mirror; -using UnityEngine; - -/* - Documentation: https://mirror-networking.gitbook.io/docs/components/network-authenticators - API Reference: https://mirror-networking.com/docs/api/Mirror.NetworkAuthenticator.html -*/ - -namespace Mirror.Examples.Chat -{ - [AddComponentMenu("")] - public class ChatAuthenticator : NetworkAuthenticator - { - readonly HashSet connectionsPendingDisconnect = new HashSet(); - - [Header("Client Username")] - public string playerName; - - #region Messages - - public struct AuthRequestMessage : NetworkMessage - { - // use whatever credentials make sense for your game - // for example, you might want to pass the accessToken if using oauth - public string authUsername; - } - - public struct AuthResponseMessage : NetworkMessage - { - public byte code; - public string message; - } - - #endregion - - #region Server - - /// - /// Called on server from StartServer to initialize the Authenticator - /// Server message handlers should be registered in this method. - /// - public override void OnStartServer() - { - // register a handler for the authentication request we expect from client - NetworkServer.RegisterHandler(OnAuthRequestMessage, false); - } - - /// - /// Called on server from StopServer to reset the Authenticator - /// Server message handlers should be registered in this method. - /// - public override void OnStopServer() - { - // unregister the handler for the authentication request - NetworkServer.UnregisterHandler(); - } - - /// - /// Called on server from OnServerAuthenticateInternal when a client needs to authenticate - /// - /// Connection to client. - public override void OnServerAuthenticate(NetworkConnection conn) - { - // do nothing...wait for AuthRequestMessage from client - } - - /// - /// Called on server when the client's AuthRequestMessage arrives - /// - /// Connection to client. - /// The message payload - public void OnAuthRequestMessage(NetworkConnection conn, AuthRequestMessage msg) - { - Debug.Log($"Authentication Request: {msg.authUsername}"); - - if (connectionsPendingDisconnect.Contains(conn)) return; - - // check the credentials by calling your web server, database table, playfab api, or any method appropriate. - if (!Player.playerNames.Contains(msg.authUsername)) - { - // Add the name to the HashSet - Player.playerNames.Add(msg.authUsername); - - // Store username in authenticationData - // This will be read in Player.OnStartServer - // to set the playerName SyncVar. - conn.authenticationData = msg.authUsername; - - // create and send msg to client so it knows to proceed - AuthResponseMessage authResponseMessage = new AuthResponseMessage - { - code = 100, - message = "Success" - }; - - conn.Send(authResponseMessage); - - // Accept the successful authentication - ServerAccept(conn); - } - else - { - connectionsPendingDisconnect.Add(conn); - - // create and send msg to client so it knows to disconnect - AuthResponseMessage authResponseMessage = new AuthResponseMessage - { - code = 200, - message = "Username already in use...try again" - }; - - conn.Send(authResponseMessage); - - // must set NetworkConnection isAuthenticated = false - conn.isAuthenticated = false; - - // disconnect the client after 1 second so that response message gets delivered - StartCoroutine(DelayedDisconnect(conn, 1f)); - } - } - - IEnumerator DelayedDisconnect(NetworkConnection conn, float waitTime) - { - yield return new WaitForSeconds(waitTime); - - // Reject the unsuccessful authentication - ServerReject(conn); - - yield return null; - - // remove conn from pending connections - connectionsPendingDisconnect.Remove(conn); - } - - #endregion - - #region Client - - // Called by UI element Username.OnValueChanged - public void SetPlayername(string username) - { - playerName = username; - LoginUI.instance.errorText.text = string.Empty; - LoginUI.instance.errorText.gameObject.SetActive(false); - } - - /// - /// Called on client from StartClient to initialize the Authenticator - /// Client message handlers should be registered in this method. - /// - public override void OnStartClient() - { - // register a handler for the authentication response we expect from server - NetworkClient.RegisterHandler((Action)OnAuthResponseMessage, false); - } - - /// - /// Called on client from StopClient to reset the Authenticator - /// Client message handlers should be unregistered in this method. - /// - public override void OnStopClient() - { - // unregister the handler for the authentication response - NetworkClient.UnregisterHandler(); - } - - /// - /// Called on client from OnClientAuthenticateInternal when a client needs to authenticate - /// - public override void OnClientAuthenticate() - { - AuthRequestMessage authRequestMessage = new AuthRequestMessage - { - authUsername = playerName, - }; - - NetworkClient.connection.Send(authRequestMessage); - } - - /// - /// Called on client when the server's AuthResponseMessage arrives - /// - /// The message payload - public void OnAuthResponseMessage(AuthResponseMessage msg) - { - if (msg.code == 100) - { - Debug.Log($"Authentication Response: {msg.message}"); - - // Authentication has been accepted - ClientAccept(); - } - else - { - Debug.LogError($"Authentication Response: {msg.message}"); - - // Authentication has been rejected - // StopHost works for both host client and remote clients - NetworkManager.singleton.StopHost(); - - // Do this AFTER StopHost so it doesn't get cleared / hidden by OnClientDisconnect - LoginUI.instance.errorText.text = msg.message; - LoginUI.instance.errorText.gameObject.SetActive(true); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs.meta b/Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs.meta deleted file mode 100644 index eb06fd12b..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/ChatAuthenticator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6e2e6b40604520d408bef0a5243a58cd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs b/Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs deleted file mode 100644 index dc10ce0b6..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs +++ /dev/null @@ -1,36 +0,0 @@ -using UnityEngine; - -/* - Documentation: https://mirror-networking.gitbook.io/docs/components/network-manager - API Reference: https://mirror-networking.com/docs/api/Mirror.NetworkManager.html -*/ - -namespace Mirror.Examples.Chat -{ - [AddComponentMenu("")] - public class ChatNetworkManager : NetworkManager - { - // Called by UI element NetworkAddressInput.OnValueChanged - public void SetHostname(string hostname) - { - networkAddress = hostname; - } - - public override void OnServerDisconnect(NetworkConnection conn) - { - // remove player name from the HashSet - if (conn.authenticationData != null) - Player.playerNames.Remove((string)conn.authenticationData); - - base.OnServerDisconnect(conn); - } - - public override void OnClientDisconnect() - { - base.OnClientDisconnect(); - LoginUI.instance.gameObject.SetActive(true); - LoginUI.instance.usernameInput.text = ""; - LoginUI.instance.usernameInput.ActivateInputField(); - } - } -} diff --git a/Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs.meta b/Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs.meta deleted file mode 100644 index cbc4ca706..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/ChatNetworkManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d0cd72391a563461f88eb3ddf120efef -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs b/Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs deleted file mode 100644 index b5e7dcbf1..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.Chat -{ - public class ChatUI : NetworkBehaviour - { - [Header("UI Elements")] - public InputField chatMessage; - public Text chatHistory; - public Scrollbar scrollbar; - - [Header("Diagnostic - Do Not Edit")] - public string localPlayerName; - - Dictionary connNames = new Dictionary(); - - public static ChatUI instance; - - void Awake() - { - instance = this; - } - - [Command(requiresAuthority = false)] - public void CmdSend(string message, NetworkConnectionToClient sender = null) - { - if (!connNames.ContainsKey(sender)) - connNames.Add(sender, sender.identity.GetComponent().playerName); - - if (!string.IsNullOrWhiteSpace(message)) - RpcReceive(connNames[sender], message.Trim()); - } - - [ClientRpc] - public void RpcReceive(string playerName, string message) - { - string prettyMessage = playerName == localPlayerName ? - $"{playerName}: {message}" : - $"{playerName}: {message}"; - AppendMessage(prettyMessage); - } - - public void OnEndEdit(string input) - { - if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter) || Input.GetButtonDown("Submit")) - SendMessage(); - } - - // Called by OnEndEdit above and UI element SendButton.OnClick - public void SendMessage() - { - if (!string.IsNullOrWhiteSpace(chatMessage.text)) - { - CmdSend(chatMessage.text.Trim()); - chatMessage.text = string.Empty; - chatMessage.ActivateInputField(); - } - } - - internal void AppendMessage(string message) - { - StartCoroutine(AppendAndScroll(message)); - } - - IEnumerator AppendAndScroll(string message) - { - chatHistory.text += message + "\n"; - - // it takes 2 frames for the UI to update ?!?! - yield return null; - yield return null; - - // slam the scrollbar down - scrollbar.value = 0; - } - } -} diff --git a/Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs.meta b/Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs.meta deleted file mode 100644 index 9b9bd1f73..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2c102f62d739545269250f48327d4429 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs b/Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs deleted file mode 100644 index 841661e54..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.Chat -{ - public class LoginUI : MonoBehaviour - { - [Header("UI Elements")] - public InputField usernameInput; - public Button hostButton; - public Button clientButton; - public Text errorText; - - public static LoginUI instance; - - void Awake() - { - instance = this; - } - - public void ToggleButtons(string username) - { - hostButton.interactable = !string.IsNullOrWhiteSpace(username); - clientButton.interactable = !string.IsNullOrWhiteSpace(username); - } - } -} diff --git a/Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs.meta b/Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs.meta deleted file mode 100644 index 920dda4e7..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/LoginUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7a77ca56c9d91af4b81b73a9907d6112 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Chat/Scripts/Player.cs b/Assets/Mirror/Examples/Chat/Scripts/Player.cs deleted file mode 100644 index e17fa9e3d..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/Player.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Mirror.Examples.Chat -{ - public class Player : NetworkBehaviour - { - public static readonly HashSet playerNames = new HashSet(); - - [SyncVar(hook = nameof(OnPlayerNameChanged))] - public string playerName; - - // RuntimeInitializeOnLoadMethod -> fast playmode without domain reload - [UnityEngine.RuntimeInitializeOnLoadMethod] - static void ResetStatics() - { - playerNames.Clear(); - } - - void OnPlayerNameChanged(string _, string newName) - { - ChatUI.instance.localPlayerName = playerName; - } - - public override void OnStartServer() - { - playerName = (string)connectionToClient.authenticationData; - } - } -} diff --git a/Assets/Mirror/Examples/Chat/Scripts/Player.cs.meta b/Assets/Mirror/Examples/Chat/Scripts/Player.cs.meta deleted file mode 100644 index 610ee4c9b..000000000 --- a/Assets/Mirror/Examples/Chat/Scripts/Player.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3addc5ad220944ed6888319897606739 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Discovery.meta b/Assets/Mirror/Examples/Discovery.meta deleted file mode 100644 index 85a73ff3a..000000000 --- a/Assets/Mirror/Examples/Discovery.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 450d6133608b04c57a6ebd6830d455fd -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Discovery/Prefabs.meta b/Assets/Mirror/Examples/Discovery/Prefabs.meta deleted file mode 100644 index ef0083dc9..000000000 --- a/Assets/Mirror/Examples/Discovery/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8d8abc53a4efb4544ad9cb7a44b4840a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab b/Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab deleted file mode 100644 index 2d917ed8e..000000000 --- a/Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab +++ /dev/null @@ -1,110 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &9081919128954505657 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8463701767414927392} - - component: {fileID: 435337138507318507} - - component: {fileID: 8589595951595565844} - - component: {fileID: 8188542106662419882} - - component: {fileID: 1410032569926419539} - m_Layer: 0 - m_Name: Player - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8463701767414927392 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9081919128954505657} - 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 &435337138507318507 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9081919128954505657} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &8589595951595565844 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9081919128954505657} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - 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_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - 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 ---- !u!136 &8188542106662419882 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9081919128954505657} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &1410032569926419539 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9081919128954505657} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - serverOnly: 0 - m_AssetId: - m_SceneId: 0 diff --git a/Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab.meta b/Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab.meta deleted file mode 100644 index 1c818fadc..000000000 --- a/Assets/Mirror/Examples/Discovery/Prefabs/Player.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ecd52c53a6ef7496693343d3e32dace1 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Discovery/Scenes.meta b/Assets/Mirror/Examples/Discovery/Scenes.meta deleted file mode 100644 index ed0ba6454..000000000 --- a/Assets/Mirror/Examples/Discovery/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ceaf2344f4e6944258442667a9fbbfdf -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Discovery/Scenes/Scene.unity b/Assets/Mirror/Examples/Discovery/Scenes/Scene.unity deleted file mode 100644 index 658d03b64..000000000 --- a/Assets/Mirror/Examples/Discovery/Scenes/Scene.unity +++ /dev/null @@ -1,731 +0,0 @@ -%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: 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, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 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: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 2 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &62199026 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 62199028} - - component: {fileID: 62199027} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &62199027 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 62199026} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &62199028 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 62199026} - 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!1 &441913360 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 441913362} - - component: {fileID: 441913361} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &441913361 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 441913360} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &441913362 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 441913360} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3.78, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &919124423 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 919124425} - - component: {fileID: 919124424} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &919124424 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 919124423} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &919124425 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 919124423} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.09, y: 0, z: -4.03} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &970214386 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 970214388} - - component: {fileID: 970214387} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &970214387 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 970214386} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &970214388 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 970214386} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.99, y: 0, z: -4.03} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1392889995 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1392889998} - - component: {fileID: 1392889997} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &1392889997 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1392889995} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_GateFitMode: 2 - 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 &1392889998 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1392889995} - 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 &1556883243 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1556883247} - - component: {fileID: 1556883245} - - component: {fileID: 1556883244} - - component: {fileID: 1556883248} - - component: {fileID: 1556883246} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1556883244 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1556883243} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - NoDelay: 1 - Interval: 10 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &1556883245 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1556883243} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8aab4c8111b7c411b9b92cf3dbc5bd4e, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 1 - runInBackground: 1 - autoStartServerBuild: 1 - showDebugMessages: 0 - serverTickRate: 30 - serverBatching: 0 - serverBatchInterval: 0 - offlineScene: - onlineScene: - transport: {fileID: 1556883244} - networkAddress: localhost - maxConnections: 100 - disconnectInactiveConnections: 0 - disconnectInactiveTimeout: 60 - authenticator: {fileID: 0} - playerPrefab: {fileID: 9081919128954505657, guid: ecd52c53a6ef7496693343d3e32dace1, - type: 3} - autoCreatePlayer: 1 - playerSpawnMethod: 0 - spawnPrefabs: [] ---- !u!114 &1556883246 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1556883243} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 88c37d3deca7a834d80cfd8d3cfcc510, type: 3} - m_Name: - m_EditorClassIdentifier: - networkDiscovery: {fileID: 1556883248} ---- !u!4 &1556883247 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1556883243} - 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: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1556883248 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1556883243} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c761308e733c51245b2e8bb4201f46dc, type: 3} - m_Name: - m_EditorClassIdentifier: - secretHandshake: 1558261479176021378 - serverBroadcastListenPort: 47777 - ActiveDiscoveryInterval: 3 - transport: {fileID: 0} - OnServerFound: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1556883246} - m_MethodName: OnDiscoveredServer - m_Mode: 0 - 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!1 &1611696151 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1611696153} - - component: {fileID: 1611696152} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1611696152 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1611696151} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1611696153 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1611696151} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 4.6, y: 0, z: -1.43} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1730851146 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1730851148} - - component: {fileID: 1730851147} - 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 &1730851147 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1730851146} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - 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_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1730851148 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1730851146} - 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 &1911023976 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1911023978} - - component: {fileID: 1911023977} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1911023977 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1911023976} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1911023978 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1911023976} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3.78, y: 0, z: -4.03} - 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 &1958729888 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1958729890} - - component: {fileID: 1958729889} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1958729889 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1958729888} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1958729890 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1958729888} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 4.6, y: 0, z: -4.08} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 10 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2054361114 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2054361116} - - component: {fileID: 2054361115} - m_Layer: 0 - m_Name: StartPos - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2054361115 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054361114} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &2054361116 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054361114} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.99, y: 0, z: -1.43} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 8 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Mirror/Examples/Discovery/Scenes/Scene.unity.meta b/Assets/Mirror/Examples/Discovery/Scenes/Scene.unity.meta deleted file mode 100644 index b02433fdb..000000000 --- a/Assets/Mirror/Examples/Discovery/Scenes/Scene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 90fddc74fa21c423599167eb28b09dd1 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/Mirror.Examples.asmdef b/Assets/Mirror/Examples/Mirror.Examples.asmdef deleted file mode 100644 index 67d9ce5d0..000000000 --- a/Assets/Mirror/Examples/Mirror.Examples.asmdef +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Mirror.Examples", - "references": [ - "Mirror", - "Mirror.Components", - "Unity.TextMeshPro" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Assets/Mirror/Examples/Mirror.Examples.asmdef.meta b/Assets/Mirror/Examples/Mirror.Examples.asmdef.meta deleted file mode 100644 index 2b545b58a..000000000 --- a/Assets/Mirror/Examples/Mirror.Examples.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: fecf25954bb196642ab50657689761d6 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes.meta deleted file mode 100644 index bbe9ba2f5..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 792b2d05e371c3c47ac7c4b1fa0dbfe2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials.meta deleted file mode 100644 index 7a4a3372e..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ef54d3fc8c3b6c845bb29f2d04ea7edb -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics.meta deleted file mode 100644 index a372565d6..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b5ae92b6f97224e418115c9f16c50fd8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial deleted file mode 100644 index d350850a1..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial +++ /dev/null @@ -1,14 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!134 &13400000 -PhysicMaterial: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Icosphere - dynamicFriction: 0.4 - staticFriction: 0.5 - bounciness: 0.8 - frictionCombine: 1 - bounceCombine: 2 diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial.meta deleted file mode 100644 index 04038736b..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Icosphere.physicMaterial.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 47163bc0301c1a146bbaa4d539a6ac36 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 13400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial deleted file mode 100644 index bd2d613a1..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial +++ /dev/null @@ -1,14 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!134 &13400000 -PhysicMaterial: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Player - dynamicFriction: 0.3 - staticFriction: 0.5 - bounciness: 0.2 - frictionCombine: 1 - bounceCombine: 2 diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial.meta deleted file mode 100644 index 40322e39b..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/Player.physicMaterial.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2debad4ac21a6644faf4fc93bd5b5869 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 13400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial deleted file mode 100644 index 43d66178d..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial +++ /dev/null @@ -1,14 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!134 &13400000 -PhysicMaterial: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: RoomBounce - dynamicFriction: 0.8 - staticFriction: 0.8 - bounciness: 0.8 - frictionCombine: 1 - bounceCombine: 2 diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial.meta deleted file mode 100644 index 02a172b94..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Physics/RoomBounce.physicMaterial.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2e179c076d5d0924dbf5a2de0630bdb1 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 13400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render.meta deleted file mode 100644 index 095314844..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e79e44ac19c0d9244bb54a0e960210e3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat deleted file mode 100644 index f39520d10..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: PlayArea - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _NORMALMAP _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 2800000, guid: 1ef4aad253cf7e9488305da905643f09, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 8, y: 8} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 2800000, guid: 0ce4715b95ec59e4ca799c740a5e144a, type: 3} - m_Scale: {x: 8, y: 8} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0.8867924, g: 0.84346247, b: 0.7654859, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat.meta deleted file mode 100644 index ab00bc86b..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/PlayArea.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 42fe0bcfbb65da3429ae2c289686e024 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat deleted file mode 100644 index a394fe1d7..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Player - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0, g: 0, b: 0, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat.meta deleted file mode 100644 index d890edb20..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Player.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2089070a3452e6f4d866c53e51aae8f2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat deleted file mode 100644 index 08f5003a3..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Prize - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0, g: 0, b: 0, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat.meta deleted file mode 100644 index 3df4a27c3..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Materials/Render/Prize.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2becd2014627a774e9e8f668f281f1d2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models.meta deleted file mode 100644 index fbeb501e1..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 758bdb1e6d29abf4e96198a11d34f313 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere.meta deleted file mode 100644 index 5a4152706..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ea3fb2e0d8b9abc43b8b628e3e550872 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj deleted file mode 100644 index c6dcf15d0..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj +++ /dev/null @@ -1,119 +0,0 @@ -mtllib ./IcosphereC.mtl -g Icosphere -v 1.192093E-07 0.187595 0.9822463 -v 0.5257312 0.7946554 0.3035289 -v 0.8506509 -0.1875913 0.4911242 -v -0.5257308 0.7946554 0.3035289 -v 1.192093E-07 0.7946525 -0.6070641 -v 0.8506509 0.1875908 -0.4911239 -v -0.8506508 -0.1875913 0.4911242 -v 1.192093E-07 -0.7946531 0.6070642 -v 0.5257312 -0.7946556 -0.3035287 -v 1.192093E-07 -0.1875954 -0.9822463 -v -0.8506508 0.1875908 -0.4911239 -v -0.5257308 -0.7946556 -0.3035287 - -vn 0.5773501 0.3333353 0.7453553 -vn 0 0.7453575 0.666665 -vn 0 1 -3.272848E-06 -vn 0.5773502 0.745355 -0.3333357 -vn 0.9341724 0.3333336 0.127321 -vn -0.57735 0.3333354 0.7453552 -vn 0.3568219 -0.3333308 0.8726791 -vn 0.9341724 -0.3333337 -0.127321 -vn 0.3568221 0.3333309 -0.8726789 -vn -0.5773502 0.745355 -0.3333356 -vn -0.5773502 -0.7453552 0.3333353 -vn 0 -1 2.749192E-06 -vn 0 -0.7453578 -0.6666646 -vn -0.5773502 -0.3333355 -0.7453551 -vn -0.9341723 -0.3333339 -0.1273212 -vn -0.3568219 -0.3333308 0.8726791 -vn 0.5773503 -0.7453551 0.3333354 -vn 0.5773503 -0.3333354 -0.7453551 -vn -0.356822 0.3333309 -0.8726789 -vn -0.9341723 0.3333338 0.1273211 - -vt -0.5257311 1.376382 -vt 0 1.701302 -vt 0.3249197 0.8506508 -vt 1.051462 0 -vt 0 0 -vt 0.5257311 0.8506508 -vt 0.5257311 -0.8506508 -vt 0 0 -vt 1.051462 0 -vt -0.3249197 0.8506508 -vt 0 1.701302 -vt 0.5257311 1.376382 -vt -0.5257311 0.8506508 -vt 0 1.701302 -vt 0.5257311 0.8506508 -vt -1.376382 0.8506508 -vt -1.051462 1.701302 -vt -0.5257311 1.376382 -vt -0.5257311 0.3249197 -vt -0.5257311 1.376382 -vt 0.3249197 0.8506508 -vt 0 0 -vt -0.5257311 0.8506508 -vt 0.5257311 0.8506508 -vt 0.5257311 0.3249197 -vt -0.3249197 0.8506508 -vt 0.5257311 1.376382 -vt 1.376382 0.8506508 -vt 0.5257311 1.376382 -vt 1.051462 1.701302 -vt -0.5257311 0.3249197 -vt -1.051462 0 -vt -1.376382 0.8506508 -vt 0 0 -vt -1.051462 0 -vt -0.5257311 0.8506508 -vt -0.5257311 -0.8506508 -vt -1.051462 0 -vt 0 0 -vt 1.376382 0.8506508 -vt 1.051462 0 -vt 0.5257311 0.3249197 -vt 0.5257311 0.8506508 -vt 0 0 -vt -0.5257311 0.8506508 -vt -0.5257311 1.376382 -vt -0.5257311 0.3249197 -vt -1.376382 0.8506508 -vt 0.3249197 0.8506508 -vt 0 0 -vt -0.5257311 0.3249197 -vt -0.3249197 0.8506508 -vt 0.5257311 0.3249197 -vt 0 0 -vt 0.5257311 1.376382 -vt 1.376382 0.8506508 -vt 0.5257311 0.3249197 -vt 0 1.701302 -vt 0.5257311 0.8506508 -vt -0.5257311 0.8506508 - -usemtl IcosphereMat -usemap IcosphereMat -f 3/3/1 2/2/1 1/1/1 -f 1/6/2 2/5/2 4/4/2 -f 4/9/3 2/8/3 5/7/3 -f 5/12/4 2/11/4 6/10/4 -f 6/15/5 2/14/5 3/13/5 -f 1/18/6 4/17/6 7/16/6 -f 3/21/7 1/20/7 8/19/7 -f 6/24/8 3/23/8 9/22/8 -f 5/27/9 6/26/9 10/25/9 -f 4/30/10 5/29/10 11/28/10 -f 7/33/11 12/32/11 8/31/11 -f 8/36/12 12/35/12 9/34/12 -f 9/39/13 12/38/13 10/37/13 -f 10/42/14 12/41/14 11/40/14 -f 11/45/15 12/44/15 7/43/15 -f 7/48/16 8/47/16 1/46/16 -f 8/51/17 9/50/17 3/49/17 -f 9/54/18 10/53/18 6/52/18 -f 10/57/19 11/56/19 5/55/19 -f 11/60/20 7/59/20 4/58/20 diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj.meta deleted file mode 100644 index e72ff2cfc..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Icosphere.obj.meta +++ /dev/null @@ -1,104 +0,0 @@ -fileFormatVersion: 2 -guid: 1fe56a0e685b8434ebfeb53c69b59a5e -ModelImporter: - serializedVersion: 23 - fileIDToRecycleName: - 100000: Icosphere - 100002: //RootNode - 400000: Icosphere - 400002: //RootNode - 2100000: IcosphereMat - 2300000: Icosphere - 3300000: Icosphere - 4300000: Icosphere - externalObjects: - - first: - type: UnityEngine:Material - assembly: UnityEngine.CoreModule - name: ProBuilderDefault - second: {fileID: 2100000, guid: 883a7db7f994aab478a4380ad50eda70, type: 2} - materials: - importMaterials: 1 - materialName: 0 - materialSearch: 1 - materialLocation: 1 - animations: - legacyGenerateAnimations: 4 - bakeSimulation: 0 - resampleCurves: 1 - optimizeGameObjects: 0 - motionNodeName: - rigImportErrors: - rigImportWarnings: - animationImportErrors: - animationImportWarnings: - animationRetargetingWarnings: - animationDoRetargetingWarnings: 0 - importAnimatedCustomProperties: 0 - importConstraints: 0 - animationCompression: 1 - animationRotationError: 0.5 - animationPositionError: 0.5 - animationScaleError: 0.5 - animationWrapMode: 0 - extraExposedTransformPaths: [] - extraUserProperties: [] - clipAnimations: [] - isReadable: 1 - meshes: - lODScreenPercentages: [] - globalScale: 1 - meshCompression: 0 - addColliders: 0 - useSRGBMaterialColor: 1 - importVisibility: 1 - importBlendShapes: 1 - importCameras: 1 - importLights: 1 - swapUVChannels: 0 - generateSecondaryUV: 0 - useFileUnits: 1 - optimizeMeshForGPU: 1 - keepQuads: 0 - weldVertices: 1 - preserveHierarchy: 0 - indexFormat: 0 - secondaryUVAngleDistortion: 8 - secondaryUVAreaDistortion: 15.000001 - secondaryUVHardAngle: 88 - secondaryUVPackMargin: 4 - useFileScale: 1 - previousCalculatedGlobalScale: 1 - hasPreviousCalculatedGlobalScale: 0 - tangentSpace: - normalSmoothAngle: 60 - normalImportMode: 0 - tangentImportMode: 3 - normalCalculationMode: 4 - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 - blendShapeNormalImportMode: 1 - normalSmoothingSource: 0 - importAnimation: 1 - copyAvatar: 0 - humanDescription: - serializedVersion: 2 - human: [] - skeleton: [] - armTwist: 0.5 - foreArmTwist: 0.5 - upperLegTwist: 0.5 - legTwist: 0.5 - armStretch: 0.05 - legStretch: 0.05 - feetSpacing: 0 - rootMotionBoneName: - hasTranslationDoF: 0 - hasExtraRoot: 0 - skeletonHasParents: 1 - lastHumanDescriptionAvatarSource: {instanceID: 0} - animationType: 0 - humanoidOversampling: 1 - additionalBone: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials.meta deleted file mode 100644 index 1eb00d1b9..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2c07f54121eb4534e85f72041ec0f196 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat deleted file mode 100644 index e01a611f5..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Icosphere - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 0, b: 0, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat.meta deleted file mode 100644 index 3e1c3b870..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Models/Icosphere/Materials/Icosphere.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7e6bf26596c6f564097734c7cc319e15 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs.meta deleted file mode 100644 index 6d235af18..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 90a1d98ef5d99304095438cdf9cbdc10 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab deleted file mode 100644 index 16b861d37..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab +++ /dev/null @@ -1,221 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &5513112217680870096 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5513112217680897776} - - component: {fileID: 5513112217677473488} - - component: {fileID: 5513112217678603280} - - component: {fileID: 456454062324168415} - m_Layer: 0 - m_Name: Icosphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5513112217680897776 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870096} - 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: 5513112217680897778} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &5513112217677473488 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870096} - m_Mesh: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} ---- !u!23 &5513112217678603280 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870096} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 7e6bf26596c6f564097734c7cc319e15, type: 2} - 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: 0 - 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 ---- !u!64 &456454062324168415 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870096} - m_Material: {fileID: 13400000, guid: 47163bc0301c1a146bbaa4d539a6ac36, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 1 - m_CookingOptions: 30 - m_Mesh: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} ---- !u!1 &5513112217680870098 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5513112217680897778} - - component: {fileID: -7012348765844800875} - - component: {fileID: -5073764247860119520} - - component: {fileID: 8774992865005872063} - - component: {fileID: -73998256042230442} - - component: {fileID: -2850352209440038129} - m_Layer: 0 - m_Name: Icosphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5513112217680897778 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870098} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0, y: 0, z: 0} - m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} - m_Children: - - {fileID: 5513112217680897776} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &-7012348765844800875 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870098} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: - hasSpawned: 0 ---- !u!114 &-5073764247860119520 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870098} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0 - clientAuthority: 0 - localPositionSensitivity: 0.01 - localRotationSensitivity: 0.01 - localScaleSensitivity: 0.01 - compressRotation: 0 - interpolateScale: 0 - interpolateRotation: 1 - interpolatePosition: 1 - syncScale: 0 ---- !u!114 &8774992865005872063 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870098} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 218520098fbe58b4b8f0963ef41953f7, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - color: - serializedVersion: 2 - rgba: 4278190080 ---- !u!54 &-73998256042230442 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870098} - serializedVersion: 2 - m_Mass: 0.1 - m_Drag: 0.1 - m_AngularDrag: 0 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &-2850352209440038129 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5513112217680870098} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c709489168fec9348b7f8290ee2e8466, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - force: 12 - rigidbody3D: {fileID: -73998256042230442} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab.meta deleted file mode 100644 index 2d5d38202..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Icosphere.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a104de86221e66a48832c222471d4f1e -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab deleted file mode 100644 index a4ee3123b..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab +++ /dev/null @@ -1,375 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1430875437483682 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4216737524944602} - - component: {fileID: 33190644788701022} - - component: {fileID: 23708975923909982} - m_Layer: 0 - m_Name: Visor - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4216737524944602 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1430875437483682} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0.39999998, z: 0.5} - m_LocalScale: {x: 0.5, y: 0.1, z: 0.2} - m_Children: [] - m_Father: {fileID: 3138541494209382947} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &33190644788701022 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1430875437483682} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &23708975923909982 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1430875437483682} - 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_RenderingLayerMask: 4294967295 - 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: 0 - 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 ---- !u!1 &1480027675339556 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4822224316094678} - - component: {fileID: 114402732107420660} - - component: {fileID: 114265392388239132} - - component: {fileID: 8715117357206038899} - - component: {fileID: 114892629901890886} - - component: {fileID: 115187108610643062} - - component: {fileID: 143011667059871024} - - component: {fileID: 4839740653866577337} - - component: {fileID: 1849877933717427647} - - component: {fileID: 6261579163786439309} - m_Layer: 0 - m_Name: Player - m_TagString: Player - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4822224316094678 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1.08, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 3138541494209382947} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &114402732107420660 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: 1f4d376d8ca693049abd1744e4c79fad - hasSpawned: 0 ---- !u!114 &114265392388239132 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - clientAuthority: 1 - sendInterval: 0.05 - syncPosition: 1 - syncRotation: 1 - syncScale: 0 - interpolatePosition: 1 - interpolateRotation: 1 - interpolateScale: 0 - bufferTimeMultiplier: 1 - bufferSizeLimit: 64 - catchupThreshold: 4 - catchupMultiplier: 0.1 - onlySyncOnChange: 1 - bufferResetMultiplier: 5 - positionSensitivity: 0.01 - rotationSensitivity: 0.01 - scaleSensitivity: 0.01 - showGizmos: 0 - showOverlay: 0 - overlayColor: {r: 0, g: 0, b: 0, a: 0.5} ---- !u!114 &8715117357206038899 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6cac48dc20f866148b44d0f9b5850761, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 ---- !u!114 &114892629901890886 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 479a5196564ede84791870b414a13645, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - characterController: {fileID: 143011667059871024} - moveSpeed: 8 - turnSensitivity: 5 - maxTurnSpeed: 100 - horizontal: 0 - vertical: 0 - turn: 0 - jumpSpeed: 0 - isGrounded: 1 - isFalling: 0 - velocity: {x: 0, y: 0, z: 0} ---- !u!114 &115187108610643062 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8be750efa9df50f47b65ae156053d149, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0 - playerNumber: 0 - scoreIndex: 0 - matchIndex: 0 - score: 0 - clientMatchIndex: -1 ---- !u!143 &143011667059871024 -CharacterController: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 0 - serializedVersion: 2 - m_Height: 2 - m_Radius: 0.5 - m_SlopeLimit: 45 - m_StepOffset: 0.3 - m_SkinWidth: 0.001 - m_MinMoveDistance: 0.001 - m_Center: {x: 0, y: 0, z: 0} ---- !u!136 &4839740653866577337 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Material: {fileID: 13400000, guid: 2debad4ac21a6644faf4fc93bd5b5869, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.8 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!54 &1849877933717427647 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0 - m_UseGravity: 0 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &6261579163786439309 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1480027675339556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 218520098fbe58b4b8f0963ef41953f7, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - color: - serializedVersion: 2 - rgba: 4278190080 ---- !u!1 &4926068573968176962 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3138541494209382947} - - component: {fileID: 1736510165009824269} - - component: {fileID: 4008900414740136170} - m_Layer: 0 - m_Name: Capsule - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3138541494209382947 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4926068573968176962} - 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: 4216737524944602} - m_Father: {fileID: 4822224316094678} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1736510165009824269 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4926068573968176962} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &4008900414740136170 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4926068573968176962} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 2089070a3452e6f4d866c53e51aae8f2, type: 2} - 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: 0 - 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 diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab.meta deleted file mode 100644 index 2aa9fe4f1..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Player.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1f4d376d8ca693049abd1744e4c79fad -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 100100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab deleted file mode 100644 index c08171fae..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab +++ /dev/null @@ -1,196 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1139254171913846 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4362442735993418} - - component: {fileID: 135606878775227198} - - component: {fileID: 6909319328281960030} - - component: {fileID: 114251241889735402} - - component: {fileID: 114048121767222990} - - component: {fileID: 7669440687796875101} - m_Layer: 0 - m_Name: Prize - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &4362442735993418 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1139254171913846} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 7524893234998283593} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &135606878775227198 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1139254171913846} - m_Material: {fileID: 0} - m_IsTrigger: 1 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.3 - m_Center: {x: 0, y: 0, z: 0} ---- !u!54 &6909319328281960030 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1139254171913846} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 0 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &114251241889735402 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1139254171913846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: - hasSpawned: 0 ---- !u!114 &114048121767222990 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1139254171913846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 10da7fdf8caa1eb4697658bf129457fa, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - available: 1 - randomColor: {fileID: 7669440687796875101} ---- !u!114 &7669440687796875101 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1139254171913846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 218520098fbe58b4b8f0963ef41953f7, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - color: - serializedVersion: 2 - rgba: 4278190080 ---- !u!1 &5133204039361288107 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7524893234998283593} - - component: {fileID: 8440477969432842110} - - component: {fileID: 6355089084613864400} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7524893234998283593 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5133204039361288107} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.3, y: 0.3, z: 0.3} - m_Children: [] - m_Father: {fileID: 4362442735993418} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &8440477969432842110 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5133204039361288107} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6355089084613864400 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5133204039361288107} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 2becd2014627a774e9e8f668f281f1d2, type: 2} - 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: 0 - 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 diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab.meta deleted file mode 100644 index b0e72267c..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Prefabs/Prize.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8cec47ed46e0eff45966a5173d3aa0d3 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 100100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/README.md b/Assets/Mirror/Examples/MultipleAdditiveScenes/README.md deleted file mode 100644 index 29fd22ac8..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Multiple Additive Scenes Example - -In Build Settings, remove all scenes and add both of the scenes from the Scenes folder in the following order: - -- Main -- Game - -Open the Main scene in the Editor and make sure the Game Scene field in the MultiScene Network Manager on the Network scene object contains the Game scene. This is already setup by default, but if the Main scene was opened and saved before putting the scenes in the Build Settings list, the Game Scene field may be cleared accidentally. - -## MultiScene Network Manager - -The MultiScene Network Manager is derived from the base Network Manager and is responsible for additively loading the subscene instances and placing the players in their respective subscene instances and initializing player SyncVars. It has a Game Scene field where the Game subscene is assigned, and an Instances field to set how many instances are loaded on the server. - -In this example, the subscene instances are additively loaded on the server with `localPhysicsMode = LocalPhysicsMode.Physics3D`. Physics subscenes do not auto-simulate, so each scene has a game object with a generic `PhysicsSimulator` script on it. This script does nothing on the client, only on the server. - -Clients only ever have one instance of the subscene additively loaded (without `localPhysicsMode`), while server has them all. All networked objects have a `NetworkSceneChecker` component which is what isolates them to their specific subscene. - -## Playing in the Instances - -File -\> Build and Run - -Start at least 3 built instances: These will all be client players. - -Press Play in the Editor and click Host (Server + Client) in the HUD - This will be the host and the 1st player. You can also use Server Only if you prefer. - -Click Client in the built instances. - -- WASDQE keys to move & turn your player capsule, Space to jump. - -- Colliding with the small colored spheres scores points base on their color. - -- Colliding with the larger tumblers sends them rolling around...they're server-side non-kinematic rigidbodies. - -- Only scores for the players in the same subscene are shown at the top of the game window. diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/README.md.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/README.md.meta deleted file mode 100644 index 668fabd43..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 915d7b115a88c7c409dadf5bfc543737 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes.meta deleted file mode 100644 index d749d32c3..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 060de58cc46acdf4b92e21c43400aa58 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity deleted file mode 100644 index 025472246..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity +++ /dev/null @@ -1,753 +0,0 @@ -%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, g: 0, b: 0, 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: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 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, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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: 112000002, guid: 83612f89e0d5b404fbd99891bda78df4, - type: 2} - m_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &473309615 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 473309616} - m_Layer: 0 - m_Name: Tumblers - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &473309616 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 473309615} - 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: 535961556} - - {fileID: 1069065321} - - {fileID: 2061474489} - - {fileID: 1072549450} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &535961555 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 473309616} - m_Modifications: - - target: {fileID: -7012348765844800875, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: sceneId - value: 2357680917 - objectReference: {fileID: 0} - - target: {fileID: 456454062324168415, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217677473488, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217678603280, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Materials.Array.data[0] - value: - objectReference: {fileID: 2100000, guid: 7e6bf26596c6f564097734c7cc319e15, type: 2} - - target: {fileID: 5513112217680870098, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Name - value: Icosphere - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.x - value: -5 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.y - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: - - {fileID: -8786580539857106334, guid: a104de86221e66a48832c222471d4f1e, type: 3} - m_SourcePrefab: {fileID: 100100000, guid: a104de86221e66a48832c222471d4f1e, type: 3} ---- !u!4 &535961556 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - m_PrefabInstance: {fileID: 535961555} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1069065320 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 473309616} - m_Modifications: - - target: {fileID: -7012348765844800875, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: sceneId - value: 2631545699 - objectReference: {fileID: 0} - - target: {fileID: 456454062324168415, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217677473488, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217678603280, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Materials.Array.data[0] - value: - objectReference: {fileID: 2100000, guid: 7e6bf26596c6f564097734c7cc319e15, type: 2} - - target: {fileID: 5513112217680870098, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Name - value: Icosphere - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.y - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: - - {fileID: -8786580539857106334, guid: a104de86221e66a48832c222471d4f1e, type: 3} - m_SourcePrefab: {fileID: 100100000, guid: a104de86221e66a48832c222471d4f1e, type: 3} ---- !u!4 &1069065321 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - m_PrefabInstance: {fileID: 1069065320} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1072549449 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 473309616} - m_Modifications: - - target: {fileID: -7012348765844800875, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: sceneId - value: 634817531 - objectReference: {fileID: 0} - - target: {fileID: 456454062324168415, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217677473488, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217678603280, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Materials.Array.data[0] - value: - objectReference: {fileID: 2100000, guid: 7e6bf26596c6f564097734c7cc319e15, type: 2} - - target: {fileID: 5513112217680870098, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Name - value: Icosphere - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.y - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.z - value: -5 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: - - {fileID: -8786580539857106334, guid: a104de86221e66a48832c222471d4f1e, type: 3} - m_SourcePrefab: {fileID: 100100000, guid: a104de86221e66a48832c222471d4f1e, type: 3} ---- !u!4 &1072549450 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - m_PrefabInstance: {fileID: 1072549449} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1305256737 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1305256745} - - component: {fileID: 1305256744} - - component: {fileID: 1305256742} - - component: {fileID: 1305256743} - - component: {fileID: 1305256741} - - component: {fileID: 1305256740} - - component: {fileID: 1305256739} - - component: {fileID: 1305256738} - - component: {fileID: 1305256746} - m_Layer: 0 - m_Name: PlayArea - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!65 &1305256738 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Material: {fileID: 13400000, guid: 2e179c076d5d0924dbf5a2de0630bdb1, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 10, y: 8, z: 0.1} - m_Center: {x: 0, y: 4, z: 5} ---- !u!65 &1305256739 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Material: {fileID: 13400000, guid: 2e179c076d5d0924dbf5a2de0630bdb1, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 10, y: 8, z: 0.1} - m_Center: {x: 0, y: 4, z: -5} ---- !u!65 &1305256740 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Material: {fileID: 13400000, guid: 2e179c076d5d0924dbf5a2de0630bdb1, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.1, y: 8, z: 10} - m_Center: {x: 5, y: 4, z: 0} ---- !u!65 &1305256741 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Material: {fileID: 13400000, guid: 2e179c076d5d0924dbf5a2de0630bdb1, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 0.1, y: 8, z: 10} - m_Center: {x: -5, y: 4, z: 0} ---- !u!23 &1305256742 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - 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_RenderingLayerMask: 4294967295 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 42fe0bcfbb65da3429ae2c289686e024, type: 2} - 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: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - 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 ---- !u!64 &1305256743 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!33 &1305256744 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1305256745 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 4, y: 1, z: 4} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1305256746 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1305256737} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 3504801306 - serverOnly: 0 - visible: 0 - m_AssetId: - hasSpawned: 0 ---- !u!1 &1713236906 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1713236908} - - component: {fileID: 1713236907} - m_Layer: 0 - m_Name: PhysicsSimulator - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1713236907 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1713236906} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 78e3051d2c03f27429276d8a55a6d15c, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1713236908 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1713236906} - 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: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &2061474488 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 473309616} - m_Modifications: - - target: {fileID: -7012348765844800875, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: sceneId - value: 2066882912 - objectReference: {fileID: 0} - - target: {fileID: 456454062324168415, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217677473488, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Mesh - value: - objectReference: {fileID: 4300000, guid: 1fe56a0e685b8434ebfeb53c69b59a5e, type: 3} - - target: {fileID: 5513112217678603280, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Materials.Array.data[0] - value: - objectReference: {fileID: 2100000, guid: 7e6bf26596c6f564097734c7cc319e15, type: 2} - - target: {fileID: 5513112217680870098, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_Name - value: Icosphere - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.y - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: - - {fileID: -8786580539857106334, guid: a104de86221e66a48832c222471d4f1e, type: 3} - m_SourcePrefab: {fileID: 100100000, guid: a104de86221e66a48832c222471d4f1e, type: 3} ---- !u!4 &2061474489 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 5513112217680897778, guid: a104de86221e66a48832c222471d4f1e, - type: 3} - m_PrefabInstance: {fileID: 2061474488} - m_PrefabAsset: {fileID: 0} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity.meta deleted file mode 100644 index dae050d1d..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: d45ed07e5475d4740812c97ae565255c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity deleted file mode 100644 index b01ced722..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity +++ /dev/null @@ -1,801 +0,0 @@ -%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, g: 0, b: 0, 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: 3 - 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: 690741348} - m_IndirectSpecularColor: {r: 0.17276844, g: 0.21589246, b: 0.2978263, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &2272925 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2272928} - - component: {fileID: 2272927} - - component: {fileID: 2272926} - 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 &2272926 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2272925} - m_Enabled: 1 ---- !u!20 &2272927 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2272925} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 1 - orthographic size: 25 - 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 &2272928 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2272925} - 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 &69965666 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 69965670} - - component: {fileID: 69965669} - - component: {fileID: 69965667} - - component: {fileID: 69965671} - - component: {fileID: 69965668} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &69965667 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 69965666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3} - m_Name: - m_EditorClassIdentifier: - showGUI: 1 - offsetX: 0 - offsetY: 0 ---- !u!114 &69965668 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 69965666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b979f26c95d34324ba005bfacfa9c4fc, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &69965669 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 69965666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b982a1fd37427e64e8310a863d03d2c9, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 0 - PersistNetworkManagerToOfflineScene: 0 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 69965671} - networkAddress: localhost - maxConnections: 100 - disconnectInactiveConnections: 0 - disconnectInactiveTimeout: 60 - authenticator: {fileID: 0} - playerPrefab: {fileID: 1480027675339556, guid: 1f4d376d8ca693049abd1744e4c79fad, - type: 3} - autoCreatePlayer: 1 - playerSpawnMethod: 1 - spawnPrefabs: - - {fileID: 1139254171913846, guid: 8cec47ed46e0eff45966a5173d3aa0d3, type: 3} - rewardPrefab: {fileID: 1139254171913846, guid: 8cec47ed46e0eff45966a5173d3aa0d3, - type: 3} - instances: 2 - gameScene: Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Game.unity ---- !u!4 &69965670 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 69965666} - 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: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &69965671 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 69965666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - NonAlloc: 1 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!1 &204334129 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 204334130} - - component: {fileID: 204334131} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &204334130 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 204334129} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &204334131 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 204334129} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &263230754 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 263230755} - - component: {fileID: 263230756} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &263230755 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 263230754} - m_LocalRotation: {x: 0, y: 0.38268343, z: 0, w: 0.92387956} - m_LocalPosition: {x: -15, y: 0, z: -15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 45, z: 0} ---- !u!114 &263230756 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 263230754} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &290557149 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 290557150} - - component: {fileID: 290557151} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &290557150 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 290557149} - m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} - m_LocalPosition: {x: -15, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} ---- !u!114 &290557151 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 290557149} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &690741347 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 690741349} - - component: {fileID: 690741348} - 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 &690741348 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 690741347} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 0.990566, g: 0.9496818, b: 0.82702917, 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: 0.7 - 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_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &690741349 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 690741347} - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 10, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!1 &733367779 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 733367780} - - component: {fileID: 733367781} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &733367780 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 733367779} - m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} - m_LocalPosition: {x: 0, y: 0, z: 15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!114 &733367781 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 733367779} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &990635329 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 990635330} - - component: {fileID: 990635331} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &990635330 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990635329} - m_LocalRotation: {x: 0, y: 0.92387956, z: 0, w: 0.38268343} - m_LocalPosition: {x: -15, y: 0, z: 15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 135, z: 0} ---- !u!114 &990635331 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990635329} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1445635739 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1445635740} - m_Layer: 0 - m_Name: StartPositions - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1445635740 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445635739} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 733367780} - - {fileID: 2127619492} - - {fileID: 1975674813} - - {fileID: 1760045337} - - {fileID: 204334130} - - {fileID: 263230755} - - {fileID: 290557150} - - {fileID: 990635330} - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1760045336 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1760045337} - - component: {fileID: 1760045338} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1760045337 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1760045336} - m_LocalRotation: {x: 0, y: 0.3826836, z: -0, w: -0.92387944} - m_LocalPosition: {x: 15, y: 0, z: -15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 315, z: 0} ---- !u!114 &1760045338 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1760045336} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1975674812 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1975674813} - - component: {fileID: 1975674814} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1975674813 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1975674812} - m_LocalRotation: {x: 0, y: 0.7071068, z: -0, w: -0.7071068} - m_LocalPosition: {x: 15, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 270, z: 0} ---- !u!114 &1975674814 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1975674812} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &2127619491 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2127619492} - - component: {fileID: 2127619493} - m_Layer: 0 - m_Name: PlayerStart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2127619492 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2127619491} - m_LocalRotation: {x: 0, y: 0.9238796, z: -0, w: -0.38268325} - m_LocalPosition: {x: 15, y: 0, z: 15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1445635740} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 225, z: 0} ---- !u!114 &2127619493 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2127619491} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity.meta deleted file mode 100644 index 036bc0db4..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scenes/Main.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0fa8b7965660de64f8aefd6b64f18a08 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts.meta deleted file mode 100644 index bcb2ac270..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6d930bed284ca5040b2743524031cc13 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs deleted file mode 100644 index a84605921..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.SceneManagement; - -/* - Documentation: https://mirror-networking.gitbook.io/docs/components/network-manager - API Reference: https://mirror-networking.com/docs/api/Mirror.NetworkManager.html -*/ - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - [AddComponentMenu("")] - public class MultiSceneNetManager : NetworkManager - { - [Header("Spawner Setup")] - [Tooltip("Reward Prefab for the Spawner")] - public GameObject rewardPrefab; - - [Header("MultiScene Setup")] - public int instances = 3; - - [Scene] - public string gameScene; - - // This is set true after server loads all subscene instances - bool subscenesLoaded; - - // subscenes are added to this list as they're loaded - readonly List subScenes = new List(); - - // Sequential index used in round-robin deployment of players into instances and score positioning - int clientIndex; - - #region Server System Callbacks - - /// - /// Called on the server when a client adds a new player with NetworkClient.AddPlayer. - /// The default implementation for this function creates a new player object from the playerPrefab. - /// - /// Connection from client. - public override void OnServerAddPlayer(NetworkConnection conn) - { - StartCoroutine(OnServerAddPlayerDelayed(conn)); - } - - // This delay is mostly for the host player that loads too fast for the - // server to have subscenes async loaded from OnStartServer ahead of it. - IEnumerator OnServerAddPlayerDelayed(NetworkConnection conn) - { - // wait for server to async load all subscenes for game instances - while (!subscenesLoaded) - yield return null; - - // Send Scene message to client to additively load the game scene - conn.Send(new SceneMessage { sceneName = gameScene, sceneOperation = SceneOperation.LoadAdditive }); - - // Wait for end of frame before adding the player to ensure Scene Message goes first - yield return new WaitForEndOfFrame(); - - base.OnServerAddPlayer(conn); - - PlayerScore playerScore = conn.identity.GetComponent(); - playerScore.playerNumber = clientIndex; - playerScore.scoreIndex = clientIndex / subScenes.Count; - playerScore.matchIndex = clientIndex % subScenes.Count; - - // Do this only on server, not on clients - // This is what allows the NetworkSceneChecker on player and scene objects - // to isolate matches per scene instance on server. - if (subScenes.Count > 0) - SceneManager.MoveGameObjectToScene(conn.identity.gameObject, subScenes[clientIndex % subScenes.Count]); - - clientIndex++; - } - - #endregion - - #region Start & Stop Callbacks - - /// - /// This is invoked when a server is started - including when a host is started. - /// StartServer has multiple signatures, but they all cause this hook to be called. - /// - public override void OnStartServer() - { - StartCoroutine(ServerLoadSubScenes()); - } - - // We're additively loading scenes, so GetSceneAt(0) will return the main "container" scene, - // therefore we start the index at one and loop through instances value inclusively. - // If instances is zero, the loop is bypassed entirely. - IEnumerator ServerLoadSubScenes() - { - for (int index = 1; index <= instances; index++) - { - yield return SceneManager.LoadSceneAsync(gameScene, new LoadSceneParameters { loadSceneMode = LoadSceneMode.Additive, localPhysicsMode = LocalPhysicsMode.Physics3D }); - - Scene newScene = SceneManager.GetSceneAt(index); - subScenes.Add(newScene); - Spawner.InitialSpawn(newScene); - } - - subscenesLoaded = true; - } - - /// - /// This is called when a server is stopped - including when a host is stopped. - /// - public override void OnStopServer() - { - NetworkServer.SendToAll(new SceneMessage { sceneName = gameScene, sceneOperation = SceneOperation.UnloadAdditive }); - StartCoroutine(ServerUnloadSubScenes()); - clientIndex = 0; - } - - // Unload the subScenes and unused assets and clear the subScenes list. - IEnumerator ServerUnloadSubScenes() - { - for (int index = 0; index < subScenes.Count; index++) - yield return SceneManager.UnloadSceneAsync(subScenes[index]); - - subScenes.Clear(); - subscenesLoaded = false; - - yield return Resources.UnloadUnusedAssets(); - } - - /// - /// This is called when a client is stopped. - /// - public override void OnStopClient() - { - // make sure we're not in host mode - if (mode == NetworkManagerMode.ClientOnly) - StartCoroutine(ClientUnloadSubScenes()); - } - - // Unload all but the active scene, which is the "container" scene - IEnumerator ClientUnloadSubScenes() - { - for (int index = 0; index < SceneManager.sceneCount; index++) - { - if (SceneManager.GetSceneAt(index) != SceneManager.GetActiveScene()) - yield return SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(index)); - } - } - - #endregion - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs.meta deleted file mode 100644 index dbca14042..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/MultiSceneNetManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b982a1fd37427e64e8310a863d03d2c9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs deleted file mode 100644 index 221c00b99..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs +++ /dev/null @@ -1,44 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - [RequireComponent(typeof(Rigidbody))] - public class PhysicsCollision : NetworkBehaviour - { - [Tooltip("how forcefully to push this object")] - public float force = 12; - - public Rigidbody rigidbody3D; - - void OnValidate() - { - if (rigidbody3D == null) - rigidbody3D = GetComponent(); - } - - void Start() - { - rigidbody3D.isKinematic = !isServer; - } - - [ServerCallback] - void OnCollisionStay(Collision other) - { - if (other.gameObject.CompareTag("Player")) - { - // get direction from which player is contacting object - Vector3 direction = other.contacts[0].normal; - - // zero the y and normalize so we don't shove this through the floor or launch this over the wall - direction.y = 0; - direction = direction.normalized; - - // push this away from player...a bit less force for host player - if (other.gameObject.GetComponent().connectionToClient.connectionId == NetworkConnection.LocalConnectionId) - rigidbody3D.AddForce(direction * force * .5f); - else - rigidbody3D.AddForce(direction * force); - } - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs.meta deleted file mode 100644 index 2343563dc..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsCollision.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c709489168fec9348b7f8290ee2e8466 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs deleted file mode 100644 index a7a739472..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs +++ /dev/null @@ -1,40 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - public class PhysicsSimulator : MonoBehaviour - { - PhysicsScene physicsScene; - PhysicsScene2D physicsScene2D; - - bool simulatePhysicsScene; - bool simulatePhysicsScene2D; - - void Awake() - { - if (NetworkServer.active) - { - physicsScene = gameObject.scene.GetPhysicsScene(); - simulatePhysicsScene = physicsScene.IsValid() && physicsScene != Physics.defaultPhysicsScene; - - physicsScene2D = gameObject.scene.GetPhysicsScene2D(); - simulatePhysicsScene2D = physicsScene2D.IsValid() && physicsScene2D != Physics2D.defaultPhysicsScene; - } - else - { - enabled = false; - } - } - - void FixedUpdate() - { - if (!NetworkServer.active) return; - - if (simulatePhysicsScene) - physicsScene.Simulate(Time.fixedDeltaTime); - - if (simulatePhysicsScene2D) - physicsScene2D.Simulate(Time.fixedDeltaTime); - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs.meta deleted file mode 100644 index a48884d33..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PhysicsSimulator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 78e3051d2c03f27429276d8a55a6d15c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs deleted file mode 100644 index 2d8a0b543..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs +++ /dev/null @@ -1,41 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; - -// This sets up the scene camera for the local player - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - public class PlayerCamera : NetworkBehaviour - { - Camera mainCam; - - void Awake() - { - mainCam = Camera.main; - } - - public override void OnStartLocalPlayer() - { - if (mainCam != null) - { - // configure and make camera a child of player with 3rd person offset - mainCam.orthographic = false; - mainCam.transform.SetParent(transform); - mainCam.transform.localPosition = new Vector3(0f, 3f, -8f); - mainCam.transform.localEulerAngles = new Vector3(10f, 0f, 0f); - } - } - - public override void OnStopClient() - { - if (isLocalPlayer && mainCam != null) - { - mainCam.transform.SetParent(null); - SceneManager.MoveGameObjectToScene(mainCam.gameObject, SceneManager.GetActiveScene()); - mainCam.orthographic = true; - mainCam.transform.localPosition = new Vector3(0f, 70f, 0f); - mainCam.transform.localEulerAngles = new Vector3(90f, 0f, 0f); - } - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs.meta deleted file mode 100644 index 6d4a9c952..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerCamera.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6cac48dc20f866148b44d0f9b5850761 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs deleted file mode 100644 index b8a1c00ad..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs +++ /dev/null @@ -1,96 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - [RequireComponent(typeof(CapsuleCollider))] - [RequireComponent(typeof(CharacterController))] - [RequireComponent(typeof(NetworkTransform))] - [RequireComponent(typeof(Rigidbody))] - public class PlayerController : NetworkBehaviour - { - public CharacterController characterController; - - void OnValidate() - { - if (characterController == null) - characterController = GetComponent(); - - characterController.enabled = false; - GetComponent().isKinematic = true; - GetComponent().clientAuthority = true; - } - - public override void OnStartLocalPlayer() - { - characterController.enabled = true; - } - - [Header("Movement Settings")] - public float moveSpeed = 8f; - public float turnSensitivity = 5f; - public float maxTurnSpeed = 100f; - - [Header("Diagnostics")] - public float horizontal; - public float vertical; - public float turn; - public float jumpSpeed; - public bool isGrounded = true; - public bool isFalling; - public Vector3 velocity; - - void Update() - { - if (!isLocalPlayer || characterController == null || !characterController.enabled) - return; - - horizontal = Input.GetAxis("Horizontal"); - vertical = Input.GetAxis("Vertical"); - - // Q and E cancel each other out, reducing the turn to zero - if (Input.GetKey(KeyCode.Q)) - turn = Mathf.MoveTowards(turn, -maxTurnSpeed, turnSensitivity); - if (Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, maxTurnSpeed, turnSensitivity); - if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, 0, turnSensitivity); - if (!Input.GetKey(KeyCode.Q) && !Input.GetKey(KeyCode.E)) - turn = Mathf.MoveTowards(turn, 0, turnSensitivity); - - if (isGrounded) - isFalling = false; - - if ((isGrounded || !isFalling) && jumpSpeed < 1f && Input.GetKey(KeyCode.Space)) - { - jumpSpeed = Mathf.Lerp(jumpSpeed, 1f, 0.5f); - } - else if (!isGrounded) - { - isFalling = true; - jumpSpeed = 0; - } - } - - void FixedUpdate() - { - if (!isLocalPlayer || characterController == null || !characterController.enabled) - return; - - transform.Rotate(0f, turn * Time.fixedDeltaTime, 0f); - - Vector3 direction = new Vector3(horizontal, jumpSpeed, vertical); - direction = Vector3.ClampMagnitude(direction, 1f); - direction = transform.TransformDirection(direction); - direction *= moveSpeed; - - if (jumpSpeed > 0) - characterController.Move(direction * Time.fixedDeltaTime); - else - characterController.SimpleMove(direction); - - isGrounded = characterController.isGrounded; - velocity = characterController.velocity; - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs.meta deleted file mode 100644 index c3bad11c5..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 479a5196564ede84791870b414a13645 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs deleted file mode 100644 index 08238b229..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs +++ /dev/null @@ -1,30 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - public class PlayerScore : NetworkBehaviour - { - [SyncVar] - public int playerNumber; - - [SyncVar] - public int scoreIndex; - - [SyncVar] - public int matchIndex; - - [SyncVar] - public uint score; - - public int clientMatchIndex = -1; - - void OnGUI() - { - if (!isServerOnly && !isLocalPlayer && clientMatchIndex < 0) - clientMatchIndex = NetworkClient.connection.identity.GetComponent().matchIndex; - - if (isLocalPlayer || matchIndex == clientMatchIndex) - GUI.Box(new Rect(10f + (scoreIndex * 110), 10f, 100f, 25f), $"P{playerNumber}: {score}"); - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs.meta deleted file mode 100644 index 3b9c9dd01..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/PlayerScore.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8be750efa9df50f47b65ae156053d149 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs deleted file mode 100644 index d6d2ac8c7..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs +++ /dev/null @@ -1,32 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - public class RandomColor : NetworkBehaviour - { - public override void OnStartServer() - { - base.OnStartServer(); - color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f); - } - - // Color32 packs to 4 bytes - [SyncVar(hook = nameof(SetColor))] - public Color32 color = Color.black; - - // Unity clones the material when GetComponent().material is called - // Cache it here and destroy it in OnDestroy to prevent a memory leak - Material cachedMaterial; - - void SetColor(Color32 _, Color32 newColor) - { - if (cachedMaterial == null) cachedMaterial = GetComponentInChildren().material; - cachedMaterial.color = newColor; - } - - void OnDestroy() - { - Destroy(cachedMaterial); - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs.meta deleted file mode 100644 index 2bef2a62c..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/RandomColor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 218520098fbe58b4b8f0963ef41953f7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs deleted file mode 100644 index e3d2bc025..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs +++ /dev/null @@ -1,52 +0,0 @@ -using UnityEngine; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - [RequireComponent(typeof(RandomColor))] - public class Reward : NetworkBehaviour - { - public bool available = true; - public RandomColor randomColor; - - void OnValidate() - { - if (randomColor == null) - randomColor = GetComponent(); - } - - [ServerCallback] - void OnTriggerEnter(Collider other) - { - if (other.gameObject.CompareTag("Player")) - ClaimPrize(other.gameObject); - } - - // This is called from PlayerController.CmdClaimPrize which is invoked by PlayerController.OnControllerColliderHit - // This only runs on the server - public void ClaimPrize(GameObject player) - { - if (available) - { - // This is a fast switch to prevent two players claiming the prize in a bang-bang close contest for it. - // First hit turns it off, pending the object being destroyed a few frames later. - available = false; - - Color32 color = randomColor.color; - - // calculate the points from the color ... lighter scores higher as the average approaches 255 - // UnityEngine.Color RGB values are float fractions of 255 - uint points = (uint)(((color.r) + (color.g) + (color.b)) / 3); - //Debug.Log($"Scored {points} points R:{color.r} G:{color.g} B:{color.b}"); - - // award the points via SyncVar on the PlayerController - player.GetComponent().score += points; - - // spawn a replacement - Spawner.SpawnReward(gameObject.scene); - - // destroy this one - NetworkServer.Destroy(gameObject); - } - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs.meta deleted file mode 100644 index 1bb7ea35a..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Reward.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 10da7fdf8caa1eb4697658bf129457fa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs deleted file mode 100644 index 8646b1b65..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs +++ /dev/null @@ -1,26 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace Mirror.Examples.MultipleAdditiveScenes -{ - internal class Spawner - { - internal static void InitialSpawn(Scene scene) - { - if (!NetworkServer.active) return; - - for (int i = 0; i < 10; i++) - SpawnReward(scene); - } - - internal static void SpawnReward(Scene scene) - { - if (!NetworkServer.active) return; - - Vector3 spawnPosition = new Vector3(Random.Range(-19, 20), 1, Random.Range(-19, 20)); - GameObject reward = Object.Instantiate(((MultiSceneNetManager)NetworkManager.singleton).rewardPrefab, spawnPosition, Quaternion.identity); - SceneManager.MoveGameObjectToScene(reward, scene); - NetworkServer.Spawn(reward); - } - } -} diff --git a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs.meta b/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs.meta deleted file mode 100644 index 9d9b2b1bb..000000000 --- a/Assets/Mirror/Examples/MultipleAdditiveScenes/Scripts/Spawner.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f522bf510b49da44caa9f3ca0ac17f3b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches.meta b/Assets/Mirror/Examples/MultipleMatches.meta deleted file mode 100644 index c8788e5be..000000000 --- a/Assets/Mirror/Examples/MultipleMatches.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8e1be7be6da8e2448ba40eba0daa44b9 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs.meta b/Assets/Mirror/Examples/MultipleMatches/Prefabs.meta deleted file mode 100644 index 7d19e9159..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ad2253a5702ed854995bf034be09a1ae -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab b/Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab deleted file mode 100644 index 6fb790b6b..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab +++ /dev/null @@ -1,144 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &4903779300334215825 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8667093524748208693} - - component: {fileID: 792638734159983555} - - component: {fileID: 2985632515421915780} - - component: {fileID: 9218727033388977555} - - component: {fileID: 2439948753870522382} - m_Layer: 5 - m_Name: CellGUI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8667093524748208693 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4903779300334215825} - 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} - 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.5, y: 0.5} ---- !u!222 &792638734159983555 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4903779300334215825} - m_CullTransparentMesh: 0 ---- !u!114 &2985632515421915780 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4903779300334215825} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 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 ---- !u!114 &9218727033388977555 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4903779300334215825} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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_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_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 2985632515421915780} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2439948753870522382} - m_MethodName: MakePlay - 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 &2439948753870522382 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4903779300334215825} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9cda2a394a443474689a3c6d6044f7b0, type: 3} - m_Name: - m_EditorClassIdentifier: - matchController: {fileID: 0} - cellValue: 0 - image: {fileID: 2985632515421915780} - button: {fileID: 9218727033388977555} - playerIdentity: {fileID: 0} diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab.meta b/Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab.meta deleted file mode 100644 index 8ddee88fd..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/CellGUI.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5ab8c221183f0094eb04b7f6eb569e7b -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab b/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab deleted file mode 100644 index cba01f5a7..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab +++ /dev/null @@ -1,2169 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &2555295541931690112 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 9152319602512786093} - - component: {fileID: 5340387473365754403} - - component: {fileID: 6419338461327946957} - m_Layer: 5 - m_Name: Grid - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &9152319602512786093 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2555295541931690112} - 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: 7845801290156398150} - - {fileID: 6007826401523109089} - - {fileID: 2045714052640889548} - - {fileID: 5012654960586055004} - - {fileID: 5768719360570285027} - - {fileID: 3581888124560234741} - - {fileID: 1213482271452262600} - - {fileID: 8092575970934441626} - - {fileID: 134186364329385301} - m_Father: {fileID: 2234053401096987375} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -230} - m_SizeDelta: {x: 200, y: 200} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5340387473365754403 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2555295541931690112} - m_CullTransparentMesh: 0 ---- !u!114 &6419338461327946957 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2555295541931690112} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 4 - m_StartCorner: 0 - m_StartAxis: 0 - m_CellSize: {x: 50, y: 50} - m_Spacing: {x: 10, y: 10} - m_Constraint: 1 - m_ConstraintCount: 3 ---- !u!1 &2923784255186993310 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2234053401096987375} - - component: {fileID: 7453676321493443231} - - component: {fileID: 4598621321729434398} - - component: {fileID: 4694292283357099176} - - component: {fileID: 1964986598517419573} - - component: {fileID: 400263754679705305} - - component: {fileID: 4082668978785527835} - - component: {fileID: 6069480080749678769} - m_Layer: 5 - m_Name: MatchController - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2234053401096987375 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - 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: 6235856198463648228} - - {fileID: 9152319602512786093} - - {fileID: 8089560656303244059} - - {fileID: 5427396184031506795} - - {fileID: 3332139760985286172} - - {fileID: 6549136291348945526} - m_Father: {fileID: 0} - 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: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!223 &7453676321493443231 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - 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!114 &4598621321729434398 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - 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 ---- !u!225 &4694292283357099176 -CanvasGroup: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - m_Enabled: 1 - m_Alpha: 0 - m_Interactable: 0 - m_BlocksRaycasts: 0 - m_IgnoreParentGroups: 0 ---- !u!114 &1964986598517419573 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - 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 &400263754679705305 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: e101d385946c91b4c81f318efc723a88 - hasSpawned: 0 ---- !u!114 &4082668978785527835 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5d17e718851449a6879986e45c458fb7, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 ---- !u!114 &6069480080749678769 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2923784255186993310} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9ccb1dd1fc7cc624e9bff1d0d7a5c741, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 - canvasGroup: {fileID: 4694292283357099176} - gameText: {fileID: 3623013869500637742} - exitButton: {fileID: 3578082239447023245} - playAgainButton: {fileID: 505721148531914274} - winCountLocal: {fileID: 1799015512609000790} - winCountOpponent: {fileID: 5140715663012776105} - canvasController: {fileID: 0} - player1: {fileID: 0} - player2: {fileID: 0} - startingPlayer: {fileID: 0} - currentPlayer: {fileID: 0} ---- !u!1 &3002539098384373397 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5427396184031506795} - - component: {fileID: 1482480893644091453} - - component: {fileID: 5971814406204202327} - - component: {fileID: 3578082239447023245} - m_Layer: 5 - m_Name: BackButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5427396184031506795 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3002539098384373397} - 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: 6237100814274483571} - m_Father: {fileID: 2234053401096987375} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 80, y: -360} - m_SizeDelta: {x: 140, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1482480893644091453 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3002539098384373397} - m_CullTransparentMesh: 0 ---- !u!114 &5971814406204202327 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3002539098384373397} - 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_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!114 &3578082239447023245 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3002539098384373397} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 5971814406204202327} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 6069480080749678769} - m_MethodName: RequestExitGame - 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!1 &3827598301957981835 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8089560656303244059} - - component: {fileID: 4347360514208405509} - - component: {fileID: 3285613769939000379} - - component: {fileID: 505721148531914274} - m_Layer: 5 - m_Name: ReplayButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8089560656303244059 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3827598301957981835} - 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: 5868794740851378326} - m_Father: {fileID: 2234053401096987375} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: -80, y: -360} - m_SizeDelta: {x: 140, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &4347360514208405509 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3827598301957981835} - m_CullTransparentMesh: 0 ---- !u!114 &3285613769939000379 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3827598301957981835} - 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_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!114 &505721148531914274 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3827598301957981835} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 3285613769939000379} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 6069480080749678769} - m_MethodName: RequestPlayAgain - 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!1 &4626758344199994040 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6549136291348945526} - - component: {fileID: 8917506311834154436} - - component: {fileID: 5140715663012776105} - - component: {fileID: 676122213734729856} - m_Layer: 5 - m_Name: OpponentWinCount - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6549136291348945526 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4626758344199994040} - 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: 2234053401096987375} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 200, y: -220} - m_SizeDelta: {x: 150, y: 100} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &8917506311834154436 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4626758344199994040} - m_CullTransparentMesh: 0 ---- !u!114 &5140715663012776105 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4626758344199994040} - 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: 1, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &676122213734729856 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4626758344199994040} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 1, g: 1, b: 1, a: 0.5} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!1 &4990186583940393891 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6235856198463648228} - - component: {fileID: 3131614140979920454} - - component: {fileID: 3623013869500637742} - - component: {fileID: 24521910774297013} - m_Layer: 5 - m_Name: GameText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6235856198463648228 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4990186583940393891} - 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: 2234053401096987375} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -100} - m_SizeDelta: {x: 600, y: 134} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &3131614140979920454 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4990186583940393891} - m_CullTransparentMesh: 0 ---- !u!114 &3623013869500637742 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4990186583940393891} - 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: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &24521910774297013 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4990186583940393891} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 1, g: 1, b: 1, a: 0.5} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!1 &6520692455078726128 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3332139760985286172} - - component: {fileID: 6960075187593147498} - - component: {fileID: 1799015512609000790} - - component: {fileID: 4004526050613360083} - m_Layer: 5 - m_Name: LocalWinCount - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &3332139760985286172 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6520692455078726128} - 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: 2234053401096987375} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: -200, y: -220} - m_SizeDelta: {x: 150, y: 100} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6960075187593147498 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6520692455078726128} - m_CullTransparentMesh: 0 ---- !u!114 &1799015512609000790 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6520692455078726128} - 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, g: 0, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 30 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &4004526050613360083 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6520692455078726128} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 1, g: 1, b: 1, a: 0.5} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!1 &7074721236105841979 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5868794740851378326} - - component: {fileID: 7905154098717810396} - - component: {fileID: 7932145844108874787} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5868794740851378326 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7074721236105841979} - 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: 8089560656303244059} - 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!222 &7905154098717810396 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7074721236105841979} - m_CullTransparentMesh: 0 ---- !u!114 &7932145844108874787 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7074721236105841979} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Play Again ---- !u!1 &8221244113287092374 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6237100814274483571} - - component: {fileID: 5779956055286566608} - - component: {fileID: 630561348298258014} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6237100814274483571 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8221244113287092374} - 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: 5427396184031506795} - 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!222 &5779956055286566608 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8221244113287092374} - m_CullTransparentMesh: 0 ---- !u!114 &630561348298258014 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8221244113287092374} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Back to Lobby ---- !u!1001 &579039501550898351 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 128 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: B3 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 7 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &8092575970934441626 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 579039501550898351} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1487965888931322995 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: A1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &7845801290156398150 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 1487965888931322995} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &2902895493631791574 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 16 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: B2 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 4 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &5768719360570285027 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 2902895493631791574} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &3109636500741621460 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: B1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &6007826401523109089 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 3109636500741621460} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &4456088094002665321 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 8 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: A2 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &5012654960586055004 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 4456088094002665321} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &5328567489950307008 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 32 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: C2 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &3581888124560234741 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 5328567489950307008} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &7216004328368886009 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 4 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: C1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &2045714052640889548 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 7216004328368886009} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &7534684980187888381 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 64 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: A3 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 6 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &1213482271452262600 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 7534684980187888381} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &8762608952144385888 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 9152319602512786093} - m_Modifications: - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: cellValue - value: 256 - objectReference: {fileID: 0} - - target: {fileID: 2439948753870522382, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: matchController - value: - objectReference: {fileID: 6069480080749678769} - - target: {fileID: 4903779300334215825, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Name - value: C3 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_RootOrder - value: 8 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5ab8c221183f0094eb04b7f6eb569e7b, type: 3} ---- !u!224 &134186364329385301 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 8667093524748208693, guid: 5ab8c221183f0094eb04b7f6eb569e7b, - type: 3} - m_PrefabInstance: {fileID: 8762608952144385888} - m_PrefabAsset: {fileID: 0} diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab.meta b/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab.meta deleted file mode 100644 index e358fcc14..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchController.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e101d385946c91b4c81f318efc723a88 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab b/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab deleted file mode 100644 index 5a929fdf6..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab +++ /dev/null @@ -1,293 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &732536732566260629 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6013388882030083517} - - component: {fileID: 2895310434674857523} - - component: {fileID: 7191823870515597218} - m_Layer: 5 - m_Name: Players - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6013388882030083517 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 732536732566260629} - 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: 3533216216399874122} - 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: -10, y: 0} - m_SizeDelta: {x: 60, y: 30} - m_Pivot: {x: 1, y: 0.5} ---- !u!222 &2895310434674857523 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 732536732566260629} - m_CullTransparentMesh: 0 ---- !u!114 &7191823870515597218 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 732536732566260629} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.78431374} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 5 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: X / X ---- !u!1 &3533216216399874123 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3533216216399874122} - - component: {fileID: 3533216216399874119} - - component: {fileID: 8159776287394259959} - - component: {fileID: 8871144159682159596} - - component: {fileID: 114572912279416540} - m_Layer: 5 - m_Name: MatchGUI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &3533216216399874122 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3533216216399874123} - 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: 8536989563668766087} - - {fileID: 6013388882030083517} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &3533216216399874119 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3533216216399874123} - m_CullTransparentMesh: 0 ---- !u!114 &8159776287394259959 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3533216216399874123} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.19607843} - m_RaycastTarget: 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 ---- !u!114 &8871144159682159596 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3533216216399874123} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 2109663825, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, 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_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 8159776287394259959} - toggleTransition: 1 - graphic: {fileID: 0} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 0 ---- !u!114 &114572912279416540 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3533216216399874123} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e875a237ce12c3145b20f17222f10b68, type: 3} - m_Name: - m_EditorClassIdentifier: - image: {fileID: 8159776287394259959} - toggleButton: {fileID: 8871144159682159596} - matchName: {fileID: 4525608779212400833} - playerCount: {fileID: 7191823870515597218} - canvasController: {fileID: 0} ---- !u!1 &5341423849544309394 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8536989563668766087} - - component: {fileID: 3979716480785526962} - - component: {fileID: 4525608779212400833} - m_Layer: 5 - m_Name: Name - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8536989563668766087 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5341423849544309394} - 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: 3533216216399874122} - m_RootOrder: 0 - 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: 200, y: 30} - m_Pivot: {x: 0, y: 0.5} ---- !u!222 &3979716480785526962 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5341423849544309394} - m_CullTransparentMesh: 0 ---- !u!114 &4525608779212400833 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5341423849544309394} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.78431374} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Match X diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab.meta b/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab.meta deleted file mode 100644 index 3308e2cf1..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchGUI.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: df3727c2222378b4ca786485a8b09981 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab b/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab deleted file mode 100644 index dd41ad65d..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab +++ /dev/null @@ -1,65 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &3559083313143303799 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1204658229548937417} - - component: {fileID: 7660209086417859164} - - component: {fileID: -3992624706284245286} - m_Layer: 0 - m_Name: MatchPlayer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1204658229548937417 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3559083313143303799} - 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!114 &7660209086417859164 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3559083313143303799} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 0 - serverOnly: 0 - visible: 0 - m_AssetId: 11d2414f1e120a14c98cba6866e5348f - hasSpawned: 0 ---- !u!114 &-3992624706284245286 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3559083313143303799} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5d17e718851449a6879986e45c458fb7, type: 3} - m_Name: - m_EditorClassIdentifier: - syncMode: 0 - syncInterval: 0.1 diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab.meta b/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab.meta deleted file mode 100644 index 66f3795d6..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/MatchPlayer.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 11d2414f1e120a14c98cba6866e5348f -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab b/Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab deleted file mode 100644 index 4c7a2ab93..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab +++ /dev/null @@ -1,182 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &2742256683483721700 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4805460816392144898} - - component: {fileID: 4240234839557606510} - - component: {fileID: 733636089880751452} - - component: {fileID: 8081368318735942264} - m_Layer: 5 - m_Name: PlayerGUI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4805460816392144898 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2742256683483721700} - 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: 4975002542353798605} - m_Father: {fileID: 0} - 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: 0, y: 0} - m_SizeDelta: {x: 0, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &4240234839557606510 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2742256683483721700} - m_CullTransparentMesh: 0 ---- !u!114 &733636089880751452 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2742256683483721700} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.2509804, g: 0.2509804, b: 0.2509804, a: 1} - m_RaycastTarget: 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 ---- !u!114 &8081368318735942264 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2742256683483721700} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f61e9bc3715eb904b91222a5526f63d8, type: 3} - m_Name: - m_EditorClassIdentifier: - playerName: {fileID: 893070459539714110} ---- !u!1 &4667088617155248724 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4975002542353798605} - - component: {fileID: 8874787277914191185} - - component: {fileID: 893070459539714110} - - component: {fileID: 1559385578385937998} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4975002542353798605 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4667088617155248724} - 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: 4805460816392144898} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 300, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &8874787277914191185 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4667088617155248724} - m_CullTransparentMesh: 0 ---- !u!114 &893070459539714110 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4667088617155248724} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 25 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Player X ---- !u!114 &1559385578385937998 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4667088617155248724} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -900027084, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 diff --git a/Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab.meta b/Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab.meta deleted file mode 100644 index 27639dc37..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Prefabs/PlayerGUI.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 504f86497324bc040be44f6f88b6cc73 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/README.md b/Assets/Mirror/Examples/MultipleMatches/README.md deleted file mode 100644 index a6da1e349..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# MultipleMatches Example - -This example demonstrates how to run a large number of non-physics games concurrently in a single game server instance. - -This would be most appropriate for Card, Board, Puzzle, and Arcade games where there is no physics involved, just presentation and messaging. - -While this example is turn-based, real-time games work just as well. - -When a match is started, a MatchController and Player objects are spawned, all with a Network Match Checker component with the same matchId set. Only clients with the same matchID get messages about each others actions and about their own match. They don't receive any data about other matches that may be running concurrently. diff --git a/Assets/Mirror/Examples/MultipleMatches/README.md.meta b/Assets/Mirror/Examples/MultipleMatches/README.md.meta deleted file mode 100644 index fdee84040..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9749e23e4e90e0646afc81061710a927 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Scenes.meta b/Assets/Mirror/Examples/MultipleMatches/Scenes.meta deleted file mode 100644 index af2754251..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a92fd9255da5fe9449e612566195a3aa -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity b/Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity deleted file mode 100644 index 993ff0b50..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity +++ /dev/null @@ -1,2982 +0,0 @@ -%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, g: 0, b: 0, 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: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 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: 1 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - 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: 512 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - 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_UseShadowmask: 1 ---- !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 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &8446050 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8446051} - - component: {fileID: 8446054} - - component: {fileID: 8446053} - - component: {fileID: 8446052} - m_Layer: 5 - m_Name: JoinButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &8446051 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8446050} - 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: 73998978} - m_Father: {fileID: 490177806} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 80, y: -160} - m_SizeDelta: {x: 140, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &8446052 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8446050} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 8446053} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2050110698} - m_MethodName: RequestJoinMatch - 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 &8446053 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8446050} - 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_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 &8446054 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8446050} - m_CullTransparentMesh: 0 ---- !u!1 &18198962 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 18198963} - - component: {fileID: 18198965} - - component: {fileID: 18198964} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &18198963 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 18198962} - 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: 1613178153} - 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 &18198964 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 18198962} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Start ---- !u!222 &18198965 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 18198962} - m_CullTransparentMesh: 0 ---- !u!1 &73998977 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 73998978} - - component: {fileID: 73998980} - - component: {fileID: 73998979} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &73998978 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 73998977} - 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: 8446051} - 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 &73998979 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 73998977} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Join ---- !u!222 &73998980 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 73998977} - m_CullTransparentMesh: 0 ---- !u!1 &239920241 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 239920242} - - component: {fileID: 239920244} - - component: {fileID: 239920243} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &239920242 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 239920241} - 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: 716626176} - 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: 0, y: 0} - m_SizeDelta: {x: 20, y: 19.999998} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &239920243 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 239920241} - 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_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 &239920244 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 239920241} - m_CullTransparentMesh: 0 ---- !u!1 &346368339 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 346368340} - - component: {fileID: 346368342} - - component: {fileID: 346368341} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &346368340 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346368339} - 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: 1108207370} - 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 &346368341 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346368339} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Cancel ---- !u!222 &346368342 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346368339} - m_CullTransparentMesh: 0 ---- !u!1 &490177805 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 490177806} - m_Layer: 5 - m_Name: LobbyView - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &490177806 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 490177805} - 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: 1005098734} - - {fileID: 1100846361} - - {fileID: 8446051} - m_Father: {fileID: 2050110697} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -200} - m_SizeDelta: {x: 1, y: 1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &492832111 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 492832112} - - component: {fileID: 492832114} - - component: {fileID: 492832113} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &492832112 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492832111} - 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: 1205047099} - 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: 19.999998} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &492832113 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492832111} - 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_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 &492832114 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492832111} - m_CullTransparentMesh: 0 ---- !u!1 &647085297 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 647085298} - - component: {fileID: 647085300} - - component: {fileID: 647085299} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &647085298 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 647085297} - 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: 2105646339} - 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 &647085299 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 647085297} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Leave ---- !u!222 &647085300 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 647085297} - m_CullTransparentMesh: 0 ---- !u!1 &716626175 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 716626176} - 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 &716626176 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 716626175} - 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: 239920242} - m_Father: {fileID: 816951368} - 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 &777606420 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 777606421} - - component: {fileID: 777606424} - - component: {fileID: 777606423} - - component: {fileID: 777606422} - m_Layer: 5 - m_Name: TitleText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &777606421 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777606420} - 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: 2050110697} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -40} - m_SizeDelta: {x: 360, y: 45} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &777606422 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777606420} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!114 &777606423 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777606420} - 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: 1, g: 1, b: 0, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 35 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 3 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Tic-Tac-Toe ---- !u!222 &777606424 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777606420} - m_CullTransparentMesh: 0 ---- !u!1 &814991252 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 814991255} - - component: {fileID: 814991254} - - component: {fileID: 814991253} - 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 &814991253 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814991252} - m_Enabled: 1 ---- !u!20 &814991254 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814991252} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.21698111, g: 0.21698111, b: 0.21698111, 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 &814991255 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814991252} - 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 &816951367 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 816951368} - - component: {fileID: 816951371} - - component: {fileID: 816951370} - - component: {fileID: 816951369} - m_Layer: 5 - m_Name: Scrollbar Vertical - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &816951368 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 816951367} - 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: 716626176} - m_Father: {fileID: 1005098734} - 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: 0, y: 20} - m_Pivot: {x: 1, y: 1} ---- !u!114 &816951369 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 816951367} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 239920243} - m_HandleRect: {fileID: 239920242} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &816951370 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 816951367} - 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_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 &816951371 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 816951367} - m_CullTransparentMesh: 0 ---- !u!1 &874070006 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 874070010} - - component: {fileID: 874070009} - - component: {fileID: 874070008} - - component: {fileID: 874070007} - - component: {fileID: 874070011} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &874070007 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874070006} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3} - m_Name: - m_EditorClassIdentifier: - showGUI: 1 - offsetX: 0 - offsetY: 0 ---- !u!114 &874070008 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874070006} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b0fecffa3f624585964b0d0eb21b18e, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - DualMode: 1 - NoDelay: 1 - Interval: 10 - Timeout: 10000 - FastResend: 2 - CongestionWindow: 0 - SendWindowSize: 4096 - ReceiveWindowSize: 4096 - NonAlloc: 1 - debugLog: 0 - statisticsGUI: 0 - statisticsLog: 0 ---- !u!114 &874070009 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874070006} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0b15c78bb8ab8da42a94aa0bc3081814, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 0 - PersistNetworkManagerToOfflineScene: 0 - runInBackground: 1 - autoStartServerBuild: 1 - serverTickRate: 30 - offlineScene: - onlineScene: - transport: {fileID: 874070008} - networkAddress: localhost - maxConnections: 200 - disconnectInactiveConnections: 0 - disconnectInactiveTimeout: 60 - authenticator: {fileID: 0} - playerPrefab: {fileID: 3559083313143303799, guid: 11d2414f1e120a14c98cba6866e5348f, - type: 3} - autoCreatePlayer: 0 - playerSpawnMethod: 1 - spawnPrefabs: - - {fileID: 2923784255186993310, guid: e101d385946c91b4c81f318efc723a88, type: 3} - canvas: {fileID: 2050110693} - canvasController: {fileID: 2050110698} ---- !u!4 &874070010 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874070006} - 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: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &874070011 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874070006} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d09f5c8bf2f4747b7a9284ef5d9ce2a7, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1005098733 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1005098734} - - component: {fileID: 1005098737} - - component: {fileID: 1005098736} - - component: {fileID: 1005098735} - m_Layer: 5 - m_Name: Scroll View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1005098734 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1005098733} - 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: 1348255964} - - {fileID: 816951368} - m_Father: {fileID: 490177806} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 300, y: 250} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1005098735 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1005098733} - 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, g: 0, b: 0, a: 0.19607843} - m_RaycastTarget: 1 - 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 &1005098736 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1005098733} - m_CullTransparentMesh: 0 ---- !u!114 &1005098737 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1005098733} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 1386671669} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 25 - m_Viewport: {fileID: 1348255964} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 816951369} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!1 &1100846360 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1100846361} - - component: {fileID: 1100846364} - - component: {fileID: 1100846362} - - component: {fileID: 1100846363} - m_Layer: 5 - m_Name: CreateButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1100846361 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1100846360} - 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: 1582884915} - m_Father: {fileID: 490177806} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -80, y: -160} - m_SizeDelta: {x: 140, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1100846362 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1100846360} - 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_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!114 &1100846363 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1100846360} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1100846362} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2050110698} - m_MethodName: RequestCreateMatch - 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!222 &1100846364 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1100846360} - m_CullTransparentMesh: 0 ---- !u!1 &1108207369 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1108207370} - - component: {fileID: 1108207373} - - component: {fileID: 1108207372} - - component: {fileID: 1108207371} - m_Layer: 5 - m_Name: CancelButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1108207370 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1108207369} - 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: 346368340} - m_Father: {fileID: 1258848447} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -120, y: -160} - m_SizeDelta: {x: 100, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1108207371 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1108207369} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1108207372} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2050110698} - m_MethodName: RequestCancelMatch - 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 &1108207372 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1108207369} - 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_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 &1108207373 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1108207369} - m_CullTransparentMesh: 0 ---- !u!1 &1132002899 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1132002900} - - component: {fileID: 1132002903} - - component: {fileID: 1132002902} - - component: {fileID: 1132002901} - m_Layer: 5 - m_Name: Scrollbar Vertical - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1132002900 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1132002899} - 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: 1205047099} - m_Father: {fileID: 1538073291} - 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: 25} - m_SizeDelta: {x: 0, y: 70} - m_Pivot: {x: 1, y: 1} ---- !u!114 &1132002901 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1132002899} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 492832113} - m_HandleRect: {fileID: 492832112} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1132002902 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1132002899} - 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_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 &1132002903 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1132002899} - m_CullTransparentMesh: 0 ---- !u!1 &1205047098 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1205047099} - 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 &1205047099 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1205047098} - 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: 492832112} - m_Father: {fileID: 1132002900} - 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 &1258848446 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1258848447} - - component: {fileID: 1258848448} - m_Layer: 5 - m_Name: RoomView - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1258848447 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258848446} - 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: 1538073291} - - {fileID: 2105646339} - - {fileID: 1108207370} - - {fileID: 1986814489} - - {fileID: 1613178153} - m_Father: {fileID: 2050110697} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -200} - m_SizeDelta: {x: 1, y: 1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1258848448 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258848446} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fc0f113afba9a074b9a3e4fb56f16abb, type: 3} - m_Name: - m_EditorClassIdentifier: - playerList: {fileID: 1295888617} - playerPrefab: {fileID: 2742256683483721700, guid: 504f86497324bc040be44f6f88b6cc73, - type: 3} - cancelButton: {fileID: 1108207369} - leaveButton: {fileID: 2105646338} - startButton: {fileID: 1613178154} - owner: 0 ---- !u!1 &1295888617 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1295888618} - - component: {fileID: 1295888620} - - component: {fileID: 1295888619} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1295888618 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1295888617} - 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: 1623056866} - 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: -183} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1295888619 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1295888617} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!114 &1295888620 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1295888617} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 1 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 ---- !u!1 &1348255963 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1348255964} - - component: {fileID: 1348255967} - - component: {fileID: 1348255966} - - component: {fileID: 1348255965} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1348255964 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348255963} - 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: 1386671669} - m_Father: {fileID: 1005098734} - 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: -17, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1348255965 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348255963} - 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_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 &1348255966 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348255963} - m_CullTransparentMesh: 0 ---- !u!114 &1348255967 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348255963} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1386671668 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1386671669} - - component: {fileID: 1386671671} - - component: {fileID: 1386671670} - - component: {fileID: 1386671672} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1386671669 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1386671668} - 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: 1348255964} - 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: -250} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1386671670 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1386671668} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!114 &1386671671 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1386671668} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 1 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 ---- !u!114 &1386671672 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1386671668} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2fafe2cfe61f6974895a912c3755e8f1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AllowSwitchOff: 1 ---- !u!1 &1538073290 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1538073291} - - component: {fileID: 1538073294} - - component: {fileID: 1538073293} - - component: {fileID: 1538073292} - m_Layer: 5 - m_Name: Scroll View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1538073291 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1538073290} - 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: 1623056866} - - {fileID: 1132002900} - m_Father: {fileID: 1258848447} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 300, y: 200} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1538073292 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1538073290} - 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, g: 0, b: 0, a: 0.19607843} - m_RaycastTarget: 1 - 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 &1538073293 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1538073290} - m_CullTransparentMesh: 0 ---- !u!114 &1538073294 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1538073290} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 1295888618} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 25 - m_Viewport: {fileID: 1623056866} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 1132002901} - m_HorizontalScrollbarVisibility: 2 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: -3 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!1 &1582884914 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1582884915} - - component: {fileID: 1582884917} - - component: {fileID: 1582884916} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1582884915 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1582884914} - 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: 1100846361} - 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 &1582884916 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1582884914} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Create ---- !u!222 &1582884917 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1582884914} - m_CullTransparentMesh: 0 ---- !u!1 &1613178152 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1613178153} - - component: {fileID: 1613178156} - - component: {fileID: 1613178155} - - component: {fileID: 1613178154} - m_Layer: 5 - m_Name: StartButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1613178153 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1613178152} - 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: 18198963} - m_Father: {fileID: 1258848447} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 120, y: -160} - m_SizeDelta: {x: 100, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1613178154 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1613178152} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1613178155} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2050110698} - m_MethodName: RequestStartMatch - 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 &1613178155 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1613178152} - 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_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 &1613178156 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1613178152} - m_CullTransparentMesh: 0 ---- !u!1 &1623056865 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1623056866} - - component: {fileID: 1623056869} - - component: {fileID: 1623056868} - - component: {fileID: 1623056867} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1623056866 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1623056865} - 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: 1295888618} - m_Father: {fileID: 1538073291} - 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: -17, y: -17} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1623056867 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1623056865} - 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_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 &1623056868 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1623056865} - m_CullTransparentMesh: 0 ---- !u!114 &1623056869 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1623056865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1902615731 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1902615734} - - component: {fileID: 1902615733} - - component: {fileID: 1902615732} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1902615732 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1902615731} - 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 &1902615733 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1902615731} - 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 &1902615734 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1902615731} - 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!1 &1986814488 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1986814489} - - component: {fileID: 1986814492} - - component: {fileID: 1986814491} - - component: {fileID: 1986814490} - m_Layer: 5 - m_Name: ReadyButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1986814489 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1986814488} - 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: 2133592452} - m_Father: {fileID: 1258848447} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -160} - m_SizeDelta: {x: 100, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1986814490 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1986814488} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1986814491} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2050110698} - m_MethodName: RequestReadyChange - 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 &1986814491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1986814488} - 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_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 &1986814492 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1986814488} - m_CullTransparentMesh: 0 ---- !u!1 &2050110693 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2050110697} - - component: {fileID: 2050110696} - - component: {fileID: 2050110695} - - component: {fileID: 2050110694} - - component: {fileID: 2050110698} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &2050110694 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2050110693} - 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 &2050110695 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2050110693} - 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 ---- !u!223 &2050110696 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2050110693} - 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 &2050110697 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2050110693} - 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: 777606421} - - {fileID: 490177806} - - {fileID: 1258848447} - m_Father: {fileID: 0} - m_RootOrder: 2 - 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 &2050110698 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2050110693} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c12d7cb6cdb799041927819f22a2c931, type: 3} - m_Name: - m_EditorClassIdentifier: - matchList: {fileID: 1386671668} - matchPrefab: {fileID: 3533216216399874123, guid: df3727c2222378b4ca786485a8b09981, - type: 3} - matchControllerPrefab: {fileID: 2923784255186993310, guid: e101d385946c91b4c81f318efc723a88, - type: 3} - createButton: {fileID: 1100846363} - joinButton: {fileID: 8446052} - lobbyView: {fileID: 490177805} - roomView: {fileID: 1258848446} - roomGUI: {fileID: 1258848448} - toggleGroup: {fileID: 1386671672} ---- !u!1 &2105646338 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2105646339} - - component: {fileID: 2105646342} - - component: {fileID: 2105646341} - - component: {fileID: 2105646340} - m_Layer: 5 - m_Name: LeaveButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2105646339 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2105646338} - 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: 647085298} - m_Father: {fileID: 1258848447} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -120, y: -160} - m_SizeDelta: {x: 100, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2105646340 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2105646338} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 2105646341} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2050110698} - m_MethodName: RequestLeaveMatch - 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 &2105646341 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2105646338} - 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_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 &2105646342 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2105646338} - m_CullTransparentMesh: 0 ---- !u!1 &2133592451 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2133592452} - - component: {fileID: 2133592454} - - component: {fileID: 2133592453} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2133592452 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2133592451} - 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: 1986814489} - 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 &2133592453 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2133592451} - 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_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Ready ---- !u!222 &2133592454 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2133592451} - m_CullTransparentMesh: 0 diff --git a/Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity.meta b/Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity.meta deleted file mode 100644 index 234a17370..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scenes/Main.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: aa1f875396fa7d348a782cebc2f75d7c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Scripts.meta b/Assets/Mirror/Examples/MultipleMatches/Scripts.meta deleted file mode 100644 index bc1a9c00a..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d418be768b6d32e4d9c3b8828929c3eb -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs b/Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs deleted file mode 100644 index b3ed8f60d..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs +++ /dev/null @@ -1,678 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.MultipleMatch -{ - public class CanvasController : MonoBehaviour - { - /// - /// Match Controllers listen for this to terminate their match and clean up - /// - public event Action OnPlayerDisconnected; - - /// - /// Cross-reference of client that created the corresponding match in openMatches below - /// - internal static readonly Dictionary playerMatches = new Dictionary(); - - /// - /// Open matches that are available for joining - /// - internal static readonly Dictionary openMatches = new Dictionary(); - - /// - /// Network Connections of all players in a match - /// - internal static readonly Dictionary> matchConnections = new Dictionary>(); - - /// - /// Player informations by Network Connection - /// - internal static readonly Dictionary playerInfos = new Dictionary(); - - /// - /// Network Connections that have neither started nor joined a match yet - /// - internal static readonly List waitingConnections = new List(); - - /// - /// GUID of a match the local player has created - /// - internal Guid localPlayerMatch = Guid.Empty; - - /// - /// GUID of a match the local player has joined - /// - internal Guid localJoinedMatch = Guid.Empty; - - /// - /// GUID of a match the local player has selected in the Toggle Group match list - /// - internal Guid selectedMatch = Guid.Empty; - - // Used in UI for "Player #" - int playerIndex = 1; - - [Header("GUI References")] - public GameObject matchList; - public GameObject matchPrefab; - public GameObject matchControllerPrefab; - public Button createButton; - public Button joinButton; - public GameObject lobbyView; - public GameObject roomView; - public RoomGUI roomGUI; - public ToggleGroup toggleGroup; - - // RuntimeInitializeOnLoadMethod -> fast playmode without domain reload - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] - static void ResetStatics() - { - playerMatches.Clear(); - openMatches.Clear(); - matchConnections.Clear(); - playerInfos.Clear(); - waitingConnections.Clear(); - } - - #region UI Functions - - // Called from several places to ensure a clean reset - // - MatchNetworkManager.Awake - // - OnStartServer - // - OnStartClient - // - OnClientDisconnect - // - ResetCanvas - internal void InitializeData() - { - playerMatches.Clear(); - openMatches.Clear(); - matchConnections.Clear(); - waitingConnections.Clear(); - localPlayerMatch = Guid.Empty; - localJoinedMatch = Guid.Empty; - } - - // Called from OnStopServer and OnStopClient when shutting down - void ResetCanvas() - { - InitializeData(); - lobbyView.SetActive(false); - roomView.SetActive(false); - gameObject.SetActive(false); - } - - #endregion - - #region Button Calls - - /// - /// Called from - /// - /// - public void SelectMatch(Guid matchId) - { - if (!NetworkClient.active) return; - - if (matchId == Guid.Empty) - { - selectedMatch = Guid.Empty; - joinButton.interactable = false; - } - else - { - if (!openMatches.Keys.Contains(matchId)) - { - joinButton.interactable = false; - return; - } - - selectedMatch = matchId; - MatchInfo infos = openMatches[matchId]; - joinButton.interactable = infos.players < infos.maxPlayers; - } - } - - /// - /// Assigned in inspector to Create button - /// - public void RequestCreateMatch() - { - if (!NetworkClient.active) return; - - NetworkClient.connection.Send(new ServerMatchMessage { serverMatchOperation = ServerMatchOperation.Create }); - } - - /// - /// Assigned in inspector to Join button - /// - public void RequestJoinMatch() - { - if (!NetworkClient.active || selectedMatch == Guid.Empty) return; - - NetworkClient.connection.Send(new ServerMatchMessage { serverMatchOperation = ServerMatchOperation.Join, matchId = selectedMatch }); - } - - /// - /// Assigned in inspector to Leave button - /// - public void RequestLeaveMatch() - { - if (!NetworkClient.active || localJoinedMatch == Guid.Empty) return; - - NetworkClient.connection.Send(new ServerMatchMessage { serverMatchOperation = ServerMatchOperation.Leave, matchId = localJoinedMatch }); - } - - /// - /// Assigned in inspector to Cancel button - /// - public void RequestCancelMatch() - { - if (!NetworkClient.active || localPlayerMatch == Guid.Empty) return; - - NetworkClient.connection.Send(new ServerMatchMessage { serverMatchOperation = ServerMatchOperation.Cancel }); - } - - /// - /// Assigned in inspector to Ready button - /// - public void RequestReadyChange() - { - if (!NetworkClient.active || (localPlayerMatch == Guid.Empty && localJoinedMatch == Guid.Empty)) return; - - Guid matchId = localPlayerMatch == Guid.Empty ? localJoinedMatch : localPlayerMatch; - - NetworkClient.connection.Send(new ServerMatchMessage { serverMatchOperation = ServerMatchOperation.Ready, matchId = matchId }); - } - - /// - /// Assigned in inspector to Start button - /// - public void RequestStartMatch() - { - if (!NetworkClient.active || localPlayerMatch == Guid.Empty) return; - - NetworkClient.connection.Send(new ServerMatchMessage { serverMatchOperation = ServerMatchOperation.Start }); - } - - /// - /// Called from - /// - public void OnMatchEnded() - { - if (!NetworkClient.active) return; - - localPlayerMatch = Guid.Empty; - localJoinedMatch = Guid.Empty; - ShowLobbyView(); - } - - /// - /// Sends updated match list to all waiting connections or just one if specified - /// - /// - internal void SendMatchList(NetworkConnection conn = null) - { - if (!NetworkServer.active) return; - - if (conn != null) - { - conn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.List, matchInfos = openMatches.Values.ToArray() }); - } - else - { - foreach (var waiter in waitingConnections) - { - waiter.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.List, matchInfos = openMatches.Values.ToArray() }); - } - } - } - - #endregion - - #region Server & Client Callbacks - - // Methods in this section are called from MatchNetworkManager's corresponding methods - - internal void OnStartServer() - { - if (!NetworkServer.active) return; - - InitializeData(); - NetworkServer.RegisterHandler(OnServerMatchMessage); - } - - internal void OnServerReady(NetworkConnection conn) - { - if (!NetworkServer.active) return; - - waitingConnections.Add(conn); - playerInfos.Add(conn, new PlayerInfo { playerIndex = this.playerIndex, ready = false }); - playerIndex++; - - SendMatchList(); - } - - internal void OnServerDisconnect(NetworkConnection conn) - { - if (!NetworkServer.active) return; - - // Invoke OnPlayerDisconnected on all instances of MatchController - OnPlayerDisconnected?.Invoke(conn); - - Guid matchId; - if (playerMatches.TryGetValue(conn, out matchId)) - { - playerMatches.Remove(conn); - openMatches.Remove(matchId); - - foreach (NetworkConnection playerConn in matchConnections[matchId]) - { - PlayerInfo _playerInfo = playerInfos[playerConn]; - _playerInfo.ready = false; - _playerInfo.matchId = Guid.Empty; - playerInfos[playerConn] = _playerInfo; - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Departed }); - } - } - - foreach (KeyValuePair> kvp in matchConnections) - { - kvp.Value.Remove(conn); - } - - PlayerInfo playerInfo = playerInfos[conn]; - if (playerInfo.matchId != Guid.Empty) - { - MatchInfo matchInfo; - if (openMatches.TryGetValue(playerInfo.matchId, out matchInfo)) - { - matchInfo.players--; - openMatches[playerInfo.matchId] = matchInfo; - } - - HashSet connections; - if (matchConnections.TryGetValue(playerInfo.matchId, out connections)) - { - PlayerInfo[] infos = connections.Select(playerConn => playerInfos[playerConn]).ToArray(); - - foreach (NetworkConnection playerConn in matchConnections[playerInfo.matchId]) - { - if (playerConn != conn) - { - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.UpdateRoom, playerInfos = infos }); - } - } - } - } - - SendMatchList(); - } - - internal void OnStopServer() - { - ResetCanvas(); - } - - internal void OnClientConnect() - { - playerInfos.Add(NetworkClient.connection, new PlayerInfo { playerIndex = this.playerIndex, ready = false }); - } - - internal void OnStartClient() - { - if (!NetworkClient.active) return; - - InitializeData(); - ShowLobbyView(); - createButton.gameObject.SetActive(true); - joinButton.gameObject.SetActive(true); - NetworkClient.RegisterHandler(OnClientMatchMessage); - } - - internal void OnClientDisconnect() - { - if (!NetworkClient.active) return; - - InitializeData(); - } - - internal void OnStopClient() - { - ResetCanvas(); - } - - #endregion - - #region Server Match Message Handlers - - void OnServerMatchMessage(NetworkConnection conn, ServerMatchMessage msg) - { - if (!NetworkServer.active) return; - - switch (msg.serverMatchOperation) - { - case ServerMatchOperation.None: - { - Debug.LogWarning("Missing ServerMatchOperation"); - break; - } - case ServerMatchOperation.Create: - { - OnServerCreateMatch(conn); - break; - } - case ServerMatchOperation.Cancel: - { - OnServerCancelMatch(conn); - break; - } - case ServerMatchOperation.Start: - { - OnServerStartMatch(conn); - break; - } - case ServerMatchOperation.Join: - { - OnServerJoinMatch(conn, msg.matchId); - break; - } - case ServerMatchOperation.Leave: - { - OnServerLeaveMatch(conn, msg.matchId); - break; - } - case ServerMatchOperation.Ready: - { - OnServerPlayerReady(conn, msg.matchId); - break; - } - } - } - - void OnServerPlayerReady(NetworkConnection conn, Guid matchId) - { - if (!NetworkServer.active) return; - - PlayerInfo playerInfo = playerInfos[conn]; - playerInfo.ready = !playerInfo.ready; - playerInfos[conn] = playerInfo; - - HashSet connections = matchConnections[matchId]; - PlayerInfo[] infos = connections.Select(playerConn => playerInfos[playerConn]).ToArray(); - - foreach (NetworkConnection playerConn in matchConnections[matchId]) - { - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.UpdateRoom, playerInfos = infos }); - } - } - - void OnServerLeaveMatch(NetworkConnection conn, Guid matchId) - { - if (!NetworkServer.active) return; - - MatchInfo matchInfo = openMatches[matchId]; - matchInfo.players--; - openMatches[matchId] = matchInfo; - - PlayerInfo playerInfo = playerInfos[conn]; - playerInfo.ready = false; - playerInfo.matchId = Guid.Empty; - playerInfos[conn] = playerInfo; - - foreach (KeyValuePair> kvp in matchConnections) - { - kvp.Value.Remove(conn); - } - - HashSet connections = matchConnections[matchId]; - PlayerInfo[] infos = connections.Select(playerConn => playerInfos[playerConn]).ToArray(); - - foreach (NetworkConnection playerConn in matchConnections[matchId]) - { - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.UpdateRoom, playerInfos = infos }); - } - - SendMatchList(); - - conn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Departed }); - } - - void OnServerCreateMatch(NetworkConnection conn) - { - if (!NetworkServer.active || playerMatches.ContainsKey(conn)) return; - - Guid newMatchId = Guid.NewGuid(); - matchConnections.Add(newMatchId, new HashSet()); - matchConnections[newMatchId].Add(conn); - playerMatches.Add(conn, newMatchId); - openMatches.Add(newMatchId, new MatchInfo { matchId = newMatchId, maxPlayers = 2, players = 1 }); - - PlayerInfo playerInfo = playerInfos[conn]; - playerInfo.ready = false; - playerInfo.matchId = newMatchId; - playerInfos[conn] = playerInfo; - - PlayerInfo[] infos = matchConnections[newMatchId].Select(playerConn => playerInfos[playerConn]).ToArray(); - - conn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Created, matchId = newMatchId, playerInfos = infos }); - - SendMatchList(); - } - - void OnServerCancelMatch(NetworkConnection conn) - { - if (!NetworkServer.active || !playerMatches.ContainsKey(conn)) return; - - conn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Cancelled }); - - Guid matchId; - if (playerMatches.TryGetValue(conn, out matchId)) - { - playerMatches.Remove(conn); - openMatches.Remove(matchId); - - foreach (NetworkConnection playerConn in matchConnections[matchId]) - { - PlayerInfo playerInfo = playerInfos[playerConn]; - playerInfo.ready = false; - playerInfo.matchId = Guid.Empty; - playerInfos[playerConn] = playerInfo; - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Departed }); - } - - SendMatchList(); - } - } - - void OnServerStartMatch(NetworkConnection conn) - { - if (!NetworkServer.active || !playerMatches.ContainsKey(conn)) return; - - Guid matchId; - if (playerMatches.TryGetValue(conn, out matchId)) - { - GameObject matchControllerObject = Instantiate(matchControllerPrefab); - matchControllerObject.GetComponent().matchId = matchId; - NetworkServer.Spawn(matchControllerObject); - - MatchController matchController = matchControllerObject.GetComponent(); - - foreach (NetworkConnection playerConn in matchConnections[matchId]) - { - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Started }); - - GameObject player = Instantiate(NetworkManager.singleton.playerPrefab); - player.GetComponent().matchId = matchId; - NetworkServer.AddPlayerForConnection(playerConn, player); - - if (matchController.player1 == null) - { - matchController.player1 = playerConn.identity; - } - else - { - matchController.player2 = playerConn.identity; - } - - /* Reset ready state for after the match. */ - PlayerInfo playerInfo = playerInfos[playerConn]; - playerInfo.ready = false; - playerInfos[playerConn] = playerInfo; - } - - matchController.startingPlayer = matchController.player1; - matchController.currentPlayer = matchController.player1; - - playerMatches.Remove(conn); - openMatches.Remove(matchId); - matchConnections.Remove(matchId); - SendMatchList(); - - OnPlayerDisconnected += matchController.OnPlayerDisconnected; - } - } - - void OnServerJoinMatch(NetworkConnection conn, Guid matchId) - { - if (!NetworkServer.active || !matchConnections.ContainsKey(matchId) || !openMatches.ContainsKey(matchId)) return; - - MatchInfo matchInfo = openMatches[matchId]; - matchInfo.players++; - openMatches[matchId] = matchInfo; - matchConnections[matchId].Add(conn); - - PlayerInfo playerInfo = playerInfos[conn]; - playerInfo.ready = false; - playerInfo.matchId = matchId; - playerInfos[conn] = playerInfo; - - PlayerInfo[] infos = matchConnections[matchId].Select(playerConn => playerInfos[playerConn]).ToArray(); - SendMatchList(); - - conn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.Joined, matchId = matchId, playerInfos = infos }); - - foreach (NetworkConnection playerConn in matchConnections[matchId]) - { - playerConn.Send(new ClientMatchMessage { clientMatchOperation = ClientMatchOperation.UpdateRoom, playerInfos = infos }); - } - } - - #endregion - - #region Client Match Message Handler - - void OnClientMatchMessage(ClientMatchMessage msg) - { - if (!NetworkClient.active) return; - - switch (msg.clientMatchOperation) - { - case ClientMatchOperation.None: - { - Debug.LogWarning("Missing ClientMatchOperation"); - break; - } - case ClientMatchOperation.List: - { - openMatches.Clear(); - foreach (MatchInfo matchInfo in msg.matchInfos) - { - openMatches.Add(matchInfo.matchId, matchInfo); - } - RefreshMatchList(); - break; - } - case ClientMatchOperation.Created: - { - localPlayerMatch = msg.matchId; - ShowRoomView(); - roomGUI.RefreshRoomPlayers(msg.playerInfos); - roomGUI.SetOwner(true); - break; - } - case ClientMatchOperation.Cancelled: - { - localPlayerMatch = Guid.Empty; - ShowLobbyView(); - break; - } - case ClientMatchOperation.Joined: - { - localJoinedMatch = msg.matchId; - ShowRoomView(); - roomGUI.RefreshRoomPlayers(msg.playerInfos); - roomGUI.SetOwner(false); - break; - } - case ClientMatchOperation.Departed: - { - localJoinedMatch = Guid.Empty; - ShowLobbyView(); - break; - } - case ClientMatchOperation.UpdateRoom: - { - roomGUI.RefreshRoomPlayers(msg.playerInfos); - break; - } - case ClientMatchOperation.Started: - { - lobbyView.SetActive(false); - roomView.SetActive(false); - break; - } - } - } - - void ShowLobbyView() - { - lobbyView.SetActive(true); - roomView.SetActive(false); - - foreach (Transform child in matchList.transform) - { - if (child.gameObject.GetComponent().GetMatchId() == selectedMatch) - { - Toggle toggle = child.gameObject.GetComponent(); - toggle.isOn = true; - //toggle.onValueChanged.Invoke(true); - } - } - } - - void ShowRoomView() - { - lobbyView.SetActive(false); - roomView.SetActive(true); - } - - void RefreshMatchList() - { - foreach (Transform child in matchList.transform) - { - Destroy(child.gameObject); - } - - joinButton.interactable = false; - - foreach (MatchInfo matchInfo in openMatches.Values) - { - GameObject newMatch = Instantiate(matchPrefab, Vector3.zero, Quaternion.identity); - newMatch.transform.SetParent(matchList.transform, false); - newMatch.GetComponent().SetMatchInfo(matchInfo); - newMatch.GetComponent().group = toggleGroup; - if (matchInfo.matchId == selectedMatch) - { - newMatch.GetComponent().isOn = true; - } - } - } - - #endregion - - } -} diff --git a/Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs.meta b/Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs.meta deleted file mode 100644 index 9379f5c08..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scripts/CanvasController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c12d7cb6cdb799041927819f22a2c931 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs b/Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs deleted file mode 100644 index 1df2ec3b9..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs +++ /dev/null @@ -1,46 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.MultipleMatch -{ - public class CellGUI : MonoBehaviour - { - public MatchController matchController; - public CellValue cellValue; - - [Header("GUI References")] - public Image image; - public Button button; - - [Header("Diagnostics - Do Not Modify")] - public NetworkIdentity playerIdentity; - - - public void Awake() - { - matchController.MatchCells.Add(cellValue, this); - } - - public void MakePlay() - { - if (matchController.currentPlayer.isLocalPlayer) - matchController.CmdMakePlay(cellValue); - } - - public void SetPlayer(NetworkIdentity playerIdentity) - { - if (playerIdentity != null) - { - this.playerIdentity = playerIdentity; - image.color = this.playerIdentity.isLocalPlayer ? Color.blue : Color.red; - button.interactable = false; - } - else - { - this.playerIdentity = null; - image.color = Color.white; - button.interactable = true; - } - } - } -} \ No newline at end of file diff --git a/Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs.meta b/Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs.meta deleted file mode 100644 index 2ab1003b5..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scripts/CellGUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9cda2a394a443474689a3c6d6044f7b0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Mirror/Examples/MultipleMatches/Scripts/MatchController.cs b/Assets/Mirror/Examples/MultipleMatches/Scripts/MatchController.cs deleted file mode 100644 index 339e3858f..000000000 --- a/Assets/Mirror/Examples/MultipleMatches/Scripts/MatchController.cs +++ /dev/null @@ -1,313 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UI; - -namespace Mirror.Examples.MultipleMatch -{ - [RequireComponent(typeof(NetworkMatch))] - public class MatchController : NetworkBehaviour - { - internal readonly SyncDictionary matchPlayerData = new SyncDictionary(); - internal readonly Dictionary MatchCells = new Dictionary(); - - CellValue boardScore = CellValue.None; - bool playAgain = false; - - [Header("GUI References")] - public CanvasGroup canvasGroup; - public Text gameText; - public Button exitButton; - public Button playAgainButton; - public Text winCountLocal; - public Text winCountOpponent; - - [Header("Diagnostics - Do Not Modify")] - public CanvasController canvasController; - public NetworkIdentity player1; - public NetworkIdentity player2; - public NetworkIdentity startingPlayer; - - [SyncVar(hook = nameof(UpdateGameUI))] - public NetworkIdentity currentPlayer; - - void Awake() - { - canvasController = FindObjectOfType(); - } - - public override void OnStartServer() - { - StartCoroutine(AddPlayersToMatchController()); - } - - // For the SyncDictionary to properly fire the update callback, we must - // wait a frame before adding the players to the already spawned MatchController - IEnumerator AddPlayersToMatchController() - { - yield return null; - - matchPlayerData.Add(player1, new MatchPlayerData { playerIndex = CanvasController.playerInfos[player1.connectionToClient].playerIndex }); - matchPlayerData.Add(player2, new MatchPlayerData { playerIndex = CanvasController.playerInfos[player2.connectionToClient].playerIndex }); - } - - - public override void OnStartClient() - { - matchPlayerData.Callback += UpdateWins; - - canvasGroup.alpha = 1f; - canvasGroup.interactable = true; - canvasGroup.blocksRaycasts = true; - - exitButton.gameObject.SetActive(false); - playAgainButton.gameObject.SetActive(false); - } - - public void UpdateGameUI(NetworkIdentity _, NetworkIdentity newPlayerTurn) - { - if (!newPlayerTurn) return; - - if (newPlayerTurn.gameObject.GetComponent().isLocalPlayer) - { - gameText.text = "Your Turn"; - gameText.color = Color.blue; - } - else - { - gameText.text = "Their Turn"; - gameText.color = Color.red; - } - } - - public void UpdateWins(SyncDictionary.Operation op, NetworkIdentity key, MatchPlayerData matchPlayerData) - { - if (key.gameObject.GetComponent().isLocalPlayer) - { - winCountLocal.text = $"Player {matchPlayerData.playerIndex}\n{matchPlayerData.wins}"; - } - else - { - winCountOpponent.text = $"Player {matchPlayerData.playerIndex}\n{matchPlayerData.wins}"; - } - } - - [Command(requiresAuthority = false)] - public void CmdMakePlay(CellValue cellValue, NetworkConnectionToClient sender = null) - { - // If wrong player or cell already taken, ignore - if (sender.identity != currentPlayer || MatchCells[cellValue].playerIdentity != null) - return; - - MatchCells[cellValue].playerIdentity = currentPlayer; - RpcUpdateCell(cellValue, currentPlayer); - - MatchPlayerData mpd = matchPlayerData[currentPlayer]; - mpd.currentScore = mpd.currentScore | cellValue; - matchPlayerData[currentPlayer] = mpd; - - boardScore = boardScore | cellValue; - - if (CheckWinner(mpd.currentScore)) - { - mpd.wins += 1; - matchPlayerData[currentPlayer] = mpd; - RpcShowWinner(currentPlayer); - currentPlayer = null; - } - else if (boardScore == CellValue.Full) - { - RpcShowWinner(null); - currentPlayer = null; - } - else - { - // Set currentPlayer SyncVar so clients know whose turn it is - currentPlayer = currentPlayer == player1 ? player2 : player1; - } - - } - - bool CheckWinner(CellValue currentScore) - { - if ((currentScore & CellValue.TopRow) == CellValue.TopRow) - return true; - if ((currentScore & CellValue.MidRow) == CellValue.MidRow) - return true; - if ((currentScore & CellValue.BotRow) == CellValue.BotRow) - return true; - if ((currentScore & CellValue.LeftCol) == CellValue.LeftCol) - return true; - if ((currentScore & CellValue.MidCol) == CellValue.MidCol) - return true; - if ((currentScore & CellValue.RightCol) == CellValue.RightCol) - return true; - if ((currentScore & CellValue.Diag1) == CellValue.Diag1) - return true; - if ((currentScore & CellValue.Diag2) == CellValue.Diag2) - return true; - - return false; - } - - [ClientRpc] - public void RpcUpdateCell(CellValue cellValue, NetworkIdentity player) - { - MatchCells[cellValue].SetPlayer(player); - } - - [ClientRpc] - public void RpcShowWinner(NetworkIdentity winner) - { - - foreach (CellGUI cellGUI in MatchCells.Values) - cellGUI.GetComponent