{"id":31056,"date":"2025-04-21T07:07:43","date_gmt":"2025-04-20T23:07:43","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/31056.html"},"modified":"2025-04-21T07:07:43","modified_gmt":"2025-04-20T23:07:43","slug":"%e3%80%90unity%e7%bd%91%e7%bb%9c%e5%90%8c%e6%ad%a5%e6%a1%86%e6%9e%b6-nakama%e7%a0%94%e7%a9%b6%e4%b8%89%e3%80%91","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/31056.html","title":{"rendered":"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011"},"content":{"rendered":"<\/p>\n<h4>\u6587\u7ae0\u76ee\u5f55<\/h4>\n<ul>\n<li>\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 &#8211; Nakama\u7814\u7a76(\u4e09)\u3011<\/li>\n<li>\n<ul>\n<li>\u51c6\u5907\u5de5\u4f5c<\/li>\n<li>\u524d\u8a00<\/li>\n<li>Unity\u90e8\u5206<\/li>\n<li>\n<ul>\n<li>\u8fde\u63a5\u670d\u52a1\u5668<\/li>\n<li>\u521b\u5efa\u5e76\u8fdb\u5165\u623f\u95f4<\/li>\n<li>\u521b\u5efa\u4eba\u7269<\/li>\n<li>\u4eba\u7269\u79fb\u52a8\u548c\u540c\u6b65<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 &#8211; Nakama\u7814\u7a76(\u4e09)\u3011<\/h2>\n<p>\u4ee5\u4e0b\u90e8\u5206\u9700\u8981\u6709\u4e00\u5b9a\u7684Unity\u57fa\u7840&#xff0c;\u5728\u5b98\u65b9\u7684\u6848\u4f8bPirate Panic\u57fa\u7840\u4e0a\u8fdb\u884c\u4fee\u6539\u800c\u6210\u3002\u5982\u679c\u6ca1\u6709\u4e0b\u8f7d\u5e76\u719f\u6089\u8fc7\u5b98\u65b9\u6848\u4f8b&#xff0c;\u6700\u597d\u5148\u4e0b\u8f7d\u5bf9\u5e94\u7684\u5de5\u7a0b\u67e5\u770b\u3002\u5de5\u7a0b\u5730\u5740\u4e3a&#xff1a;https:\/\/github.com\/heroiclabs\/unity-sampleproject&#xff0c;\u5bf9\u5e94\u7684\u6848\u4f8b\u6587\u6863\u4e3a&#xff1a;https:\/\/heroiclabs.com\/docs\/zh\/nakama\/tutorials\/unity\/pirate-panic\/&#xff0c;\u4ee5\u4e0b\u8fd0\u884c\u7684Unity\u7248\u672c\u4e3a2022LTS&#xff0c;\u4e00\u822c\u5173\u7cfb\u4e0d\u5927<\/p>\n<h3>\u51c6\u5907\u5de5\u4f5c<\/h3>\n<ul>\n<li>Unity2022\u6216\u8005\u968f\u4fbf\u4e00\u4e2aLTS\u7248\u672c<\/li>\n<li>VS2022<\/li>\n<li>Nakama Unity SDK(\u5b98\u7f51\u6216\u8005Unity\u5546\u5e97\u90fd\u6709&#xff0c;\u5b9e\u5728\u627e\u4e0d\u5230\u628a\u4e0a\u9762\u7684\u6848\u4f8b\u7684\u7a0b\u5e8f\u96c6\u5077\u51fa\u6765)<\/li>\n<\/ul>\n<h3>\u524d\u8a00<\/h3>\n<ul>\n<li>Nakama\u662f\u4e00\u4e2a\u7f51\u7edc\u540c\u6b65\u5e93&#xff0c;\u517c\u5bb9\u5f88\u591a\u6e38\u620f\u5f15\u64ce&#xff0c;\u540d\u5b57\u53d6\u81ea\u4e8e\u65e5\u8bed\u4f19\u4f34&#xff0c;\u5e95\u5c42\u7531Go\u5f00\u53d1&#xff0c;\u6240\u4ee5\u6027\u80fd\u4e0a\u6709\u4fdd\u8bc1&#xff08;\u53ef\u4ee5\u5bf9\u6bd4\u5176\u4ed6\u6d41\u884c\u7684\u7f51\u7edc\u6846\u67b6&#xff09;\u3002\u5e76\u4e14\u62e5\u6709\u5927\u91cf\u5df2\u7ecf\u5f00\u53d1\u597d\u800c\u4e14\u7ecf\u8fc7\u68c0\u9a8c\u7684\u529f\u80fd&#xff08;\u804a\u5929&#xff0c;\u6392\u884c\u699c&#xff0c;\u7fa4\u7ec4&#xff0c;\u623f\u95f4&#xff0c;\u8eab\u4efd\u9a8c\u8bc1&#xff0c;\u5b58\u50a8&#xff0c;\u597d\u53cb\u7b49\u7b49&#xff09;&#xff0c;\u4f46\u662f\u4e4b\u524d\u5728\u7f51\u7edc\u4e0a&#xff0c;\u751a\u81f3\u5b98\u7f51\u4e0a\u627e\u5230\u7684\u535a\u5ba2\u6216\u8005\u6587\u7ae0\u8981\u4e48\u662f\u6027\u8d28\u96f7\u540c&#xff0c;\u8981\u4e48\u5c31\u662f\u7a7a\u8c08\u3002<\/li>\n<li>\u4ee5\u4e0b\u7684\u6539\u53d8\u4e3b\u8981\u662f\u7528\u4e8e\u7f51\u4e0a\u627e\u4e0d\u5230&#xff0c;AI\u63d0\u4f9b\u4e0d\u51c6\u786e&#xff0c;\u8bba\u575b\u5168\u82f1\u6587&#xff0c;\u7ffb\u627e\u8d44\u6599\u9ebb\u70e6\u7684\u57fa\u7840\u4e0a\u63d0\u4f9b\u7684\u3002<\/li>\n<\/ul>\n<h3>Unity\u90e8\u5206<\/h3>\n<h4>\u8fde\u63a5\u670d\u52a1\u5668<\/h4>\n<ul>\n<li>\u6211\u559c\u6b22\u5c3d\u91cf\u628a\u903b\u8f91\u7cbe\u7b80&#xff0c;\u8ba9\u7a0b\u5e8f\u80fd\u8dd1\u8d77\u6765&#xff0c;\u518d\u53bb\u7814\u7a76\u91cc\u9762\u7684\u7ec6\u8282&#xff0c;\u5c31\u50cf\u94a2\u94c1\u4fa0\u91cc\u9762\u7684\u53f0\u8bcd\u201c\u6709\u65f6\u5019\u4f60\u5f97\u5148\u8dd1\u8d77\u6765&#xff0c;\u518d\u5b66\u4f1a\u8d70\u8def\u201d<\/li>\n<\/ul>\n<p><span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">SerializeField<\/span><\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">GameConnection<\/span> _connection<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string<\/span><\/span> DeviceIdKey <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token string\">&#034;nakama.deviceId&#034;<\/span> <span class=\"token operator\">&#043;<\/span> UserData<span class=\"token punctuation\">.<\/span>Id<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string<\/span><\/span> AuthTokenKey <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token string\">&#034;nakama.authToken&#034;<\/span> <span class=\"token operator\">&#043;<\/span> UserData<span class=\"token punctuation\">.<\/span>Id<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string<\/span><\/span> RefreshTokenKey <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token string\">&#034;nakama.refreshToken&#034;<\/span> <span class=\"token operator\">&#043;<\/span> UserData<span class=\"token punctuation\">.<\/span>Id<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token class-name\">Client<\/span> client<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">private<\/span> <span class=\"token class-name\">ISocket<\/span> socket<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">private<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> ServerIp <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;xxx.xxx.xx.xx&#034;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4f60\u7684ip\u5730\u5740<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">RequireEnterRoom<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>_connection<span class=\"token punctuation\">.<\/span>Session <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> deviceId <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">GetDeviceId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">IsNullOrEmpty<\/span><span class=\"token punctuation\">(<\/span>deviceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nPlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetString<\/span><span class=\"token punctuation\">(<\/span>DeviceIdKey<span class=\"token punctuation\">,<\/span> deviceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">await<\/span> <span class=\"token function\">InitializeGame<\/span><span class=\"token punctuation\">(<\/span>deviceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\">Task<\/span> <span class=\"token function\">InitializeGame<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> deviceId<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nclient <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Client<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;http&#034;<\/span><span class=\"token punctuation\">,<\/span> ServerIp<span class=\"token punctuation\">,<\/span> <span class=\"token number\">7350<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;defaultkey&#034;<\/span><span class=\"token punctuation\">,<\/span> UnityWebRequestAdapter<span class=\"token punctuation\">.<\/span>Instance<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nclient<span class=\"token punctuation\">.<\/span>Timeout <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>socket <span class=\"token operator\">&#061;<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewSocket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token named-parameter punctuation\">useMainThread<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> authToken <span class=\"token operator\">&#061;<\/span> PlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetString<\/span><span class=\"token punctuation\">(<\/span>AuthTokenKey<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">bool<\/span><\/span> isAuthToken <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">!<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">IsNullOrEmpty<\/span><span class=\"token punctuation\">(<\/span>authToken<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> refreshToken <span class=\"token operator\">&#061;<\/span> PlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetString<\/span><span class=\"token punctuation\">(<\/span>RefreshTokenKey<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token class-name\">ISession<\/span> session <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ refresh token can be null\/empty for initial migration of client to using refresh tokens.<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>isAuthToken<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nsession <span class=\"token operator\">&#061;<\/span> Session<span class=\"token punctuation\">.<\/span><span class=\"token function\">Restore<\/span><span class=\"token punctuation\">(<\/span>authToken<span class=\"token punctuation\">,<\/span> refreshToken<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Check whether a session is close to expiry.<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">.<\/span><span class=\"token function\">HasExpired<\/span><span class=\"token punctuation\">(<\/span>DateTime<span class=\"token punctuation\">.<\/span>UtcNow<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddDays<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">try<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ get a new access token<\/span><br \/>\nsession <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">SessionRefreshAsync<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ApiResponseException<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ get a new refresh token<\/span><br \/>\nsession <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">AuthenticateDeviceAsync<\/span><span class=\"token punctuation\">(<\/span>deviceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nPlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetString<\/span><span class=\"token punctuation\">(<\/span>RefreshTokenKey<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">.<\/span>RefreshToken<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>PlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetString<\/span><span class=\"token punctuation\">(<\/span>AuthTokenKey<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">.<\/span>AuthToken<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nsession <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">AuthenticateDeviceAsync<\/span><span class=\"token punctuation\">(<\/span>deviceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nPlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetString<\/span><span class=\"token punctuation\">(<\/span>AuthTokenKey<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">.<\/span>AuthToken<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nPlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetString<\/span><span class=\"token punctuation\">(<\/span>RefreshTokenKey<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">.<\/span>RefreshToken<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">Connect<\/span><span class=\"token punctuation\">(<\/span>socket<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token class-name\">IApiAccount<\/span> account <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">try<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\naccount <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetAccountAsync<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ApiResponseException<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nDebug<span class=\"token punctuation\">.<\/span><span class=\"token function\">LogError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Error getting user account: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> e<span class=\"token punctuation\">.<\/span>Message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>_connection<span class=\"token punctuation\">.<\/span><span class=\"token function\">Init<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> socket<span class=\"token punctuation\">,<\/span> account<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ISocket<\/span> socket<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ISession<\/span> session<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">try<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>socket<span class=\"token punctuation\">.<\/span>IsConnected<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">await<\/span> socket<span class=\"token punctuation\">.<\/span><span class=\"token function\">ConnectAsync<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Exception<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nDebug<span class=\"token punctuation\">.<\/span><span class=\"token function\">LogWarning<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Error connecting socket: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> e<span class=\"token punctuation\">.<\/span>Message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string<\/span><\/span> <span class=\"token function\">GetDeviceId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> deviceId <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>deviceId <span class=\"token operator\">&#061;<\/span> PlayerPrefs<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetString<\/span><span class=\"token punctuation\">(<\/span>DeviceIdKey<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">IsNullOrWhiteSpace<\/span><span class=\"token punctuation\">(<\/span>deviceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ndeviceId <span class=\"token operator\">&#061;<\/span> Guid<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewGuid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">ToString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> deviceId<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4e0a\u9762\u7684\u8fd9\u90e8\u5206\u5c31\u662f\u8fde\u63a5\u7684\u51fd\u6570\u90e8\u5206&#xff0c;\u5176\u4e2d\u7684\u7ed3\u6784GameConnection\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Nakama<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> <span class=\"token namespace\">UnityEngine<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">GameConnection<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">ScriptableObject<\/span><\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span> <span class=\"token class-name\">IClient<\/span> _client<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">IClient<\/span> Client <span class=\"token operator\">&#061;&gt;<\/span> _client<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">ISession<\/span> Session <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">set<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">IApiAccount<\/span> Account <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">set<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token class-name\">ISocket<\/span> _socket<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">ISocket<\/span> Socket <span class=\"token operator\">&#061;&gt;<\/span> _socket<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token class-name\">IChannel<\/span> _channel<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">IChannel<\/span> Channel <span class=\"token operator\">&#061;&gt;<\/span> _channel<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string<\/span><\/span> MatchID <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">set<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IClient<\/span> client<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ISocket<\/span> socket<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">IApiAccount<\/span> account<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ISession<\/span> session<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n_client <span class=\"token operator\">&#061;<\/span> client<span class=\"token punctuation\">;<\/span><br \/>\n_socket <span class=\"token operator\">&#061;<\/span> socket<span class=\"token punctuation\">;<\/span><br \/>\nAccount <span class=\"token operator\">&#061;<\/span> account<span class=\"token punctuation\">;<\/span><br \/>\nSession <span class=\"token operator\">&#061;<\/span> session<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4e0a\u9762\u5927\u90e8\u5206\u7684\u4ee3\u7801\u90fd\u80fd\u5728\u6848\u4f8b\u4e2d\u627e\u5230&#xff0c;\u6709\u4e9b\u5c0f\u4fee\u6539\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5982\u679c\u8981\u5728\u7535\u8111\u4e0a\u5b9e\u73b0\u591a\u5f00&#xff08;\u975e\u7f16\u8f91\u5668\u6a21\u5f0f\u4e0b&#xff0c;\u5904\u4e8e\u6253\u5b8c\u5305\u7684exe\u72b6\u6001&#xff09;&#xff0c;\u9700\u8981\u4fee\u6539DeviceIdKey\u7b49\u53c2\u6570&#xff0c;\u4e0d\u7136\u670d\u52a1\u5668\u63a5\u6536\u5230\u7684\u65f6\u5019&#xff0c;\u8fd9\u4fe9\u4f1a\u8bc6\u522b\u6210\u540c\u4e00\u4e2a\u5e10\u53f7(\u56e0\u4e3a\u4f20\u5165\u7684\u53c2\u6570deviceId\u4e00\u81f4)&#xff0c;\u4f1a\u7ed9\u540e\u7eed\u64cd\u4f5c\u5e26\u6765\u9ebb\u70e6\u3002<\/p>\n<h4>\u521b\u5efa\u5e76\u8fdb\u5165\u623f\u95f4<\/h4>\n<ul>\n<li>\u8fd9\u4e00\u6b65\u5f00\u59cb\u5c31\u8ddf\u6848\u4f8b\u4e2d\u7684\u4e0d\u4e00\u6837\u4e86&#xff0c;\u6848\u4f8b\u4f7f\u7528\u7684\u662fAddMatchmakerAsync&#xff0c;\u8fd9\u4e2a\u65b9\u6cd5\u5728\u6587\u6863\u4e2d\u8bf4\u660e\u662f\u4e0d\u4f1a\u521b\u5efa\u623f\u95f4\u7684&#xff0c;\u53ea\u662f\u7b80\u5355\u7684\u5339\u914d\u673a\u5236&#xff0c;\u6240\u4ee5\u5982\u679c\u8fd9\u4e2a\u65f6\u5019\u4f60\u5199\u4e86\u5982\u4e0b\u4ee3\u7801&#xff1a;<\/li>\n<\/ul>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">ListMatchesAndJoin<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> minPlayers <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> maxPlayers <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> limit <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> authoritative <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> label <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> query <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;*&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">try<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">ListMatchesAsync<\/span><span class=\"token punctuation\">(<\/span>_connection<span class=\"token punctuation\">.<\/span>Session<span class=\"token punctuation\">,<\/span> minPlayers<span class=\"token punctuation\">,<\/span> maxPlayers<span class=\"token punctuation\">,<\/span> limit<span class=\"token punctuation\">,<\/span> authoritative<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6dfb\u52a0\u65b0\u7684\u5217\u8868\u9879<\/span><br \/>\n<span class=\"token keyword\">foreach<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> match <span class=\"token keyword\">in<\/span> result<span class=\"token punctuation\">.<\/span>Matches<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nDebug<span class=\"token punctuation\">.<\/span><span class=\"token function\">LogFormat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;{0}: {1}\/{2} players&#034;<\/span><span class=\"token punctuation\">,<\/span> match<span class=\"token punctuation\">.<\/span>MatchId<span class=\"token punctuation\">,<\/span> match<span class=\"token punctuation\">.<\/span>Size<span class=\"token punctuation\">,<\/span> maxPlayers<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">JoinMatch<\/span><span class=\"token punctuation\">(<\/span>match<span class=\"token punctuation\">.<\/span>MatchId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">System<span class=\"token punctuation\">.<\/span>Exception<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nDebug<span class=\"token punctuation\">.<\/span><span class=\"token function\">LogError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Error listing matches: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> e<span class=\"token punctuation\">.<\/span>Message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5230\u65f6\u5019\u4f60\u5c31\u4f1a\u53d1\u73b0\u600e\u4e48\u90fd\u62ff\u4e0d\u5230\u623f\u95f4\u4fe1\u606f&#xff0c;\u4e00\u76f4\u8fd4\u56de\u7a7a&#xff0c;\u8fd9\u91cc\u6839\u636e\u9700\u6c42\u5206\u4e3a\u4e24\u6b65&#xff0c;\u4e00\u662f\u4f60\u81ea\u5df1\u521b\u5efa\u7684\u623f\u95f4&#xff08;\u5982\u679c\u4eba\u6570\u4e3a0&#xff0c;\u4f1a\u88ab\u9500\u6bc1&#xff0c;\u800c\u4e14\u8d70\u7684\u662f\u5b98\u65b9\u8bbe\u5b9a\u597d\u7684\u903b\u8f91&#xff0c;\u53eb\u975e\u6743\u5a01\u6bd4\u8d5b&#xff09;&#xff0c;\u4e8c\u662f\u670d\u52a1\u5668\u521b\u5efa\u7684\u6743\u5a01\u6bd4\u8d5b&#xff0c;\u8fd9\u4e2a\u6bd4\u8d5b\u5373\u4f7f\u623f\u95f4\u5185\u4eba\u6570\u4e3a0\u4e5f\u4e0d\u4f1a\u89e3\u6563&#xff08;\u5173\u670d\u52a1\u5668\u8fd8\u662f\u4f1a\u89e3\u6563\u7684&#xff09;<\/p>\n<p><span class=\"token comment\">\/\/ \u8fd9\u662f\u975e\u6743\u5a01\u6bd4\u8d5b(\u6743\u5a01\u6bd4\u8d5b\u4f1a\u5728\u4e0a\u8ff0\u4ee3\u7801\u4e2d\u76f4\u63a5\u8fd4\u56de\u5bf9\u5e94\u7684matchid)<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> matchid <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> _connection<span class=\"token punctuation\">.<\/span>Socket<span class=\"token punctuation\">.<\/span><span class=\"token function\">CreateMatchAsync<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u901a\u8fc7\u8fd4\u56de\u7684matchid\u52a0\u5165<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> match <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> socket<span class=\"token punctuation\">.<\/span><span class=\"token function\">JoinMatchAsync<\/span><span class=\"token punctuation\">(<\/span>matchId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u81f3\u4e8e\u5982\u4f55\u521b\u5efa\u670d\u52a1\u5668\u7684\u6743\u5a01\u6bd4\u8d5b&#xff0c;\u7559\u5230\u4e0b\u6b21\u8bb2\u670d\u52a1\u5668\u6269\u5c55\u518d\u8bf4\u3002<\/p>\n<ul>\n<li>\u8d70\u5230\u8fd9\u4e00\u6b65&#xff0c;\u5176\u5b9e\u6211\u4eec\u5df2\u7ecf\u5728\u623f\u95f4\u91cc\u4e86&#xff0c;\u770b\u670d\u52a1\u5668\u7684\u65e5\u5fd7&#xff0c;<img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250420230741-68057e3d75451.png\" alt=\"\u65e5\u5fd7\" \/> \u7b2c\u4e00\u6761\u662f\u8fde\u63a5socket&#xff0c;\u7b2c\u4e8c\u6761\u662f\u52a0\u5165\u623f\u95f4\u3002<\/li>\n<\/ul>\n<h4>\u521b\u5efa\u4eba\u7269<\/h4>\n<ul>\n<li>\u8fdb\u5165\u4e86\u623f\u95f4&#xff0c;\u63a5\u4e0b\u53bb\u505a\u7684\u4e00\u822c\u662f\u521b\u5efa\u4f60\u6240\u52a0\u5165\u623f\u95f4\u7684\u90a3\u4e2a\u6446\u8bbe&#xff0c;\u6216\u8005\u65b0\u7684\u573a\u666f&#xff0c;\u7136\u540e\u7ed9\u670d\u52a1\u5668\u53d1\u9001\u521b\u5efa\u4eba\u7269\u7684\u4fe1\u606f&#xff0c;\u6d89\u53ca\u5230\u64cd\u4f5c\u4fe1\u606f\u5728\u623f\u95f4\u5185\u7684\u4f20\u9012\u3002<\/li>\n<li>\u521b\u5efa\u65b0\u7684\u573a\u666f\u8fd9\u4e00\u70b9&#xff0c;Unity\u81ea\u5df1\u5c31\u80fd\u505a\u5230<\/li>\n<li>\u53d1\u9001\u64cd\u4f5c\u4fe1\u606f\u8981\u5206\u5f00&#xff0c;\u56e0\u4e3aNakama\u6709\u5f88\u591a\u79cd\u6e20\u9053\u53ef\u4ee5\u53d1\u9001\u6d88\u606f&#xff0c;\u8fd9\u91cc\u91c7\u7528\u6b63\u89c4\u4e00\u70b9\u7684\u623f\u95f4\u6d88\u606f&#xff0c;\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5982\u679c\u8fd9\u4e2a\u623f\u95f4\u662f\u975e\u6743\u5a01\u623f\u95f4&#xff0c;\u90a3\u4e48\u623f\u95f4\u4fe1\u606fNakama\u7ed9\u4f60\u5199\u597d\u4e86&#xff0c;\u5982\u679c\u662f\u670d\u52a1\u5668\u81ea\u5df1\u521b\u5efa\u7684\u975e\u6743\u5a01\u623f\u95f4&#xff0c;\u90a3\u4e48\u9700\u8981\u4f60\u81ea\u5df1\u5199\u3002<\/li>\n<\/ul>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\">Task<\/span> <span class=\"token function\">SpawnPlayer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> matchMessagePlayerCreate <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">MatchMessagePlayerCreate<\/span><span class=\"token punctuation\">(<\/span><br \/>\nBattleSceneController<span class=\"token punctuation\">.<\/span>Instance<span class=\"token punctuation\">.<\/span>Connection<span class=\"token punctuation\">.<\/span>Session<span class=\"token punctuation\">.<\/span>Username<span class=\"token punctuation\">,<\/span><br \/>\nBattleSceneController<span class=\"token punctuation\">.<\/span>Instance<span class=\"token punctuation\">.<\/span>Connection<span class=\"token punctuation\">.<\/span>Session<span class=\"token punctuation\">.<\/span>UserId<span class=\"token punctuation\">,<\/span><br \/>\nrandomPos<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span><br \/>\nrandomPos<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span><br \/>\nrandomPos<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\nselectCharacterId<span class=\"token punctuation\">,<\/span><br \/>\nselectCharacterData<br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nBattleSceneController<span class=\"token punctuation\">.<\/span>Instance<span class=\"token punctuation\">.<\/span>StateManager<span class=\"token punctuation\">.<\/span><span class=\"token function\">SendMatchStateMessage<\/span><span class=\"token punctuation\">(<\/span>MatchMessageType<span class=\"token punctuation\">.<\/span>UnitSpawned<span class=\"token punctuation\">,<\/span> matchMessagePlayerCreate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nBattleSceneController<span class=\"token punctuation\">.<\/span>Instance<span class=\"token punctuation\">.<\/span>StateManager<span class=\"token punctuation\">.<\/span><span class=\"token function\">SendMatchStateMessageSelf<\/span><span class=\"token punctuation\">(<\/span>MatchMessageType<span class=\"token punctuation\">.<\/span>UnitSpawned<span class=\"token punctuation\">,<\/span> matchMessagePlayerCreate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u521b\u5efa\u4eba\u7269\u4fe1\u606f\u7684\u65b9\u5f0f\u8ddf\u6848\u4f8b\u91cc\u9762\u7684\u5dee\u4e0d\u591a&#xff0c;\u6ce8\u610f\u4e00\u4e0b\u65f6\u5e8f\u95ee\u9898\u5373\u53ef\u3002\u7136\u540e\u5728\u76d1\u542c\u5bf9\u5e94\u4e8b\u4ef6\u7684\u5730\u65b9GameStateManager\u5904\u7406\u670d\u52a1\u5668\u53d1\u9001\u8fc7\u6765\u7684\u6d88\u606f\u5373\u53ef\u3002<\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token class-name\">GameConnection<\/span> _connection<span class=\"token punctuation\">;<\/span><\/p>\n<p>_connection<span class=\"token punctuation\">.<\/span>Socket<span class=\"token punctuation\">.<\/span>ReceivedMatchState <span class=\"token operator\">&#043;&#061;<\/span> ReceiveMatchStateMessage<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">ReceiveMatchStateMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IMatchState<\/span> matchState<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> messageJson <span class=\"token operator\">&#061;<\/span> System<span class=\"token punctuation\">.<\/span>Text<span class=\"token punctuation\">.<\/span>Encoding<span class=\"token punctuation\">.<\/span>UTF8<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetString<\/span><span class=\"token punctuation\">(<\/span>matchState<span class=\"token punctuation\">.<\/span>State<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">IsNullOrEmpty<\/span><span class=\"token punctuation\">(<\/span>messageJson<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">ReceiveMatchStateHandle<\/span><span class=\"token punctuation\">(<\/span>matchState<span class=\"token punctuation\">.<\/span>OpCode<span class=\"token punctuation\">,<\/span> messageJson<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token generic-method\"><span class=\"token function\">SendMatchStateMessageSelf<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>T<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">MatchMessageType<\/span> opCode<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">T<\/span> message<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">where<\/span> <span class=\"token class-name\">T<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">MatchMessage<span class=\"token punctuation\">&lt;<\/span>T<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>opCode<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">case<\/span> MatchMessageType<span class=\"token punctuation\">.<\/span>UnitSpawned<span class=\"token punctuation\">:<\/span><br \/>\nOnPlayerCreate<span class=\"token punctuation\">?.<\/span><span class=\"token function\">Invoke<\/span><span class=\"token punctuation\">(<\/span>message <span class=\"token keyword\">as<\/span> <span class=\"token class-name\">MatchMessagePlayerCreate<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">default<\/span><span class=\"token punctuation\">:<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">ReceiveMatchStateHandle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\"><span class=\"token keyword\">long<\/span><\/span> opCode<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\"><span class=\"token keyword\">string<\/span><\/span> messageJson<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>MatchMessageType<span class=\"token punctuation\">)<\/span>opCode<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">case<\/span> MatchMessageType<span class=\"token punctuation\">.<\/span>UnitSpawned<span class=\"token punctuation\">:<\/span><br \/>\n<span class=\"token class-name\">MatchMessagePlayerCreate<\/span> matchMessagePlayerCreate <span class=\"token operator\">&#061;<\/span> MatchMessagePlayerCreate<span class=\"token punctuation\">.<\/span><span class=\"token function\">Parse<\/span><span class=\"token punctuation\">(<\/span>messageJson<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nOnPlayerCreate<span class=\"token punctuation\">?.<\/span><span class=\"token function\">Invoke<\/span><span class=\"token punctuation\">(<\/span>matchMessagePlayerCreate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">default<\/span><span class=\"token punctuation\">:<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6709\u4e00\u70b9\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;Nakama\u4f20\u9012\u7684\u6d88\u606f\u7ed3\u6784\u5b57\u6bb5\u662fjson&#xff0c;\u800c\u4e14\u662fBase64\u8f6c\u4e49\u4e4b\u540e\u7684&#xff0c;\u5982\u679c\u4f60\u5728\u670d\u52a1\u5668\u7684\u65e5\u5fd7\u4e2d\u770b\u5230\u9519\u8bef\u4fe1\u606f&#xff0c;\u8bb0\u5f97\u5148\u8f6c\u56de\u6b63\u5e38\u7684\u5b57\u7b26\u4e32\u3002<\/p>\n<ul>\n<li>\u7136\u540e\u4f60\u7684\u4eba\u7269\u5c31\u80fd\u51fa\u73b0\u5728\u573a\u666f\u4e2d\u4e86\u3002<img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250420230741-68057e3da2263.png\" alt=\"\u4eba\u7269\" \/><\/li>\n<\/ul>\n<h4>\u4eba\u7269\u79fb\u52a8\u548c\u540c\u6b65<\/h4>\n<ul>\n<li>\u518d\u5f80\u540e\u9762\u5c31\u662f\u6b63\u5e38\u7684\u4eba\u7269\u4e4b\u95f4\u7684\u540c\u6b65\u4fe1\u606f&#xff0c;\u6bd4\u5982\u4eba\u7269\u7684\u65cb\u8f6c&#xff0c;\u79fb\u52a8&#xff0c;\u52a8\u753b\u7b49\u7b49&#xff0c;\u90fd\u53ef\u4ee5\u5728\u4e0a\u9762ReceiveMatchStateHandle\u65b9\u6cd5\u91cc\u9762\u8fdb\u884c\u76d1\u542c\u548c\u6267\u884c&#xff0c;\u6d89\u53ca\u5230Cinemachine&#xff0c;Timeline&#xff0c;\u52a8\u753b\u72b6\u6001\u673a\u7b49\u7b49&#xff0c;\u5c31\u4e0d\u5728\u8fd9\u91cc\u8be6\u7ec6\u5c55\u5f00\u4e86\u3002<\/li>\n<\/ul>\n<p>\u4e0b\u4e00\u7ae0\u8bb2\u8bb2\u670d\u52a1\u5668\u7684\u6269\u5c55\u76f8\u5173\u548c\u4e00\u4e9b\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1.3k\u6b21\uff0c\u70b9\u8d5e25\u6b21\uff0c\u6536\u85cf23\u6b21\u3002Nakama\u662f\u4e00\u4e2a\u7f51\u7edc\u540c\u6b65\u5e93\uff0c\u517c\u5bb9\u5f88\u591a\u6e38\u620f\u5f15\u64ce\uff0c\u540d\u5b57\u53d6\u81ea\u4e8e\u65e5\u8bed\u4f19\u4f34\uff0c\u5e95\u5c42\u7531Go\u5f00\u53d1\uff0c\u6240\u4ee5\u6027\u80fd\u4e0a\u6709\u4fdd\u8bc1\uff08\u53ef\u4ee5\u5bf9\u6bd4\u5176\u4ed6\u6d41\u884c\u7684\u7f51\u7edc\u6846\u67b6\uff09\u3002\u5e76\u4e14\u62e5\u6709\u5927\u91cf\u5df2\u7ecf\u5f00\u53d1\u597d\u800c\u4e14\u7ecf\u8fc7\u68c0\u9a8c\u7684\u529f\u80fd\uff08\u804a\u5929\uff0c\u6392\u884c\u699c\uff0c\u7fa4\u7ec4\uff0c\u623f\u95f4\uff0c\u8eab\u4efd\u9a8c\u8bc1\uff0c\u5b58\u50a8\uff0c\u597d\u53cb\u7b49\u7b49\uff09\uff0c\u4f46\u662f\u4e4b\u524d\u5728\u7f51\u7edc\u4e0a\uff0c\u751a\u81f3\u5b98\u7f51\u4e0a\u627e\u5230\u7684\u535a\u5ba2\u6216\u8005\u6587\u7ae0\u8981\u4e48\u662f\u6027\u8d28\u96f7\u540c\uff0c\u8981\u4e48\u5c31\u662f\u7a7a\u8c08\u3002\u4ee5\u4e0b\u7684\u6539\u53d8\u4e3b\u8981\u662f\u7528\u4e8e\u7f51\u4e0a\u627e\u4e0d\u5230\uff0cAI\u63d0\u4f9b\u4e0d\u51c6\u786e\uff0c\u8bba\u575b\u5168\u82f1\u6587\uff0c\u7ffb\u627e\u8d44\u6599\u9ebb\u70e6\u7684\u57fa\u7840\u4e0a\u63d0\u4f9b\u7684\u3002_nakama \u6846\u67b6<\/p>\n","protected":false},"author":2,"featured_media":31054,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[183,735,78],"topic":[],"class_list":["post-31056","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-unity","tag-735","tag-78"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/31056.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1.3k\u6b21\uff0c\u70b9\u8d5e25\u6b21\uff0c\u6536\u85cf23\u6b21\u3002Nakama\u662f\u4e00\u4e2a\u7f51\u7edc\u540c\u6b65\u5e93\uff0c\u517c\u5bb9\u5f88\u591a\u6e38\u620f\u5f15\u64ce\uff0c\u540d\u5b57\u53d6\u81ea\u4e8e\u65e5\u8bed\u4f19\u4f34\uff0c\u5e95\u5c42\u7531Go\u5f00\u53d1\uff0c\u6240\u4ee5\u6027\u80fd\u4e0a\u6709\u4fdd\u8bc1\uff08\u53ef\u4ee5\u5bf9\u6bd4\u5176\u4ed6\u6d41\u884c\u7684\u7f51\u7edc\u6846\u67b6\uff09\u3002\u5e76\u4e14\u62e5\u6709\u5927\u91cf\u5df2\u7ecf\u5f00\u53d1\u597d\u800c\u4e14\u7ecf\u8fc7\u68c0\u9a8c\u7684\u529f\u80fd\uff08\u804a\u5929\uff0c\u6392\u884c\u699c\uff0c\u7fa4\u7ec4\uff0c\u623f\u95f4\uff0c\u8eab\u4efd\u9a8c\u8bc1\uff0c\u5b58\u50a8\uff0c\u597d\u53cb\u7b49\u7b49\uff09\uff0c\u4f46\u662f\u4e4b\u524d\u5728\u7f51\u7edc\u4e0a\uff0c\u751a\u81f3\u5b98\u7f51\u4e0a\u627e\u5230\u7684\u535a\u5ba2\u6216\u8005\u6587\u7ae0\u8981\u4e48\u662f\u6027\u8d28\u96f7\u540c\uff0c\u8981\u4e48\u5c31\u662f\u7a7a\u8c08\u3002\u4ee5\u4e0b\u7684\u6539\u53d8\u4e3b\u8981\u662f\u7528\u4e8e\u7f51\u4e0a\u627e\u4e0d\u5230\uff0cAI\u63d0\u4f9b\u4e0d\u51c6\u786e\uff0c\u8bba\u575b\u5168\u82f1\u6587\uff0c\u7ffb\u627e\u8d44\u6599\u9ebb\u70e6\u7684\u57fa\u7840\u4e0a\u63d0\u4f9b\u7684\u3002_nakama \u6846\u67b6\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/31056.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-20T23:07:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250420230741-68057e3d75451.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/31056.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/31056.html\",\"name\":\"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-04-20T23:07:43+00:00\",\"dateModified\":\"2025-04-20T23:07:43+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/31056.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/31056.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/31056.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/31056.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1.3k\u6b21\uff0c\u70b9\u8d5e25\u6b21\uff0c\u6536\u85cf23\u6b21\u3002Nakama\u662f\u4e00\u4e2a\u7f51\u7edc\u540c\u6b65\u5e93\uff0c\u517c\u5bb9\u5f88\u591a\u6e38\u620f\u5f15\u64ce\uff0c\u540d\u5b57\u53d6\u81ea\u4e8e\u65e5\u8bed\u4f19\u4f34\uff0c\u5e95\u5c42\u7531Go\u5f00\u53d1\uff0c\u6240\u4ee5\u6027\u80fd\u4e0a\u6709\u4fdd\u8bc1\uff08\u53ef\u4ee5\u5bf9\u6bd4\u5176\u4ed6\u6d41\u884c\u7684\u7f51\u7edc\u6846\u67b6\uff09\u3002\u5e76\u4e14\u62e5\u6709\u5927\u91cf\u5df2\u7ecf\u5f00\u53d1\u597d\u800c\u4e14\u7ecf\u8fc7\u68c0\u9a8c\u7684\u529f\u80fd\uff08\u804a\u5929\uff0c\u6392\u884c\u699c\uff0c\u7fa4\u7ec4\uff0c\u623f\u95f4\uff0c\u8eab\u4efd\u9a8c\u8bc1\uff0c\u5b58\u50a8\uff0c\u597d\u53cb\u7b49\u7b49\uff09\uff0c\u4f46\u662f\u4e4b\u524d\u5728\u7f51\u7edc\u4e0a\uff0c\u751a\u81f3\u5b98\u7f51\u4e0a\u627e\u5230\u7684\u535a\u5ba2\u6216\u8005\u6587\u7ae0\u8981\u4e48\u662f\u6027\u8d28\u96f7\u540c\uff0c\u8981\u4e48\u5c31\u662f\u7a7a\u8c08\u3002\u4ee5\u4e0b\u7684\u6539\u53d8\u4e3b\u8981\u662f\u7528\u4e8e\u7f51\u4e0a\u627e\u4e0d\u5230\uff0cAI\u63d0\u4f9b\u4e0d\u51c6\u786e\uff0c\u8bba\u575b\u5168\u82f1\u6587\uff0c\u7ffb\u627e\u8d44\u6599\u9ebb\u70e6\u7684\u57fa\u7840\u4e0a\u63d0\u4f9b\u7684\u3002_nakama \u6846\u67b6","og_url":"https:\/\/www.wsisp.com\/helps\/31056.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-04-20T23:07:43+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250420230741-68057e3d75451.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/31056.html","url":"https:\/\/www.wsisp.com\/helps\/31056.html","name":"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-04-20T23:07:43+00:00","dateModified":"2025-04-20T23:07:43+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/31056.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/31056.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/31056.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010Unity\u7f51\u7edc\u540c\u6b65\u6846\u67b6 - Nakama\u7814\u7a76(\u4e09)\u3011"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/31056","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=31056"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/31056\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/31054"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=31056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=31056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=31056"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=31056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}