Vuforia默认Trackable事件处理器无法检测Start脚本组件求助
解决方案:Vuforia跟踪触发脚本调用失败+代码自动还原问题
先处理代码被自动还原的紧急问题:
你直接修改的DefaultTrackableEventHandler.cs是Vuforia Package包自带的文件,Unity的Package Manager会自动维护包内文件的原始状态,重启后就会覆盖你的修改。正确的做法是:
- 找到Vuforia包内的
DefaultTrackableEventHandler.cs(一般在Packages/com.ptc.vuforia.engine/Assets/Scripts/DefaultTrackableEventHandler.cs) - 复制这个文件到你自己的
Assets目录下(比如Assets/Scripts/CustomTrackableEventHandler.cs,可以顺便重命名避免混淆) - 打开场景中你的Vuforia Trackable物体(比如ImageTarget),把原来的
DefaultTrackableEventHandler组件移除,添加你复制到Assets里的自定义脚本 - 现在修改这个自定义脚本,重启Unity后代码就不会被还原了
接下来解决Unity无法检测到Start脚本组件的问题,逐个排查可能的原因:
脚本文件名与类名必须完全一致
你的脚本文件必须命名为Start.cs,而且内部的类定义必须是:public class Start : MonoBehaviour { public void OnAppear() { // 你的实例化逻辑 } }如果文件名和类名不匹配,Unity会无法识别这个组件。
检查命名空间引用
如果你的Start脚本放在自定义命名空间里(比如namespace MyGame),那么在你的自定义DefaultTrackableEventHandler脚本顶部必须添加引用:using MyGame;或者使用完全限定名获取组件:
MyGame.Start summoner = ...;修正组件获取的逻辑
你当前用的GetComponentInChildren<Start>()是从当前Trackable物体的子物体中查找,但你的StartSpawn是独立的GameObject,不是Trackable的子物体,所以找不到。推荐两种更可靠的方式:- 方式一:手动拖入引用(最稳定)
在你的自定义DefaultTrackableEventHandler脚本里添加一个public变量:
然后在Unity Inspector面板中,把public Start summoner;StartSpawn物体上的Start组件拖到这个变量上,这样就不需要动态查找了。 - 方式二:通过物体名查找(适合固定命名的物体)
如果StartSpawn物体不会被销毁或重命名,可以用:
注意:Start summoner = GameObject.Find("StartSpawn").GetComponent<Start>();GameObject.Find会遍历场景,性能略差,适合场景物体不多的情况。
- 方式一:手动拖入引用(最稳定)
检查脚本是否有编译错误
打开Unity的Console面板,看看有没有红色的编译错误。如果Start脚本里有语法错误,Unity会无法编译这个脚本,导致组件无法被识别,甚至挂载的组件会丢失。
最后,修改自定义DefaultTrackableEventHandler的OnTrackingFound方法示例:
protected virtual void OnTrackingFound() { if (mTrackableBehaviour) { var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true); var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true); var canvasComponents = mTrackableBehaviour.GetComponentsInChildren<Canvas>(true); // 启用渲染、碰撞体、画布 foreach (var component in rendererComponents) component.enabled = true; foreach (var component in colliderComponents) component.enabled = true; foreach (var component in canvasComponents) component.enabled = true; // 调用OnAppear方法(这里用手动拖入的引用示例) if (summoner != null) { summoner.OnAppear(); } else { Debug.LogWarning("Summoner component is not assigned!"); } } }
内容的提问来源于stack exchange,提问作者Francis Aaron Milano
相关产品推荐
相关产品推荐

