启动
打开 PlayNANOO 帮助台,用户可以提交和查看咨询。
URL 确认
此功能使用 help.playnanoo.com 域名。
功能概述
帮助台有两种运行模式:
- 访客模式:未登录的用户也可以提交咨询
- 玩家模式:携带已登录用户信息提交咨询
认证方式
玩家模式通过 authKey 参数进行认证。
AuthKey 生成
using System;
using System.Text;
public static string CreateAuthKey(string gameId, string userId)
{
// AuthKey = Base64(GameId + UserId)
string authKeySource = gameId + userId;
return Convert.ToBase64String(Encoding.UTF8.GetBytes(authKeySource));
}
Unity C# 实现
帮助台类
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public class HelpDesk
{
private static string baseUrl = "https://help.playnanoo.com";
private static Dictionary<string, string> optionalParams = new Dictionary<string, string>();
public static void ClearOptional()
{
optionalParams.Clear();
}
public static void SetOptional(string key, string value)
{
if (optionalParams.ContainsKey(key))
optionalParams[key] = value;
else
optionalParams.Add(key, value);
}
private static string DictionaryToJson(Dictionary<string, string> dict)
{
if (dict.Count == 0) return "{}";
string json = "{";
bool first = true;
foreach (var kvp in dict)
{
if (!first) json += ",";
json += $"\"{kvp.Key}\":\"{kvp.Value}\"";
first = false;
}
json += "}";
return json;
}
private static string CreateAuthKey(string gameId, string userId)
{
string authKeySource = gameId + userId;
return Convert.ToBase64String(Encoding.UTF8.GetBytes(authKeySource));
}
public static void OpenView(string url, Action onClose = null)
{
Debug.Log($"Opening WebView: {url}");
Application.OpenURL(url);
onClose?.Invoke();
}
public static void OpenPlayerMode(Action onClose = null)
{
string uuid = DataManager.Instance.UUID;
string authKey = CreateAuthKey(HttpClient.GameId, uuid);
string url = $"{baseUrl}/{HttpClient.GameId}" +
$"?userId={UnityWebRequest.EscapeURL(uuid)}" +
$"&authKey={UnityWebRequest.EscapeURL(authKey)}";
// Optional 파라미터를 Base64 JSON으로 인코딩
if (optionalParams.Count > 0)
{
string optionalJson = DictionaryToJson(optionalParams);
string optionalBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(optionalJson));
url += $"&optional={UnityWebRequest.EscapeURL(optionalBase64)}";
}
OpenView(url, onClose);
}
public static void OpenGuestMode(Action onClose = null)
{
string url = $"{baseUrl}/{HttpClient.GameId}?mode=guest";
// Optional 파라미터를 Base64 JSON으로 인코딩
if (optionalParams.Count > 0)
{
string optionalJson = DictionaryToJson(optionalParams);
string optionalBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(optionalJson));
url += $"&optional={UnityWebRequest.EscapeURL(optionalBase64)}";
}
OpenView(url, onClose);
}
}
主要方法
ClearOptional()
清除所有可选参数。
HelpDesk.ClearOptional();
SetOptional(string key, string value)
设置可选参数。用于传递游戏自定义信息。
参数:
key:参数键value:参数值
HelpDesk.SetOptional("GAME_SERVER", "ASIA");
HelpDesk.SetOptional("GAME_NICKNAME", "PlayerName");
Base64 JSON 编码
设置的可选参数在内部会转换为 JSON 后进行 Base64 编码,通过 URL 的 optional 参数传递。
OpenPlayerMode(Action onClose = null)
以玩家模式打开帮助台。已登录用户信息会自动包含在内。
参数:
onClose:帮助台关闭时调用的回调(可选)
URL 参数:
| 参数 | 说明 |
|---|---|
| userId | 用户唯一 ID (UUID) |
| authKey | Base64 编码的认证密钥 |
OpenGuestMode(Action onClose = null)
以访客模式打开帮助台。未登录的用户也可以提交咨询。无需认证。
参数:
onClose:帮助台关闭时调用的回调(可选)
使用示例
以访客模式打开
using PlayNANOO;
using UnityEngine;
public class PlayNANOOExample : MonoBehaviour
{
public void OpenHelpDeskGuestMode()
{
HelpDesk.ClearOptional();
HelpDesk.SetOptional("GAME_SERVER", "ASIA");
HelpDesk.SetOptional("GAME_NICKNAME", "NICKNAME");
HelpDesk.OpenGuestMode(() => {
Debug.Log("HelpDesk Closed");
});
}
}
以玩家模式打开
using PlayNANOO;
using UnityEngine;
public class PlayNANOOExample : MonoBehaviour
{
public void OpenHelpDeskPlayerMode()
{
HelpDesk.ClearOptional();
HelpDesk.SetOptional("GAME_SERVER", "ASIA");
HelpDesk.SetOptional("GAME_NICKNAME", "NICKNAME");
HelpDesk.OpenPlayerMode(() => {
Debug.Log("HelpDesk Closed");
});
}
}
连接到 UI 按钮
using PlayNANOO;
using UnityEngine;
using UnityEngine.UI;
public class HelpDeskUI : MonoBehaviour
{
public Button helpButton;
void Start()
{
helpButton.onClick.AddListener(OnHelpButtonClick);
}
void OnHelpButtonClick()
{
// 로그인 여부 확인
if (DataManager.Instance.IsLoggedIn)
{
OpenHelpDeskWithPlayerInfo();
}
else
{
OpenHelpDeskAsGuest();
}
}
void OpenHelpDeskWithPlayerInfo()
{
HelpDesk.ClearOptional();
// 게임 서버 정보 추가
HelpDesk.SetOptional("GAME_SERVER", GetCurrentServer());
// 플레이어 레벨 정보 추가
HelpDesk.SetOptional("PLAYER_LEVEL", GetPlayerLevel().ToString());
// 마지막 플레이 시간 추가
HelpDesk.SetOptional("LAST_PLAY_TIME", System.DateTime.Now.ToString());
HelpDesk.OpenPlayerMode(() => {
Debug.Log("플레이어 모드 헬프데스크 종료");
});
}
void OpenHelpDeskAsGuest()
{
HelpDesk.ClearOptional();
HelpDesk.SetOptional("GAME_SERVER", GetCurrentServer());
HelpDesk.OpenGuestMode(() => {
Debug.Log("게스트 모드 헬프데스크 종료");
});
}
string GetCurrentServer()
{
// 현재 서버 정보 반환
return "ASIA";
}
int GetPlayerLevel()
{
// 플레이어 레벨 반환
return 50;
}
}
可选参数
可以使用 SetOptional 方法将各种游戏信息传递给帮助台:
| 参数示例 | 说明 |
|---|---|
| GAME_SERVER | 游戏服务器(例:ASIA、NA、EU) |
| GAME_NICKNAME | 游戏内昵称 |
| PLAYER_LEVEL | 玩家等级 |
| CHARACTER_CLASS | 角色职业/类别 |
| GUILD_NAME | 公会/战队名称 |
| LAST_STAGE | 最后游玩关卡 |
| GAME_VERSION | 游戏版本 |
| ERROR_CODE | 错误代码(发生错误时) |
可选参数的活用
通过可选参数在用户咨询时一同传递游戏状态信息,客服团队可以更快地发现和解决问题。
多语言支持
帮助台会自动检测浏览器语言设置,并以相应语言显示。
推荐使用 WebView
帮助台默认使用 Application.OpenURL,但为了更好的用户体验,建议使用 WebView 插件。