NewN_UAVPlane/Assets/Zion/Scripts/Sync1/OneValueSyncObject.cs

273 lines
8.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Text;
/// <summary>
/// 单值同步
/// </summary>
public class OneValueSyncObject : SyncBase
{
public static Dictionary<string, OneValueSyncObject> OneAxisSyncObjectList = new Dictionary<string, OneValueSyncObject>();
[HideInInspector]
[SerializeField]
public ValueType valueType;
/// <summary>
/// 同步回调 <id,是否为进房间>
/// </summary>
[HideInInspector]
public Action<string,bool> callbackInmono;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public bool mybool;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public byte mybyte;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public short myshort;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public int myint;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public float myfloat;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public double mydouble;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public string mystring;
[SerializeField]
[HideInInspector]
[DisplayOnly]
public Vector3 myvector3;
public bool = false;
private st_Motions st_Motions = new st_Motions { m_iOperaType = 10006 };
private int lastindex;
/// <summary>
/// 打分回调
/// </summary>
public Action action_apprisedetail;
private void OnDestroy()
{
if(OneAxisSyncObjectList.ContainsKey(Id))
{
OneAxisSyncObjectList.Remove(Id);
}
}
public void InitDynamic(string id = "", Action<string,bool> callbackInMono = null, ValueType TmpvalueType = ValueType.Null)
{
if (GameManage.Instance.is单机模式)
{
return;
}
if (hasInit)
{
Debug.Log("已经初始化,不能重复初始化");
return;
}
if (string.IsNullOrEmpty(id))
{
if (string.IsNullOrEmpty(Id))
{
Debug.LogError("Id为空");
return;
}
}
else
{
Id = id;
}
if(TmpvalueType!= ValueType.Null)
{
this.valueType = TmpvalueType;
}
else if(valueType== ValueType.Null)
{
Debug.LogError("类型为空:"+gameObject.name);
return;
}
this.callbackInmono= callbackInMono;
st_Motions.area = LoadManage.Instance.currentRoomArea;
List<byte> tmpbytes = new List<byte>();
//syncId
tmpbytes.AddRange(BitConverter.GetBytes(LoadManage.Instance.SyncId));
//id
byte[] data=Encoding.UTF8.GetBytes(Id);
tmpbytes.AddRange(BitConverter.GetBytes(data.Length));
tmpbytes.AddRange(data);
//类型
tmpbytes.Add((byte)valueType);
//回调
tmpbytes.Add(callbackInmono == null?(byte)0:(byte)1);
switch (valueType)
{
case ValueType.Null:
Debug.LogError("类型不能为空");
return;
case ValueType.Bool:
tmpbytes.Add(new byte());
lastindex = tmpbytes.Count - 1;
break;
case ValueType.Byte:
tmpbytes.Add(new byte());
lastindex = tmpbytes.Count - 1;
break;
case ValueType.Short:
tmpbytes.AddRange(new byte[2]);
lastindex = tmpbytes.Count - 2;
break;
case ValueType.Int:
tmpbytes.AddRange(new byte[4]);
lastindex = tmpbytes.Count - 4;
break;
case ValueType.Float:
tmpbytes.AddRange(new byte[4]);
lastindex = tmpbytes.Count - 4;
break;
case ValueType.Double:
tmpbytes.AddRange(new byte[8]);
lastindex = tmpbytes.Count - 8;
break;
case ValueType.String:
tmpbytes.AddRange(new byte[4]);
lastindex = tmpbytes.Count - 4;
break;
case ValueType.Vector3:
tmpbytes.AddRange(new byte[12]);
lastindex = tmpbytes.Count - 12;
break;
}
st_Motions.m_sOperaData = tmpbytes.ToArray();
OneAxisSyncObjectList.Add(Id, this);
hasInit = true;
}
/// <summary>
/// 发送同步
/// </summary>
public void SendSync()
{
if (!GameManage.Instance.is单机模式)
{
switch (valueType)
{
case ValueType.Null:
Debug.LogError("类型不能为空");
return;
case ValueType.Bool:
st_Motions.m_sOperaData[lastindex] = mybool ? (byte)1 : (byte)0;
break;
case ValueType.Byte:
st_Motions.m_sOperaData[lastindex] = mybyte;
break;
case ValueType.Short:
Array.Copy(BitConverter.GetBytes(myshort), 0, st_Motions.m_sOperaData, lastindex, 2);
break;
case ValueType.Int:
Array.Copy(BitConverter.GetBytes(myint), 0, st_Motions.m_sOperaData, lastindex, 4);
break;
case ValueType.Float:
Array.Copy(BitConverter.GetBytes(myfloat), 0, st_Motions.m_sOperaData, lastindex, 4);
break;
case ValueType.Double:
Array.Copy(BitConverter.GetBytes(mydouble), 0, st_Motions.m_sOperaData, lastindex, 8);
break;
case ValueType.String:
byte[] tmpstring = Encoding.UTF8.GetBytes(mystring);
Array.Copy(BitConverter.GetBytes(tmpstring.Length), 0, st_Motions.m_sOperaData, lastindex, 4);
byte[] data = new byte[lastindex + 4 + tmpstring.Length];
Array.Copy(st_Motions.m_sOperaData, 0, data, 0, lastindex + 4);
Array.Copy(tmpstring, 0, data, lastindex + 4, tmpstring.Length);
st_Motions.m_sOperaData = data;
break;
case ValueType.Vector3:
Array.Copy(BitConverter.GetBytes(myvector3.x), 0, st_Motions.m_sOperaData, lastindex, 4);
Array.Copy(BitConverter.GetBytes(myvector3.y), 0, st_Motions.m_sOperaData, lastindex + 4, 4);
Array.Copy(BitConverter.GetBytes(myvector3.z), 0, st_Motions.m_sOperaData, lastindex + 8, 4);
break;
}
LoadManage.Instance.RSclient.Send(st_Motions);
}
}
/// <summary>
/// 设置值
/// </summary>
public void SetValue(int start,byte[] data)
{
switch ((ValueType)(data[start]))
{
case ValueType.Null:
Debug.LogError("类型不能为空");
return ;
case ValueType.Bool:
mybool = (data[start + 2] == 1 ? true : false);
break;
case ValueType.Byte:
mybyte = data[start+2];
break;
case ValueType.Short:
myshort = BitConverter.ToInt16(data, start+2);
break;
case ValueType.Int:
myint = BitConverter.ToInt32(data, start + 2);
break;
case ValueType.Float:
myfloat = BitConverter.ToSingle(data, start + 2);
break;
case ValueType.Double:
mydouble = BitConverter.ToDouble(data, start + 2);
break;
case ValueType.String:
int length = BitConverter.ToInt32(data, start + 2);
mystring = Encoding.UTF8.GetString(data, start + 6, length);
break;
case ValueType.Vector3:
myvector3.x = BitConverter.ToSingle(data, start + 2);
myvector3.y= BitConverter.ToSingle(data, start + 6);
myvector3.z = BitConverter.ToSingle(data, start + 10);
break;
}
}
}
public enum ValueType
{
Null,
Bool,
Byte,
Short,
Int,
Float,
Double,
String,
Vector3
}