Unity3D应用课 |
您所在的位置:网站首页 › unity联机对战框架 › Unity3D应用课 |
联机对战(上)
本次主要讲解如何将游戏的 Server 端部署到一台有公网IP的服务器上 unity打包配置如果之前没有进行过unity打包 Linux 版本游戏的配置,在打包界面,是不能选择打包成 Linux 版本的 要进行配置,需要在 Unity Hub ,点击右边的 Installs 之后点击项目右上角的设置图标, 点击 Add modules 选中图中三个模块,点击下载 下载过程中如果进度卡住的话,可以将unity关掉后重开,继续下载。 下好之后就可以看到 Linux 选项了 联机对战基本原理服务器上有一些游戏的可执行文件,这些文件按照 Server 的模式运行,玩家打开游戏后进入 Client 模式,便可以加入 Server 游戏开多个房间,就是有多个 Server , 每个 Server 拥有不同的端口号,依靠端口号区分每个 Server 。比如在现在的游戏版本里,我们开启一个 Server ,会占用端口7777。(这个信息可以在 NetworkManager 物体的 Unity Transport 里的 Connection Data 中看到 想创建多个 Server ,需要在该 Server 创建时为它附上没有被占用的端口号。 目前的联机对战只能在一台电脑上进行,但无法在不同电脑上进行,因为在自己的电脑上, Server 使用的IP是一个私有IP,无法被其他人访问。我们需要在一台拥有公网IP的服务器上启动 Server ,这样才能实现不同电脑的联机对战。 在服务器上,我们需要使用后端框架来维护游戏后端,包括 Server , 玩家信息等等,后端框架也负责操作数据库。前后端的交互通过网络协议请求实现。 配置云端环境配置服务器的通用操作,可以参考这篇文章 Linux基础课——租云服务器及配docker环境 购买服务器这里使用阿里云进行演示,用其他平台的云服务器同理,国外的服务器在连接上可能会有比较大的延迟。 常用云平台的官网: 阿里云 腾讯云 华为云进入阿里云官网,登录或注册之后,点击右上角的控制台 点击资源管理,往下翻,点击购买资源 进入购买页面后,按照下图划红线处修改。地域选择里自己近的,时间看自己需求。 服务器规格选择1核2G,操作系统版本选择Ubuntu 22.04 64位版本 快照可以选择每7天保存一次。分配公网IP一定要选上!带宽改为按使用流量付费,峰值直接拉满。 新建一个安全组,按照图中所示勾选设置。登录选择自定义密码 可以修改主机名称和实例名称,其他按红线修改或者默认,然后点击下单。 支付成功后点击管理控制台,进入到控制台里 这时就可以看到我们刚买好的服务器了。我们点击左边的安全组 找到我们刚创建的安全组,点击管理规则 点击手动添加,我们添加一下7777和7778端口的开放,开放UDP协议。 这时服务器就购买好了 安装终端Linux和Mac的电脑自带终端可以使用。Windows电脑,推荐下载一个git bash。下载教程 git bash里复制是 ctrl + insert ,粘贴是 shift + insert 配置免密登录详细的免密登录教程可以参考这篇文章 Linux基础课——ssh 安装好git bash后,在电脑桌面上右键,选择 Git Bash Here 进入终端后输入以下命令 cd ssh-keygen之后一路回车。这时输入 cd .ssh 表示进入 .ssh 文件夹,如果没有就用 mkdir .ssh 创建一个,然后进入。 进入后输入命令 vim config 创建或打开一个叫 config 的文件,进入vim编辑器,点击i键进入编辑模式,输入以下内容 Host unity HostName 服务器的公网IP地址 User root(这个是根用户的用户名,不同平台云服务器不一样,要事先确认一下,阿里云是root)输好之后点击Esc键退出编辑模式,输入 :wq 保存并退出。之后输入 ssh unity ,一开始登录时会有一个确认请求,输入 yes ,然后输入之前设置的密码,就可以登录到服务器上了。 登录之后输入 adduser acs 添加一个非根用户,之后我们的操作都是通过非根用户进行,因为根用户权限太高,误操作导致的损失比较大。输入命令回车执行后设置一个密码,然后回车,在最后确认时输入 Y 即可。 之后输入 usermod -aG sudo acs 为刚刚创建的 acs 用户提供sudo权限 点击 ctrl + d 退出登录,然后进入 config 中将用户 root 改为 acs ,保存并退出。输入 ssh-copy-id unity , 之后按照提示输入密码,就配置好免密登录了。直接输入 ssh unity 可以不用输密码直接登录到服务器上。 配置服务器软件登录上远程服务器,输入以下命令并执行 sudo apt-get update sudo apt-get install tmux # 安装tmux yxc祖传配置下载祖传配置文件 之后输入 scp 三个文件的路径,具体到文件,用空格分开,每个文件都要写全 unity:就为新服务器配置上了祖传文件。祖传文件不配置也行,之后的操作中 ctrl + a 全部换成 ctrl + b 即可 在服务器上启动 Server 使unity程序接收外部参数目前我们的游戏要开 Server 模式是需要鼠标在图形化界面上点击。在Linux服务器上,我们只能使用传入参数的方式开启 Server ,需要修改程序 点击 NetworkManager 物体,将 Unity Transport 删除,然后添加一个 UNet Transport 组件,将该组件拖到 Network Manager 组件中的 Network Transport 里。 打开 NetworkManagerUI , 在 Start() 函数中添加以下代码 var args = System.Environment.GetCommandLineArgs(); // 返回当前程序的所有命令行参数 // 两个循环不能合成一个循环,因为两个操作需要先后进行,先改端口号,再启动server for (int i = 0; i < args.Length; i++) { if (args[i] == "-port") // 修改端口号 { int port = int.Parse(args[i + 1]); // 一般输入命令的格式是 -port 7777 var transport = GetComponent(); // 获取UNet Transport 组件 transport.ConnectPort = transport.ServerListenPort = port; // 修改端口号 } } for (int i = 0; i < args.Length; i++) { if (args[i] == "-launch-as-server") // 如果参数为 -launch-as-server,就启动server模式 { NetworkManager.Singleton.StartServer(); DestroyAllButtons(); } } 打包成Linux版本在 UNet Transport 组件中,将 Connect Address 修改为服务器公网IP 之后进行打包,记得将版本换成Linux。打包好之后,在存放游戏文件的文件夹上层目录里打开Git Bash(比如我的游戏文件打包在了 Linux 文件夹里,Linux 文件夹在 Build 文件夹里,我就在 Build 文件夹里打开Git Bash,之后输入命令并执行 scp -r 存放游戏的文件夹 unity: # -r表示递归传入文件夹里的所有文件传完后登录到服务器上,在 Linux 文件夹下就可以看到游戏文件了。输入命令并执行 chmod +x server.x86_64 # 为游戏文件添加可执行权限 tmux # 打开tmux,在这里启动游戏,这样即使终端被关闭了游戏进程仍然不会被结束 ./server.x86_64 -batchmode -nographics -launch-as-server -port 7777 # 启动游戏server模式启动游戏后,我们在unity里开始游戏,进入Client模式,就可以连接到服务器了 编写执行脚本为了简化我们部署服务器游戏房间的操作,我们可以将一些会重复执行的命令写成一个可执行的脚本。输入 vim run.sh 创建好一个脚本,并输入以下内容 cd /home/acs/Linux # 这里输入游戏文件所在文件夹的路径 chmod +x server.x86_64之后给 run.sh 添加可执行权限,这样执行这个脚本,我们就自动给游戏文件添加可执行权限了。 本地电脑上,在存放游戏文件的文件夹上层目录里也创建一个脚本,并编写以下内容: scp -r 游戏文件所在文件夹 unity: ssh unity './run.sh' # 这里默认run.sh是放在服务器家目录下给脚本添加可执行权限。以后将本地游戏文件部署到服务器上,只用双击执行脚本即可 开启游戏房间进入服务器上的游戏文件所在文件夹,打开tmux,按下 ctrl + a 后输入 % 进行左右分屏,按下 ctrl + a 后输入 " 进行上下分屏。上下分屏的两个窗口,分别在端口7777和端口7778启动游戏 在本地添加UI双击unity里的 MenuUI 物体,进入2D视图,将一个按钮复制两份拖到中间,将两个按钮的锚点设置为中心,修改内容为 Room-7777 和 Room-7778 在 NetworkManagerUI 里通过 SerializeField 获取两个按钮,并为它们添加监听逻辑 room7777.onClick.AddListener(() => { var transport = GetComponent(); // 获取UNet Transport 组件 transport.ConnectPort = transport.ServerListenPort = 7777; // 修改端口号 NetworkManager.Singleton.StartClient(); DestroyAllButtons(); }); room7778.onClick.AddListener(() => { var transport = GetComponent(); // 获取UNet Transport 组件 transport.ConnectPort = transport.ServerListenPort = 7778; // 修改端口号 NetworkManager.Singleton.StartClient(); DestroyAllButtons(); });这样游戏就可以连到服务器上的游戏房间啦 阶段性成品欢迎大家来玩! 链接:https://pan.baidu.com/s/1ndXfWzOhtUNTHupUx112jg?pwd=o3xc 提取码:o3xc 修改的代码 NetworkManagerUI using System.Collections; using System.Collections.Generic; using Unity.Netcode; using Unity.Netcode.Transports.UNET; using UnityEngine; using UnityEngine.UI; public class NetworkManagerUI : MonoBehaviour { // 将三个button与脚本绑定 [SerializeField] private Button hostBtn; [SerializeField] private Button serverBtn; [SerializeField] private Button clientBtn; [SerializeField] private Button room7777; [SerializeField] private Button room7778; // Start is called before the first frame update void Start() { var args = System.Environment.GetCommandLineArgs(); // 返回当前程序的所有命令行参数 // 两个循环不能合成一个循环,因为两个操作需要先后进行,先改端口号,再启动server for (int i = 0; i < args.Length; i++) { if (args[i] == "-port") // 修改端口号 { int port = int.Parse(args[i + 1]); // 一般输入命令的格式是 -port 7777 var transport = GetComponent(); // 获取UNet Transport 组件 transport.ConnectPort = transport.ServerListenPort = port; // 修改端口号 } } for (int i = 0; i < args.Length; i++) { if (args[i] == "-launch-as-server") // 如果参数为 -launch-as-server,就启动server模式 { NetworkManager.Singleton.StartServer(); DestroyAllButtons(); } } // 监听函数,当点击时触发 hostBtn.onClick.AddListener(() => { NetworkManager.Singleton.StartHost(); DestroyAllButtons(); }); serverBtn.onClick.AddListener(() => { NetworkManager.Singleton.StartServer(); DestroyAllButtons(); }); clientBtn.onClick.AddListener(() => { NetworkManager.Singleton.StartClient(); DestroyAllButtons(); }); room7777.onClick.AddListener(() => { var transport = GetComponent(); // 获取UNet Transport 组件 transport.ConnectPort = transport.ServerListenPort = 7777; // 修改端口号 NetworkManager.Singleton.StartClient(); DestroyAllButtons(); }); room7778.onClick.AddListener(() => { var transport = GetComponent(); // 获取UNet Transport 组件 transport.ConnectPort = transport.ServerListenPort = 7778; // 修改端口号 NetworkManager.Singleton.StartClient(); DestroyAllButtons(); }); } private void DestroyAllButtons() { Destroy(hostBtn.gameObject); Destroy(serverBtn.gameObject); Destroy(clientBtn.gameObject); Destroy(room7777.gameObject); Destroy(room7778.gameObject); } } 著作权信息 源视频作者:yxc 文章作者: jaylenwanghitsz 链接:https://www.acwing.com/file_system/file/content/whole/index/content/8987137/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |