Skip to content

Prototype components #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jan 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion MLAPI/Data/NetworkingConfiguration.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using UnityEngine.Networking;

Expand Down
1 change: 1 addition & 0 deletions MLAPI/MLAPI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
<Compile Include="MonoBehaviours\Core\NetworkedObject.cs" />
<Compile Include="Data\NetworkingConfiguration.cs" />
<Compile Include="MonoBehaviours\Core\NetworkingManager.cs" />
<Compile Include="MonoBehaviours\Prototyping\NetworkedTransform.cs" />
<Compile Include="NetworkingManagerComponents\MessageManager.cs" />
<Compile Include="NetworkingManagerComponents\SpawnManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
4 changes: 3 additions & 1 deletion MLAPI/MonoBehaviours/Core/NetworkingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,14 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)

//MLAPI channels and messageTypes
NetworkConfig.Channels.Add("MLAPI_RELIABLE_FRAGMENTED", QosType.ReliableFragmented);
NetworkConfig.Channels.Add("MLAPI_POSITION_UPDATE", QosType.StateUpdate);
MessageManager.messageTypes.Add("MLAPI_CONNECTION_REQUEST", 0);
MessageManager.messageTypes.Add("MLAPI_CONNECTION_APPROVED", 1);
MessageManager.messageTypes.Add("MLAPI_ADD_OBJECT", 2);
MessageManager.messageTypes.Add("MLAPI_CLIENT_DISCONNECT", 3);
MessageManager.messageTypes.Add("MLAPI_DESTROY_OBJECT", 4);

NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromClient");
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromServer");

HashSet<string> channelNames = new HashSet<string>();
foreach (KeyValuePair<string, QosType> pair in NetworkConfig.Channels)
Expand Down
165 changes: 165 additions & 0 deletions MLAPI/MonoBehaviours/Prototyping/NetworkedTransform.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
using MLAPI;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEngine;

namespace MLAP
{
public class NetworkedTransform : NetworkedBehaviour
{
[Range(0, 120)]
public int SendsPerSecond = 20;
[Tooltip("This assumes that the SendsPerSecond is synced across clients")]
public bool AssumeSyncedSends = true;
[Tooltip("This requires AssumeSyncedSends to be true")]
public bool InterpolatePosition = true;
[Tooltip("The transform will snap if the distance is greater than this distance")]
public float SnapDistance = 10f;
public bool InterpolateServer = true;
public float MinMeters = 0.15f;
public float MinDegrees = 1.5f;
private float timeForLerp;
private float lerpT;
private Vector3 lerpStartPos;
private Quaternion lerpStartRot;
private Vector3 lerpEndPos;
private Quaternion lerpEndRot;

private float lastSendTime;
private Vector3 lastSentPos;
private Quaternion lastSentRot;

private void OnValidate()
{
if (!AssumeSyncedSends && InterpolatePosition)
InterpolatePosition = false;
if (InterpolateServer && !InterpolatePosition)
InterpolateServer = false;
if (MinDegrees < 0)
MinDegrees = 0;
if (MinMeters < 0)
MinMeters = 0;
}


void Start()
{
if (isServer)
{
RegisterMessageHandler("MLAPI_OnRecieveTransformFromClient", OnRecieveTransformFromClient);
}
if (isClient)
{
RegisterMessageHandler("MLAPI_OnRecieveTransformFromServer", OnRecieveTransformFromServer);
}
if(AssumeSyncedSends)
{
timeForLerp = 1f / SendsPerSecond;
}
}

void Update()
{
if(isLocalPlayer)
{
if(Time.time - lastSendTime >= timeForLerp && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
{
lastSendTime = Time.time;
lastSentPos = transform.position;
lastSentRot = transform.rotation;
using (MemoryStream writeStream = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(writeStream))
{
writer.Write(transform.position.x);
writer.Write(transform.position.y);
writer.Write(transform.position.z);
writer.Write(transform.rotation.x);
writer.Write(transform.rotation.y);
writer.Write(transform.rotation.z);
}
SendToServerTarget("MLAPI_OnRecieveTransformFromClient", "MLAPI_POSITION_UPDATE", writeStream.ToArray());
}

}
}
else
{
if((isServer && InterpolateServer) || !isServer)
{
lerpT += Time.deltaTime / timeForLerp;
transform.position = Vector3.Lerp(lerpStartPos, lerpEndPos, lerpT);
transform.rotation = Quaternion.Slerp(lerpStartRot, lerpEndRot, lerpT);
}
}
}

private void OnRecieveTransformFromServer(int clientId, byte[] data)
{
if (isServer)
return;
using (MemoryStream stream = new MemoryStream(data))
{
using (BinaryReader reader = new BinaryReader(stream))
{
float xPos = reader.ReadSingle();
float yPos = reader.ReadSingle();
float zPos = reader.ReadSingle();
float xRot = reader.ReadSingle();
float yRot = reader.ReadSingle();
float zRot = reader.ReadSingle();
lerpStartPos = transform.position;
lerpStartRot = transform.rotation;
lerpEndPos = new Vector3(xPos, yPos, zRot);
lerpEndRot = Quaternion.Euler(xRot, yRot, zRot);
lerpT = 0;
}
}
}

private void OnRecieveTransformFromClient(int clientId, byte[] data)
{
using(MemoryStream readStream = new MemoryStream(data))
{
using(BinaryReader reader = new BinaryReader(readStream))
{
float xPos = reader.ReadSingle();
float yPos = reader.ReadSingle();
float zPos = reader.ReadSingle();
float xRot = reader.ReadSingle();
float yRot = reader.ReadSingle();
float zRot = reader.ReadSingle();
if (InterpolateServer)
{
lerpStartPos = transform.position;
lerpStartRot = transform.rotation;
lerpEndPos = new Vector3(xPos, yPos, zRot);
lerpEndRot = Quaternion.Euler(xRot, yRot, zRot);
lerpT = 0;
}
else
{
transform.position = new Vector3(xPos, yPos, zPos);
transform.rotation = Quaternion.Euler(new Vector3(xRot, yRot, zRot));
}
using (MemoryStream writeStream = new MemoryStream())
{
using(BinaryWriter writer = new BinaryWriter(writeStream))
{
writer.Write(xPos);
writer.Write(yPos);
writer.Write(zPos);
writer.Write(xRot);
writer.Write(yRot);
writer.Write(zRot);
}
SendToNonLocalClientsTarget("MLAPI_OnRecieveTransformFromServer", "MLAPI_POSITION_UPDATE", writeStream.ToArray());
}
}
}
}
}
}