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

Unity脚本移动多对象异常求助:单对象正常多对象需双击生效

Unity多对象移动异常:单对象正常,多对象需双击按钮才生效

我编写了一款用于在Unity场景中移动指定对象的MoveObject脚本,当前遇到如下异常问题:仅添加单个待移动对象时,对象可正常移动;但添加两个及以上对象时,对象会停留在原地,需双击触发按钮才能完成移动。将子对象挂载到主对象下测试,问题仍未解决。

脚本代码

using UnityEngine;
using System.Collections;

public class MoveObject : MonoBehaviour
{
    public GameObject[] objectsToMove; 
    public Vector3 targetPosition; 
    public Vector3 targetRotation; 
    public GameObject RaceScripts;
    public GameObject RaceCampaign;
    public GameObject Race;
    public GameObject RCCCanvas;
    
    public void MoveAndRotate()
    {
        foreach (GameObject obj in objectsToMove)
        {
            obj.transform.position = targetPosition;
            obj.transform.rotation = Quaternion.Euler(targetRotation);
        }

        StartCoroutine(ActivateRaceComponentsWithDelay(0.1f));
    }
    
    private IEnumerator ActivateRaceComponentsWithDelay(float delay)
    {
        yield return new WaitForSeconds(delay);
        ActivateRaceComponents();
    }
    
    private void ActivateRaceComponents()
    {
        RaceScripts.GetComponent<Timer>().enabled = true;
        RaceCampaign.SetActive(false);
        Race.SetActive(true);
        RCCCanvas.SetActive(true);
    }
}

演示视频展示了异常场景:单对象状态下点击按钮可直接完成移动,多对象状态下第一次点击无反应,第二次点击才触发对象移动。

排查方向及解决方案

  • 检查按钮触发逻辑:确认绑定MoveAndRotate的UI按钮没有重复绑定事件,也没有其他脚本修改按钮的Interactable状态——比如第一次点击后按钮被设为不可交互,导致需要双击才能再次触发。
  • 处理数组空引用:遍历对象数组时跳过空元素,避免空引用异常中断执行流程:
    foreach (GameObject obj in objectsToMove)
    {
        if (obj == null) continue;
        obj.transform.position = targetPosition;
        obj.transform.rotation = Quaternion.Euler(targetRotation);
    }
    
  • 适配带Rigidbody的对象:如果待移动对象挂载了Rigidbody组件,直接赋值position/rotation会被物理引擎覆盖,改用Rigidbody的移动方法:
    foreach (GameObject obj in objectsToMove)
    {
        if (obj == null) continue;
        Rigidbody rb = obj.GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.isKinematic = true; // 禁用物理模拟干扰
            rb.MovePosition(targetPosition);
            rb.MoveRotation(Quaternion.Euler(targetRotation));
        }
        else
        {
            obj.transform.position = targetPosition;
            obj.transform.rotation = Quaternion.Euler(targetRotation);
        }
    }
    
  • 调整协程时机:尝试移除协程延迟,直接在移动完成后激活Race组件,避免组件激活逻辑意外重置对象位置:
    public void MoveAndRotate()
    {
        foreach (GameObject obj in objectsToMove)
        {
            if (obj == null) continue;
            obj.transform.position = targetPosition;
            obj.transform.rotation = Quaternion.Euler(targetRotation);
        }
        ActivateRaceComponents();
    }
    
  • 排查其他干扰组件:确认待移动对象没有绑定动画组件、其他移动脚本等会修改位置/旋转的逻辑,避免和当前脚本的设置冲突。

内容的提问来源于stack exchange,提问作者Miscoulious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:15:00