如何在MRTK 2.3.0中为动态创建的立方体绑定Pointer事件?
解决MRTK 2.3.0中新生成立方体绑定交互事件的问题
嘿,我明白你的需求啦——你现在已经能通过PointerDown生成新立方体,但新 cube 没法像原立方体一样拖拽交互对吧?这是因为新生成的对象缺少必要的交互组件和处理指针事件的脚本挂载,咱们一步步来搞定:
关键问题分析
- 你的现有脚本
TouchableCube里的rend变量没有初始化,会导致空引用错误,得先补上初始化逻辑。 - 新生成的立方体默认只有基础的Mesh和碰撞器,没有挂载处理MRTK指针事件的脚本,也缺少MRTK交互所需的核心组件。
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.MixedReality.Toolkit.Input; using Microsoft.MixedReality.Toolkit.UI; // 用于近交互抓取组件 public class TouchableCube : MonoBehaviour, IMixedRealityPointerHandler { Color colorBlue = Color.blue; Renderer rend; void Start() { // 初始化Renderer组件,避免空引用报错 rend = GetComponent<Renderer>(); } public void OnPointerClicked(MixedRealityPointerEventData eventData) { rend.material.color = colorBlue; } public void OnPointerDown(MixedRealityPointerEventData eventData) { rend.material.color = Color.red; GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = new Vector3(0,0,2); cube.SetActive(true); // 1. 给新立方体挂载当前的TouchableCube脚本,让它具备指针事件处理能力 cube.AddComponent<TouchableCube>(); // 2. 添加近交互抓取组件(如果用的是近手触摸交互,推荐添加;远交互可省略) cube.AddComponent<NearInteractionGrabbable>(); // 3. CreatePrimitive生成的Cube默认自带BoxCollider,远交互需依赖碰撞器检测,无需额外添加 } public void OnPointerDragged(MixedRealityPointerEventData eventData) { rend.material.color = Color.yellow; // 简化赋值逻辑,直接使用指针位置更新立方体位置 transform.position = eventData.Pointer.Position; } // 必须实现IMixedRealityPointerHandler的所有方法,补上之前缺失的OnPointerUp public void OnPointerUp(MixedRealityPointerEventData eventData) { // 可添加松手后的逻辑,比如恢复初始颜色 rend.material.color = colorBlue; } }
重要说明
- 接口完整性:
IMixedRealityPointerHandler要求实现全部四个方法,你之前漏掉了OnPointerUp,这会导致编译错误,已经补充完整。 - 交互组件逻辑:通过
AddComponent<TouchableCube>()让新立方体拥有和原立方体完全一致的交互逻辑;NearInteractionGrabbable是MRTK近手触摸交互的核心组件,若使用射线远交互可省略,但碰撞器必须存在(默认已带)。 - 空引用规避:在
Start方法初始化rend变量,避免指针事件中访问null对象导致程序崩溃。
这样修改后,你新生成的每个立方体都能像原立方体一样响应PointerDown、拖拽等交互事件啦~
内容的提问来源于stack exchange,提问作者Liliymas
相关产品推荐
相关产品推荐

