/// <summary> /// 玩家状态变更 /// </summary> void OnGetPlayerList(byte[] p) { if (playerListProto == null) { playerListProto = new ProtoPlayerList(); } Util.DeSerializeProto <ProtoPlayerList>(p, playerListProto); if (Connection.GetInstance().differentUdpPort&& playerListProto != null) { ProtoPlayerInfo selfInfo = model.GetPlayerInfo(); int selfID = 255; selfID = selfInfo == null ? selfID : selfInfo.id; for (int i = 0; i < playerListProto.players.Length; i++) { ProtoPlayerInfo info = playerListProto.players[i]; if (selfID != info.id) { Connection.GetInstance().AddBroadCastPort(info.id); } } } Debug.Log("刷新玩家信息"); }
public void ActiveObject(int objectIndex, int serverID) { bool isPreSet = objectIndex >= 0; int index = isPreSet ? objectIndex : -objectIndex; if (isPreSet) { if (index < preSetPrefabs.Length) { GameObject go = preSetPrefabs[index]; if (go == null) { return; } go.SetActive(true); SceneGameObject sgo = go.GetComponent <SceneGameObject>(); if (sgo != null) { ProtoPlayerInfo selfInfo = playerModel.GetPlayerInfo(); if (selfInfo != null) { sgo.SetSyncStatus(objectIndex, serverID, true, selfInfo.pos, sgo.GetStartPos(), sgo.GetStartRot()); sceneModel.AddSceneObject(sgo); } } } } }
/// <summary> /// 获取用户ID /// </summary> void OnLogin(byte[] pData) { ProtoPlayerInfo proto = ObjectPool.protoPool.GetOrCreate <ProtoPlayerInfo>(ProtoPool.ProtoRecycleType.PlayerInfo); if (proto.Parse(pData)) { model.SetPlayerInfo(proto); Connection.GetInstance().RemoveBroadCastPort(proto.id); Connection.GetInstance().SetUpMutiDataUdp(proto.id); } }
/// <summary> /// 创建场景对象 /// </summary> /// <param name="objInfo"></param> public void CreateObject(int objectIndex, int serverID, ProtoCreateObject sync) { bool isPreSet = objectIndex >= 0; int index = isPreSet ? objectIndex : -objectIndex; if (index < cratePrefabs.Length) { GameObject prefab = cratePrefabs[index]; if (prefab == null) { Debug.LogError("生成AI:无效对象索引" + objectIndex); return; } GameObject go = GameObject.Instantiate(prefab); #if UNITY_EDITOR go.name = "" + serverID; #endif if (!go.activeSelf) { go.SetActive(true); } //获取/初始化配置数据 BaseAI ai = go.GetComponent <BaseAI>(); if (ai != null) { if (Connection.GetInstance().isHost == true) { AppearObjectData objCfg = AICreater.GetObjectCfg(sync.hashCode); if (objCfg != null) { ai.InitAIData(objCfg); } } sceneModel.RegisterAI(ai); } //设置同步组件 SceneGameObject sgo = go.GetComponent <SceneGameObject>(); if (sgo != null) { ProtoPlayerInfo selfInfo = playerModel.GetPlayerInfo(); if (selfInfo != null) { sgo.SetSyncStatus(objectIndex, serverID, true, selfInfo.pos, sync.GetPos(), sync.GetRot()); sceneModel.AddSceneObject(sgo); } } } else { Debug.LogError("生成AI:无效对象索引" + objectIndex); } }
/// <summary> /// 发送上传输入 /// </summary> void SendSyncInput(EventArgs args) { if (playerInfo == null) { playerInfo = PlayerController.instance.GetModel <PlayerModel>(PlayerModel.name).GetPlayerInfo(); } if (playerInfo == null) { return; } selfInputData[0] = playerInfo.pos; selfInputData[1] = inputModel.selfFires[0]; selfInputData[2] = inputModel.selfFires[1]; Send(ProtoIDCfg.SYNC_INPUT, selfInputData, ProtoType.Importance); }
void OnMsgLogin(TcpHost.SocketAccept socket, byte[] protoData) { ProtoPlayerInfo p; byte id = (byte)socket.id; if (playerInfos.TryGetValue((byte)id, out p)) { p.connectStatus = 1; host.RemoveClient(id); } else { byte loginPos = protoData[0]; bool[] inPosPlayers = new bool[10]; bool canUsePos = true; foreach (var player in playerInfos) { if (player.Value.pos == loginPos) { canUsePos = false; } inPosPlayers[player.Value.pos] = true; } if (!canUsePos) { for (int i = 1; i < inPosPlayers.Length; i++) { if (inPosPlayers[i] == false) { loginPos = (byte)i; break; } } } p = new ProtoPlayerInfo(); p.hp = PlayerCfg.HP; p.score = PlayerCfg.score; p.connectStatus = 1; p.id = id; p.pos = loginPos; playerInfos.Add(id, p); Debug.LogWarning("玩家加入" + id); SyncPlayerList(); } //返回角色数据 SendMsg(socket.id, ProtoIDCfg.LOGIN, p); }
public void SetPlayerInfo(ProtoPlayerInfo playerProto) { playerID = playerProto.id; selfInfo = playerProto; Debug.Log("玩家ID:" + playerID + " 位置:" + playerProto.pos); }