Update
This commit is contained in:
ALEXTANG
2023-07-13 21:02:29 +08:00
parent 0c51ae7bdd
commit 72b7149aa1
21 changed files with 2784 additions and 1 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ed92f6b6b24543747bc10eba9141feb1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7de46f8a9c58a584289bbc481e85271a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,58 @@
using TEngine;
namespace GameLogic
{
public interface IDataCenterModule
{
void Init();
void OnRoleLogin();
void OnRoleLogout();
void OnUpdate();
void OnMainPlayerMapChange();
}
public class DataCenterModule<T> : IDataCenterModule where T : new()
{
private static T _instance;
public static T Instance
{
get
{
if (null == _instance)
{
_instance = new T();
Log.Assert(_instance != null);
}
return _instance;
}
}
public virtual void Init()
{
}
public virtual void OnRoleLogin()
{
}
public virtual void OnRoleLogout()
{
}
public virtual void OnUpdate()
{
}
public virtual void OnMainPlayerMapChange()
{
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1ef4b9e7ceb44a37b83ee7bca1726d93
timeCreated: 1689248879

View File

@@ -0,0 +1,72 @@
using System.Collections.Generic;
using TEngine;
namespace GameLogic
{
/// <summary>
/// 数据中心模块。
/// </summary>
public class DataCenterSys : BaseLogicSys<DataCenterSys>
{
/// <summary>
/// 子模块集合。
/// </summary>
private readonly List<IDataCenterModule> _listModule = new List<IDataCenterModule>();
/// <summary>
/// 初始化数据中心。
/// </summary>
/// <returns></returns>
public override bool OnInit()
{
InitModule();
InitOtherModule();
return true;
}
/// <summary>
/// 初始化数据中心接口。
/// </summary>
/// <param name="module"></param>
public void InitModule(IDataCenterModule module)
{
if (_listModule.Contains(module))
{
return;
}
module.Init();
_listModule.Add(module);
}
/// <summary>
/// 初始化数据中心模块。
/// </summary>
void InitModule()
{
InitModule(PlayerNetSys.Instance);
}
/// <summary>
/// 初始化数据中心其他模块。
/// <remarks>优先级低于InitModule。</remarks>
/// </summary>
void InitOtherModule()
{
}
/// <summary>
/// 帧更新驱动。
/// </summary>
public override void OnUpdate()
{
var listModule = _listModule;
foreach (var module in listModule)
{
TProfiler.BeginSample(module.GetType().FullName);
module.OnUpdate();
TProfiler.EndSample();
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 11af3015e673484a89ea388dbb2dc2cb
timeCreated: 1689248848

View File

@@ -0,0 +1,120 @@
using System.IO;
using GameBase;
using TEngine;
using TEngine.Core.Network;
namespace GameLogic
{
/// <summary>
/// 网络客户端状态。
/// </summary>
public enum GameClientStatus
{
/// <summary>
/// 初始化。
/// </summary>
StatusInit,
/// <summary>
/// 连接成功服务器。
/// </summary>
StatusConnected,
/// <summary>
/// 重新连接。
/// </summary>
StatusReconnect,
/// <summary>
/// 断开连接。
/// </summary>
StatusClose,
/// <summary>
/// 登录中。
/// </summary>
StatusLogin,
/// <summary>
/// AccountLogin成功进入服务器了。
/// </summary>
StatusEnter,
}
/// <summary>
/// 网络客户端。
/// </summary>
public class GameClient:Singleton<GameClient>
{
public readonly NetworkProtocolType ProtocolType = NetworkProtocolType.KCP;
public GameClientStatus Status { get; set; } = GameClientStatus.StatusInit;
public Scene Scene { private set; get; }
private string _lastAddress = null;
public GameClient()
{
Scene = GameApp.Instance.Scene;
}
public void Connect(string address, bool reconnect = false)
{
if (!reconnect)
{
// SetWatchReconnect(false);
}
if (reconnect)
{
// GameEvent.Get<ICommUI>().ShowWaitUITip(WaitUISeq.LOGINWORLD_SEQID, G.R(TextDefine.ID_TIPS_RECONNECTING));
}
else
{
// GameEvent.Get<ICommUI>().ShowWaitUI(WaitUISeq.LOGINWORLD_SEQID);
}
_lastAddress = address;
Status = reconnect ? GameClientStatus.StatusReconnect : GameClientStatus.StatusInit;
Scene.CreateSession(address, ProtocolType, OnConnectComplete, OnConnectFail);
}
private void OnConnectComplete()
{
Status = GameClientStatus.StatusConnected;
Log.Info("Connect to server success");
}
private void OnConnectFail()
{
Status = GameClientStatus.StatusClose;
Log.Warning("Could not connect to server");
}
public virtual void Send(object message, uint rpcId = 0, long routeId = 0)
{
if (Scene.Session == null)
{
Log.Error("Send Message Failed Because Session Is Null");
return;
}
Scene.Session.Send(message,rpcId,routeId);
}
public virtual void Send(IRouteMessage routeMessage, uint rpcId = 0, long routeId = 0)
{
if (Scene.Session == null)
{
Log.Error("Send Message Failed Because Session Is Null");
return;
}
Scene.Session.Send(routeMessage,rpcId,routeId);
}
public virtual void Send(MemoryStream memoryStream, uint rpcId = 0, long routeTypeOpCode = 0, long routeId = 0)
{
if (Scene.Session == null)
{
Log.Error("Send Message Failed Because Session Is Null");
return;
}
Scene.Session.Send(memoryStream,rpcId,routeTypeOpCode,routeId);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 346da02ec1b54ce7938cabd8511d4404
timeCreated: 1689250782

View File

@@ -7,6 +7,8 @@ public partial class GameApp:Singleton<GameApp>
{
private static List<Assembly> _hotfixAssembly;
public Scene Scene { private set; get; }
/// <summary>
/// 热更域App主入口。
/// </summary>
@@ -33,7 +35,7 @@ public partial class GameApp:Singleton<GameApp>
/// </summary>
private void StartGameLogic()
{
GameModule.UI.ShowUIAsync<NetWorkDemoUI>();
}
/// <summary>

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using GameLogic;
using TEngine;
using TEngine.Core;
@@ -26,6 +27,7 @@ public partial class GameApp
/// </summary>
private void RegisterAllSystem()
{
Scene = GameSystem.Init();
if (_hotfixAssembly != null)
{
AssemblyManager.Load(AssemblyName.GameBase, _hotfixAssembly.Find(t=>t.FullName.Contains("GameBase")));
@@ -35,6 +37,7 @@ public partial class GameApp
//带生命周期的单例系统。
AddLogicSys(BehaviourSingleSystem.Instance);
AddLogicSys(DataCenterSys.Instance);
}
/// <summary>

View File

@@ -0,0 +1,101 @@
using GameLogic;
using UnityEngine;
using UnityEngine.UI;
using TEngine;
[Window(UILayer.UI)]
class NetWorkDemoUI : UIWindow
{
#region
private GameObject m_goScrollView;
private Transform m_tfContent;
private GameObject m_itemNetLog;
private GameObject m_goConnect;
private Button m_btnConnect;
private GameObject m_goLogin;
private InputField m_inputPassWord;
private InputField m_inputName;
private Button m_btnLogin;
private Button m_btnRegister;
public override void ScriptGenerator()
{
m_goScrollView = FindChild("Panel/m_goScrollView").gameObject;
m_tfContent = FindChild("Panel/m_goScrollView/Viewport/m_tfContent");
m_itemNetLog = FindChild("Panel/m_goScrollView/Viewport/m_tfContent/m_itemNetLog").gameObject;
m_goConnect = FindChild("Panel/m_goConnect").gameObject;
m_btnConnect = FindChildComponent<Button>("Panel/m_goConnect/m_btnConnect");
m_goLogin = FindChild("Panel/m_goLogin").gameObject;
m_inputPassWord = FindChildComponent<InputField>("Panel/m_goLogin/m_inputPassWord");
m_inputName = FindChildComponent<InputField>("Panel/m_goLogin/m_inputName");
m_btnLogin = FindChildComponent<Button>("Panel/m_goLogin/m_btnLogin");
m_btnRegister = FindChildComponent<Button>("Panel/m_goLogin/m_btnRegister");
m_btnConnect.onClick.AddListener(OnClickConnectBtn);
m_btnLogin.onClick.AddListener(OnClickLoginBtn);
m_btnRegister.onClick.AddListener(OnClickRegisterBtn);
}
#endregion
#region
private void OnClickConnectBtn()
{
GameClient.Instance.Connect("127.0.0.1:20000");
}
private void OnClickLoginBtn()
{
if (GameClient.Instance.Status == GameClientStatus.StatusInit)
{
Log.Info("没有连接到服务器、请先点击连接到服务器按钮在进行此操作");
return;
}
if (string.IsNullOrEmpty(m_inputName.text) || string.IsNullOrEmpty(m_inputPassWord.text))
{
Log.Info("请输入账号和密码");
return;
}
GameClient.Instance.Send(new H_C2G_LoginRequest()
{
UserName = m_inputName.text,
Password = m_inputPassWord.text
});
}
private void OnClickRegisterBtn()
{
}
#endregion
private void RefreshLog()
{
}
}
namespace GameLogic
{
[Window(UILayer.UI)]
class NetWorkDemoLog : UIWindow
{
#region
private Text m_textInfo;
public override void ScriptGenerator()
{
m_textInfo = FindChildComponent<Text>("m_textInfo");
}
#endregion
public void SetText(string value)
{
m_textInfo.text = value;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8079c660ac3636e45a2de14f5dbcc940
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
using System;
using TEngine;
using TEngine.Core;
using TEngine.Core.Network;
namespace GameLogic
{
/// <summary>
/// 玩家信息网络模块。
/// </summary>
public class PlayerNetSys:DataCenterModule<PlayerNetSys>
{
public override void Init()
{
base.Init();
}
}
public class H_C2G_LoginRequestHandler : MessageRPC<H_C2G_LoginRequest,H_G2C_LoginResponse>
{
protected override async FTask Run(Session session, H_C2G_LoginRequest request, H_G2C_LoginResponse response, Action reply)
{
Log.Debug($"收到请求登录的消息 request:{request.ToJson()}");
response.Text = "登录成功";
await FTask.CompletedTask;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a16f1c71dea04c5a890b75eda47df16a
timeCreated: 1689248961

View File

@@ -0,0 +1,157 @@
using ProtoBuf;
using Unity.Mathematics;
using System.Collections.Generic;
using TEngine.Core.Network;
#pragma warning disable CS8618
namespace TEngine
{
/// <summary>
/// 发送一个消息到Gate服务器
/// </summary>
[ProtoContract]
public partial class H_C2G_Message : AProto, IMessage
{
public uint OpCode() { return OuterOpcode.H_C2G_Message; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 发送一个RPC消息到Gate服务器
/// </summary>
[ProtoContract]
public partial class H_C2G_MessageRequest : AProto, IRequest
{
[ProtoIgnore]
public H_G2C_MessageResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.H_C2G_MessageRequest; }
[ProtoMember(1)]
public string Message { get; set; }
}
[ProtoContract]
public partial class H_G2C_MessageResponse : AProto, IResponse
{
public uint OpCode() { return OuterOpcode.H_G2C_MessageResponse; }
[ProtoMember(91, IsRequired = true)]
public int ErrorCode { get; set; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 发送一个消息通知服务器给客户端推送一个消息
/// </summary>
[ProtoContract]
public partial class H_C2G_PushMessageToClient : AProto, IMessage
{
public uint OpCode() { return OuterOpcode.H_C2G_PushMessageToClient; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 客户端接收服务器推送的一条消息
/// </summary>
[ProtoContract]
public partial class H_G2C_ReceiveMessageToServer : AProto, IMessage
{
public uint OpCode() { return OuterOpcode.H_G2C_ReceiveMessageToServer; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 注册Address消息
/// </summary>
[ProtoContract]
public partial class H_C2G_LoginAddressRequest : AProto, IRequest
{
[ProtoIgnore]
public H_G2C_LoginAddressResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.H_C2G_LoginAddressRequest; }
[ProtoMember(1)]
public string Message { get; set; }
}
[ProtoContract]
public partial class H_G2C_LoginAddressResponse : AProto, IResponse
{
public uint OpCode() { return OuterOpcode.H_G2C_LoginAddressResponse; }
[ProtoMember(91, IsRequired = true)]
public int ErrorCode { get; set; }
}
/// <summary>
/// 发送一个Address消息给Map
/// </summary>
[ProtoContract]
public partial class H_C2M_Message : AProto, IAddressableRouteMessage
{
public uint OpCode() { return OuterOpcode.H_C2M_Message; }
public long RouteTypeOpCode() { return CoreRouteType.Addressable; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 发送一个AddressRPC消息给Map
/// </summary>
[ProtoContract]
public partial class H_C2M_MessageRequest : AProto, IAddressableRouteRequest
{
[ProtoIgnore]
public H_M2C_MessageResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.H_C2M_MessageRequest; }
public long RouteTypeOpCode() { return CoreRouteType.Addressable; }
[ProtoMember(1)]
public string Message { get; set; }
}
[ProtoContract]
public partial class H_M2C_MessageResponse : AProto, IAddressableRouteResponse
{
public uint OpCode() { return OuterOpcode.H_M2C_MessageResponse; }
[ProtoMember(91, IsRequired = true)]
public int ErrorCode { get; set; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 发送一个消息通知服务器给客户端推送一个Address消息
/// </summary>
[ProtoContract]
public partial class H_C2M_PushAddressMessageToClient : AProto, IAddressableRouteMessage
{
public uint OpCode() { return OuterOpcode.H_C2M_PushAddressMessageToClient; }
public long RouteTypeOpCode() { return CoreRouteType.Addressable; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 客户端接收服务器推送的一条Address消息
/// </summary>
[ProtoContract]
public partial class H_M2C_ReceiveAddressMessageToServer : AProto, IAddressableRouteMessage
{
public uint OpCode() { return OuterOpcode.H_M2C_ReceiveAddressMessageToServer; }
public long RouteTypeOpCode() { return CoreRouteType.Addressable; }
[ProtoMember(1)]
public string Message { get; set; }
}
/// <summary>
/// 客户端发送消息请求登录服务器
/// </summary>
[ProtoContract]
public partial class H_C2G_LoginRequest : AProto, IRequest
{
[ProtoIgnore]
public H_G2C_LoginResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.H_C2G_LoginRequest; }
[ProtoMember(1)]
public string UserName { get; set; }
[ProtoMember(2)]
public string Password { get; set; }
}
[ProtoContract]
public partial class H_G2C_LoginResponse : AProto, IResponse
{
public uint OpCode() { return OuterOpcode.H_G2C_LoginResponse; }
[ProtoMember(91, IsRequired = true)]
public int ErrorCode { get; set; }
[ProtoMember(1)]
public string Text { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5b1b62e3a467f384ab288e354631af67
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,20 @@
namespace TEngine
{
public static partial class OuterOpcode
{
public const int H_C2G_Message = 100000001;
public const int H_C2G_MessageRequest = 110000001;
public const int H_G2C_MessageResponse = 160000001;
public const int H_C2G_PushMessageToClient = 100000002;
public const int H_G2C_ReceiveMessageToServer = 100000003;
public const int H_C2G_LoginAddressRequest = 110000002;
public const int H_G2C_LoginAddressResponse = 160000002;
public const int H_C2M_Message = 190000001;
public const int H_C2M_MessageRequest = 200000001;
public const int H_M2C_MessageResponse = 250000001;
public const int H_C2M_PushAddressMessageToClient = 190000002;
public const int H_M2C_ReceiveAddressMessageToServer = 190000003;
public const int H_C2G_LoginRequest = 110000003;
public const int H_G2C_LoginResponse = 160000003;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4d6b4f93610543d4aba550a41e62c38c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
namespace TEngine.Core.Network
{
// Route协议定义(需要定义1000以上、因为1000以内的框架预留)
public enum RouteType : long
{
ChatRoute = 1001, // 聊天服协议
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: de1af2c2a2178fe4bbaa8bc911ca5e51
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: