为XR体验提供新API
我们知道,XRMOD引擎分为一个启动器和一个内容包(XR-Experience)。
所以XR-Experience脚本不能直接调用第三方方法或开发者定义的脚本方法。因为这些方法没有提前(AOT)生成代码。例如,如果你在应用程序中嵌入了uniwebview,你将无法在XRMOD Experience代码中调用相应的方法来启动浏览器。不过,我们也提供了一种方法。
Custom Method
例子
using System;
using UnityEngine;
using System.Collections;
using com.Phantoms.ARMODAPI.Runtime;
using com.Phantoms.ActionNotification.Runtime;
using UnityEngine.Assertions;
namespace APITest.Runtime
{
public class APITestMainEntry
{
//XRMOD API
internal static API ARMODAPI = new API(nameof(APITest));
public async void OnLoad()
{
// we can not directly call this method.
Uniwebview.OpenWebPage("https://phantomsxr.cn");
}
}
}
自定义Bridge
在这里,我们将使用XRMOD Action Notification包来创建一个桥梁。
指南:
将com.Phantoms.ActionNotification.Runtime加入你的assembly定义中。
Add ReferenceAdd References当你使用Assembly definitions - ASMDEF时,必须为它添加引用。
在你的代码中注册该动作。调用ActionNotificationCenter.DefaultCenter.AddObserver来创建一个动作
危险- 你的脚本必须是持久的。你可以为你的类添加DontDestroyOnLoadattrbute。
- AddObserver第一个参数是响应动作,第二个参数是动作的键,这个键必须是全局唯一。
PcxmPagenamespace Runtime.UI
{
using UnityEngine;
using Runtime.Core;
using Runtime.Utils;
using Runtime.Models;
using Runtime.Config;
using SDKEntry.Runtime;
using System.Threading.Tasks;
using com.phantoms.models.Runtime;
using UnityEngine.SceneManagement;
using com.Phantoms.ActionNotification.Runtime;
[DontDestroyOnLoad]
public class PcxmPage : UIBase
{
public void OnExitClicked()
{
var tmp_SDKEntryPoint = UnityEngine.Object.FindObjectOfType<SDKEntryPoint>();
tmp_SDKEntryPoint.Dispose();
StartCoroutine(GameEnvironment.Singleton.SceneM.LoadSceneAsync(2));
}
private void OnEnable()
{
ActionNotificationCenter.DefaultCenter.AddObserver(OpenH5Page, "OpenH5");
}
// Custom Action for XR-Experience to open webpage using Uniwebview
private void OpenH5Page(BaseNotificationData _data)
{
var tmp_data = JsonUtility.FromJson<H5BridgeData>(_data.BaseData);
Debug.Log(tmp_data.link);
}
}
}XRMOD XR-Experience脚本触发的桥梁。当我们调用PostNotification时必须传递一个BaseNotificationData。同样PostNotification也有两个参数,第一个参数是关键,也就是要执行的动作ID;第二个参数是传送给动作的数据。
TriggerActionNotificationCenter.DefaultCenter.PostNotification("OpenH5", new BaseNotificationData()
{
BaseData = "{\"title\":\"PostNotification\", \"link\":\"https://phantomsxr.cn\"}"
});警告所有已经注册到ActionNotificationCenter的动作将在XRMOD模块关闭后被释放(调用Dispose。
总结
虽然我们不能在XR-Experience脚本中直接调用第三方或用户定义的方法,但我们可以通过ActionNotificationCenter来实现。