如何使用MonoBehaviour
我们已经在 如何加载资产 和 如何与用户界面互动部分学习了如何加载艺术资源和与用户界面互动。接下来我们将使用同一个项目进行创建。
MonoBehaviour是基类,每个Unity脚本都是从它派生出来的。它允许创作者轻松地编写代码来制作互动逻辑。
但是,在XRMOD中,平台(策略)限制导致无法像传统的Unity开发那样将MonoBehaviour拖放到GameObject上。
有一句话说得好:"物极必反",所以我们用另一种方式将MonoBehaviour安装在GameObject上。
这种方法我们称之为MonoBinder。
如何做到
首先,我们需要写一个继承自MonoBehaviour的类。让我们开始吧!
- 进入
YOURPROJECT/Script/Runtime
- 创建一个C#Script类,将其称为
RotateCubeMonoBehaviour
- 双击该脚本以打开
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace HowToCreateProject.Runtime
{
public class RotateCubeMonobehaviour : MonoBehaviour
{
private Transform selfTransform;
private float currentTime;
public float timeToDisplay = 5;
public float RotateSpeed = 5;
public GameObject ChildGameObject;
private void Start()
{
selfTransform = this.transform;
}
private void Update()
{
if (selfTransform == null) return;
selfTransform.Rotate(Vector3.up, Time.deltaTime * RotateSpeed);
currentTime += Time.deltaTime;
if (currentTime >= timeToDisplay)
{
currentTime = 0;
ChildGameObject.SetActive(true);
}
else
{
if (ChildGameObject.activeSelf)
{
ChildGameObject.SetActive(false);
}
}
}
}
}
原始的物体
当我们完成编辑RotateCubeMonoBehaviour后,回到Unity。使用快捷键(Mac: Command+N, Win: Ctrl+N)创建一个新的场景,并在新场景中创建一个Unity Primitive Objects;通过右击Hierarchy
->3D Objects
->Cube
创建一个Cube对象,再次选择Cube,并为其创建一个子对象Sphere
并调整scale
和position
。
挂载MonoBehaviour
接下来,拖放RotateCubeMonoBehaviour来安装Cube游戏对象。将Sphere的子对象填入RotateCubeMonoBehaviour的Child Game Object
字段。然后将Sphere游戏对象的子对象的活动状态设置为deactivated
。
转换并成为预制体
我们已经完成了RotateCubeMonoBehaviour脚本的设置,但是它还没有在XRMOD引擎上运行;所以我们需要进一步配置它。
转换过程是全自动的,所以创作者不需要手动设置。
- 选择Cube游戏对象
- 找到RotateCubeMonoBehaviour组件。
- 点击Convert to MonoBinder,开始转换过程。
- 将Cube拖放到
YOURPROJECT
->Artwork
->Prefabs
,让它成为一个prefab。
目前存在某些限制,点击这里获取更多信息。
Collection Assets
- 打开PackageToolsEditor
- 切换到Contents部分
- 从
YOURPROJECT/Artwork/Prefabs
拖放Cube到PackageTools Editor的Contents。
加载立方体
进入PROJECT_PATH
->PROJECT_NAME
->Scripts
->Runtime
并打开PROJECTNAMEMainEntry.cs
文件(通过双击)。
然后在OnLoad
方法上写一些代码。
ARMODAPI.LoadAssetAsync<GameObject>("Cube");对象名称(Cube
)必须与PackageToolsEditor
->Contents
资产名称相同。
using System;
using UnityEngine;
using System.Collections;
using com.Phantoms.ARMODAPI.Runtime;
using com.Phantoms.ActionNotification.Runtime;
using UnityEngine.UI;
using Object = UnityEngine.Object;
namespace HowToCreateProject.Runtime
{
public class HowToCreateProjectMainEntry
{
//XRMOD API
internal static API ARMODAPI = new API(nameof(HowToCreateProject));
public async void OnLoad()
{
//Use this for initialization. Please delete the function if it is not used
var tmp_ARVirtualObjectPrefab = await ARMODAPI.LoadAssetAsync<GameObject>("VirtualObject");
Object.Instantiate(tmp_ARVirtualObjectPrefab);
var tmp_UICanvasPrefab = await ARMODAPI.LoadAssetAsync<GameObject>("UICanvas");
var tmp_UICanvas = Object.Instantiate(tmp_UICanvasPrefab);
var tmp_ClickMeGo = tmp_UICanvas.transform.Find("ClickMe");
var tmp_ClickMeBtn = tmp_ClickMeGo.GetComponent<Button>();
tmp_ClickMeBtn.onClick.AddListener(() => { Debug.Log("Clicked me!!!"); });
var tmp_CubePrefab = await ARMODAPI.LoadAssetAsync<GameObject>("Cube");
var tmp_Cube = Object.Instantiate(tmp_CubePrefab);
}
}
}
建立XR-体验
- 转到PackageToolsEditor。
- 切换到Build部分
- 选择你需要构建的平台。
- 点击Build AR-Experience按钮,开始构建。
Build Platform和Platform Group所选的两个平台必须是相同的。
测试
现在我们已经完成了所有的工作,但我们还不知道内容是否正常加载,所以我们需要进一步测试以验证我们的结果。
如何测试?
XRMOD引擎目前提供了在Unity编辑器中加载测试等流程,所以我们可以在Unity编辑器中验证所有的逻辑。在开始测试之前,我们需要通过Unity Package Manager安装XRMOD Engine Simulator插件。
点击这里来学习如何安装XRMOD引擎工具链。
在这里,我们需要安装XRMOD引擎模拟器插件。
当你完成安装后,你可以在Unity编辑器的左上角看到一个XR按钮,这主要是用来启动XRMOD引擎模拟器的。
启动模拟器
- 点击左上方的XR Play按钮,启动XRMOD引擎模拟器。
- 切换到Game视图
- 将你的项目名称输入模拟器
- 点击Fetch Project来加载我们的项目
总结
在本节中,我们学习了如何在XRMOD引擎中使用MonoBehaviour。在XRMOD引擎中使用MonoBehaviour只有一个步骤,那就是将MonoBehaviour转换成MonoBinder。
众所周知,MonoBinder有一定的局限性,这一点可以在这里查阅。