5
5
6
6
namespace Unity . Netcode . RuntimeTests
7
7
{
8
+ public class CustomType : INetworkSerializable
9
+ {
10
+ public int SomeValue ;
11
+ private const int k_ByteFactor = 256 ;
12
+ public void NetworkSerialize < T > ( BufferSerializer < T > serializer ) where T : IReaderWriter
13
+ {
14
+ if ( serializer . IsReader )
15
+ {
16
+ var reader = serializer . GetFastBufferReader ( ) ;
17
+ reader . TryBeginRead ( 2 ) ;
18
+ byte value ;
19
+ reader . ReadByte ( out value ) ;
20
+ SomeValue = value * k_ByteFactor ;
21
+ reader . ReadByte ( out value ) ;
22
+ SomeValue += value ;
23
+ }
24
+ else
25
+ {
26
+ var writer = serializer . GetFastBufferWriter ( ) ;
27
+ writer . TryBeginWrite ( 2 ) ;
28
+ writer . WriteByte ( ( byte ) ( SomeValue / k_ByteFactor ) ) ;
29
+ writer . WriteByte ( ( byte ) ( SomeValue % k_ByteFactor ) ) ;
30
+ }
31
+ }
32
+ } ;
33
+
34
+ public class DifferentCustomType : INetworkSerializable
35
+ {
36
+ public int SomeValue ;
37
+ public bool SomeBoolean ;
38
+ private const int k_ByteFactor = 256 ;
39
+
40
+ public void NetworkSerialize < T > ( BufferSerializer < T > serializer ) where T : IReaderWriter
41
+ {
42
+ if ( serializer . IsReader )
43
+ {
44
+ var reader = serializer . GetFastBufferReader ( ) ;
45
+ reader . TryBeginRead ( 3 ) ;
46
+ byte value ;
47
+ reader . ReadByte ( out value ) ;
48
+ SomeValue = value * k_ByteFactor ;
49
+ reader . ReadByte ( out value ) ;
50
+ SomeValue += value ;
51
+
52
+ reader . ReadByte ( out value ) ;
53
+ SomeBoolean = value > 0 ;
54
+ }
55
+ else
56
+ {
57
+ var writer = serializer . GetFastBufferWriter ( ) ;
58
+ writer . TryBeginWrite ( 3 ) ;
59
+ writer . WriteByte ( ( byte ) ( SomeValue / k_ByteFactor ) ) ;
60
+ writer . WriteByte ( ( byte ) ( SomeValue % k_ByteFactor ) ) ;
61
+ writer . WriteByte ( ( byte ) ( SomeBoolean ? 1 : 0 ) ) ;
62
+ }
63
+ }
64
+ } ;
65
+
8
66
public class RpcOwnershipTest : NetworkBehaviour
9
67
{
10
68
@@ -14,6 +72,7 @@ public class RpcOwnershipObject : NetworkBehaviour
14
72
{
15
73
public int RequireOwnershipCount = 0 ;
16
74
public int DoesntRequireOwnershipCount = 0 ;
75
+ public int ArrayRpcCount = 0 ;
17
76
18
77
[ ServerRpc ( RequireOwnership = true ) ]
19
78
public void RequireOwnershipServerRpc ( )
@@ -26,9 +85,37 @@ public void DoesntRequireOwnershipServerRpc()
26
85
{
27
86
DoesntRequireOwnershipCount ++ ;
28
87
}
88
+
89
+ [ ServerRpc ]
90
+ public void TwoCustomTypesAndVect3ServerRpc ( CustomType someObject , DifferentCustomType someOtherObject , Vector3 vect )
91
+ {
92
+ Debug . Assert ( someObject . SomeValue == 50 ) ;
93
+ Debug . Assert ( someOtherObject . SomeValue == 300 ) ;
94
+ Debug . Assert ( someOtherObject . SomeBoolean = true ) ;
95
+ Debug . Assert ( vect . x == 20 ) ;
96
+ Debug . Assert ( vect . y == 30 ) ;
97
+ Debug . Assert ( vect . z == 40 ) ;
98
+ }
99
+
100
+ [ ServerRpc ]
101
+ public void ArrayOfCustomTypesServerRpc ( CustomType [ ] arrayOfObjects , CustomType [ ] emptyArray )
102
+ {
103
+ Debug . Assert ( arrayOfObjects . Length > 0 ) ;
104
+ for ( int i = 0 ; i < arrayOfObjects . Length ; i ++ )
105
+ {
106
+ if ( i > 0 )
107
+ {
108
+ Debug . Assert ( arrayOfObjects [ i ] . SomeValue > arrayOfObjects [ i - 1 ] . SomeValue ) ;
109
+ }
110
+ }
111
+
112
+ Debug . Assert ( emptyArray . Length == 0 ) ;
113
+
114
+ ArrayRpcCount ++ ;
115
+ }
29
116
}
30
117
31
- public class RpcOwnershipTests : BaseMultiInstanceTest
118
+ public class RpcOwnershipCustomTests : BaseMultiInstanceTest
32
119
{
33
120
protected override int NbClients => 2 ;
34
121
@@ -70,6 +157,45 @@ public IEnumerator RpcOwnershipTest()
70
157
yield return RunTests ( true ) ;
71
158
}
72
159
160
+ [ UnityTest ]
161
+ public IEnumerator RpcArrayCustomTypesTest ( )
162
+ {
163
+ var spawnedObject = UnityEngine . Object . Instantiate ( m_PrefabToSpawn ) ;
164
+ var netSpawnedObject = spawnedObject . GetComponent < NetworkObject > ( ) ;
165
+ netSpawnedObject . NetworkManagerOwner = m_ServerNetworkManager ;
166
+
167
+ netSpawnedObject . Spawn ( ) ;
168
+
169
+ var arrayOfObjects = new CustomType [ 2 ] { new CustomType ( ) , new CustomType ( ) } ;
170
+ var emptyArray = new CustomType [ 0 ] ;
171
+
172
+ arrayOfObjects [ 0 ] . SomeValue = 1 ;
173
+ arrayOfObjects [ 1 ] . SomeValue = 2 ;
174
+
175
+ netSpawnedObject . GetComponent < RpcOwnershipObject > ( ) . ArrayOfCustomTypesServerRpc ( arrayOfObjects , emptyArray ) ;
176
+
177
+ Debug . Assert ( netSpawnedObject . GetComponent < RpcOwnershipObject > ( ) . ArrayRpcCount == 1 ) ;
178
+ yield return null ;
179
+ }
180
+
181
+ [ UnityTest ]
182
+ public IEnumerator CustomTypesTest ( )
183
+ {
184
+ var spawnedObject = UnityEngine . Object . Instantiate ( m_PrefabToSpawn ) ;
185
+ var netSpawnedObject = spawnedObject . GetComponent < NetworkObject > ( ) ;
186
+ netSpawnedObject . NetworkManagerOwner = m_ServerNetworkManager ;
187
+
188
+ netSpawnedObject . Spawn ( ) ;
189
+
190
+ var someObject = new CustomType ( ) { SomeValue = 50 } ;
191
+ var someOtherObject = new DifferentCustomType ( ) { SomeValue = 300 , SomeBoolean = true } ;
192
+ var vect = new Vector3 ( ) { x = 20 , y = 30 , z = 40 } ;
193
+
194
+ spawnedObject . GetComponent < RpcOwnershipObject > ( ) . TwoCustomTypesAndVect3ServerRpc ( someObject , someOtherObject , vect ) ;
195
+
196
+ yield return null ;
197
+ }
198
+
73
199
private IEnumerator RunTests ( bool serverOwned )
74
200
{
75
201
m_ExpectedRequireOwnershipCount = 0 ;
@@ -126,7 +252,8 @@ private IEnumerator RunTests(bool serverOwned)
126
252
netSpawnedObjectOnClient . GetComponent < RpcOwnershipObject > ( ) . RequireOwnershipServerRpc ( ) ;
127
253
netSpawnedObjectOnClient . GetComponent < RpcOwnershipObject > ( ) . DoesntRequireOwnershipServerRpc ( ) ;
128
254
129
- yield return new WaitForSeconds ( 1.0f ) ;
255
+ var nextFrameNumber = Time . frameCount + 3 ;
256
+ yield return new WaitUntil ( ( ) => Time . frameCount >= nextFrameNumber ) ;
130
257
131
258
// verify counts
132
259
Debug . Assert ( spawnedObject . GetComponent < RpcOwnershipObject > ( ) . RequireOwnershipCount == m_ExpectedRequireOwnershipCount ) ;
0 commit comments