修改Transform后游戏对象未移动?Unity平滑移动问题排查
问题原因及解决方法
核心问题在于你没有接收Instantiate返回的实例对象,导致移动逻辑操作的是预制体而非场景中生成的游戏对象:
- 你的
cat变量应该引用的是预制体资源,Instantiate(cat, ...)会在场景中创建一个新的实例,但你并未将这个实例赋值回cat变量。 - 后续调用
StartCoroutine(MoveFromTo(cat.transform, ...))时,操作的是预制体的transform(预制体本身不在场景中),所以调试日志显示的是预制体的位置被修改,但场景里的实例完全没被操作,自然看不到移动效果。
修改后的代码
只需修改Instantiate的调用行,将返回的实例赋值给cat:
// 接收实例化后的对象,替换原来的cat引用 cat = Instantiate(cat, OffScreenLeft(), Quaternion.identity); Debug.Log("start position: " + OffScreenLeft()); Debug.Log("end position: " + InPosition()); StartCoroutine(MoveFromTo(cat.transform, OffScreenLeft(), InPosition(), 3f)); IEnumerator MoveFromTo(Transform objectToMove, Vector3 a, Vector3 b, float speed) { float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime; float t = 0; while (t <= 1.0f) { t += step; objectToMove.position = Vector3.Lerp(a, b, t); yield return new WaitForFixedUpdate(); } objectToMove.position = b; Debug.Log("move complete cat: " + cat.transform.position); }
这样后续的移动逻辑就会作用于场景中生成的实例对象,视觉上就能看到平滑移动效果了。
内容的提问来源于stack exchange,提问作者soleil
相关产品推荐
相关产品推荐

