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

金歌  论坛元老 | 2025-3-16 22:10:38 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1003|帖子 1003|积分 3009

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

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

   使用官方保举的Docker进行安装
  

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


这代表你的服务端已经正常开启了,接下来我们测试一下对应的一些方法和函数。
我的设置文件docker-compose(官网上也能找到类似的)
  1. version: '3'
  2. services:
  3.   cockroachdb:
  4.     image: cockroachdb/cockroach:latest-v23.1
  5.     command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/
  6.     restart: "no"
  7.     volumes:
  8.       - data:/var/lib/cockroach
  9.     expose:
  10.       - "8080"
  11.       - "26257"
  12.     ports:
  13.       - "26257:26257"
  14.       - "8080:8080"
  15.     healthcheck:
  16.       test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"]
  17.       interval: 3s
  18.       timeout: 3s
  19.       retries: 5
  20.   nakama:
  21.     image: registry.heroiclabs.com/heroiclabs/nakama:3.22.0
  22.     entrypoint:
  23.       - "/bin/sh"
  24.       - "-ecx"
  25.       - >
  26.           /nakama/nakama migrate up --database.address root@cockroachdb:26257 &&
  27.           exec /nakama/nakama --name nakama1 --database.address root@cockroachdb:26257 --logger.level DEBUG --session.token_expiry_sec 7200 --metrics.prometheus_port 9100
  28.     restart: "no"
  29.     links:
  30.       - "cockroachdb:db"
  31.     depends_on:
  32.       - cockroachdb
  33.       - prometheus
  34.     volumes:
  35.       - ./:/nakama/data
  36.     environment:
  37.       - NAKAMA_RUNTIME_PATH=/nakama/data/modules
  38.     expose:
  39.       - "7349"
  40.       - "7350"
  41.       - "7351"
  42.       - "9100"
  43.     ports:
  44.       - "7349:7349"
  45.       - "7350:7350"
  46.       - "7351:7351"
  47.     healthcheck:
  48.       test: ["CMD", "/nakama/nakama", "healthcheck"]
  49.       interval: 10s
  50.       timeout: 5s
  51.       retries: 5
  52.   prometheus:
  53.     image: prom/prometheus
  54.     entrypoint: /bin/sh -c
  55.     command: |
  56.       'sh -s <<EOF
  57.         cat > ./prometheus.yml <<EON
  58.       global:
  59.         scrape_interval:     15s
  60.         evaluation_interval: 15s
  61.       scrape_configs:
  62.         - job_name: prometheus
  63.           static_configs:
  64.           - targets: ['localhost:9090']
  65.         - job_name: nakama
  66.           metrics_path: /
  67.           static_configs:
  68.           - targets: ['nakama:9100']
  69.       EON
  70.       prometheus --config.file=./prometheus.yml
  71.       EOF'
  72.     ports:
  73.       - '9090:9090'
  74. volumes:
  75.   data:
复制代码
服务器简单测试

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

  • 为了方便测试,我们在这里先不使用Unity,直接打开一个C#程序,我们只是测试一下而已,按照简单的来。有几个重要的网站必要记一下:

    • 本地控制台
    • 接口Api地址(包含client和console)

  • 测试代码如下:
  1. using Newtonsoft.Json.Linq;
  2. using System.Text;
  3. class Program
  4. {
  5.         private static readonly string nakamaApiMatchUrl = "http://127.0.0.1:7350/v2/match";
  6.         private static readonly string nakamaApiUrl = "http://127.0.0.1:7350/v2/account/authenticate/device?create=true";
  7.         private static readonly string nakamaApiLogoutUrl = "http://127.0.0.1:7350/v2/session/logout";
  8.         private static readonly string nakamaApiStorageUrl = "http://127.0.0.1:7350/v2/storage";
  9.         private static readonly string nakamaApiKey = "defaultkey";
  10.         private static string nakamaAuthToken = "nakama.autoToken";
  11.         static async Task Main(string[] args)
  12.         {
  13.                 await AuthenticateDevice();
  14.                 await FetchMatchList();
  15.                 await FetchStorageObjectAsync();
  16.                 await LogOut();
  17.         }
  18.        
  19.         static async Task AuthenticateDevice()
  20.         {
  21.                 try
  22.                 {
  23.                         var authHeader = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{nakamaApiKey}:"));
  24.        
  25.                         var client = new HttpClient();
  26.                         client.DefaultRequestHeaders.Add("Authorization", $"Basic {authHeader}");
  27.        
  28.                         var postData = new { id = "someuniqueidentifier" };
  29.                         var json = Newtonsoft.Json.JsonConvert.SerializeObject(postData);
  30.                         var content = new StringContent(json, Encoding.UTF8, "application/json");
  31.        
  32.                         var response = await client.PostAsync(nakamaApiUrl, content);
  33.        
  34.                         if (response.IsSuccessStatusCode)
  35.                         {
  36.                                 var responseContent = await response.Content.ReadAsStringAsync();
  37.                                 var responseJson = JObject.Parse(responseContent);
  38.        
  39.                                 Console.WriteLine("Authentication successful.");
  40.                                 Console.WriteLine($"Session Token: {responseJson["token"]}");
  41.                                 if(responseJson.ContainsKey("token"))
  42.                                         nakamaAuthToken = responseJson["token"].ToString();
  43.                         }
  44.                         else
  45.                         {
  46.                                 Console.WriteLine($"Error authenticating device: {response.StatusCode}");
  47.                         }
  48.                 }
  49.                 catch (Exception ex)
  50.                 {
  51.                         Console.WriteLine($"Error occurred: {ex.Message}");
  52.                         Console.WriteLine("Please check the URL and network connection. If the issue persists, ensure the URL is correct and the server is running.");
  53.                 }
  54.         }
  55.        
  56.         static async Task LogOut()
  57.         {
  58.                 try
  59.                 {
  60.                         var client = new HttpClient();
  61.                         client.DefaultRequestHeaders.Add("Authorization", $"Bearer {nakamaAuthToken}");
  62.        
  63.                         var response = await client.PostAsync($"{nakamaApiLogoutUrl}", null);
  64.        
  65.                         if (response.IsSuccessStatusCode)
  66.                         {
  67.                                 var content = await response.Content.ReadAsStringAsync();
  68.                                 var _content = JObject.Parse(content);
  69.                         }
  70.                         else
  71.                         {
  72.                                 Console.WriteLine($"Error : {response.StatusCode}");
  73.                         }
  74.                 }
  75.                 catch (Exception ex)
  76.                 {
  77.                         Console.WriteLine($"Error occurred: {ex.Message}");
  78.                 }
  79.         }
  80.        
  81.         static async Task FetchMatchList()
  82.         {
  83.                 try
  84.                 {
  85.                         var client = new HttpClient();
  86.                         client.DefaultRequestHeaders.Add("Authorization", $"Bearer {nakamaAuthToken}");
  87.        
  88.                         var response = await client.GetAsync($"{nakamaApiMatchUrl}?limit=10&min_size=1&max_size=10");
  89.        
  90.                         if (response.IsSuccessStatusCode)
  91.                         {
  92.                                 var content = await response.Content.ReadAsStringAsync();
  93.                                 var matches = JObject.Parse(content);
  94.        
  95.                                 if(matches.ContainsKey("matches"))
  96.                                 {
  97.                                         foreach (var match in matches["matches"])
  98.                                         {
  99.                                                 Console.WriteLine($"Match ID: {match["match_id"]}, Size: {match["size"]}");
  100.                                         }
  101.                                 }
  102.                                 else
  103.                                 {
  104.                                         Console.WriteLine($"Match list is empty");
  105.                                 }
  106.                         }
  107.                         else
  108.                         {
  109.                                 Console.WriteLine($"Error fetching match list: {response.StatusCode}");
  110.                         }
  111.                 }
  112.                 catch (Exception ex)
  113.                 {
  114.                         Console.WriteLine($"Error occurred: {ex.Message}");
  115.                 }
  116.         }
  117.        
  118.         static async Task FetchStorageObjectAsync()
  119.         {
  120.                 try
  121.                 {
  122.                         var client = new HttpClient();
  123.                         client.DefaultRequestHeaders.Add("Authorization", $"Bearer {nakamaAuthToken}");
  124.        
  125.                         var response = await client.GetAsync($"{nakamaApiStorageUrl}/test/0ba39c8d-5b3d-429d-a570-85af6df61b49");
  126.        
  127.                         if (response.IsSuccessStatusCode)
  128.                         {
  129.                                 var content = await response.Content.ReadAsStringAsync();
  130.                                 var storageContent = JObject.Parse(content);
  131.                         }
  132.                         else
  133.                         {
  134.                                 Console.WriteLine($"Error fetching match list: {response.StatusCode}");
  135.                         }
  136.                 }
  137.                 catch (Exception ex)
  138.                 {
  139.                         Console.WriteLine($"Error occurred: {ex.Message}");
  140.                 }
  141.         }
  142. }
复制代码


  • 上面的代码中简单测试了几个功能部门:登录,获取比赛(房间)列表,存储数据,登出。
  • 其中有一些坑必要留意一下:

    • 上面的设置中,不同的服务有不同的端口,其中7350是http请求的端口,也能自行指定
    • Nakama中的比赛(房间)分为权势巨子(服务器创建)和非权势巨子(玩家自创建),要留意区分(查询时会返回不同)
    • 存储分为服务器内存的存储和数据库本地的持久存储,上面的测试是一个临时行的测试,请求的全文是/v2/storage/{collection}/{userId},如果必要严格测试的话,该测试必要后期进行才气跑通


  • 如果乐成的话,运行的效果应该是上面类似(有部门数据没有打印出来,偷懒直接断点看了)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表