Unity中C#脚本触觉场景3对象追踪异常问题排查
Unity C# 实验场景对象跟随异常排查请求
问题说明
我用Unity+C#开发了一个实验项目,包含4种场景:
- 仅视觉
- 仅触觉
- 触觉先触发,随后视觉
- 视觉先触发,随后触觉
前3种场景运行完全正常,但视觉先于触觉的场景出现异常:视觉与触觉的触发顺序是对的,但游戏对象无法像其他场景那样正确跟随trackedPoint移动。
已经尝试过以下修复手段,均未解决问题:
- 将
FollowTrackedPoint协程移至场景3的逻辑内单独实现 - 移除协程,重写场景3的对象移动代码
- 调整
yield return的等待时长与逻辑
下面是完整脚本代码,请求帮忙排查代码层面的问题。
完整脚本代码
using UnityEngine; using System.Collections; public class ExperimentController : MonoBehaviour { [Header("References")] public Transform trackedPoint; public GameObject visualTarget; public GameObject hapticTarget; [Header("Scene Settings")] public enum ExperimentScene { VisualOnly, HapticOnly, HapticFirst, VisualFirst } public ExperimentScene currentActiveScene; private void Start() { StartCoroutine(RunSceneLogic()); } private IEnumerator RunSceneLogic() { switch (currentActiveScene) { case ExperimentScene.VisualOnly: visualTarget.SetActive(true); yield return StartCoroutine(FollowTrackedPoint(visualTarget)); break; case ExperimentScene.HapticOnly: hapticTarget.SetActive(true); yield return StartCoroutine(FollowTrackedPoint(hapticTarget)); break; case ExperimentScene.HapticFirst: hapticTarget.SetActive(true); yield return StartCoroutine(FollowTrackedPoint(hapticTarget)); yield return new WaitForSeconds(0.6f); visualTarget.SetActive(true); yield return StartCoroutine(FollowTrackedPoint(visualTarget)); break; case ExperimentScene.VisualFirst: // 问题场景:视觉先触发,随后触觉 visualTarget.SetActive(true); yield return StartCoroutine(FollowTrackedPoint(visualTarget)); yield return new WaitForSeconds(0.6f); hapticTarget.SetActive(true); yield return StartCoroutine(FollowTrackedPoint(hapticTarget)); // 此处触觉对象完全无法跟随trackedPoint移动 break; } } private IEnumerator FollowTrackedPoint(GameObject targetObj) { while (true) { if (trackedPoint == null || targetObj == null) yield break; targetObj.transform.position = trackedPoint.position; yield return null; } } }
代码排查方向建议
- 对象引用检查:确认场景3中
trackedPoint、hapticTarget的Inspector引用未出错,运行时未被意外设为null - 协程生命周期冲突:检查视觉对象的
FollowTrackedPoint协程是否未终止(因用了while(true)),是否与触觉对象的协程产生资源冲突;或触觉对象的协程是否未正常启动 - 激活状态异常:验证触觉对象在等待0.6秒后是否真的被
SetActive(true),是否有其他代码偷偷修改其激活状态 - 坐标空间问题:确认
trackedPoint与目标对象的坐标空间一致(世界/局部),若trackedPoint是子节点,是否需用trackedPoint.TransformPoint转换坐标 - 等待逻辑影响:检查是否有代码修改了
Time.timeScale,导致WaitForSeconds的实际等待时长异常,打乱协程执行节奏 - 变量作用域问题:若
FollowTrackedPoint使用了外部共享变量,排查是否被其他场景逻辑篡改,导致跟随逻辑失效
内容的提问来源于stack exchange,提问作者brain_and_brawn
相关产品推荐
相关产品推荐

