Unity(支持WebGL)+PHP(Workerman的Gateway)用Websocket协议实现匹配对战(摇骰子为例)2
Unity(支持WebGL)+PHP(Workerman的Gateway)用Websocket协议实现匹配对战(摇骰子为例)1
上篇文章只讲述工程使用、发布。并没讲述任何流程和实现原理。然而下面先讲述流程,并不打算细细展开原理,我怕先说原理大家可能会一下懵圈了。
连接入口
服务端
- 侦听ip、port和使用的协议 体现在文件:server\GatewayWorker\Applications\YourApp\start_gateway.php
$gateway = new Gateway("Websocket://0.0.0.0:8282");
Websocket
设置Gateway的通讯协议为websocket0.0.0.0
是入口ip,代表监听本机所有网卡,也就是内网、外网、本机都可以访问到-
- 所以在本机使用127.0.0.1作为ip也可以访问成功
0.0.0.0
- 所以在本机使用127.0.0.1作为ip也可以访问成功
8282
是访问端口
客户端
- 链接ip、port和使用的协议 体现在文件:client\Assets\Scripts\UI\Window\UILogin\UILogin.Login.cs
WebSocketClient.Instance.Connect("ws://" + ip + ":" + port, onConnect2Login);
ws
是websocket协议的简称
通讯流程
登录
- 请求协议
login
:client\Assets\Scripts\UI\Window\UILogin\UILogin.Login.cs
public partial class UILogin : UIBase
{
public void onButtonLoginClick()
{
...
//客户端请求和服务端建立连接
WebSocketClient.Instance.Connect("ws://" + ip + ":" + port, onConnect2Login);
...
}
//建立连接后,发送第一条登录请求协议
private void onConnect2Login()
{
...
var req = new login();
req.user = account;
req.psw = psw;
req.versioncode = CommonDefine.VersionCode;
WebSocketClient.Instance.SendSerialize(req);
...
}
...
- 服务端
-
- 连接回调:server\GatewayWorker\Applications\YourApp\Events.php
class Events
{
/**
* 当客户端连接时触发
* 如果业务不需此回调可以删除onConnect
* @param int $client_id 连接id
*/
public static function onConnect($client_id){
}
...
-
- 响应协议
login_rsp
:server\GatewayWorker\Applications\YourApp\Cmd\login.php
- 响应协议
<?php
class login extends cmdbase
{
public function onCmd($msg){
...
//返回登录结果给客户端:客户端侦听协议login_rsp即可收到此响应协议
$msg_body = array(
'ret'=> NetErrorCode::$None,
'reason'=>$user_id,
);
return $msg_body;
}
}
- 客户端侦听响应协议:client\Assets\Scripts\UI\Window\UILogin\UILogin.Login.cs
protected override void onVisible()
{
Facade.Instance.RegistNetEvent(nameof(login_rsp), OnHandleLoginRsp);
}
protected override void OnInvisible()
{
Facade.Instance.UnRegistNetEvent(nameof(login_rsp), OnHandleLoginRsp);
}
private void OnHandleLoginRsp(System.Object data)
{
var rsp = data as login_rsp;
switch (rsp.ret)
{
case NetErrorCode.None:
this.CloseUI();
DataPlayer.Instance.userId = rsp.reason;
SceneMgr.Instance.LoadScene(SceneName.SceneMain);
UITips.Instance.Show(XLocalization.Get("登录成功"));
break;
}
}
到此你应该已经发现规律了,客户端请求协议如
login
,服务端对应文件login.php
里的onCmd函数就收到客户端的请求协议。onCmd函数返回值就是服务端应答客户端后,响应的协议:协议名为原来的协议加_rsp如login_rsp
创建房间
- 请求协议
match
:client\Assets\Scripts\UI\Window\UIMatch\UIMatch.cs
var req = new match();
req.side = 1;//备用
req.room_id = -1;//-1为请求创建房间
WebSocketClient.Instance.SendSerialize(button, req);
- 响应协议
match_rsp
:server\GatewayWorker\Applications\YourApp\Cmd\match.php
<?php
use \GatewayWorker\Lib\Gateway;
class match extends cmdbase
{
public function onCmd($msg){
...
$msg_body = array(
'ret'=> NetErrorCode::$None,
"room_id" => $group_id,
);
return $msg_body;
}
}
进入房间
- 请求协议
match
var req = new match();
req.side = 1;//备用
req.room_id = 1;
WebSocketClient.Instance.SendSerialize(button, req);
- 响应协议
match_rsp
:server\GatewayWorker\Applications\YourApp\Cmd\match.php
开始战斗
- 请求协议
startbattle
(在Unity工程搜索此关键字,即可找到对应的代码) - 响应协议
startbattle_rsp
:server\GatewayWorker\Applications\YourApp\Cmd\startbattle.php
战斗转发
- 请求协议
actionbattle
(在Unity工程搜索此关键字,即可找到对应的代码) - 响应协议
actionbattle_rsp
:server\GatewayWorker\Applications\YourApp\Cmd\actionbattle.php
退出战斗
- 请求协议
exitbattle
(在Unity工程搜索此关键字,即可找到对应的代码) - 响应协议
exitbattle_rsp
:server\GatewayWorker\Applications\YourApp\Cmd\exitbattle.php
联系作者
email:chasing2moro@qq.com