public static void StageObjectSpawned(Packet packet) { BaseBuildInfo info = Deserialize <BaseBuildInfo>(packet); //Debug.Log(info.GetType()); //Debug.Log(info is PlayerBuildInfo); //Debug.Log(info.GetType() == typeof(BaseBuildInfo)); GameManager.instance.SpawnStageObject(info, BuildType.Client); }
public static void StageSynchronize(int clientID, List <StageObjectPair> clientObjs) { Debug.Log($"收到了 客户端{clientID} 发来的场景同步请求"); List <StageObjectPair> serverObjs = StageManager.instance.GetStageObjectPairs(new List <StageObjectPair> { new StageObjectPair { category = StageObjectCategory.Player, id = clientID } }); //得到除去该客户端Player以外的元素 IEnumerable <StageObjectPair> intersection = serverObjs.Intersect(clientObjs); IEnumerable <StageObjectPair> serverOnly = serverObjs.Except(intersection); IEnumerable <StageObjectPair> clientOnly = clientObjs.Except(intersection); Debug.Log($"当前:{serverObjs.Count},客户端:{clientObjs.Count},交集:{intersection.Count()},服务器独有:{serverOnly.Count()},客户端独有:{clientOnly.Count()}"); List <Vector3Holder> posList = new List <Vector3Holder>(); List <QuaternionHolder> rotList = new List <QuaternionHolder>(); foreach (StageObjectPair pair in intersection) { BaseStageObject obj = StageManager.instance.GetStageObject(pair.category, pair.id); posList.Add(new Vector3Holder { category = pair.category, id = pair.id, vect = obj.transform.position }); rotList.Add(new QuaternionHolder { category = pair.category, id = pair.id, quat = obj.transform.rotation }); } ServerSend.StageObjectPositions(clientID, posList); ServerSend.StageObjectRotations(clientID, rotList); ServerSend.StageObjectDespawned(clientID, clientOnly.ToList()); foreach (StageObjectPair pair in serverOnly) { BaseStageObject obj = StageManager.instance.GetStageObject(pair.category, pair.id); if (obj.builder != null) { BaseBuildInfo info = obj.builder.GenerateBuildInfo(obj); if (info != null) { ServerSend.StageObjectSpawned(clientID, info); } } } }