【Unity网络同步框架 - Nakama研究(二)】

server/2025/3/18 18:50:27/

Unity网络同步框架 - Nakama研究(二)

虽说官方文档和网站以及论坛建立的不错,而且还有中文翻译且质量也不错,但是总会遇到一些词不达意,说了但是依旧没懂的部分,甚至问AI也问不出什么东西,所以需要有一些比较明显的博客来记录实战部分

服务端搭建

使用官方推荐的Docker进行安装

  • 在将Docker软件下载到Windows环境后,请确保已安装node-jstypescriptluaGo等环境(后续的对应扩展需要),否则先进行npm相关库的安装,需要翻墙或者镜像库安装。
  • 进入根目录,运行cmd控制台(在文件管理器上方地址栏直接输入cmd),输入docker compose up,即能运行服务器(如需要配置文件见下文)。如果更改模块,需要重新编译运行,请输入docker compose up --build nakama(或者在Docker中停止运行再打开)
  • 如果遇到问题,一般情况是缺少对应的库,或者需要下载的库在墙外,下载超时了,很少会遇到不支持对应的数据库CockroachDB或者PostgreSQL啥的,如果遇到了其他问题,建议上官网或者论坛查查
  • 运行成功后,你应该能在Docker中看到如下:

这代表你的服务端已经正常开启了,接下来我们测试一下对应的一些方法和函数。
我的配置文件docker-compose(官网上也能找到类似的)

version: '3'
services:cockroachdb:image: cockroachdb/cockroach:latest-v23.1command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/restart: "no"volumes:- data:/var/lib/cockroachexpose:- "8080"- "26257"ports:- "26257:26257"- "8080:8080"healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"]interval: 3stimeout: 3sretries: 5nakama:image: registry.heroiclabs.com/heroiclabs/nakama:3.22.0entrypoint:- "/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 9100restart: "no"links:- "cockroachdb:db"depends_on:- cockroachdb- prometheusvolumes:- ./:/nakama/dataenvironment:- NAKAMA_RUNTIME_PATH=/nakama/data/modulesexpose:- "7349"- "7350"- "7351"- "9100"ports:- "7349:7349"- "7350:7350"- "7351:7351"healthcheck:test: ["CMD", "/nakama/nakama", "healthcheck"]interval: 10stimeout: 5sretries: 5prometheus:image: prom/prometheusentrypoint: /bin/sh -ccommand: |'sh -s <<EOFcat > ./prometheus.yml <<EONglobal:scrape_interval:     15sevaluation_interval: 15sscrape_configs:- job_name: prometheusstatic_configs:- targets: ['localhost:9090']- job_name: nakamametrics_path: /static_configs:- targets: ['nakama:9100']EONprometheus --config.file=./prometheus.ymlEOF'ports:- '9090:9090'volumes:data:

服务器简单测试

布置完了服务器,现在我们应该如何使用以及观察对应的服务器内的数据

  • 为了方便测试,我们在这里先不使用Unity,直接打开一个C#程序,我们只是测试一下而已,按照简单的来。有几个重要的网站需要记一下:
    1. 本地控制台
    2. 接口Api地址(包含clientconsole)
  • 测试代码如下:
using Newtonsoft.Json.Linq;
using System.Text;class Program
{private static readonly string nakamaApiMatchUrl = "http://127.0.0.1:7350/v2/match";private static readonly string nakamaApiUrl = "http://127.0.0.1:7350/v2/account/authenticate/device?create=true";private static readonly string nakamaApiLogoutUrl = "http://127.0.0.1:7350/v2/session/logout";private static readonly string nakamaApiStorageUrl = "http://127.0.0.1:7350/v2/storage";private static readonly string nakamaApiKey = "defaultkey";private static string nakamaAuthToken = "nakama.autoToken";static async Task Main(string[] args){await AuthenticateDevice();await FetchMatchList();await FetchStorageObjectAsync();await LogOut();}static async Task AuthenticateDevice(){try{var authHeader = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{nakamaApiKey}:"));var client = new HttpClient();client.DefaultRequestHeaders.Add("Authorization", $"Basic {authHeader}");var postData = new { id = "someuniqueidentifier" };var json = Newtonsoft.Json.JsonConvert.SerializeObject(postData);var content = new StringContent(json, Encoding.UTF8, "application/json");var response = await client.PostAsync(nakamaApiUrl, content);if (response.IsSuccessStatusCode){var responseContent = await response.Content.ReadAsStringAsync();var responseJson = JObject.Parse(responseContent);Console.WriteLine("Authentication successful.");Console.WriteLine($"Session Token: {responseJson["token"]}");if(responseJson.ContainsKey("token"))nakamaAuthToken = responseJson["token"].ToString();}else{Console.WriteLine($"Error authenticating device: {response.StatusCode}");}}catch (Exception ex){Console.WriteLine($"Error occurred: {ex.Message}");Console.WriteLine("Please check the URL and network connection. If the issue persists, ensure the URL is correct and the server is running.");}}static async Task LogOut(){try{var client = new HttpClient();client.DefaultRequestHeaders.Add("Authorization", $"Bearer {nakamaAuthToken}");var response = await client.PostAsync($"{nakamaApiLogoutUrl}", null);if (response.IsSuccessStatusCode){var content = await response.Content.ReadAsStringAsync();var _content = JObject.Parse(content);}else{Console.WriteLine($"Error : {response.StatusCode}");}}catch (Exception ex){Console.WriteLine($"Error occurred: {ex.Message}");}}static async Task FetchMatchList(){try{var client = new HttpClient();client.DefaultRequestHeaders.Add("Authorization", $"Bearer {nakamaAuthToken}");var response = await client.GetAsync($"{nakamaApiMatchUrl}?limit=10&min_size=1&max_size=10");if (response.IsSuccessStatusCode){var content = await response.Content.ReadAsStringAsync();var matches = JObject.Parse(content);if(matches.ContainsKey("matches")){foreach (var match in matches["matches"]){Console.WriteLine($"Match ID: {match["match_id"]}, Size: {match["size"]}");}}else{Console.WriteLine($"Match list is empty");}}else{Console.WriteLine($"Error fetching match list: {response.StatusCode}");}}catch (Exception ex){Console.WriteLine($"Error occurred: {ex.Message}");}}static async Task FetchStorageObjectAsync(){try{var client = new HttpClient();client.DefaultRequestHeaders.Add("Authorization", $"Bearer {nakamaAuthToken}");var response = await client.GetAsync($"{nakamaApiStorageUrl}/test/0ba39c8d-5b3d-429d-a570-85af6df61b49");if (response.IsSuccessStatusCode){var content = await response.Content.ReadAsStringAsync();var storageContent = JObject.Parse(content);}else{Console.WriteLine($"Error fetching match list: {response.StatusCode}");}}catch (Exception ex){Console.WriteLine($"Error occurred: {ex.Message}");}}}
  • 上面的代码中简单测试了几个功能部分:登录,获取比赛(房间)列表,存储数据,登出。
  • 其中有一些坑需要注意一下:
    • 上面的配置中,不同的服务有不同的端口,其中7350是http请求的端口,也能自行指定
    • Nakama中的比赛(房间)分为权威(服务器创建)和非权威(玩家自创建),要注意区分(查询时会返回不同)
    • 存储分为服务器内存的存储和数据库本地的持久存储,上面的测试是一个临时行的测试,请求的全文是/v2/storage/{collection}/{userId},如果需要严格测试的话,该测试需要后期进行才能跑通
  • 运行
    如果成功的话,运行的结果应该是上面类似(有部分数据没有打印出来,偷懒直接断点看了)

http://www.ppmy.cn/server/176023.html

相关文章

Powershell和bcp工具实现带多组参数和标签的SQL Server数据库批量数据导出程序

设计一个基于多个带标签SQL模板作为配置文件和多组参数的Powershell代码程序和bcp工具&#xff0c;实现根据不同的输入参数&#xff0c;自动批量地将SQL Server数据库的数据导出为CSV文件到指定目录上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出…

信创环境下TOP5甘特图工具对比:从功能到适配性测评

在数字化转型的浪潮中&#xff0c;项目管理的高效与否直接决定了企业能否在激烈的市场竞争中脱颖而出。而甘特图作为项目管理中不可或缺的工具&#xff0c;其重要性不言而喻。尤其是在信创环境日益受到重视的当下&#xff0c;选择一款适配性强、功能完备的甘特图工具&#xff0…

贪心算法(7)(java) 分发饼干

题目&#xff1a;假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子i&#xff0c;都有一个胃口值g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j&#xff0c;都有一个尺寸 s[j…

C++:类对象的存储方式

如何计算类对象的大小 class A { public: void PrintA() { cout<<_a<<endl; } private: char _a; }; 类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算 一个类的大小&#xff1f; 类对象的存储方…

嵌入式/C++笔试面试指南(前言)

在数字化转型与智能硬件快速发展的时代&#xff0c;嵌入式系统与 C 语言作为支撑物联网、人工智能、工业控制等领域的核心技术&#xff0c;正面临着前所未有的人才需求。无论是初入职场的应届生&#xff0c;还是寻求技术突破的从业者&#xff0c;掌握嵌入式开发与 C 编程的核心…

谷粒商城:性能压测JVM堆区

目录 Kit Apache JMeter VisualVM 堆内存 jvm内存模型 垃圾回收&#xff08;Garbage Collection, GC&#xff09; 新对象分配内存 GC步骤 MinorGC 性能优化 影响因素 优化 nginx动静分离 优化三级分类获取 Jvm参数配置堆区 测试 Kit Apache JMeter 压力测试&…

如何处理PHP中的日期和时间问题

如何处理PHP中的日期和时间问题 在PHP开发中&#xff0c;日期和时间的处理是一个常见且重要的任务。无论是记录用户操作时间、生成时间戳&#xff0c;还是进行日期计算&#xff0c;PHP提供了丰富的函数和类来帮助开发者高效处理这些需求。本文将详细介绍如何在PHP中处理日期和…

关于deepseek R1模型分布式推理效率分析

1、引言 DeepSeek R1 采用了混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;架构&#xff0c;包含多个专家子网络&#xff0c;并通过一个门控机制动态地激活最相关的专家来处理特定的任务 。DeepSeek R1 总共有 6710 亿个参数&#xff0c;但在每个前向传播…