You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:35:18