Unity3D应用课

您所在的位置:网站首页 unity联机对战框架 Unity3D应用课

Unity3D应用课

2024-06-08 22:51| 来源: 网络整理| 查看: 265

联机对战(上)

cod.png

本次主要讲解如何将游戏的 Server 端部署到一台有公网IP的服务器上

mind.png

unity打包配置

如果之前没有进行过unity打包 Linux 版本游戏的配置,在打包界面,是不能选择打包成 Linux 版本的

no.png

要进行配置,需要在 Unity Hub ,点击右边的 Installs

linux1

之后点击项目右上角的设置图标, 点击 Add modules

linux2

选中图中三个模块,点击下载

linux3

下载过程中如果进度卡住的话,可以将unity关掉后重开,继续下载。

下好之后就可以看到 Linux 选项了

linux.png

联机对战基本原理

服务器上有一些游戏的可执行文件,这些文件按照 Server 的模式运行,玩家打开游戏后进入 Client 模式,便可以加入 Server

游戏开多个房间,就是有多个 Server , 每个 Server 拥有不同的端口号,依靠端口号区分每个 Server 。比如在现在的游戏版本里,我们开启一个 Server ,会占用端口7777。(这个信息可以在 NetworkManager 物体的 Unity Transport 里的 Connection Data 中看到

port.png

想创建多个 Server ,需要在该 Server 创建时为它附上没有被占用的端口号。

目前的联机对战只能在一台电脑上进行,但无法在不同电脑上进行,因为在自己的电脑上, Server 使用的IP是一个私有IP,无法被其他人访问。我们需要在一台拥有公网IP的服务器上启动 Server ,这样才能实现不同电脑的联机对战。

在服务器上,我们需要使用后端框架来维护游戏后端,包括 Server , 玩家信息等等,后端框架也负责操作数据库。前后端的交互通过网络协议请求实现。

配置云端环境

配置服务器的通用操作,可以参考这篇文章 Linux基础课——租云服务器及配docker环境

购买服务器

这里使用阿里云进行演示,用其他平台的云服务器同理,国外的服务器在连接上可能会有比较大的延迟。

常用云平台的官网:

阿里云 腾讯云 华为云

进入阿里云官网,登录或注册之后,点击右上角的控制台

control.png

点击资源管理,往下翻,点击购买资源

resource.png

buy.png

进入购买页面后,按照下图划红线处修改。地域选择里自己近的,时间看自己需求。

buy2.png

服务器规格选择1核2G,操作系统版本选择Ubuntu 22.04 64位版本

buy3.png

快照可以选择每7天保存一次。分配公网IP一定要选上!带宽改为按使用流量付费,峰值直接拉满。

buy4.png

新建一个安全组,按照图中所示勾选设置。登录选择自定义密码

buy5.png

可以修改主机名称和实例名称,其他按红线修改或者默认,然后点击下单。

buy6.png

支付成功后点击管理控制台,进入到控制台里

buy7.png

这时就可以看到我们刚买好的服务器了。我们点击左边的安全组

secure.png

找到我们刚创建的安全组,点击管理规则

secure1.png

点击手动添加,我们添加一下7777和7778端口的开放,开放UDP协议。

secure2.png

这时服务器就购买好了

安装终端

Linux和Mac的电脑自带终端可以使用。Windows电脑,推荐下载一个git bash。下载教程

git bash里复制是 ctrl + insert ,粘贴是 shift + insert

配置免密登录

详细的免密登录教程可以参考这篇文章 Linux基础课——ssh

安装好git bash后,在电脑桌面上右键,选择 Git Bash Here

git.png

进入终端后输入以下命令

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 里。

unet1.png

打开 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

ip.png

之后进行打包,记得将版本换成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

room.png

在 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(); });

这样游戏就可以连到服务器上的游戏房间啦

阶段性成品

work.png

欢迎大家来玩!

链接: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