Skip to content

Commit 13b0edc

Browse files
authored
Merge pull request #2 from TwoTenPvP/prototype-components
Prototype components
2 parents b22642f + 8c737fe commit 13b0edc

File tree

4 files changed

+169
-2
lines changed

4 files changed

+169
-2
lines changed

MLAPI/Data/NetworkingConfiguration.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4-
using System.Net;
54
using System.Security.Cryptography;
65
using UnityEngine.Networking;
76

MLAPI/MLAPI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<Compile Include="MonoBehaviours\Core\NetworkedObject.cs" />
5252
<Compile Include="Data\NetworkingConfiguration.cs" />
5353
<Compile Include="MonoBehaviours\Core\NetworkingManager.cs" />
54+
<Compile Include="MonoBehaviours\Prototyping\NetworkedTransform.cs" />
5455
<Compile Include="NetworkingManagerComponents\MessageManager.cs" />
5556
<Compile Include="NetworkingManagerComponents\SpawnManager.cs" />
5657
<Compile Include="Properties\AssemblyInfo.cs" />

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,14 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
8484

8585
//MLAPI channels and messageTypes
8686
NetworkConfig.Channels.Add("MLAPI_RELIABLE_FRAGMENTED", QosType.ReliableFragmented);
87+
NetworkConfig.Channels.Add("MLAPI_POSITION_UPDATE", QosType.StateUpdate);
8788
MessageManager.messageTypes.Add("MLAPI_CONNECTION_REQUEST", 0);
8889
MessageManager.messageTypes.Add("MLAPI_CONNECTION_APPROVED", 1);
8990
MessageManager.messageTypes.Add("MLAPI_ADD_OBJECT", 2);
9091
MessageManager.messageTypes.Add("MLAPI_CLIENT_DISCONNECT", 3);
9192
MessageManager.messageTypes.Add("MLAPI_DESTROY_OBJECT", 4);
92-
93+
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromClient");
94+
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromServer");
9395

9496
HashSet<string> channelNames = new HashSet<string>();
9597
foreach (KeyValuePair<string, QosType> pair in NetworkConfig.Channels)
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
using MLAPI;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Text;
7+
using UnityEngine;
8+
9+
namespace MLAP
10+
{
11+
public class NetworkedTransform : NetworkedBehaviour
12+
{
13+
[Range(0, 120)]
14+
public int SendsPerSecond = 20;
15+
[Tooltip("This assumes that the SendsPerSecond is synced across clients")]
16+
public bool AssumeSyncedSends = true;
17+
[Tooltip("This requires AssumeSyncedSends to be true")]
18+
public bool InterpolatePosition = true;
19+
[Tooltip("The transform will snap if the distance is greater than this distance")]
20+
public float SnapDistance = 10f;
21+
public bool InterpolateServer = true;
22+
public float MinMeters = 0.15f;
23+
public float MinDegrees = 1.5f;
24+
private float timeForLerp;
25+
private float lerpT;
26+
private Vector3 lerpStartPos;
27+
private Quaternion lerpStartRot;
28+
private Vector3 lerpEndPos;
29+
private Quaternion lerpEndRot;
30+
31+
private float lastSendTime;
32+
private Vector3 lastSentPos;
33+
private Quaternion lastSentRot;
34+
35+
private void OnValidate()
36+
{
37+
if (!AssumeSyncedSends && InterpolatePosition)
38+
InterpolatePosition = false;
39+
if (InterpolateServer && !InterpolatePosition)
40+
InterpolateServer = false;
41+
if (MinDegrees < 0)
42+
MinDegrees = 0;
43+
if (MinMeters < 0)
44+
MinMeters = 0;
45+
}
46+
47+
48+
void Start()
49+
{
50+
if (isServer)
51+
{
52+
RegisterMessageHandler("MLAPI_OnRecieveTransformFromClient", OnRecieveTransformFromClient);
53+
}
54+
if (isClient)
55+
{
56+
RegisterMessageHandler("MLAPI_OnRecieveTransformFromServer", OnRecieveTransformFromServer);
57+
}
58+
if(AssumeSyncedSends)
59+
{
60+
timeForLerp = 1f / SendsPerSecond;
61+
}
62+
}
63+
64+
void Update()
65+
{
66+
if(isLocalPlayer)
67+
{
68+
if(Time.time - lastSendTime >= timeForLerp && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
69+
{
70+
lastSendTime = Time.time;
71+
lastSentPos = transform.position;
72+
lastSentRot = transform.rotation;
73+
using (MemoryStream writeStream = new MemoryStream())
74+
{
75+
using (BinaryWriter writer = new BinaryWriter(writeStream))
76+
{
77+
writer.Write(transform.position.x);
78+
writer.Write(transform.position.y);
79+
writer.Write(transform.position.z);
80+
writer.Write(transform.rotation.x);
81+
writer.Write(transform.rotation.y);
82+
writer.Write(transform.rotation.z);
83+
}
84+
SendToServerTarget("MLAPI_OnRecieveTransformFromClient", "MLAPI_POSITION_UPDATE", writeStream.ToArray());
85+
}
86+
87+
}
88+
}
89+
else
90+
{
91+
if((isServer && InterpolateServer) || !isServer)
92+
{
93+
lerpT += Time.deltaTime / timeForLerp;
94+
transform.position = Vector3.Lerp(lerpStartPos, lerpEndPos, lerpT);
95+
transform.rotation = Quaternion.Slerp(lerpStartRot, lerpEndRot, lerpT);
96+
}
97+
}
98+
}
99+
100+
private void OnRecieveTransformFromServer(int clientId, byte[] data)
101+
{
102+
if (isServer)
103+
return;
104+
using (MemoryStream stream = new MemoryStream(data))
105+
{
106+
using (BinaryReader reader = new BinaryReader(stream))
107+
{
108+
float xPos = reader.ReadSingle();
109+
float yPos = reader.ReadSingle();
110+
float zPos = reader.ReadSingle();
111+
float xRot = reader.ReadSingle();
112+
float yRot = reader.ReadSingle();
113+
float zRot = reader.ReadSingle();
114+
lerpStartPos = transform.position;
115+
lerpStartRot = transform.rotation;
116+
lerpEndPos = new Vector3(xPos, yPos, zRot);
117+
lerpEndRot = Quaternion.Euler(xRot, yRot, zRot);
118+
lerpT = 0;
119+
}
120+
}
121+
}
122+
123+
private void OnRecieveTransformFromClient(int clientId, byte[] data)
124+
{
125+
using(MemoryStream readStream = new MemoryStream(data))
126+
{
127+
using(BinaryReader reader = new BinaryReader(readStream))
128+
{
129+
float xPos = reader.ReadSingle();
130+
float yPos = reader.ReadSingle();
131+
float zPos = reader.ReadSingle();
132+
float xRot = reader.ReadSingle();
133+
float yRot = reader.ReadSingle();
134+
float zRot = reader.ReadSingle();
135+
if (InterpolateServer)
136+
{
137+
lerpStartPos = transform.position;
138+
lerpStartRot = transform.rotation;
139+
lerpEndPos = new Vector3(xPos, yPos, zRot);
140+
lerpEndRot = Quaternion.Euler(xRot, yRot, zRot);
141+
lerpT = 0;
142+
}
143+
else
144+
{
145+
transform.position = new Vector3(xPos, yPos, zPos);
146+
transform.rotation = Quaternion.Euler(new Vector3(xRot, yRot, zRot));
147+
}
148+
using (MemoryStream writeStream = new MemoryStream())
149+
{
150+
using(BinaryWriter writer = new BinaryWriter(writeStream))
151+
{
152+
writer.Write(xPos);
153+
writer.Write(yPos);
154+
writer.Write(zPos);
155+
writer.Write(xRot);
156+
writer.Write(yRot);
157+
writer.Write(zRot);
158+
}
159+
SendToNonLocalClientsTarget("MLAPI_OnRecieveTransformFromServer", "MLAPI_POSITION_UPDATE", writeStream.ToArray());
160+
}
161+
}
162+
}
163+
}
164+
}
165+
}

0 commit comments

Comments
 (0)