# roommatch **Repository Path**: chasing2moro/roommatch ## Basic Information - **Project Name**: roommatch - **Description**: PHP服务端、Unity客户端 双端源码做桌游:阿瓦隆面杀(支持WebGL、小程序发布) - **Primary Language**: Unknown - **License**: Zlib - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-01-12 - **Last Updated**: 2024-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [toc] PHP服务端、Unity客户端 双端基础源码做avalon阿瓦隆桌游面sha(类似狼人游戏)支持WebGL、小游戏发布 - License:没有经过作者允许,禁止商用此项目 - 此工程主要讲述功能点:创建房间、加入房间、房间内战 工程源码:https://gitee.com/chasing2moro/roommatch > 现在流行Unity开发小游戏(WebGL) ,但是很多人苦于WebGL网络层不支持TCP/P (C# Socket) ,于是我用PHP流行框架Workerman写了一 Websocket作为网络层的例子分享给大家。 # PHP服务端发布(Windows下演示) ## Windows ### 安装PHP 1. 去官网 https://windows.php.net/download 下载一个Thread Safe X64/X86版本的zip(比如: https://windows.php.net/downloads/releases/php-8.2.2-Win32-vs16-x64.zip ) 2. 解压zip 3. 设置环境变量为解压后的路径 > 遇到问题,可以去 https://www.workerman.net/windows 网站,查看详细步骤 ### 启动服务器 双击工程里的 server\GatewayWorker\start_for_win.bat 文件(工程源码地址在文章开头) ## Linux家族 安装、启动 请查阅 https://www.workerman.net/doc/workerman/install/install.html # Unity客户端发布 ## 发布Windows客户端 1. 打开Addressables Groups窗口(菜单路径:Asset Management/Addressables/Groups) ![在这里插入图片描述](https://img-blog.csdnimg.cn/367648305eae490daa6da2d440881025.png) 2. 打包Bundle资源(菜单路径:Build/New Build/Default Build Script) ![在这里插入图片描述](https://img-blog.csdnimg.cn/eecaeadbbac044fda3a91b4fca18556d.png) 3. 构建可执行文件(菜单路径:File/Build Settings/Build) ![在这里插入图片描述](https://img-blog.csdnimg.cn/f90c1b46c05e42828f915bff40c52e89.png) 4. 双击构建成功的可执行文件*工程名.exe*,即可运行 ![在这里插入图片描述](https://gitee.com/chasing2moro/roommatch/raw/master/client/Doc/build.jpg) ## 发布WebGL端 详细步骤请阅读 https://blog.csdn.net/lbxnba/article/details/128542984 里的*发布WebGL*部分 # 演示 运行5~10个可执行文件 *工程名.exe*,即可开始演示 1. 创建房间 2. 加入房间 3. 房间内战 ![请添加图片描述](https://gitee.com/chasing2moro/roommatch/raw/master/client/Doc/ani.gif) # 源码解析 - 工程讲述 1. PHP服务端工程路径 `.\server` 2. Unity客户端工程路径 `.\client` 3. Unity入口场景 `SceneLaunch.unity` - 登录协议 login - - PHP代码: .\server\GatewayWorker\Applications\YourApp\DirRoot\Cmd\cmd_login.php ``` user, $msg->psw); $_SESSION[SessionTag::uid] = $user_id; //把在线的旧玩家踢下线 if(Gateway::isUidOnline($user_id)){ $client_id_list = Gateway::getClientIdByUid($user_id); foreach ($client_id_list as $client_id) { $notify_kick = new notify_kick(); $notify_kick->msg = "login kick out"; $message = Events::wrapMsg(notify_kick::class, $notify_kick); Gateway::closeClient($client_id, $message); echo "warning=>玩家在线,需要提下线:$client_id\n"; } } $client_id = $this->getCurClientId(); //绑定用户id,方便下次踢人或者恢复现场 Gateway::bindUid($client_id, $user_id); $msg_body = new login_rsp(); $msg_body->ret = NetErrorCode::None; $msg_body->reason = $user_id; return $msg_body; } } ``` - - Unity代码: .\client\Assets\Scripts\UI\Window\UILogin\UILogin.Login.cs ``` //向网络层请求login协议 public void onButtonLoginClick(){ var req = new login(); req.user = account; req.psw = psw; req.versioncode = CommonDefine.VersionCode; WebSocketClient.Instance.SendSerialize(req); } //订阅网络事件 private void OnEnable() { Facade.Instance.RegistNetEvent(nameof(login_rsp), OnHandleLoginRsp); } //退阅网络事件 private void OnDisable() { Facade.Instance.UnRegistNetEvent(nameof(login_rsp), OnHandleLoginRsp); } //网络层返回login协议 private void OnHandleLoginRsp(System.Object data) { var rsp = data as login_rsp; switch (rsp.ret) { case NetErrorCode.None: DataPlayer.Instance.userId = rsp.reason; UITips.Instance.Show(XLocalization.Get("登录成功")); break; default: Debug.LogError("unhandle error:" + rsp.ret); break; } } ``` - 看懂上面的`登录协议login`前后端是如何沟通后,就知道下面所有协议是怎么用了。 - - PHP代码: .\server\GatewayWorker\Applications\YourApp\DirRoot\Protocol\rsp_mix.php ```