// 本脚本只在不存在时会生成一次。已存在不会再次生成覆盖 using System.Collections.Generic; using Assets.Scripts.Entity; using Assets.Scripts.Hotfix; using FairyGUI; using Fantasy; using Fantasy.Async; using Fantasy.Network; using NBC; using UnityEngine; using Log = NBC.Log; using UIPanel = NBC.UIPanel; namespace NBF { public partial class ChatTestPanel : UIPanel { private List _messages = new List(); protected override void OnInit() { this.AutoAddClick(OnClick); } protected override void OnShow() { SetLoginState(false); } private void RefreshList() { ChatList.RemoveChildrenToPool(); foreach (var item in _messages) { if(ChatList.AddItemFromPool() is ChatItem chatItem) { chatItem.InitData(item); } } } private void OnClick(GComponent btn) { if (btn == BtnLogin) { if (string.IsNullOrEmpty(InputAccount.text)) { Notices.Info("没有输入账号密码"); return; } OnLoginButtonClick(InputAccount.text).Coroutine(); } else if (btn == BtnSendWorld) { OnSendMessage(InputMessage.title).Coroutine(); } } private void SetLoginState(bool isLogin = false, string account = "") { if (isLogin) { BtnLogin.visible = false; BtnLogout.visible = true; TextLoginInfo.text = account; } else { BtnLogin.visible = true; BtnLogout.visible = false; } } #region 登录测试 private Session _session; private async FTask OnLoginButtonClick(string account) { // NBC.Platform.Unity.Entry.Initialize(GetType().Assembly); // 根据用户名来选择目标的鉴权服务器 // 根据鉴权服务器地址来创建一个新的网络会话 _session = SessionHelper.CreateSession(App.Main, "127.0.0.1:20001", OnConnectComplete, OnConnectFail, OnConnectDisconnect); var acc = account; // 发送登录的请求给服务器 var response = (A2C_LoginResponse)await _session.Call(new C2A_LoginRequest() { Username = acc, Password = acc, LoginType = 1 }); if (response.ErrorCode != 0) { Log.Error($"登录发生错误{response.ErrorCode}"); return; } if (!App.Main.GetComponent().Parse(response.ToKen, out var payload)) { return; } // 根据ToKen返回的Address登录到Gate服务器 _session = SessionHelper.CreateSession(App.Main, payload.Address, OnConnectComplete, OnConnectFail, OnConnectDisconnect); // 发送登录请求到Gate服务器 var loginResponse = (G2C_LoginResponse)await _session.Call(new C2G_LoginRequest() { ToKen = response.ToKen }); if (loginResponse.ErrorCode != 0) { Log.Error($"登录发生错误{loginResponse.ErrorCode}"); return; } SetLoginState(true, InputAccount.text); Log.Debug( $"登录到Gate服务器成功!ErrorCode:{loginResponse.ErrorCode}"); // Log.Debug( // $"登录到Gate服务器成功!LoginTime:{loginResponse.GameAccountInfo.LoginTime} CreateTime:{loginResponse.GameAccountInfo.CreateTime}"); // var getResponse = (G2C_GetAccountInfoResponse)await _session.Call(new C2G_GetAccountInfoRequest()); // var gameAcc = getResponse.GameAccountInfo; // Log.Info($"gameAcc LoginTime:{gameAcc.LoginTime} CreateTime:{gameAcc.CreateTime}"); // getResponse.GameAccountInfo.LoginTime.ToString() } private void OnConnectComplete() { Log.Debug("连接成功"); // 添加心跳组件给Session。 // Start(2000)就是2000毫秒。 _session.AddComponent().Start(5000); } private void OnConnectFail() { Log.Debug("连接失败"); SetLoginState(false); } private void OnConnectDisconnect() { Log.Debug("连接断开"); SetLoginState(false); } #endregion #region 发生消息测试 private async FTask OnSendMessage(string message) { var messageResponse = (S2C_SendMessageResponse)await _session.Call(new C2S_SendMessageRequest() { Message = message }); if (messageResponse.ErrorCode != 0) { Notices.Info($"发送消息失败,code={messageResponse.ErrorCode}"); } } public void Message(string message) { _messages.Add(message); RefreshList(); } #endregion } }