Skip to content

Commit a6e5907

Browse files
committed
Began working on prototype components
1 parent 3dfc999 commit a6e5907

File tree

3 files changed

+146
-2
lines changed

3 files changed

+146
-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/MonoBehaviours/Core/NetworkingManager.cs

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

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

9395
HashSet<string> channelNames = new HashSet<string>();
9496
foreach (KeyValuePair<string, QosType> pair in NetworkConfig.Channels)
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
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+
private float lastSendTime;
31+
32+
private void OnValidate()
33+
{
34+
if (!AssumeSyncedSends && InterpolatePosition)
35+
InterpolatePosition = false;
36+
if (InterpolateServer && !InterpolatePosition)
37+
InterpolateServer = false;
38+
}
39+
40+
41+
void Awake()
42+
{
43+
if (isServer)
44+
{
45+
RegisterMessageHandler("MLAPI_OnRecieveTransformFromClient", OnRecieveTransformFromClient);
46+
}
47+
if (isClient)
48+
{
49+
RegisterMessageHandler("MLAPI_OnRecieveTransformFromServer", OnRecieveTransformFromServer);
50+
}
51+
if(AssumeSyncedSends)
52+
{
53+
timeForLerp = 1f / SendsPerSecond;
54+
}
55+
}
56+
57+
void Update()
58+
{
59+
if(isLocalPlayer)
60+
{
61+
if(Time.time - lastSendTime >= timeForLerp)
62+
{
63+
lastSendTime = Time.time;
64+
}
65+
}
66+
else
67+
{
68+
lerpT += Time.deltaTime / timeForLerp;
69+
transform.position = Vector3.Lerp(lerpStartPos, lerpEndPos, lerpT);
70+
transform.rotation = Quaternion.Slerp(lerpStartRot, lerpEndRot, lerpT);
71+
}
72+
}
73+
74+
private void OnRecieveTransformFromServer(int clientId, byte[] data)
75+
{
76+
if (isServer)
77+
return;
78+
using (MemoryStream stream = new MemoryStream(data))
79+
{
80+
using (BinaryReader reader = new BinaryReader(stream))
81+
{
82+
uint netId = reader.ReadUInt32();
83+
if (networkId != netId)
84+
return;
85+
float xPos = reader.ReadSingle();
86+
float yPos = reader.ReadSingle();
87+
float zPos = reader.ReadSingle();
88+
float xRot = reader.ReadSingle();
89+
float yRot = reader.ReadSingle();
90+
float zRot = reader.ReadSingle();
91+
lerpStartPos = transform.position;
92+
lerpStartRot = transform.rotation;
93+
lerpEndPos = new Vector3(xPos, yPos, zRot);
94+
lerpEndRot = Quaternion.Euler(xRot, yRot, zRot);
95+
lerpT = 0;
96+
}
97+
}
98+
}
99+
100+
private void OnRecieveTransformFromClient(int clientId, byte[] data)
101+
{
102+
using(MemoryStream readStream = new MemoryStream(data))
103+
{
104+
using(BinaryReader reader = new BinaryReader(readStream))
105+
{
106+
float xPos = reader.ReadSingle();
107+
float yPos = reader.ReadSingle();
108+
float zPos = reader.ReadSingle();
109+
float xRot = reader.ReadSingle();
110+
float yRot = reader.ReadSingle();
111+
float zRot = reader.ReadSingle();
112+
if (InterpolateServer)
113+
{
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+
else
121+
{
122+
transform.position = new Vector3(xPos, yPos, zPos);
123+
transform.rotation = Quaternion.Euler(new Vector3(xRot, yRot, zRot));
124+
}
125+
using (MemoryStream writeStream = new MemoryStream())
126+
{
127+
using(BinaryWriter writer = new BinaryWriter(writeStream))
128+
{
129+
writer.Write(networkId);
130+
writer.Write(xPos);
131+
writer.Write(yPos);
132+
writer.Write(zPos);
133+
writer.Write(xRot);
134+
writer.Write(yRot);
135+
writer.Write(zRot);
136+
}
137+
SendToNonLocalClients("MLAPI_OnRecieveTransformFromServer", "MLAPI_POSITION_UPDATE", writeStream.ToArray());
138+
}
139+
}
140+
}
141+
}
142+
}
143+
}

0 commit comments

Comments
 (0)