【问题标题】:Why does my gameobject float away when setting transform position manually?为什么手动设置变换位置时我的游戏对象会飘走?
【发布时间】:2020-12-07 23:10:43
【问题描述】:

我有一个脚本可以让硬币在空中上下浮动。

float increment = Mathf.Sin(startTime + Time.time * speed) * strength * Time.deltaTime;
Vector3 pos = new Vector3(this.transform.position.x, this.transform.position.y + increment, this.transform.position.z);
this.transform.position = pos;

它似乎有效,但它应该只更新 Y 位置。现在它还修改了 X 和 Z 的位置,但只有一点点,以至于只有在游戏运行了很多分钟后才会注意到。

Unity 是否在 Vector3 内进行舍入转换? position.x 和 position.z 没有以任何方式修改,但对象仍在缓慢移动。

【问题讨论】:

  • 你为什么要把你的鼻窦当作增量?它不应该代替职位吗? -> 存储原始 Y 位置并始终将增量添加到原始 Y 位置
  • 另外@kor_,您可以通过在任何地方添加“Debug.Log ...”来轻松调试它。此外,您根本不需要也不应该使用“this”。在这种情况下

标签: unity3d


【解决方案1】:

原因:

transform.position 是对象的世界位置,这意味着它包括其父对象到根的所有变换,并且每次更改 transform.position 时都会重新计算。当任何父对象具有非默认旋转时(可能是由于矩阵/四元数计算中的舍入误差),它就不稳定。

解决方案:

存储初始 transform.position(即在 Start 方法中)并修改它的 y 组件将起作用,但会产生副作用:任何父组件的转换都将丢失。那可能是也可能不是某人想要的。如果我们确实想保留父母的转换(即硬币移动的平台),我们应该存储和使用transform.localPosition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多