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
相关产品推荐
相关产品推荐

