Unity(支持WebGL)+PHP(Workerman的Gateway)用Websocket协议实现匹配对战(摇骰子为例)2


Unity(支持WebGL)+PHP(Workerman的Gateway)用Websocket协议实现匹配对战(摇骰子为例)1
上篇文章只讲述工程使用、发布。并没讲述任何流程和实现原理。然而下面先讲述流程,并不打算细细展开原理,我怕先说原理大家可能会一下懵圈了。

连接入口

服务端

  1. 侦听ip、port和使用的协议 体现在文件:server\GatewayWorker\Applications\YourApp\start_gateway.php
$gateway = new Gateway("Websocket://0.0.0.0:8282");
  • Websocket 设置Gateway的通讯协议为websocket
  • 0.0.0.0 是入口ip,代表监听本机所有网卡,也就是内网、外网、本机都可以访问到
    • 所以在本机使用127.0.0.1作为ip也可以访问成功0.0.0.0
  • 8282是访问端口

在这里插入图片描述

客户端

  1. 链接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

posted @ 2023-01-05 19:05  lib0祥  阅读(110)  评论(0编辑  收藏  举报