跳到主要内容

为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包来创建一个桥梁。

指南:

  1. com.Phantoms.ActionNotification.Runtime加入你的assembly定义中。

    Add Reference
    Add References

    当你使用Assembly definitions - ASMDEF时,必须为它添加引用。

  2. 在你的代码中注册该动作。调用ActionNotificationCenter.DefaultCenter.AddObserver来创建一个动作

    危险
    • 你的脚本必须是持久的。你可以为你的类添加DontDestroyOnLoadattrbute。
    • AddObserver第一个参数是响应动作,第二个参数是动作的键,这个键必须是全局唯一
    PcxmPage
    namespace 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);
    }
    }
    }
  3. XRMOD XR-Experience脚本触发的桥梁。当我们调用PostNotification时必须传递一个BaseNotificationData。同样PostNotification也有两个参数,第一个参数是关键,也就是要执行的动作ID;第二个参数是传送给动作的数据。

    Trigger
    ActionNotificationCenter.DefaultCenter.PostNotification("OpenH5", new BaseNotificationData()
    {
    BaseData = "{\"title\":\"PostNotification\", \"link\":\"https://phantomsxr.cn\"}"
    });
    警告

    所有已经注册到ActionNotificationCenter的动作将在XRMOD模块关闭后被释放(调用Dispose

总结

虽然我们不能在XR-Experience脚本中直接调用第三方或用户定义的方法,但我们可以通过ActionNotificationCenter来实现。