This commit is contained in:
kridoo
2025-09-26 09:36:52 +08:00
parent 6e91a0c7f0
commit a9c7992a7a
37 changed files with 12827 additions and 469 deletions

View File

@@ -31,19 +31,19 @@ public class VR2 : MonoBehaviour
Register register = new();
Logout logout = new();
VRInfo vrinfo = new();
VRPos vrpos = new();//<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
VRPos vrpos = new();//自己的位置
ObjPos gPos = new();
Ask ask = new();
Inform inform = new();
BackInfo backInfo = new();
float statHight = 0; //<EFBFBD><EFBFBD>ʼ<EFBFBD>ĸ߶<EFBFBD>
Vector3 lastPos; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
float distance = 0; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õľ<EFBFBD><EFBFBD><EFBFBD>
Vector3 myPositionChang; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>޸Ĺ<EFBFBD><EFBFBD>ĸ߶ȣ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float statHight = 0; //开始的高度
Vector3 lastPos; //最后的位置
float distance = 0; //最后的位置和最新位置的距离
Vector3 myPositionChang; //这个是自己修改过的高度,要传给服务器
Vector3 db_myPosition; //<EFBFBD>Լ<EFBFBD><EFBFBD>ԱȾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
Vector3 db_otherPosition; //<EFBFBD><EFBFBD><EFBFBD>˶ԱȾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
float db_distance = 0; //<EFBFBD>Աȵľ<EFBFBD><EFBFBD><EFBFBD>
Vector3 db_myPosition; //自己对比距离的位置
Vector3 db_otherPosition; //别人对比距离的位置
float db_distance = 0; //对比的距离
//TimelineProgress timelineProgress = new();
string user = "u";
@@ -61,11 +61,11 @@ public class VR2 : MonoBehaviour
public GameObject cubeObj;
internal UnityEvent<uint, int> OnTimelineProgress = new();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Good<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>
// 存储所有Good对象的字典
private Dictionary<string, Good> goodsDictionary = new Dictionary<string, Good>();
int erorrCount;
private Memory<byte> _receiveMemory = Memory<byte>.Empty; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private Memory<byte> _receiveMemory = Memory<byte>.Empty; //缓冲区
private void Awake()
{
@@ -83,15 +83,32 @@ public class VR2 : MonoBehaviour
GlobalEventMgr.Listen<int>(GameEvent.EventAnimalSend, GameDataManage_EventAnimalSend);
// MyLoadSceneAsync(1);//<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
// MyLoadSceneAsync(1);//加载第一个内容场景
}
void Init()
void ReadConfig()
{
if (File.Exists(Config.IpConfig))
Config.TcpHost = File.ReadAllText(Config.IpConfig);
{
string[] str = File.ReadAllText(Config.IpConfig).Split('\n');
Config.TcpHost = str[0];
WebNet.webIp = str[1];
WebNet.assetsUrl = $"{WebNet.webIp}/api/dev/login";
WebNet.DownAssetsUrl = $"{WebNet.webIp}/storage/resource";
WebNet.UploadInfoUrl = $"{WebNet.webIp}/api/dev/uploadUsageInfo";
WebNet.getDeviceList = $"{WebNet.webIp}/api/tablet/getDeviceList";
WebNet.uploadEQ = $"{WebNet.webIp}/api/dev/uploadEQ";
}
else
File.WriteAllText(Config.IpConfig, Config.TcpHost);
{
string str = $"{Config.TcpHost}\n{WebNet.webIp}";
File.WriteAllText(Config.IpConfig, str);
}
}
void Init()
{
ReadConfig();
cameraTran = Camera.main.transform;
statHight = Camera.main.transform.position.y;
@@ -123,7 +140,7 @@ public class VR2 : MonoBehaviour
_messageHandlers[21] = HandleTimeLineProgress;
}
//<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
//发送创建动物事件
void GameDataManage_EventAnimalSend(int animalType)
{
sendCom(3, animalType, 0);
@@ -131,7 +148,7 @@ public class VR2 : MonoBehaviour
void Update()
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//测试
if (Input.GetKeyDown(KeyCode.Space))
{
//Logout logout = new Logout();
@@ -150,7 +167,7 @@ public class VR2 : MonoBehaviour
MyLoadSceneAsync(1);
}
//<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD>Ϸ
//退出游戏
if (Input.GetKey(KeyCode.JoystickButton0))
{
quitTimers += Time.deltaTime;
@@ -193,7 +210,7 @@ public class VR2 : MonoBehaviour
}
}
//ͷ<EFBFBD><EFBFBD><EFBFBD>
//头盔变化
if (Application.platform == RuntimePlatform.Android)
{
if (InputDevices.GetDeviceAtXRNode(XRNode.Head).TryGetFeatureValue(CommonUsages.userPresence, out bool userPresence))
@@ -210,7 +227,7 @@ public class VR2 : MonoBehaviour
}
//<EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//连接服务器
if (client != null)
{
if (!isConnecting)
@@ -218,9 +235,7 @@ public class VR2 : MonoBehaviour
if (DateTime.Now > connTime.AddSeconds(2))
{
connTime = DateTime.Now;
Debug.Log("<22><>ʼ<EFBFBD><CABC>ַ:"+ Config.IpConfig);
Config.TcpHost = File.ReadAllText(Config.IpConfig);
Debug.Log($"<22><><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ip:{Config.TcpHost}");
Debug.Log($"连接中。。。ip:{Config.TcpHost}");
client.Open(new Host(Config.TcpHost, Config.TcpPort));
Invoke("sendRegister", 1f);
}
@@ -237,7 +252,7 @@ public class VR2 : MonoBehaviour
if (DateTime.Now > posTime.AddSeconds(0.5f))
{
posTime = DateTime.Now;
if (cameraTran.position.y < (statHight * 0.7f)) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (cameraTran.position.y < (statHight * 0.7f)) //这个是自己判断自己的状态后加的 蹲着
{
myPositionChang = new Vector3(cameraTran.position.x, 3, cameraTran.position.z);
//cameraTran.position = new Vector3(cameraTran.position.x, 3, cameraTran.position.z);
@@ -245,20 +260,20 @@ public class VR2 : MonoBehaviour
else
{
distance = Vector3.Distance(lastPos, cameraTran.position);
//Debug.Log("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>:" + lastPos + "||" + cameraTran.position+"||"+ distance);
//Debug.Log("最后的位置:" + lastPos + "||" + cameraTran.position+"||"+ distance);
if (distance <= 0.1f)
{
myPositionChang = new Vector3(cameraTran.position.x, 1, cameraTran.position.z);
//cameraTran.position = new Vector3(cameraTran.position.x, 1, cameraTran.position.z); //վ<EFBFBD><EFBFBD>
//cameraTran.position = new Vector3(cameraTran.position.x, 1, cameraTran.position.z); //站立
}
else
{
myPositionChang = new Vector3(cameraTran.position.x, 2, cameraTran.position.z);
//cameraTran.position = new Vector3(cameraTran.position.x, 2, cameraTran.position.z); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//cameraTran.position = new Vector3(cameraTran.position.x, 2, cameraTran.position.z); //行走
}
}
lastPos = cameraTran.position;
//Debug.Log("<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲô״̬:" + myPositionChang.y);
//Debug.Log("自己传的是什么状态:" + myPositionChang.y);
sendvrPos(Config.SN, user, Config.Group, myPositionChang, cameraTran.rotation);
}
@@ -284,14 +299,14 @@ public class VR2 : MonoBehaviour
/// <summary>
/// ע<EFBFBD><EFBFBD>Good<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 注册Good对象
/// </summary>
/// <param name="good">Ҫע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Good<EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="good">要注册的Good对象</param>
public void RegisterGood(Good good)
{
if (good == null) return;
string key = good.gameObject.name; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>
string key = good.gameObject.name; // 使用物体名作为键
if (!goodsDictionary.ContainsKey(key))
{
@@ -299,15 +314,15 @@ public class VR2 : MonoBehaviour
}
else
{
// <EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬿<EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 已存在同名对象,可以选择替换或忽略
goodsDictionary[key] = good;
Debug.LogWarning($"<EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>Good<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {key}, <20><><EFBFBD>滻Ϊ<E6BBBB><EFBFBD><C2B6><EFBFBD>");
Debug.LogWarning($"已存在同名Good对象: {key}, 已替换为新对象");
}
}
/// <summary>
/// ע<EFBFBD><EFBFBD>Good<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 注销Good对象
/// </summary>
/// <param name="good">Ҫע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Good<EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="good">要注销的Good对象</param>
public void UnregisterGood(Good good)
{
if (good == null) return;
@@ -316,7 +331,7 @@ public class VR2 : MonoBehaviour
if (goodsDictionary.ContainsKey(key))
{
// ȷ<EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 确保移除的是同一个对象
if (goodsDictionary[key] == good)
{
goodsDictionary.Remove(key);
@@ -324,35 +339,35 @@ public class VR2 : MonoBehaviour
}
}
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#region
void sendMessage<T>(uint type, T msg)
{
try
{
// <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>Ϣ
// 序列化消息
string json = JsonConvert.SerializeObject(msg);
Debug.Log($"<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>json: {json}");
Debug.Log($"发送的json: {json}");
byte[] msgBytes = NE.GetBytes(json);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> + <20><>β<EFBFBD><CEB2>0<EFBFBD><30>
int totalLength = sizeof(uint) + msgBytes.Length + 1; // <EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD><EFBFBD> + <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> + 1<><31><EFBFBD><EFBFBD>β<EFBFBD><CEB2>0<EFBFBD><30>
// 计算总长度(消息类型 + 消息内容 + 结尾的0
int totalLength = sizeof(uint) + msgBytes.Length + 1; // 类型长度 + 消息长度 + 1结尾的0
// ʹ<EFBFBD><EFBFBD> MemoryStream <EFBFBD><EFBFBD> BinaryWriter <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 使用 MemoryStream BinaryWriter 构建字节数组
using (var stream = new MemoryStream())
using (var writer = new BinaryWriter(stream))
{
writer.Write(totalLength); // д<EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><EFBFBD><EFBFBD>
writer.Write(type); // д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
writer.Write(msgBytes); // д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
writer.Write((byte)0); // д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>0
writer.Write(totalLength); // 写入总长度
writer.Write(type); // 写入消息类型
writer.Write(msgBytes); // 写入消息内容
writer.Write((byte)0); // 写入结尾的0
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 发送数据
client.ToData(stream.ToArray());
}
}
catch (Exception ex)
{
Debug.LogError("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<EFBFBD><EFBFBD>: " + ex.Message);
Debug.LogError("发送消息失败: " + ex.Message);
}
}
//
@@ -366,7 +381,7 @@ public class VR2 : MonoBehaviour
}
void error(Exception e)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>:{e.Message}");
Debug.LogError($"连接错误:{e.Message}");
}
void msgEvent(string name, byte[] bytes)
{
@@ -377,7 +392,7 @@ public class VR2 : MonoBehaviour
{
if (bytes == null || bytes.Length == 0)
{
Debug.LogError("<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
Debug.LogError("无效数据包:空数据");
return;
}
//string hexResult = "";
@@ -385,10 +400,10 @@ public class VR2 : MonoBehaviour
//{
// hexResult += b.ToString("X2") + " ";
//}
//Debug.Log($"<EFBFBD><EFBFBD>Ϣ<EFBFBD>ֽ<EFBFBD>: {hexResult}");
//Debug.Log($"消息字节: {hexResult}");
#region Memory<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#region Memory缓冲区
// 将新数据追加到缓冲区
_receiveMemory = CombineMemory(_receiveMemory, bytes.AsMemory());
try
@@ -396,77 +411,77 @@ public class VR2 : MonoBehaviour
while (_receiveMemory.Length >= 8)
{
var bufferSpan = _receiveMemory.Span;
int contentLength = BitConverter.ToInt32(bufferSpan.Slice(0, 4));//<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
int type = BitConverter.ToInt32(bufferSpan.Slice(4, 4));// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int contentLength = BitConverter.ToInt32(bufferSpan.Slice(0, 4));//数据长度
int type = BitConverter.ToInt32(bufferSpan.Slice(4, 4));// 数据类型
if (type > 100)
{
// <EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> 0 <20>ֽڵ<D6BD>λ<EFBFBD><CEBB>
// 找到第一个 0 字节的位置
int zeroIndex = _receiveMemory.Span.IndexOf((byte)0);
if (zeroIndex >= 0)
{
_receiveMemory = _receiveMemory.Slice(zeroIndex + 1); // <EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD> 0 <20>ֽ<EFBFBD>֮<EFBFBD><D6AE>
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>: {type}<7D><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> 0 <20>ֽ<EFBFBD>֮<EFBFBD><D6AE>");
_receiveMemory = _receiveMemory.Slice(zeroIndex + 1); // 移除到 0 字节之后
Debug.LogError($"数据包类型错误: {type},移除到 0 字节之后");
}
else
{
_receiveMemory = Memory<byte>.Empty; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD> 0 <20>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>: {type}<7D><>û<EFBFBD><C3BB> 0 <20>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>");
_receiveMemory = Memory<byte>.Empty; // 如果没有 0 字节,清空缓冲区
Debug.LogError($"数据包类型错误: {type},没有 0 字节,清空缓冲区");
}
break;
}
int totalPacketLength = 4 + contentLength;
int msgLength = contentLength - 5;//(<EFBFBD><EFBFBD>4<EFBFBD><EFBFBD>1)
int msgLength = contentLength - 5;//(减4减1)
try
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
//检查是否收到完整的数据包
if (_receiveMemory.Length >= totalPacketLength)
{
// <EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD>β<EFBFBD>ֽ<EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ0
// 验证结尾字节是否为0
if (bufferSpan[totalPacketLength - 1] != 0)
{
_receiveMemory = Memory<byte>.Empty;
Debug.LogError("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ȱ<>ٽ<EFBFBD>β0<CEB2>ֽ<EFBFBD>");
Debug.LogError("清除缓冲区,数据包格式错误: 缺少结尾0字节");
break;
}
var msgMemory = _receiveMemory.Slice(8, msgLength);
string msg = Encoding.UTF8.GetString(msgMemory.Span);
Debug.Log($"<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ:{msg}");
Debug.Log($"收到的消息:{msg}");
if (_messageHandlers.TryGetValue(type, out var handler))
{
try
{
handler(msg);//ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
handler(msg);//业务处理
}
catch (Exception e)
{
Debug.LogError($"ҵ<EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{e.Message}");
Debug.LogError($"业务逻辑处理报错:{e.Message}");
}
}
else
{
//Debug.LogError($"δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {type}");
//Debug.LogError($"未知的消息类型: {type}");
}
//Debug.Log("<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
//Debug.Log("从缓冲区移除已处理的数据");
_receiveMemory = _receiveMemory.Slice(totalPacketLength);
erorrCount = 0;
}
else
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>{type}<7D><>Ԥ<EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>: {totalPacketLength}, ʵ<EFBFBD>ʳ<EFBFBD><EFBFBD><EFBFBD>: {_receiveMemory.Length}");
Debug.LogError($"数据不完整,类型:{type},预期长度: {totalPacketLength}, 实际长度: {_receiveMemory.Length}");
erorrCount++;
if (erorrCount >= 10)
{
erorrCount = 0;
_receiveMemory = Memory<byte>.Empty;
Debug.LogError("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<EFBFBD><EFBFBD>");
Debug.LogError("清除缓冲区数据不完整超过10次");
}
break;
}
}
catch (Exception e)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {e.Message}");
Debug.LogError($"清除缓冲区,处理数据包时出错: {e.Message}");
_receiveMemory = Memory<byte>.Empty;
}
}
@@ -474,7 +489,7 @@ public class VR2 : MonoBehaviour
}
catch (Exception e)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {e.Message}");
Debug.LogError($"清除缓冲区,消息处理异常: {e.Message}");
_receiveMemory = Memory<byte>.Empty;
}
@@ -482,7 +497,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
/// 加载更新玩家位置
/// </summary>
void LoadPlayer(VRPos vrpos, ref Player player)
{
@@ -499,9 +514,19 @@ public class VR2 : MonoBehaviour
player.isOtherPlayer = true;
player.transform.name = vrpos.sn;
player.sn = vrpos.sn;
if(player.user)
if (player.user)
{
player.user.text = vrpos.user;
player.human = vrpos.human;
if (vrpos.human > 1)
{
player.human = 0;
}
else
{
player.human = vrpos.human;
}
}
player.group = vrpos.group;
player.x = vrpos.x;
player.y = vrpos.y;
@@ -512,11 +537,11 @@ public class VR2 : MonoBehaviour
player.r = vrpos.r;
player.LastTime = Time.time;
if (Config.Group == player.group) //ͬ<EFBFBD><EFBFBD>
if (Config.Group == player.group) //同组
{
player.gameObject.SetActive(true);
}
else //<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>
else //不同组
{
db_myPosition.x = lastPos.x;
db_myPosition.y = 0;
@@ -525,8 +550,8 @@ public class VR2 : MonoBehaviour
db_otherPosition.y = 0;
db_otherPosition.z = player.z/ Config.times;
db_distance = Vector3.Distance(db_myPosition, db_otherPosition);
//Debug.Log("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:"+ db_distance);
if (db_distance < 3)
//Debug.Log("多少米:"+ db_distance);
if (db_distance < 5)
player.gameObject.SetActive(true);
else
player.gameObject.SetActive(false);
@@ -535,7 +560,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
/// 加载更新物体位置
/// </summary>
void LoadGood(Good good, ObjPos gPos)
{
@@ -552,10 +577,10 @@ public class VR2 : MonoBehaviour
}
#endregion
#region <EFBFBD><EFBFBD>Ϣ
#region
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 发送时间轴进度
/// </summary>
public void sendTimeLineProgress(uint scene, int progress)
{
@@ -564,11 +589,11 @@ public class VR2 : MonoBehaviour
//timelineProgress.scene = scene;
//timelineProgress.progress = progress;
//sendMessage(16, timelineProgress);
//Debug.Log($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ: {timelineProgress.scene}+++++{timelineProgress.progress}");
//Debug.Log($"发送时间轴消息: {timelineProgress.scene}+++++{timelineProgress.progress}");
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vr<EFBFBD><EFBFBD><EFBFBD>Ϣ
/// 发送vr设备信息
/// </summary>
void sendvrInfo(string sn, string name, uint power, uint status, uint wear)
{
@@ -582,7 +607,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vrλ<EFBFBD><EFBFBD>
/// 发送vr位置
/// </summary>
void sendvrPos(string sn, string name, uint group, Vector3 v3, Quaternion qua)
{
@@ -601,7 +626,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
/// 发送物体位置
/// </summary>
public void sendGoodPos(string objname, Vector3 v3, Quaternion qua)
{
@@ -620,7 +645,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// ע<EFBFBD><EFBFBD>
/// 注册
/// </summary>
void sendRegister()
{
@@ -631,7 +656,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// ע<EFBFBD><EFBFBD>
/// 注销
/// </summary>
public void sendLogout()
{
@@ -645,7 +670,7 @@ public class VR2 : MonoBehaviour
Application.Quit();
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 请求人物全量数据
/// </summary>
void sendAskInfo()
{
@@ -653,7 +678,7 @@ public class VR2 : MonoBehaviour
sendMessage(5, ask);
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 请求物品全量数据
/// </summary>
void sendGoodAskInfo()
{
@@ -662,7 +687,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ
/// 发送通知
/// </summary>
void sendCom(uint com, int value, float f)
{
@@ -676,7 +701,7 @@ public class VR2 : MonoBehaviour
}
/// <summary>
/// <EFBFBD>ظ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
/// 回给平板消息
/// </summary>
void sendBackInfo()
{
@@ -686,13 +711,13 @@ public class VR2 : MonoBehaviour
}
#endregion
#region <EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>Ϣִ<EFBFBD><EFBFBD>
#region
private void HandleTimeLineProgress(string msg)
{
try
{
//TimelineProgress timelineProgress = JsonConvert.DeserializeObject<TimelineProgress>(msg);
//Debug.Log($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ: {msg}");
//Debug.Log($"解析时间轴消息: {msg}");
//if (Config.Group == timelineProgress.group)
//{
// OnTimelineProgress.Invoke(timelineProgress.scene, timelineProgress.progress);
@@ -700,7 +725,7 @@ public class VR2 : MonoBehaviour
}
catch (Exception ex)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
Debug.LogError($"解析时间轴时遇到错误: {ex.Message}");
}
}
@@ -721,7 +746,7 @@ public class VR2 : MonoBehaviour
// if (Config.SN != inform.sn)
// {
// Player player = otherPlayers.Find(inform.sn).GetComponent<Player>();
// GlobalEventMgr.Dispatch(GameEvent.EventAnimalSync, inform.value, player.transform.position); //<EFBFBD>յ<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// GlobalEventMgr.Dispatch(GameEvent.EventAnimalSync, inform.value, player.transform.position); //收到同组玩家创建动物
// }
// break;
// default:
@@ -730,7 +755,7 @@ public class VR2 : MonoBehaviour
//}
//catch (Exception ex)
//{
// Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
// Debug.LogError($"解析玩家通知时遇到错误: {ex.Message}");
//}
}
private void HandleVRControl(string msg)
@@ -761,13 +786,13 @@ public class VR2 : MonoBehaviour
case 6:
switch (vrControl.volume)
{
case 0://<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case 0://启动
break;
case 1://<EFBFBD><EFBFBD>ͣ
case 1://暂停
break;
case 2://<EFBFBD>ر<EFBFBD>
case 2://关闭
break;
}
@@ -777,7 +802,7 @@ public class VR2 : MonoBehaviour
}
catch (Exception ex)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
Debug.LogError($"解析控制设备时遇到错误: {ex.Message}");
}
}
@@ -787,16 +812,16 @@ public class VR2 : MonoBehaviour
try
{
var allIfo = JsonConvert.DeserializeObject<AllIfo>(msg);
var currentSNs = new HashSet<string>(); // <EFBFBD><EFBFBD>ǰ֡<EFBFBD><EFBFBD> SN <20><><EFBFBD><EFBFBD>
var currentSNs = new HashSet<string>(); // 当前帧的 SN 集合
foreach (var vrGroupInfo in allIfo.all)
{
foreach (var vrpos in vrGroupInfo.vrs)
{
// <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD> vrpos.sn
// 记录所有 vrpos.sn
currentSNs.Add(vrpos.sn);
Player p;
if (string.Equals(vrpos.sn, Config.SN))//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD>
if (string.Equals(vrpos.sn, Config.SN))//如果是自己,则获得组名,获得体验者昵称
{
p = cameraTran.Find("Player").GetComponent<Player>();
p.group = Config.Group = vrpos.group;
@@ -811,19 +836,19 @@ public class VR2 : MonoBehaviour
}
}
// <EFBFBD>ԱȲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD> SN
// 对比差异并隐藏消失的 SN
var missingSNs = _previousSNs.Except(currentSNs);
foreach (var sn in missingSNs)
{
otherPlayers.Find(sn).gameObject.SetActive(false);
}
// <EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><EFBFBD><EFBFBD>
// 更新缓存
_previousSNs = currentSNs;
}
catch (Exception ex)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
Debug.LogError($"解析所有玩家信息时遇到错误: {ex.Message}");
}
}
@@ -839,7 +864,7 @@ public class VR2 : MonoBehaviour
}
catch (Exception ex)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
Debug.LogError($"解析物体位置时遇到错误: {ex.Message}");
}
}
void HandleVRPosition(string msg)
@@ -852,7 +877,7 @@ public class VR2 : MonoBehaviour
}
catch (Exception ex)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
Debug.LogError($"解析玩家位置时遇到错误: {ex.Message}");
}
}
@@ -866,13 +891,13 @@ public class VR2 : MonoBehaviour
}
catch (Exception ex)
{
Debug.LogError($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}");
Debug.LogError($"解析玩家注销时遇到错误: {ex.Message}");
}
}
#endregion
int lastSceneIndex;//<EFBFBD>ϴγ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int lastSceneIndex;//上次场景索引
IEnumerator loadSceneAsync(int index)
{
if (lastSceneIndex > 0)
@@ -888,14 +913,14 @@ public class VR2 : MonoBehaviour
lastSceneIndex = index;
}
/// <summary>
/// ж<EFBFBD>ؾɳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><EFBFBD><EFBFBD>
/// 卸载旧场景再加载新场景
/// </summary>
public void MyLoadSceneAsync(int index)
{
StartCoroutine(loadSceneAsync(index));
}
// <EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Memory<byte><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> List<byte>.AddRange<EFBFBD><EFBFBD>
// 合并两个 Memory<byte>(模拟 List<byte>.AddRange
private Memory<byte> CombineMemory(Memory<byte> a, Memory<byte> b)
{
if (a.IsEmpty) return b;