首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运动刚体自行运动

运动刚体自行运动
EN

Stack Overflow用户
提问于 2015-07-10 00:16:47
回答 1查看 3.8K关注 0票数 4

在我的2D统一游戏中,我有一个非常奇怪的问题,我可以把它简化为下面的核心问题/最小的再现测试用例。按照以下步骤复制(团结5.1.1f1):

  • (0,0,0)位置创建一个player对象(立方体)。
  • 删除BoxCollider组件。
  • 附加下面的C#脚本,团结将自动添加所需的组件,从而使它成为刚体对撞机。
  • 设置isKinematic标志。
  • 添加另一个立方体到场景的位置(2,0,0)
  • 删除BoxCollider组件并添加一个BoxCollider2D。这使得这个立方体成为静态对撞机。
  • 设置isTrigger标志。
  • 去现场看看。

预期行为:

玩家立方体加速到另一个立方体,一旦接触到它就停止移动。

观察行为:

玩家立方体加速到另一个立方体,然后继续以恒定的速度移动。

其他实现详细信息:

最初,我通过翻译所有对象的转换来移动它们,并且根本不使用刚体,因为我不需要碰撞检测。现在我想,所以我想要刚毅。我深入研究了在线资源,发现我应该使用rigidbody.MovePosition()而不是transform.Translate()transform.position。我更改了脚本,出现了上面的错误。

回到transform.position修复了这个问题,但是这不是一个好的解决方案,因为它涉及到糟糕的实践,根据我所读到的,这会产生大量的CPU负载。

未能解决:

  • 切换到Update()Time.deltaTime并没有什么区别。
  • 我尝试不返回Update(),而只是在设置stop时将timestep重置为0。没有变化。
  • 摆弄探长和做一些事情,如冻结在刚体上的位置,或设置玩家的对象也是一个触发器,根本没有任何影响。在游戏运行时(碰撞后)更改刚体组件上的任何内容会使多维数据集立即停止。任何东西,甚至把它的质量设置为0。
  • 我还尝试将velocity设置为0,结果没有发生任何更改。这是有意义的,因为Update()是完全跳过的(顺便说一句,我也用Debug.Log()检查过)。

因此,到目前为止,我只剩下30行代码,我仍然不知道是什么原因造成的。由于所涉及的物体是静态触发对撞机和运动刚体对撞机,两者都没有物理材料,因此一旦设置旗子,就不应该有任何东西使它移动。但它确实能移动。

SimpleController2D.cs

代码语言:javascript
复制
using UnityEngine;
using System.Collections;

[RequireComponent (typeof (BoxCollider2D), typeof (Rigidbody2D))]
public class SimpleController2D : MonoBehaviour {

    public Vector3 velocity = Vector3.zero;

    private Transform thisTransform;
    private Rigidbody2D thisRigidbody;

    public bool stop = false;

    void Awake () {
        thisTransform = GetComponent<Transform> ();
        thisRigidbody = GetComponent<Rigidbody2D> ();
    }

    void FixedUpdate() {
        float timestep = Time.fixedDeltaTime; // temporarily stored for ease of access
        if (stop) {
            return; // freeze on hit
        }

        velocity.x += timestep; // accelerate
        /* add a second slash (/) to toggle between transform and rigidbody
        thisTransform.position += velocity * timestep; /*/
        thisRigidbody.MovePosition ((Vector3)thisRigidbody.position + velocity*timestep); //*/
    }

    void OnTriggerEnter2D(Collider2D col) {
        stop = true;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 19:05:19

解决方案

这是Unity5.1.1f1中的一个bug,并且在5.1.1p2及更高版本中得到了修复。

到这里来:http://unity3d.com/unity/qa/patch-releases?version=5.1

发生了什么?

您甚至可以将问题简化为一个MovePosition调用。MovePosition使用物理引擎来移动对象。因此,联合计算在下一次物理更新中到达目标位置所需的速度。5.1.1f1版本无法在到达位置后将速度重置为零,因此该对象将继续以计算出的速度移动。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31330463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档