https://github.com/open-yescoin/telegram-unity-bridge
Telegram Miniapp Bridge SDK for Unity is a powerful SDK developed by Yescoin designed to bridge the functionality of Telegram Miniapps with Unity, enabling seamless integration between your Unity-based applications and the Telegram Miniapp platform.
https://github.com/open-yescoin/telegram-unity-bridge
sdk telegram-mini-app ump unity
Last synced: about 1 year ago
JSON representation
Telegram Miniapp Bridge SDK for Unity is a powerful SDK developed by Yescoin designed to bridge the functionality of Telegram Miniapps with Unity, enabling seamless integration between your Unity-based applications and the Telegram Miniapp platform.
- Host: GitHub
- URL: https://github.com/open-yescoin/telegram-unity-bridge
- Owner: Open-Yescoin
- License: mit
- Created: 2024-12-13T07:31:46.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-01-09T14:17:52.000Z (over 1 year ago)
- Last Synced: 2025-03-28T06:51:15.309Z (about 1 year ago)
- Topics: sdk, telegram-mini-app, ump, unity
- Language: C#
- Homepage:
- Size: 581 KB
- Stars: 37
- Watchers: 1
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README-zh.md
- License: LICENSE
Awesome Lists containing this project
README
本 README 将为您介绍 **Telegram-Unity-Bridge**,包括如何在 Unity 中设置并使用所提供的 C# 类与示例脚本,以便与 Telegram MiniApp 游戏 SDK 环境进行集成。
## 概览
Telegram-Unity-Bridge 旨在简化 Unity 应用与 Telegram MiniApp 游戏环境之间的通信。通过在 C# 中使用 `[DllImport("__Internal")]` 来绑定定义在 jslib 文件中的各种 JavaScript 函数,这些函数可让 Unity 开发者:
- 管理钱包连接与支付流程。
- 获取启动参数、用户信息以及初始化数据。
- 控制 MiniApp 的用户界面(如标题栏颜色、背景、底栏颜色等)。
- 请求设备功能(例如:电话访问权限、写入权限、联系人信息)。
- 与 Telegram 环境交互(分享动态、打开链接、请求震动、设置表情符号状态等)。
## 先决条件
- Unity 2020.3 及以上版本(建议使用 LTS 版本)。
- 需要将目标平台设置为 WebGL,因为 SDK 利用 JavaScript 库和特定于浏览器的能力。
- 将 JavaScript 库文件(`.jslib`)集成到 Unity 项目中。
请确保您已包含:
- `index.jslib`(包含 JavaScript 方法)。
- 与其对应的 C# 脚本。
## 文件夹结构
典型项目结构示例:
```
Runtime/
YesTMABridge/
YesTMABridge.cs
index.jslib
Samples/
Example/
YesTMABridgeActions.cs
```
## 快速开始
1. **引入 JavaScript 库:**
将 `index.jslib` 放置在 `Runtime/` 文件夹下。Unity 会在 WebGL 构建时自动关联该文件。
2. **引入 C# 封装类:**
- `YesTMABridge.cs`:包含 `[DllImport]` 声明,用于在 C# 与 JavaScript 间建立桥梁。
- `YesTMABridgeActions.cs`(示例脚本):展示如何调用 SDK 方法并订阅相关事件。
3. **在场景中添加 TGMiniAppGameSDKProvider 组件:**
- 在 Unity 场景中创建一个空的 `GameObject`。
- 将 `YesTMABridge.cs` 附加到该 GameObject 上。
- 这样可确保提供者(provider)处理回调并维护事件订阅。
4. **配置并使用示例脚本(YesTMABridgeActions):**
- 将 `YesTMABridgeActions.cs` 附加到另一个 GameObject 上。
- 在 `YesTMABridgeActions.cs` 中,会通过 `FindObjectOfType()` 在运行时获取 `TGMiniAppGameSDKProvider` 引用。
- 确保在 `YesTMABridgeActions` 初始化前,场景中已存在 `TGMiniAppGameSDKProvider`。
5. **测试集成效果:**
- 当在兼容的环境(Telegram MiniApp 环境)中运行 WebGL 构建时,像 `connectWallet()` 或 `payWithTon()` 这类调用会触发相应的 JS 函数。
- 类似 `OnPhoneAccessReceived`、`OnWriteAccessReceived`、`OnContactReceived` 等事件会由 JS 环境触发并在 C# 中得到响应。
## 关键组件
### TGMiniAppGameSDKProvider
- **作用:**
C# 与 JavaScript 调用间的桥梁。通过 `[DllImport("__Internal")]` 访问 `index.jslib` 中的 JS 方法。
- **特性:**
- 钱包管理(连接、断开、获取状态、获取地址)。
- Ton 支付处理。
- 获取启动参数、用户信息、启动参数(start params)和原始初始化数据。
- 修改 MiniApp UI 元素(头部、背景、底栏颜色等)。
- 管理屏幕方向、确认对话框、视口等。
- 分享内容(故事、URL)、访问设备功能(震动、剪贴板、联系人、电话、写入权限)。
- 请求和设置表情状态。
- **事件:**
提供者定义了一些事件(例如 `OnContactReceived`、`OnPhoneAccessReceived`),由 JavaScript 回调触发。可在您的脚本中订阅这些事件,处理异步响应。
### YesTMABridgeActions(示例脚本)
- **作用:**
提供实际示例,展示如何:
- 订阅来自 SDK 提供者的事件。
- 调用 SDK 方法控制 MiniApp 环境。
- 处理事件响应,并将结果整合到您的游戏逻辑中。
- **使用方法:**
- 将脚本挂载到某个 GameObject 上。
- 使用 UI 按钮触发诸如 `ConnectWallet()`、`PayWithTON()`、`CloseMiniApp()` 等方法的调用。
- 在 Unity 控制台观察交互和事件的调试日志。
## 常见使用场景
1. **钱包交互:**
- `ConnectWallet()` 启动钱包连接流程。
- `CheckWalletConnection()` 检查当前钱包连接状态。
- `GetWalletAddress()` 获取用户钱包地址。
- `PayWithTON()` 使用 Ton 进行支付。
2. **UI 与屏幕方向控制:**
- `SetHeaderColor()`、`SetBackgroundColor()`、`SetBottomBarColor()` 根据游戏主题调整 MiniApp UI。
- `EnableVerticalOrientation()` 或 `DisableVerticalOrientation()` 控制屏幕布局方向。
- `ShowBackButton()` 或 `HideBackButton()` 控制返回按钮的显示与隐藏。
3. **用户信息与启动参数:**
- `TGMiniAppGameSDKProvider.getUserInfo()` 获取用户数据,以便根据用户特征定制体验。
- `TGMiniAppGameSDKProvider.getLaunchParams()` 获取 Telegram 环境传入的初始参数。
4. **设备功能与权限请求:**
- `RequestPhoneAccess()`、`RequestWriteAccess()`、`RequestContact()` 请求相应权限。
- 在 `OnContactReceived` 事件处理程序中使用获取的联系人信息为游戏内功能提供支持。
5. **分享与链接:**
- `ShareStory()`、`ShareURL()` 以实现社交分享功能。
- `OpenLink()` 和 `OpenTelegramLink()` 在 MiniApp 中打开外部内容或 Telegram 链接。
## 疑难解答
- **Error CS0120:“需要对象引用...”:**
确保您在访问事件时使用 `TGMiniAppGameSDKProvider` 的实例,而不是类名本身。
例如:
```csharp
TGMiniAppGameSDKProvider sdkInstance = FindObjectOfType();
sdkInstance.OnTextFromClipboardReceived += MyEventHandler;
```
- **SDK 方法无响应:**
- 确认您的 WebGL 构建在正确的环境中运行(JavaScript 方法已正确集成)。
- 检查浏览器控制台日志是否有 JS 报错。
- 确保 `.jslib` 文件位于 `Runtime/` 下。
- **事件未触发:**
- 确保包含 `TGMiniAppGameSDKProvider` 的 Unity 对象在运行时处于激活状态。
- 检查 `.jslib` 文件中的 JS 回调是否正确实现。
## 最佳实践
- **错误处理:**
在事件处理程序中实现健壮的错误处理和用户反馈。
- **安全与隐私:**
使用用户数据(如联系人、用户信息)时,确保遵守隐私法规并获得用户同意。
- **性能考虑:**
使用 `JSON.stringify` 与 `JsonUtility.FromJson` 对于大型对象可能较慢。可考虑缓存结果或减少大型数据传输。
## 结论
通过 Telegram-Unity-Bridge,您可以轻松实现 Unity 与 Telegram MiniApp 游戏环境之间的集成。按上述步骤操作,并基于示例脚本进行定制,您即可轻松实现钱包连接、获取用户数据、操控 UI、分享动态、调用设备功能,从而为用户带来更丰富的应用内体验。
## API 参考
### 方法
#### 钱包与支付
- **connectWallet()**
启动钱包连接过程。
- **disconnectWallet()**
断开当前已连接的钱包。
- **getWalletConnected() : bool**
若当前已连接钱包返回 `true`,否则为 `false`。
- **getWalletAddress() : string**
返回当前已连接钱包的地址。
- **payWithTon(int amount, string comment)**
启动使用 Ton 加密货币的支付流程。
- **参数:**
- `amount`:支付 Ton 的数量。
- `comment`:可选备注信息。
#### 应用参数与用户信息
- **getLaunchParams() : string**
以 JSON 字符串形式返回 Telegram 环境传递的启动参数。
- **getUserInfo() : string**
以 JSON 字符串形式返回用户信息。可使用 `TGMiniAppGameSDKProvider.GetUserInfo()` 将其转换为 `TMAUser` 对象。
- **getStartParam() : string**
返回启动应用时传入的特定 `startParam` 字符串。
- **getInitDataRaw() : string**
返回原始的初始化数据字符串。
#### MiniApp UI 控制
- **miniAppSetHeaderColor(string color)**
设置 MiniApp 顶部标题栏颜色。
- **示例:** `"#FF5733"`
- **miniAppSetBgColor(string color)**
设置 MiniApp 背景颜色。
- **miniAppSetBottomBarColor(string color)**
设置 MiniApp 底栏颜色。
- **miniAppClose()**
关闭 MiniApp 。
- **miniAppIsActive**
获取 MiniApp 当前状态。
- **viewportExpand()**
扩展 MiniApp 的视口。
- **viewportRequestFullscreen()**
请求 MiniApp 全屏显示。
- **backButtonShow()**
显示 MiniApp 中的返回按钮。
- **backButtonHide()**
隐藏 MiniApp 中的返回按钮。
- **enableConfirmation()**
启用在某些操作前的确认对话框。
- **disableConfirmation()**
禁用确认对话框。
- **enableVertical()**
启用竖屏方向强制。
- **disableVertical()**
禁用竖屏方向强制。
#### 分享与链接
- **shareStory(string mediaUrl, string text, string widgetLinkUrl, string widgetLinkName)**
分享包含媒体内容、文字及可选小部件链接的动态。
- **openTelegramLink(string link)**
在 MiniApp 环境中打开指定的 Telegram 链接。
- **openLink(string link, bool tryBrowser, bool tryInstantView)**
打开指定链接,可选尝试在浏览器或 Instant View 中打开。
- **shareURL(string url, string text)**
分享指定 URL 及相应文本。
#### 设备功能与权限
- **requestVibration(int style)**
请求设备震动(若设备支持)。`style` 参数可能用于定义震动模式。
- **addToHomeScreen**
将 MiniApp 添加到用户的主屏幕。
- **requestCheckHomeScreenStatus**
请求检查主屏幕状态。
- **requestPhoneAccess()**
请求访问用户电话功能(如适用)。
- **requestWriteAccess()**
请求写入权限。
- **requestContact()**
请求用户的联系人信息。
- **requestEmojiStatusAccess()**
请求访问或管理用户的表情状态。
- **requestSetEmojiStatus(string customEmojiId, int duration)**
请求在指定时长内设置用户的表情状态。
- **参数:**
- `customEmojiId`:要设置的表情符号 ID。
- `duration`:表情状态应保持活跃的时间(秒)。
- **requestReadTextFromClipboard()**
请求从系统剪贴板读取文本内容。
#### 工具函数
- **safeStringify(object obj, int space) : string**
安全地将对象序列化为 JSON 字符串,处理循环引用问题。
- **str2Buffer(string str) : string**
将 C# 字符串转换为供 JS/Unity 交互使用的内存缓冲(UTF-8)。
- **objGet(object obj, string path, object defaultValue) : string**
按路径检索嵌套对象属性。如未找到则返回 `defaultValue`。
### 事件
**所有事件均基于实例。** 您需要引用 `TGMiniAppGameSDKProvider` 的实例来订阅或取消订阅事件。
- **OnPhoneAccessReceived**:
当电话访问请求完成时触发。
**签名:** `event Action OnPhoneAccessReceived`
- **OnWriteAccessReceived**:
当写入权限请求完成时触发。
**签名:** `event Action OnWriteAccessReceived`
- **OnContactReceived**:
当收到联系人信息时触发。
**签名:** `event Action OnContactReceived`
**说明:** `TMARequestedContact` 包含 `userId`、`phoneNumber`、`firstName`、`lastName` 等详细信息。
- **OnEmojiStatusAccessReceived**:
当表情状态访问请求完成时触发。
**签名:** `event Action OnEmojiStatusAccessReceived`
- **OnTextFromClipboardReceived**:
当成功从剪贴板获取文本时触发。
**签名:** `event Action OnTextFromClipboardReceived`
### 示例用法
```csharp
public class MyExample : MonoBehaviour
{
private TGMiniAppGameSDKProvider sdkProvider;
void Start()
{
sdkProvider = FindObjectOfType();
if (sdkProvider != null)
{
sdkProvider.OnContactReceived += HandleContact;
}
// 连接钱包
TGMiniAppGameSDKProvider.connectWallet();
// 获取用户信息
TMAUser user = TGMiniAppGameSDKProvider.GetUserInfo();
Debug.Log("用户的名字: " + user.firstName);
}
void OnDestroy()
{
if (sdkProvider != null)
{
sdkProvider.OnContactReceived -= HandleContact;
}
}
private void HandleContact(TMARequestedContact contactInfo)
{
Debug.Log("获取到联系人信息: " + contactInfo.contact.firstName + " " + contactInfo.contact.lastName);
}
}
```
### 备注
- 在 Unity 中调用这些方法时,请确保在 WebGL 构建中运行,并且已正确设置 Telegram MiniApp 环境。
- 确保 `TGMiniAppGameSDKProvider` 存在且在场景中处于激活状态,以处理事件和回调。
- 非静态事件需要 `TGMiniAppGameSDKProvider` 的实例进行订阅。不要直接使用类名订阅事件。