02 基于Nakama和Unity开发网络多人游戏:Part 1

您好!在我的博客当中,我将持续挑选一些优质的国外技术文章进行翻译,如果文章内容翻译有误,欢迎在评论区指正,感谢:) 以下是原文链接:Tutorial: Making a Multiplayer Game with Nakama and Unity: Part 1/3 -- The Knights of Unity

2.1 引言

创建多人游戏 和其他玩家一起游戏、对抗是十分不同于单人游玩的体验。没有一个 AI 可以完全模拟人类的行为-有时它们会反应过快,或者有时可能会犯一些错误。在大多数情况下,我们可以轻松的学习 AI 可能的行为,并且预测它们接下来会做什么。而对于人类玩家而言,人的行为是难于预测的。在不同的反应时间下,人类可以基于当前拥有的游戏信息,对于不同的情况有多种多样的反应。玩家间可以一起对抗生成的生物并且观看到其他玩家的行为。这些是为什么大家都喜欢多人游戏,并且为什么我们要创造多人游戏体验。

但对于开发者而言,创建多人游戏与单人游戏的开发过程十分不同。在大部分时间里面,我们需要使用不同的服务去请求、处理用户的连接、交互,并且还需要注意账号的身份验证,以确保玩家间可以进行正常交流,并接收到其他人的输入并发送响应,并存储这些过程用于后者的访问。正是因为这些开发上的挑战,引出了我们本篇文章所需要使用到的框架:Nakama。

Nakama 被设计为处理困难、耗时的游戏网络开发服务,特别是在多人游戏当中。它提供了一些基础的功能,比如用户账号的创建,好友、小组以及家族管理系统,实时的聊天服务与通知服务,以及玩家配对与排行榜。通过使用 Docker ,这些内容可以被快速的进行测试,并很快速的被设置并创建出来。

出于项目演示的目的,我们创建了一个用于展示 Nakama 使用场景的 Unity 项目,以下是项目的所有源代码链接:

2.2 实现

我们可以设置 Nakama 服务通过两种方法:

  • 二进制文件安装
  • 使用 Docker 当我们需要部署实际的工程并且需要发布时,第一种方法是更合适的。然而,使用 Docker 可以更加轻松以及快速的部署 Nakama,因此本文会先使用这种方法。

2.2.1 Docker 安装

安装 Docker 首先第一步,我们需要先确保我们安装好了 Docker。在这里你可以找到 Docker 的安装教程:Docker: Accelerated Container Application Development

*译者补充:如果你使用的是 Windows 家庭版安装 Docker,需要先安装下 Hyper-V 环境。以下是参考步骤。 第一步:安装 Hyper-V 将下面的脚本复制到 TXT 文件中,将文件的后缀改成 bat,之后以管理员身份运行该脚本,下载 Windows 自带的虚拟机;

bat 复制代码
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

第二布:初始化环境 用管理员身份打开 PowerShell,分别执行下列两条命令:

shell 复制代码
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

第三步:下载 Dockers 在以下链接下载 Docker 并安装:Docker Desktop: The #1 Containerization Tool for Developers | Docker

2.2.2 Nakama 安装

安装Nakama 所有被 Nakama 处理的数据信息都会被存储在数据库当中。我们不会手动的去管理使用到的数据库与 Nakama ,而是使用 Docker Compose 来管理它们。通过使用 Dockers Compose 技术,可以简化我们的设置步骤,并在使用时将它缩减成一条简单的指令。 Docker Compose 使用 YAML 格式的配置文件来知道如何设置我们的环境。第一次写这个文件并不是一件很轻松的事情,因此 Heroic Labs 为你已经提供好了一个文件,以下是文件链接:

以下是 Heroic Labs 使用 Docker Compose 运行 Nakama 的步骤,原文对这部分介绍比较少,在此进行补充:

运行 Nakama:

  1. 在你的本地目录创建一个文件夹,比如 Desktop/nakama
  2. 在这个文件夹当中创建一个 docker-compose.yml 文件,用文本编辑器打开它
  3. Heroic Labs 为你提供了两个 YML 文件,分别用于使用 PostgreSQL 或 CockroachDB

以下是用于 PostgreSQL 的配置文件:

yaml 复制代码
version: '3'
services:
  postgres:
    container_name: postgres
    image: postgres:12.2-alpine
    environment:
      - POSTGRES_DB=nakama
      - POSTGRES_PASSWORD=localdb
    volumes:
      - data:/var/lib/postgresql/data
    expose:
      - "8080"
      - "5432"
    ports:
      - "5432:5432"
      - "8080:8080"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres", "-d", "nakama"]
      interval: 3s
      timeout: 3s
      retries: 5
  nakama:
    container_name: nakama
    image: registry.heroiclabs.com/heroiclabs/nakama:3.19.0
    entrypoint:
      - "/bin/sh"
      - "-ecx"
      - >
          /nakama/nakama migrate up --database.address postgres:localdb@postgres:5432/nakama &&
          exec /nakama/nakama --name nakama1 --database.address postgres:localdb@postgres:5432/nakama --logger.level DEBUG --session.token_expiry_sec 7200          
    restart: always
    links:
      - "postgres:db"
    depends_on:
      postgres:
        condition: service_healthy
    volumes:
      - ./:/nakama/data
    expose:
      - "7349"
      - "7350"
      - "7351"
    ports:
      - "7349:7349"
      - "7350:7350"
      - "7351:7351"
    healthcheck:
      test: ["CMD", "/nakama/nakama", "healthcheck"]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  data:

以下是使用于 CockroachDB 的配置文件:

yaml 复制代码
version: '3'
services:
  cockroachdb:
    image: cockroachdb/cockroach:latest-v23.1
    command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/
    restart: "no"
    volumes:
      - data:/var/lib/cockroach
    expose:
      - "8080"
      - "26257"
    ports:
      - "26257:26257"
      - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"]
      interval: 3s
      timeout: 3s
      retries: 5
  nakama:
    image: registry.heroiclabs.com/heroiclabs/nakama:3.19.0
    entrypoint:
      - "/bin/sh"
      - "-ecx"
      - >
          /nakama/nakama migrate up --database.address root@cockroachdb:26257 &&
          exec /nakama/nakama --name nakama1 --database.address root@cockroachdb:26257 --logger.level DEBUG --session.token_expiry_sec 7200 --metrics.prometheus_port 9100          
    restart: "no"
    links:
      - "cockroachdb:db"
    depends_on:
      cockroachdb:
        condition: service_healthy
      prometheus:
        condition: service_started
    volumes:
      - ./:/nakama/data
    expose:
      - "7349"
      - "7350"
      - "7351"
      - "9100"
    ports:
      - "7349:7349"
      - "7350:7350"
      - "7351:7351"
    healthcheck:
      test: ["CMD", "/nakama/nakama", "healthcheck"]
      interval: 10s
      timeout: 5s
      retries: 5
  prometheus:
    image: prom/prometheus
    entrypoint: /bin/sh -c
    command: |
      'sh -s <<EOF
        cat > ./prometheus.yml <<EON
      global:
        scrape_interval:     15s
        evaluation_interval: 15s

      scrape_configs:
        - job_name: prometheus
          static_configs:
          - targets: ['localhost:9090']

        - job_name: nakama
          metrics_path: /
          static_configs:
          - targets: ['nakama:9100']
      EON
      prometheus --config.file=./prometheus.yml
      EOF'      
    ports:
      - '9090:9090'
volumes:
  data:

上面两个文件是为 Mac 以及 Linux 系统编写的,如果需要在 Windows 上使用,需要更改配置 Docker 文件的 volumes 路径,将其置于我们本地的 Nakama 存储脚本的位置:

bash 复制代码
...
  nakama:
        volumes:
        - ./nakama/data:/nakama/
...

以下是一个配置的例子:

ruby 复制代码
...
  nakama:
        volumes:
        - /c/Users/NakamaDemo/Data:/nakama/data
...

现在,开启 Nakama 只需要一行短短的指令:

shell 复制代码
docker-compose -f docker-compose.yml up

连接测试 为了检查现在是否一切已经准备就绪并且程序已经开始运行,可以测试你的服务连接,通过输入 Nakama 或者 CockroachDB 在你的浏览器当中:

makefile 复制代码
127.0.0.1:26257 -- CockroachDB
127.0.0.1:7350  -- Nakama

需要注意的是 DockerToolbox 默认情况下不会将其容器的地址转发给 localhost,在这种情况下如果你想仅在本地访问 Nakama(通过在本地运行 DOckerToolBox),我们需要测试连接通过以下代码:

makefile 复制代码
192.168.99.100:26257 -- CockroachDB
192.168.99.100:7350  -- Nakama

这里使用的 192.168.99.100 地址是 DockerToolbox 的默认使用地址。如果我们想要分享这个访问穿透 LAN,我们需要在 VirtualBox 上设置 Docker 的端口。为了完成这个目的,需要按照以下步骤进行设置:

  1. 打开在 Docker 过程当中安装的 VirtualBox;
  2. 选择一个合适的及其,比如命名为"default"的;
  3. 确保它已经被关闭,当这个机器运行的时候很多设置无法生效;
  4. 前往 Settings > Network > Adapter 1,展开 Advanced Dropdown 并且选择 Port Forwarding;
  5. 双击并点击创建两条新规则;
  6. 改变 Host Port 和 Guest Port 的第一条规则为 26257;
  7. 改变 Host Port 和 Guest Port 的第二条规则为 7350;
  8. 保持其他字段不变,离开界面;

2.2.3 Unity 设置

随着 Nakama 被安装并运行,接下来可以在 Unity 的工程里面来实现这些需要的功能。你可以选择创建一个新的工程或者使用一个老工程。在这篇博文中,我们将使用我自己游戏《Jolly Rogers》的代码样本,这是在 Heroic Labs 开发者的帮助下完成的。Unity 版本为 2018.3.0f 2(并不要求一摸一样的版本,更新的版本同样可以使用)

最快的安装 Nakam 插件的方法就是直接在 Unity 资源上的中进行下载。一个 Unity 包可以被直接下载,它包含了 Nakama 工程所需要的一起资源。你可以在 Unity Asset Store 中搜索到它,如下图所示。

你也可以下载我们的示例工程:heroiclabs/unity-sampleproject: A sample game called Pirate Panic for Unity engine built with Nakama server. (github.com),它同样包含了所有需要的插件以及 .lua 脚本用于简单的运行游戏。在这个 Demo 中,你可以:

  • 简化身份验证和会话管理系统
  • 好友管理和聊天系统
  • 部落/团体;
  • 存储系统;
  • 配对和排行榜;
  • 实时的、基于主机的多人模式。 因为所有这些在博客中使用到的代码示例都来自于这个游戏 Demo 当中,我非常建议你下载它并且引用它,并且可以将他的部分代码调整成你想要的样子。

2.3 总结

在这篇文章当中,我们完成了 Unity 的准备工作。在接下来的文章当中将会关注于如何建立连接并维持与服务器的会话。我们将会展示一段简单的和用户身份验证相关的代码。

相关推荐
Thomas_YXQ12 天前
Unity3D项目为什么要使用FairyGUI
开发语言·unity·游戏引擎·unity3d·游戏开发
nicepainkiller12 天前
Flutter 内嵌 unity3d for android
flutter·unity3d
Thomas_YXQ1 个月前
Unity3D ngui和ugui区别与优缺点详解
服务器·游戏·unity·unity3d·游戏开发
Thomas_YXQ1 个月前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d
Thomas游戏开发1 个月前
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前端框架·unity3d·游戏开发
大眼睛姑娘1 个月前
unity运行状态下移动、旋转、缩放控制模型
unity3d
lin zaixi()1 个月前
手把手教你写Unity3D飞机大战(2)天空盒布置
unity3d
Thomas_YXQ2 个月前
Unity3D中管理Shader效果详解
开发语言·游戏·unity·unity3d·游戏开发
羊羊20352 个月前
线性代数:Matrix2x2和Matrix3x3
线性代数·数学建模·unity3d
天人合一peng2 个月前
Unity hub登录时一直无法进入license
unity3d