public override void OnResponse(string data) { //由于SendRequest执行的时机,点击创建房间后,是在加载RoomPanel时马上获得该Request执行SendRequest,然后又很快的执行OnResponse,所以SendRequest与OnResponse //执行间隔很短,OnResponse的执行可能在Start之前完成,就会导致_roomPanel报空 //所以放在更早的Awake进行初始化。这里不能进行初始化,因为新开线程不能调用主线程的内容 // //解析data string[] dataArr = data.Split('#'); ReturnType returnType = (ReturnType)int.Parse(dataArr[0]); if (returnType == ReturnType.Successful) { //说明创建房间成功-剩余工作交给RoomPanel进行 //获得服务器分配的角色 RoleColor roleColor = (RoleColor)(int.Parse(dataArr[1])); //设置该客户端的角色类型 GameFacade.Instance.PlayerManager.SetCurrentControllRoleColor(roleColor); _roomPanel.HandleCreatRoomResponse(true); } else if (returnType == ReturnType.Failed) { //说明创建房间失败-剩余工作交给RoomPanel进行 _roomPanel.HandleCreatRoomResponse(false); } }
/// <summary> /// 发送同步箭请求 /// </summary> /// <param name="roleType">发射这个箭的角色类型</param> /// <param name="positon">箭的位置</param> /// <param name="rotation">箭的方向</param> public void SendRequest(RoleColor roleColor, Vector3 positon, Vector3 rotation) { string data = (int)roleColor + "*" + positon.x + "#" + positon.y + "#" + positon.z + "*" + rotation.x + "#" + rotation.y + "#" + rotation.z; Request syncArrowRequest = new Request((int)requestType, (int)actionType, data); byte[] dataBytes = ConverterTool.SerialRequestObj(syncArrowRequest); GameFacade.Instance.ClientManager.SendMsgToServer(dataBytes); //GameFacade.Instance.ClientManager.SendRequestToServer(requestCode, actionCode, data); }
/// <summary> /// /// </summary> private void SyncRemoteRoleArrow(RoleColor roleColor, Vector3 position, Vector3 eulerAngles) { //获得远端角色的箭的预制体 GameObject remoteRoleArrowPrefab = GameFacade.Instance.PlayerManager.roleDataDict.TryGet(roleColor).ArrowPrefab; //在这个客户端进行实例化 GameObject remoteArr = Instantiate(remoteRoleArrowPrefab, position, Quaternion.Euler(eulerAngles)); //设置箭的类型-远端箭 remoteArr.GetComponent <Arrow>().arrowInstantType = ArrowInstantiateType.Remote; }
/// <summary> /// 为当前控制的角色添加组件 /// </summary> public void AddComponentToCurrentControllRole() { //添加移动组件 _currentControllRoleGo.AddComponent <PlayerMove>(); //获取该角色的角色类型-【虽然和这里的_currentControllRoleType相同】 RoleColor roleColor = _currentControllRoleGo.GetComponent <RoleInfo>().roleColor; //添加攻击组件 PlayerAttack pa = _currentControllRoleGo.AddComponent <PlayerAttack>(); //设置箭的预制体 pa.arrowPrefab = roleDataDict.TryGet(roleColor).ArrowPrefab; }
/// <summary> /// 处理同步箭请求的响应 /// </summary> /// <param name="data"></param> public override void OnResponse(string data) { //解析数据 string[] dataArr = data.Split('*'); RoleColor arrowType = (RoleColor)int.Parse(dataArr[0]);//获得箭是那种角色发的 string[] positionArr = dataArr[1].Split('#'); string[] eulerAnglesArr = dataArr[2].Split('#'); Vector3 position = new Vector3(float.Parse(positionArr[0]), float.Parse(positionArr[1]), float.Parse(positionArr[2])); Vector3 eulerAngles = new Vector3(float.Parse(eulerAnglesArr[0]), float.Parse(eulerAnglesArr[1]), float.Parse(eulerAnglesArr[2])); //按照这些数据进行创建-改变标志位-后交给Update来处理 _remoteRoleArrowInitPosition = position; _remoteRoleArrowInitEulerAngles = eulerAngles; _remoteRoleColor = arrowType; isNeedSyncArrow = true;//改变标志位-执行 }
/// <summary> /// 处理加入房间请求的响应 /// </summary> /// <param name="data"></param> public override void OnResponse(string data) { //解析响应数据 string[] dataStrArr = data.Split('-');//1级分割 ReturnType returnType = (ReturnType)int.Parse(dataStrArr[0]); if (returnType == ReturnType.Successful) { //解析服务器分配的角色类型 RoleColor roleColor = (RoleColor)int.Parse(dataStrArr[1]); //设置角色类型 GameFacade.Instance.PlayerManager.SetCurrentControllRoleColor(roleColor); //用于存储解析出来的数据 List <User> userList = new List <User>(); List <Score> scoreList = new List <Score>(); //加入房间成功 string[] usersdataStrArr = dataStrArr[2].Split('*');//二级分割 foreach (string temp in usersdataStrArr) { string[] userdata = temp.Split('#'); //三级分割 string username = userdata[1]; //从1下标开始,0是id,目前用不上 int totalCount = int.Parse(userdata[2]); int winCount = int.Parse(userdata[3]); User user = new User(); user.Username = username; Score score = new Score(); score.TotalCount = totalCount; score.WinCount = winCount; userList.Add(user); scoreList.Add(score); } //后续操作交给RoomListPanel _roomListPanel.HandleJoinRoomResponse(true, userList, scoreList); } else if (returnType == ReturnType.Failed) { //加入房间失败. //后续操作交给RoomListPanel _roomListPanel.HandleJoinRoomResponse(false, null, null); } }
/// <summary> /// 设置当前控制角色【弃用】 /// </summary> /// <param name="roleType"></param> //public void SetCurrentControllRoleType(RoleType roleType) //{ // _currentControllRoleType = roleType; //} public void SetCurrentControllRoleColor(RoleColor roleColor) { _currentControllRoleColor = roleColor; }
/// <summary> /// 角色数据模型 /// </summary> /// <param name="roleType">角色类型</param> /// <param name="rolePrefabPath">角色预制体路径</param> /// <param name="arrowPrefabPath">该角色箭的预制体路径</param> /// <param name="effectPrefab">该角色箭的命中特效预制体路径</param> public RoleData(RoleColor roleColor, string rolePrefabPath, string arrowPrefabPath) { _roleColor = roleColor; _rolePrefab = Resources.Load(rolePrefabPath) as GameObject; _arrowPrefab = Resources.Load(arrowPrefabPath) as GameObject; }