【问题标题】:How to collide objects with high speed in UnityUnity中如何高速碰撞物体
【发布时间】:2013-01-14 20:59:08
【问题描述】:

我尝试为 Android 创建游戏,但遇到高速对象问题,它们不想碰撞。

我有带有 Sphere Collider 和 Bouncy 材质的 Sphere,以及带有此参数的 RigidBody(Gravity=false,Interpolate=Interpolate,Collision Detection = Continuous Dynamic)

我还有 3 面带有 Box Collider 和 Bouncy 材质的墙。

这是我的 Sphere 代码

function IncreaseBallVelocity() {
rigidbody.velocity *= 1.05;
}

function Awake () {
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse);

InvokeRepeating("IncreaseBallVelocity", 2, 2);
}

在项目设置中我设置:"Min Penetration For Penalty Force"=0.001, "Solver Interation Count"=50

当我一开始玩时它工作正常(它会弹跳),但当速度变高时,Sphere 只是通过墙壁。

谁能帮帮我?

谢谢。

编辑

var hit : RaycastHit;

var mainGameScript : MainGame;

var particles_splash : GameObject;

function Awake () {
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse);

InvokeRepeating("IncreaseBallVelocity", 2, 2);
}

function Update() {
if (rigidbody.SweepTest(transform.forward, hit, 0.5))
    Debug.Log(hit.distance + "mts distance to obstacle");
if(transform.position.y < -3) {
    mainGameScript.GameOver();
    //Application.LoadLevel("Menu");
}
}

function IncreaseBallVelocity() {
rigidbody.velocity *= 1.05;
}

function OnCollisionEnter(collision : Collision) {
Instantiate(particles_splash, transform.position, transform.rotation);
}

EDITED 添加了更多信息

  1. 固定时间步长 = 0.02 最大允许 Tir = 0.333
  2. 在编辑器播放器和 Android 上运行游戏没有区别
  3. 没有。当我设置为 0.01 时看起来不错
  4. 我的 Paddle 是没有刚体的 Box Collider,墙壁是一样的
  5. PhysicsManager 中的所有值都在同一层(当速度正常时,一切正常),PhysicsManager 中的值是默认值(与图像相同),除了“Solver Interation Co...”= 50
  6. 没有。当我改变速度时,它会通过另一面墙
  7. 我使用的是标准立方体,但我扩展/收缩它以适应我的屏幕和其他对象,当我扩展墙更多时它可以弹跳
  8. 没有。这是视频http://www.youtube.com/watch?v=edfd1HJmKPY中的简单项目简单示例
  9. 我不使用重力

【问题讨论】:

    标签: android unity3d


    【解决方案1】:

    见:

    1. Similar SO Question
    2. A community script 使用光线追踪来帮助管理快速对象
    3. UnityAnswers post 导致 (2) 中的脚本

    您也可以尝试更改fixed time step for physics。该值越小,Unity 计算场景物理的次数就越多。但请注意,将此值设置得太小,例如

    上面的脚本最适合子弹或小物体。可以manually force刚体碰撞测试:

    public class example : MonoBehaviour {
        public RaycastHit hit;
        void Update() {
            if (rigidbody.SweepTest(transform.forward, out hit, 10))
                Debug.Log(hit.distance + "mts distance to obstacle");
    
        }
    }
    

    【讨论】:

    • 我尝试为物理 0.01 设置固定的时间步长并且它起作用了,现在 Sphere 可以承受更多但是当它加速时我有同样的问题。我尝试了 DontGoThroughThings,但我不确定这是否正确,我只是在我的 Sphere JS 脚本中复制代码,是否需要进行更多设置?
    • @Kec 不,只要你的球体有刚体组件。该脚本仅对非常粗略的测试有用,它使用可能是您的对象的中心进行测试。但是由于你有一个球体,你可以很容易地发出光线,最近的命中,如果那个命中是
    • 我尝试了各种方法,但都不起作用。现在我有了这段代码,你能告诉我要改变什么吗?我将代码添加到问题中。感谢您的帮助。
    【解决方案2】:

    我认为主要问题是对Rigidbodyvelocity 的操纵。我会尝试以下方法来解决问题。

    1. 重新设计您的代码以确保在FixedUpdate 内调用IncreaseBallVelocityRigidbody 的所有其他操作。检查Transform.position 是否没有其他操作。
    2. 尝试使用AddForce或类似方法直接替换设置速度,以便物理引擎有更高的机会计算所有依赖关系。
    3. 如果涉及到更多与物理计算相关的项目(主要玩家角色,...),请确保其代码也在 FixedUpdate 中运行。

    我偶然发现的另一点是非常缩放的网格。 GameObject 的比例 = 100 肯定会对物理计算产生负面影响。根据其中一位大师的docsthis Unity forum entry,您应该避免使用 Transform.scale 值!= 1

    还不开心?好的,那么下一个测试是从高速开始但没有加速度。在这个阶段,我们想知道问题是由高速本身还是加速度造成的。了解物理引擎开始失效的速度值会很有趣 - 请发布它们以便我们进行比较。


    编辑:还有一些事情需要调查
    6.7 m/sec 听起来并不多,所以我猜有一个特殊原因或多种原因导致出现问题。

    • 你的Maximum Allowed Timestep足够高了吗?对于测试,我建议使用 5 到 10 倍 Fixed Timestep。请注意,这可能会降低帧速率,但可以稍后修复。
    • 在编辑器播放器和 Android 上运行游戏有什么区别吗?
    • 您是否注意到由于0.01 FixedTimestep 而导致的帧速率下降?这表明物理引擎可能有问题。
    • 是否有静态碰撞器(具有碰撞器但没有Rigidbody 的对象)被移动或以其他方式操纵?这会导致在 PhysX 中进行大量重新计算。
    • 层呢:所有的墙都在同一层上吗?所涉及的层在collision detection matrix 中是否正确配置?
    • 无反弹效果总是发生在同一面墙上吗?如果是这样,您能否只复制第一面墙并将其放在第二面的位置,看看这面墙是否有问题。
    • 如果不花太多力气,我会尝试设置一些标准立方体作为墙壁,以确保不归咎于 transform.scale(我在这方面的经历非常糟糕)。
    • 您是否在脚本中操纵重力或TimeManager.timeScale
    • 顺便说一句:你在使用重力吗? (应该没问题吧

    【讨论】:

    • 好的,我做了一些测试,结果如下: 1. 当我设置 Velocity=6.7 时,Ball 在第一面墙上反弹,但第二次通过,在这种情况下,方法 OnCollisionEnter 是调用但弹跳不工作,也许我使用的 Bouncy 材料有问题? 2.当我增加壁宽或球半径时很好,弹跳工作。 Rigidbody 的所有操作都在 FixedUpdate 中调用,我不使用IncreaseBallVelocity,我只是设置了rigidbody.AddForce(6.7, 6.7, 0, ForceMode.Impulse);
    • 我在创建球的一开始就设置了球的比例参数,仅此而已。但我对此更感兴趣,它调用 OnCollisionEnter 但没有弹跳,就像“Bouncy”材料有些不对劲。
    • @Kec Well Bounciness = 1Bounce Combine = Max 应该可以。关于缩放:根据docsforum entry from one of the gurus,您应该避免使用 Transform.scale 值!= 1。
    • 参数 Bounciness = 1 和 Bounce Combine = Max 已经设置好了。关于缩放,我将球设置为 1、1、1,但由于对称性,我必须缩放其他对象,在这种情况下,我必须提高球速,然后再次发生(球通过墙壁)?还有什么想法吗?感谢您的帮助。
    • @Kec 棘手但有趣的问题。我用更多建议更新了我的答案并在推特上发布了它 - 让我们看看。
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多