initial offline mode, added reference docs for message types

upm
Anton Franzluebbers 2023-09-13 16:54:43 -04:00
parent 593afca4d1
commit 69d0f1bc80
9 changed files with 358 additions and 190 deletions

View File

@ -5,7 +5,7 @@ using UnityEngine;
namespace VelNet namespace VelNet
{ {
public static class BinaryWriterExtensions public static partial class BinaryWriterExtensions
{ {
#region Writers #region Writers

View File

@ -8,6 +8,7 @@ using UnityEngine;
using System.Net; using System.Net;
using UnityEngine.SceneManagement; using UnityEngine.SceneManagement;
using System.IO; using System.IO;
using System.Threading.Tasks;
namespace VelNet namespace VelNet
{ {
@ -119,6 +120,8 @@ namespace VelNet
public bool connected; public bool connected;
private bool wasConnected; private bool wasConnected;
private double lastConnectionCheck; private double lastConnectionCheck;
private bool offlineMode;
private string offlineRoomName;
public List<NetworkObject> prefabs = new List<NetworkObject>(); public List<NetworkObject> prefabs = new List<NetworkObject>();
public NetworkObject[] sceneObjects; public NetworkObject[] sceneObjects;
@ -316,7 +319,8 @@ namespace VelNet
onlyConnectToSameVersion onlyConnectToSameVersion
? $"{Application.productName}_{Application.version}" ? $"{Application.productName}_{Application.version}"
: $"{Application.productName}", : $"{Application.productName}",
Hash128.Compute(SystemInfo.deviceUniqueIdentifier).ToString() Hash128.Compute(SystemInfo.deviceUniqueIdentifier + Application.productName)
.ToString()
); );
} }
@ -742,137 +746,7 @@ namespace VelNet
AddMessage(new ConnectedMessage()); AddMessage(new ConnectedMessage());
while (socketConnection.Connected) while (socketConnection.Connected)
{ {
//read a byte HandleIncomingMessage(reader);
int b = stream.ReadByte();
MessageReceivedType type = (MessageReceivedType)b;
switch (type)
{
//login
case MessageReceivedType.LOGGED_IN:
{
AddMessage(new LoginMessage
{
// not really the sender...
userId = GetIntFromBytes(ReadExact(stream, 4))
});
break;
}
//rooms
case MessageReceivedType.ROOM_LIST:
{
RoomsMessage m = new RoomsMessage();
m.rooms = new List<ListedRoom>();
int N = GetIntFromBytes(ReadExact(stream, 4)); //the size of the payload
byte[] utf8data = ReadExact(stream, N);
string roomMessage = Encoding.UTF8.GetString(utf8data);
string[] sections = roomMessage.Split(',');
foreach (string s in sections)
{
string[] pieces = s.Split(':');
if (pieces.Length == 2)
{
m.rooms.Add(new ListedRoom
{
name = pieces[0],
numUsers = int.Parse(pieces[1])
});
}
}
AddMessage(m);
break;
}
case MessageReceivedType.ROOM_DATA:
{
RoomDataMessage rdm = new RoomDataMessage();
int N = stream.ReadByte();
byte[] utf8data = ReadExact(stream, N); //the room name, encoded as utf-8
string roomname = Encoding.UTF8.GetString(utf8data);
N = GetIntFromBytes(ReadExact(stream, 4)); //the number of client datas to read
rdm.room = roomname;
for (int i = 0; i < N; i++)
{
// client id + short string
int client_id = GetIntFromBytes(ReadExact(stream, 4));
int s = stream.ReadByte(); //size of string
utf8data = ReadExact(stream, s); //the username
string username = Encoding.UTF8.GetString(utf8data);
rdm.members.Add((client_id, username));
}
AddMessage(rdm);
break;
}
//joined
case MessageReceivedType.PLAYER_JOINED:
{
JoinMessage m = new JoinMessage();
m.userId = GetIntFromBytes(ReadExact(stream, 4));
int N = stream.ReadByte();
byte[] utf8data = ReadExact(stream, N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
//data
case MessageReceivedType.DATA_MESSAGE:
{
DataMessage m = new DataMessage();
m.senderId = GetIntFromBytes(ReadExact(stream, 4));
int N = GetIntFromBytes(ReadExact(stream, 4)); //the size of the payload
m.data = ReadExact(stream, N); //the message
AddMessage(m);
break;
}
// new master
case MessageReceivedType.MASTER_MESSAGE:
{
ChangeMasterMessage m = new ChangeMasterMessage();
m.masterId = GetIntFromBytes(ReadExact(stream, 4)); // sender is the new master
AddMessage(m);
break;
}
case MessageReceivedType.YOU_JOINED:
{
YouJoinedMessage m = new YouJoinedMessage();
int N = GetIntFromBytes(ReadExact(stream, 4));
m.playerIds = new List<int>();
for (int i = 0; i < N; i++)
{
m.playerIds.Add(GetIntFromBytes(ReadExact(stream, 4)));
}
N = stream.ReadByte();
byte[] utf8data = ReadExact(stream, N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
case MessageReceivedType.PLAYER_LEFT:
{
PlayerLeftMessage m = new PlayerLeftMessage();
m.userId = GetIntFromBytes(ReadExact(stream, 4));
int N = stream.ReadByte();
byte[] utf8data = ReadExact(stream, N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
case MessageReceivedType.YOU_LEFT:
{
YouLeftMessage m = new YouLeftMessage();
int N = stream.ReadByte();
byte[] utf8data = ReadExact(stream, N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
}
} }
} }
catch (ThreadAbortException) catch (ThreadAbortException)
@ -882,6 +756,9 @@ namespace VelNet
catch (SocketException socketException) catch (SocketException socketException)
{ {
VelNetLogger.Error("Socket exception: " + socketException); VelNetLogger.Error("Socket exception: " + socketException);
VelNetLogger.Error("Switching to offline mode");
offlineMode = true;
AddMessage(new ConnectedMessage());
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -891,8 +768,145 @@ namespace VelNet
connected = false; connected = false;
} }
private void HandleIncomingMessage(BinaryReader reader)
{
MessageReceivedType type = (MessageReceivedType)reader.ReadByte();
Debug.Log(type);
switch (type)
{
//login
case MessageReceivedType.LOGGED_IN:
{
AddMessage(new LoginMessage
{
// not really the sender...
userId = GetIntFromBytes(reader.ReadBytes(4))
});
break;
}
//rooms
case MessageReceivedType.ROOM_LIST:
{
RoomsMessage m = new RoomsMessage();
m.rooms = new List<ListedRoom>();
int N = GetIntFromBytes(reader.ReadBytes(4)); //the size of the payload
byte[] utf8data = reader.ReadBytes(N);
string roomMessage = Encoding.UTF8.GetString(utf8data);
string[] sections = roomMessage.Split(',');
foreach (string s in sections)
{
string[] pieces = s.Split(':');
if (pieces.Length == 2)
{
m.rooms.Add(new ListedRoom
{
name = pieces[0],
numUsers = int.Parse(pieces[1])
});
}
}
AddMessage(m);
break;
}
case MessageReceivedType.ROOM_DATA:
{
RoomDataMessage rdm = new RoomDataMessage();
int N = reader.ReadByte();
byte[] utf8data = reader.ReadBytes(N); //the room name, encoded as utf-8
string roomname = Encoding.UTF8.GetString(utf8data);
N = GetIntFromBytes(reader.ReadBytes(4)); //the number of client datas to read
rdm.room = roomname;
for (int i = 0; i < N; i++)
{
// client id + short string
int clientId = GetIntFromBytes(reader.ReadBytes(4));
int s = reader.ReadByte(); //size of string
utf8data = reader.ReadBytes(s); //the username
string username = Encoding.UTF8.GetString(utf8data);
rdm.members.Add((clientId, username));
}
AddMessage(rdm);
break;
}
//joined
case MessageReceivedType.PLAYER_JOINED:
{
JoinMessage m = new JoinMessage();
m.userId = GetIntFromBytes(reader.ReadBytes(4));
int N = reader.ReadByte();
byte[] utf8data = reader.ReadBytes(N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
//data
case MessageReceivedType.DATA_MESSAGE:
{
DataMessage m = new DataMessage();
m.senderId = GetIntFromBytes(reader.ReadBytes(4));
int N = GetIntFromBytes(reader.ReadBytes(4)); //the size of the payload
m.data = reader.ReadBytes(N); //the message
AddMessage(m);
break;
}
// new master
case MessageReceivedType.MASTER_MESSAGE:
{
ChangeMasterMessage m = new ChangeMasterMessage();
m.masterId = GetIntFromBytes(reader.ReadBytes(4)); // sender is the new master
AddMessage(m);
break;
}
case MessageReceivedType.YOU_JOINED:
{
YouJoinedMessage m = new YouJoinedMessage();
int N = GetIntFromBytes(reader.ReadBytes(4));
m.playerIds = new List<int>();
for (int i = 0; i < N; i++)
{
m.playerIds.Add(GetIntFromBytes(reader.ReadBytes(4)));
}
N = reader.ReadByte();
byte[] utf8data = reader.ReadBytes(N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
case MessageReceivedType.PLAYER_LEFT:
{
PlayerLeftMessage m = new PlayerLeftMessage();
m.userId = GetIntFromBytes(reader.ReadBytes(4));
int N = reader.ReadByte();
byte[] utf8data = reader.ReadBytes(N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
case MessageReceivedType.YOU_LEFT:
{
YouLeftMessage m = new YouLeftMessage();
int N = reader.ReadByte();
byte[] utf8data = reader.ReadBytes(N); //the room name, encoded as utf-8
m.room = Encoding.UTF8.GetString(utf8data);
AddMessage(m);
break;
}
default:
VelNetLogger.Error("Unknown message type");
throw new ArgumentOutOfRangeException(nameof(type), type, null);
}
}
private void ListenForDataUDP() private void ListenForDataUDP()
{ {
if (offlineMode) return;
//I don't yet have a UDP connection //I don't yet have a UDP connection
try try
{ {
@ -900,17 +914,14 @@ namespace VelNet
Debug.Assert(addresses.Length > 0); Debug.Assert(addresses.Length > 0);
RemoteEndPoint = new IPEndPoint(addresses[0], port); RemoteEndPoint = new IPEndPoint(addresses[0], port);
udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
udpConnected = false; udpConnected = false;
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
while (true) while (true)
{ {
buffer[0] = 0; buffer[0] = 0;
Array.Copy(get_be_bytes(userid), 0, buffer, 1, 4); Array.Copy(GetBigEndianBytes(userid), 0, buffer, 1, 4);
udpSocket.SendTo(buffer, 5, SocketFlags.None, RemoteEndPoint); udpSocket.SendTo(buffer, 5, SocketFlags.None, RemoteEndPoint);
if (udpSocket.Available == 0) if (udpSocket.Available == 0)
@ -981,6 +992,12 @@ namespace VelNet
/// <returns>True if the message successfully sent. False if it failed and we should quit</returns> /// <returns>True if the message successfully sent. False if it failed and we should quit</returns>
private static bool SendTcpMessage(byte[] message) private static bool SendTcpMessage(byte[] message)
{ {
if (instance.offlineMode)
{
instance.FakeServer(message);
return true;
}
// Logging.Info("Sent: " + clientMessage); // Logging.Info("Sent: " + clientMessage);
if (instance.socketConnection == null) if (instance.socketConnection == null)
{ {
@ -1019,7 +1036,7 @@ namespace VelNet
return true; return true;
} }
private static byte[] get_be_bytes(int n) private static byte[] GetBigEndianBytes(int n)
{ {
return BitConverter.GetBytes(n).Reverse().ToArray(); return BitConverter.GetBytes(n).Reverse().ToArray();
} }
@ -1104,10 +1121,10 @@ namespace VelNet
MemoryStream stream = new MemoryStream(); MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream); BinaryWriter writer = new BinaryWriter(stream);
byte[] R = Encoding.UTF8.GetBytes(roomName); byte[] roomBytes = Encoding.UTF8.GetBytes(roomName);
writer.Write((byte)MessageSendType.MESSAGE_JOINROOM); writer.Write((byte)MessageSendType.MESSAGE_JOINROOM);
writer.Write((byte)R.Length); writer.Write((byte)roomBytes.Length);
writer.Write(R); writer.Write(roomBytes);
SendTcpMessage(stream.ToArray()); SendTcpMessage(stream.ToArray());
} }
@ -1168,7 +1185,7 @@ namespace VelNet
MemoryStream mem = new MemoryStream(); MemoryStream mem = new MemoryStream();
BinaryWriter writer = new BinaryWriter(mem); BinaryWriter writer = new BinaryWriter(mem);
writer.Write(sendType); writer.Write(sendType);
writer.Write(get_be_bytes(message.Length)); writer.WriteBigEndian(message.Length);
writer.Write(message); writer.Write(message);
return SendTcpMessage(mem.ToArray()); return SendTcpMessage(mem.ToArray());
} }
@ -1176,7 +1193,7 @@ namespace VelNet
{ {
//udp message needs the type //udp message needs the type
toSend[0] = sendType; //we don't toSend[0] = sendType; //we don't
Array.Copy(get_be_bytes(instance.userid), 0, toSend, 1, 4); Array.Copy(GetBigEndianBytes(instance.userid), 0, toSend, 1, 4);
Array.Copy(message, 0, toSend, 5, message.Length); Array.Copy(message, 0, toSend, 5, message.Length);
SendUdpMessage(toSend, message.Length + 5); //shouldn't be over 1024... SendUdpMessage(toSend, message.Length + 5); //shouldn't be over 1024...
return true; return true;
@ -1192,7 +1209,7 @@ namespace VelNet
MemoryStream stream = new MemoryStream(); MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream); BinaryWriter writer = new BinaryWriter(stream);
writer.Write((byte)MessageSendType.MESSAGE_GROUP); writer.Write((byte)MessageSendType.MESSAGE_GROUP);
writer.Write(get_be_bytes(message.Length)); writer.WriteBigEndian(message.Length);
writer.Write(message); writer.Write(message);
writer.Write((byte)utf8bytes.Length); writer.Write((byte)utf8bytes.Length);
writer.Write(utf8bytes); writer.Write(utf8bytes);
@ -1201,7 +1218,7 @@ namespace VelNet
else else
{ {
toSend[0] = (byte)MessageSendType.MESSAGE_GROUP; toSend[0] = (byte)MessageSendType.MESSAGE_GROUP;
Array.Copy(get_be_bytes(instance.userid), 0, toSend, 1, 4); Array.Copy(GetBigEndianBytes(instance.userid), 0, toSend, 1, 4);
//also need to send the group //also need to send the group
toSend[5] = (byte)utf8bytes.Length; toSend[5] = (byte)utf8bytes.Length;
Array.Copy(utf8bytes, 0, toSend, 6, utf8bytes.Length); Array.Copy(utf8bytes, 0, toSend, 6, utf8bytes.Length);
@ -1223,14 +1240,14 @@ namespace VelNet
MemoryStream stream = new MemoryStream(); MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream); BinaryWriter writer = new BinaryWriter(stream);
byte[] R = Encoding.UTF8.GetBytes(groupName); byte[] groupNameBytes = Encoding.UTF8.GetBytes(groupName);
writer.Write((byte)6); writer.Write((byte)6);
writer.Write((byte)R.Length); writer.Write((byte)groupNameBytes.Length);
writer.Write(R); writer.Write(groupNameBytes);
writer.Write(get_be_bytes(clientIds.Count * 4)); writer.WriteBigEndian(clientIds.Count * 4);
foreach (int c in clientIds) foreach (int c in clientIds)
{ {
writer.Write(get_be_bytes(c)); writer.WriteBigEndian(c);
} }
SendTcpMessage(stream.ToArray()); SendTcpMessage(stream.ToArray());
@ -1490,5 +1507,100 @@ namespace VelNet
return true; return true;
} }
/// <summary>
/// Pretends to be the server and sends back the result to be handled. Only should be called in offline mode.
/// </summary>
/// <param name="message">The message that was meant to be sent to the server.</param>
private void FakeServer(byte[] message)
{
MemoryStream mem = new MemoryStream(message);
BinaryReader reader = new BinaryReader(mem);
MessageSendType messageType = (MessageSendType)reader.ReadByte();
MemoryStream outMem = new MemoryStream();
BinaryWriter outWriter = new BinaryWriter(outMem);
switch (messageType)
{
case MessageSendType.MESSAGE_OTHERS_ORDERED:
break;
case MessageSendType.MESSAGE_ALL_ORDERED:
break;
case MessageSendType.MESSAGE_LOGIN:
outWriter.Write((byte)MessageReceivedType.LOGGED_IN);
outWriter.WriteBigEndian(0);
break;
case MessageSendType.MESSAGE_GETROOMS:
outWriter.Write((byte)MessageReceivedType.ROOM_LIST);
outWriter.WriteBigEndian(0);
break;
case MessageSendType.MESSAGE_JOINROOM:
{
string roomName = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadByte()));
// if leaving a room
if (string.IsNullOrEmpty(roomName))
{
outWriter.Write((byte)MessageReceivedType.YOU_LEFT);
byte[] roomNameBytes = Encoding.UTF8.GetBytes(offlineRoomName);
outWriter.Write((byte)roomNameBytes.Length);
outWriter.Write(roomNameBytes);
}
else
{
outWriter.Write((byte)MessageReceivedType.YOU_JOINED);
outWriter.WriteBigEndian(1); // num players
outWriter.WriteBigEndian(0); // our userid
byte[] roomNameBytes = Encoding.UTF8.GetBytes(roomName);
outWriter.Write((byte)roomNameBytes.Length);
outWriter.Write(roomNameBytes);
}
offlineRoomName = roomName;
break;
}
case MessageSendType.MESSAGE_OTHERS:
break;
case MessageSendType.MESSAGE_ALL:
break;
case MessageSendType.MESSAGE_GROUP:
break;
case MessageSendType.MESSAGE_SETGROUP:
break;
case MessageSendType.MESSAGE_GETROOMDATA:
{
outWriter.Write((byte)MessageReceivedType.ROOM_DATA);
byte[] roomNameBytes = Encoding.UTF8.GetBytes("OFFLINE");
outWriter.Write((byte)roomNameBytes.Length);
outWriter.Write(roomNameBytes);
outWriter.WriteBigEndian(0);
break;
}
default:
throw new ArgumentOutOfRangeException();
}
outMem.Position = 0;
// if we run this in the same thread, then it is modifying the messages collection while iterating
Task.Run(() => { HandleIncomingMessage(new BinaryReader(outMem)); });
}
}
public static partial class BinaryWriterExtensions
{
public static void WriteBigEndian(this BinaryWriter writer, int value)
{
byte[] data = BitConverter.GetBytes(value);
Array.Reverse(data);
writer.Write(data);
}
public static int ReadBigEndian(this BinaryReader reader)
{
byte[] data = reader.ReadBytes(4);
Array.Reverse(data);
return BitConverter.ToInt32(data, 0);
}
} }
} }

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using System.IO; using System.IO;
using System.Text;
using UnityEngine; using UnityEngine;
namespace VelNet namespace VelNet
@ -82,12 +83,11 @@ namespace VelNet
/// ///
/// The length of the byte[] for message is fixed according to the message type /// The length of the byte[] for message is fixed according to the message type
/// </summary> /// </summary>
public void HandleMessage(VelNetManager.DataMessage m, bool unknown_sender = false) public void HandleMessage(VelNetManager.DataMessage m, bool unknownSender = false)
{ {
using MemoryStream mem = new MemoryStream(m.data); using MemoryStream mem = new MemoryStream(m.data);
using BinaryReader reader = new BinaryReader(mem); using BinaryReader reader = new BinaryReader(mem);
//individual message parameters separated by comma
VelNetManager.MessageType messageType = (VelNetManager.MessageType)reader.ReadByte(); VelNetManager.MessageType messageType = (VelNetManager.MessageType)reader.ReadByte();
if (messageType == VelNetManager.MessageType.Custom) if (messageType == VelNetManager.MessageType.Custom)
@ -109,7 +109,7 @@ namespace VelNet
return; return;
} }
if (unknown_sender) if (unknownSender)
{ {
VelNetLogger.Error("Received non-custom message from player that doesn't exist "); VelNetLogger.Error("Received non-custom message from player that doesn't exist ");
return; return;

View File

@ -104,7 +104,7 @@ NavMeshSettings:
serializedVersion: 2 serializedVersion: 2
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_BuildSettings: m_BuildSettings:
serializedVersion: 2 serializedVersion: 3
agentTypeID: 0 agentTypeID: 0
agentRadius: 0.5 agentRadius: 0.5
agentHeight: 2 agentHeight: 2
@ -117,7 +117,7 @@ NavMeshSettings:
cellSize: 0.16666667 cellSize: 0.16666667
manualTileSize: 0 manualTileSize: 0
tileSize: 256 tileSize: 256
accuratePlacement: 0 buildHeightMesh: 0
maxJobWorkers: 0 maxJobWorkers: 0
preserveTilesOutsideBounds: 0 preserveTilesOutsideBounds: 0
debug: debug:
@ -199,7 +199,9 @@ Canvas:
m_OverrideSorting: 0 m_OverrideSorting: 0
m_OverridePixelPerfect: 0 m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0 m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0 m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_TargetDisplay: 0 m_TargetDisplay: 0
@ -337,6 +339,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_SendPointerHoverToParent: 1
m_HorizontalAxis: Horizontal m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical m_VerticalAxis: Vertical
m_SubmitButton: Submit m_SubmitButton: Submit
@ -372,7 +375,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 0 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &652307109 --- !u!1 &652307109
GameObject: GameObject:
@ -466,7 +469,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 2 m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 25.729, y: -12.365, z: 17.037} m_LocalEulerAnglesHint: {x: 25.729, y: -12.365, z: 17.037}
--- !u!1 &903768653 --- !u!1 &903768653
GameObject: GameObject:
@ -500,9 +503,17 @@ Camera:
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2 m_GateFitMode: 2
m_FOVAxisMode: 0 m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24} m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0} m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect: m_NormalizedViewPortRect:
serializedVersion: 2 serializedVersion: 2
x: 0 x: 0
@ -542,7 +553,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 1 m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!81 &903768658 --- !u!81 &903768658
AudioListener: AudioListener:
@ -583,7 +594,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 3 m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1099803616 --- !u!114 &1099803616
MonoBehaviour: MonoBehaviour:
@ -597,7 +608,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3} m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
host: vn.ugavel.com host: velnet-demo.ugavel.com
port: 5000 port: 5000
udpConnected: 0 udpConnected: 0
userid: -1 userid: -1

View File

@ -104,7 +104,7 @@ NavMeshSettings:
serializedVersion: 2 serializedVersion: 2
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_BuildSettings: m_BuildSettings:
serializedVersion: 2 serializedVersion: 3
agentTypeID: 0 agentTypeID: 0
agentRadius: 0.5 agentRadius: 0.5
agentHeight: 2 agentHeight: 2
@ -117,7 +117,7 @@ NavMeshSettings:
cellSize: 0.16666667 cellSize: 0.16666667
manualTileSize: 0 manualTileSize: 0
tileSize: 256 tileSize: 256
accuratePlacement: 0 buildHeightMesh: 0
maxJobWorkers: 0 maxJobWorkers: 0
preserveTilesOutsideBounds: 0 preserveTilesOutsideBounds: 0
debug: debug:
@ -585,7 +585,9 @@ Canvas:
m_OverrideSorting: 0 m_OverrideSorting: 0
m_OverridePixelPerfect: 0 m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0 m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0 m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_TargetDisplay: 0 m_TargetDisplay: 0
@ -749,6 +751,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_SendPointerHoverToParent: 1
m_HorizontalAxis: Horizontal m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical m_VerticalAxis: Vertical
m_SubmitButton: Submit m_SubmitButton: Submit
@ -1733,9 +1736,17 @@ Camera:
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2 m_GateFitMode: 2
m_FOVAxisMode: 0 m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24} m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0} m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect: m_NormalizedViewPortRect:
serializedVersion: 2 serializedVersion: 2
x: 0 x: 0
@ -2055,7 +2066,7 @@ MonoBehaviour:
prefabName: prefabName:
isSceneObject: 1 isSceneObject: 1
syncedComponents: syncedComponents:
- {fileID: 948755939} - {fileID: 0}
--- !u!114 &948755941 --- !u!114 &948755941
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -2518,7 +2529,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3} m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
host: vn.ugavel.com host: velnet-demo.ugavel.com
port: 5000 port: 5000
udpConnected: 0 udpConnected: 0
userid: -1 userid: -1
@ -4106,7 +4117,7 @@ MonoBehaviour:
prefabName: prefabName:
isSceneObject: 1 isSceneObject: 1
syncedComponents: syncedComponents:
- {fileID: 2021764945} - {fileID: 0}
--- !u!114 &2021764945 --- !u!114 &2021764945
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -4372,6 +4383,7 @@ PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
serializedVersion: 2 serializedVersion: 2
m_Modification: m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0} m_TransformParent: {fileID: 0}
m_Modifications: m_Modifications:
- target: {fileID: 3951900052977689805, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} - target: {fileID: 3951900052977689805, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3}
@ -4439,4 +4451,7 @@ PrefabInstance:
value: 0 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3} m_SourcePrefab: {fileID: 100100000, guid: 6e4a023f70e01405e8b249a4488fe319, type: 3}

View File

@ -104,7 +104,7 @@ NavMeshSettings:
serializedVersion: 2 serializedVersion: 2
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_BuildSettings: m_BuildSettings:
serializedVersion: 2 serializedVersion: 3
agentTypeID: 0 agentTypeID: 0
agentRadius: 0.5 agentRadius: 0.5
agentHeight: 2 agentHeight: 2
@ -117,7 +117,7 @@ NavMeshSettings:
cellSize: 0.16666667 cellSize: 0.16666667
manualTileSize: 0 manualTileSize: 0
tileSize: 256 tileSize: 256
accuratePlacement: 0 buildHeightMesh: 0
maxJobWorkers: 0 maxJobWorkers: 0
preserveTilesOutsideBounds: 0 preserveTilesOutsideBounds: 0
debug: debug:
@ -152,7 +152,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3} m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
host: vn.ugavel.com host: velnet-demo.ugavel.com
port: 5000 port: 5000
udpConnected: 0 udpConnected: 0
userid: -1 userid: -1
@ -301,9 +301,17 @@ BoxCollider:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 958953873} m_GameObject: {fileID: 958953873}
m_Material: {fileID: 0} m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0 m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1 m_Enabled: 1
serializedVersion: 2 serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1} m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0} m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &958953875 --- !u!23 &958953875
@ -386,6 +394,9 @@ MonoBehaviour:
networkObject: {fileID: 958953879} networkObject: {fileID: 958953879}
serializationRateHz: 30 serializationRateHz: 30
hybridOnChangeCompression: 1 hybridOnChangeCompression: 1
position: 1
rotation: 1
scale: 0
useLocalTransform: 0 useLocalTransform: 0
teleportDistance: 0 teleportDistance: 0
teleportAngle: 0 teleportAngle: 0
@ -448,9 +459,17 @@ Camera:
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2 m_GateFitMode: 2
m_FOVAxisMode: 0 m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24} m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0} m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect: m_NormalizedViewPortRect:
serializedVersion: 2 serializedVersion: 2
x: 0 x: 0

View File

@ -616,7 +616,7 @@ RectTransform:
- {fileID: 1020014860} - {fileID: 1020014860}
- {fileID: 1536292193} - {fileID: 1536292193}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 1 m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0}
@ -788,7 +788,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 0 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &498776799 --- !u!1 &498776799
GameObject: GameObject:
@ -1319,7 +1319,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 2 m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &711524766 --- !u!1 &711524766
GameObject: GameObject:
@ -1779,7 +1779,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 3 m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!81 &903768658 --- !u!81 &903768658
AudioListener: AudioListener:
@ -2237,7 +2237,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 5 m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1020014859 --- !u!1 &1020014859
GameObject: GameObject:
@ -2585,7 +2585,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 6 m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1099803616 --- !u!114 &1099803616
MonoBehaviour: MonoBehaviour:
@ -2599,7 +2599,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3} m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
host: velnet-demo.ugavel.com host: velnet-demo2.ugavel.com
port: 5000 port: 5000
udpConnected: 0 udpConnected: 0
userid: -1 userid: -1
@ -3251,7 +3251,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 4 m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1536292192 --- !u!1 &1536292192
GameObject: GameObject:

View File

@ -104,7 +104,7 @@ NavMeshSettings:
serializedVersion: 2 serializedVersion: 2
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_BuildSettings: m_BuildSettings:
serializedVersion: 2 serializedVersion: 3
agentTypeID: 0 agentTypeID: 0
agentRadius: 0.5 agentRadius: 0.5
agentHeight: 2 agentHeight: 2
@ -117,7 +117,7 @@ NavMeshSettings:
cellSize: 0.16666667 cellSize: 0.16666667
manualTileSize: 0 manualTileSize: 0
tileSize: 256 tileSize: 256
accuratePlacement: 0 buildHeightMesh: 0
maxJobWorkers: 0 maxJobWorkers: 0
preserveTilesOutsideBounds: 0 preserveTilesOutsideBounds: 0
debug: debug:
@ -280,7 +280,9 @@ Canvas:
m_OverrideSorting: 0 m_OverrideSorting: 0
m_OverridePixelPerfect: 0 m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0 m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0 m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_TargetDisplay: 0 m_TargetDisplay: 0
@ -517,6 +519,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_SendPointerHoverToParent: 1
m_HorizontalAxis: Horizontal m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical m_VerticalAxis: Vertical
m_SubmitButton: Submit m_SubmitButton: Submit
@ -552,7 +555,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 0 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &513088493 --- !u!1 &513088493
GameObject: GameObject:
@ -722,7 +725,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 2 m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 25.729, y: -12.365, z: 17.037} m_LocalEulerAnglesHint: {x: 25.729, y: -12.365, z: 17.037}
--- !u!1 &686695937 --- !u!1 &686695937
GameObject: GameObject:
@ -987,9 +990,17 @@ Camera:
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2 m_GateFitMode: 2
m_FOVAxisMode: 0 m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24} m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0} m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect: m_NormalizedViewPortRect:
serializedVersion: 2 serializedVersion: 2
x: 0 x: 0
@ -1029,7 +1040,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 1 m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!81 &903768658 --- !u!81 &903768658
AudioListener: AudioListener:
@ -1305,7 +1316,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 3 m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1099803616 --- !u!114 &1099803616
MonoBehaviour: MonoBehaviour:
@ -1319,7 +1330,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3} m_Script: {fileID: 11500000, guid: 233344de094f11341bdb834d564708dc, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
host: vn.ugavel.com host: velnet-demo.ugavel.com
port: 5000 port: 5000
udpConnected: 0 udpConnected: 0
userid: -1 userid: -1

View File

@ -1,7 +1,7 @@
{ {
"name": "edu.uga.engr.vel.velnet", "name": "edu.uga.engr.vel.velnet",
"displayName": "VelNet", "displayName": "VelNet",
"version": "1.2.3", "version": "1.3.0",
"unity": "2019.1", "unity": "2019.1",
"description": "A custom networking library for Unity.", "description": "A custom networking library for Unity.",
"keywords": [ "keywords": [