SDKExample、Unity
介绍
该示例使用了 ioGame C# SDK
当前示例提供了 C# 、Netty、WebSocket、Protobuf 与游戏服务器交互的演示。
该示例主要演示以下几个方面的内容
- ioGame SDK + 代码生成 = 诸多优势。
- 使用代码生成后的接口文件(action、广播)与服务器交互。
- 心跳的处理,每次心跳将时间与服务器同步。
- 交互演示内容包括
- 协议碎片:“基础类型”的参数与返回值。
- List 类型的参数与返回值。
- Protobuf 对象类型的参数与返回值。
示例目录 ./Assets/Scripts/Gen/Code 中的 action、广播、错误码 ...等交互接口文件由 ioGame 生成。 代码生成可为客户端开发者减少巨大的工作量,并可为客户端开发者屏蔽路由等概念。
SDK 代码生成的几个优势
- 帮助客户端开发者减少巨大的工作量,不需要编写大量的模板代码。
- 语义明确,清晰。生成的交互代码即能明确所需要的参数类型,又能明确服务器是否会有返回值。这些会在生成接口时就提前明确好。
- 明确的交互接口,确保了方法的参数类型安全且明确,使我们在编译阶段就能发现潜在问题。 这种做法有效避免了安全隐患,并减少了联调时可能出现的低级错误。
- 减少服务器与客户端双方对接时的沟通成本,代码即文档。生成的联调代码中有文档与使用示例,方法上的示例会教你如何使用,即使是新手也能做到零学习成本。
- 帮助客户端开发者屏蔽与服务器交互部分,将更多的精力放在真正的业务上。
- 为双方联调减少心智负担。联调代码使用简单,与本地方法调用一般丝滑。
- 抛弃传统面向协议对接的方式,转而使用面向接口方法的对接方式。
- 当我们的 java 代码编写完成后,我们的文档及交互接口可做到同步更新,不需要额外花时间去维护对接文档及其内容。
Example Source Code
see https://github.com/iohao/ioGameSdkCsharpExampleGodot
快速开始
启动游戏服务器
see https://github.com/iohao/ioGameExamples/tree/main/SdkExample
运行 SdkApplication.java 启动游戏服务器
SDK C# 安装
当前示例项目已经安装好了相关环境,新项目请参考 C# SDK
启动 Unity
Unity Version: 6.x
Test
点击按钮会向服务器发送请求,并接收服务器的响应数据。
SDK 设置说明
MyNetConfig.cs 文件,该配置文件做了以下事情
- 错误码及广播监听相关的加载。
- ListenMessageCallback:自定义消息监听。
- GameGameConsole:Unity 打印实现。
- SocketInit():网络实现的配置、登录、心跳处理。
- StartNet: 启动 ioGame Sdk。
namespace Config
{
public abstract class MyNetConfig
{
private static IoGameUnityWebSocket _socket;
public static long CurrentTimeMillis { get; set; }
public static void StartNet()
{
// biz code init
GameCode.Init();
Index.Listen();
// --------- IoGameSetting ---------
IoGameSetting.EnableDevMode = true;
// China or Us
IoGameSetting.SetLanguage(IoGameLanguage.China);
// message callback. 回调监听
IoGameSetting.ListenMessageCallback = new MyListenMessageCallback();
IoGameSetting.GameGameConsole = new MyGameConsole();
// socket
SocketInit();
IoGameSetting.StartNet();
}
private static void SocketInit()
{
IoGameSetting.Url = "ws://127.0.0.1:10100/websocket";
// socket
_socket = new IoGameUnityWebSocket();
IoGameSetting.NetChannel = _socket;
_socket.OnOpen += (_, _) =>
{
Debug.Log("WebSocket OnOpen new!");
// login
var loginVerifyMessage = new LoginVerifyMessage { Jwt = "1234567" };
SdkAction.OfLoginVerify(loginVerifyMessage, result =>
{
var userMessage = result.GetValue<UserMessage>();
result.Log($"userMessage: {userMessage}");
});
// heartbeat
IdleTimer();
};
}
private static async void IdleTimer()
{
var heartbeatMessage = new ExternalMessage().ToByteArray();
var counter = 0;
while (true)
{
await Task.Delay(8000);
Debug.Log($"-------- unity new ...HeartbeatMessage {counter++}");
// Send heartbeat to server. 发送心跳给服务器
IoGameSetting.NetChannel.WriteAndFlush(heartbeatMessage);
}
}
}
internal class MyListenMessageCallback : SimpleListenMessageCallback
{
public override void OnIdleCallback(ExternalMessage message)
{
var dataBytes = message.Data.ToByteArray();
var longValue = new LongValue();
longValue.MergeFrom(new CodedInputStream(dataBytes));
/*
* Synchronize the time of each heartbeat with that of the server.
* 每次心跳与服务器的时间同步
*/
MyNetConfig.CurrentTimeMillis = longValue.Value;
}
}
internal class MyGameConsole : IGameConsole
{
public void Log(object value)
{
Debug.Log(value);
}
}
public sealed class IoGameUnityWebSocket : SimpleNetChannel
{
public string Url { set; get; }
WebSocket _socket;
public event EventHandler<OpenEventArgs> OnOpen = (_, _) => { Debug.Log("WebSocket OnOpen"); };
public override void Prepare()
{
Url ??= IoGameSetting.Url;
_socket = new WebSocket(Url);
// 注册回调
_socket.OnOpen += OnOpen;
_socket.OnClose += (_, e) => { Debug.Log($"Connection closed! {e}"); };
_socket.OnError += (_, e) => { Debug.LogError($"e {e}"); };
_socket.OnMessage += (m, e) =>
{
var packet = e.RawData;
AcceptMessage(ExternalMessage.Parser.ParseFrom(packet));
};
// 连接
_socket.ConnectAsync();
}
public override void WriteAndFlush(byte[] bytes)
{
_socket.SendAsync(bytes);
}
}
}
Example Source Code Directory
记住,你不需要编写任何交互文件 action、广播、错误码,这些是由 ioGame 服务器生成的,你只需要关注真正的业务逻辑。

下图是 ioGame 游戏服务器的源码,上图中的 C# 源码由 ioGame 生成。
;
关于代码生成与使用
click here
如何根据 .proto 生成相关 pb
tip
see compile-proto.sh
最后
记住,你不需要编写任何交互文件 action、广播、错误码,这些是由 ioGame 服务器生成的,你只需要关注真正的业务逻辑。