如何在Unity中高速碰撞对象

时间:2013-01-14 20:59:09

标签: android unity3d

我尝试为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);
}

在项目设置中我设置:“惩罚力的最小渗透率”= 0.001,“解算器交互计数”= 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. 时看起来不错
  5. My Paddle是没有Rigidbody的Box Collider,墙壁是相同的
  6. 所有在同一层(当速度正常时它都工作)PhysicsManager中的值是默认值(与图像中相同)exept“Solver Interation Co ...”= 50
  7. 否。当我改变速度时,它会通过其他墙壁
  8. 我正在使用标准立方体,但我扩展/缩小它以适合我的屏幕和其他对象,当我更多地扩展墙壁然后它就可以弹跳
  9. 否。这是来自Video http://www.youtube.com/watch?v=edfd1HJmKPY
  10. 的简单项目简单示例
  11. 我不使用重力

2 个答案:

答案 0 :(得分:4)

请参阅:

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

    您也可以尝试更改fixed time step for physics。此值越小,Unity计算场景物理的次数就越多。但要注意,将此值设置得太小,比如说&lt; = 0.005,可能会导致游戏不稳定,尤其是在便携式设备上。

    上面的脚本最适合项目符号或小对象。您可以进行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");
    
        }
    }
    

答案 1 :(得分:2)

我认为主要问题是操纵Rigidbody的{​​{1}}。我会尝试以下方法来解决问题。

  1. 重新设计代码,以确保在velocity内调用IncreaseBallVelocityRigidbody的所有其他操作。检查FixedUpdate没有其他操作。
  2. 尝试使用Transform.position或类似方法直接替换设置速度,以便物理引擎有更高的机会计算所有依赖关系。
  3. 如果涉及物理计算的更多项目(主要角色,......),请确保其代码也在FixedUpdate中运行。
  4. 我偶然发现的另一点是网格非常大。如果AddForce具有比例&lt; = 0.01或&gt; = 100,则肯定会对物理计算产生负面影响。根据其中一位大师的docsthis Unity forum entry,你应该避免使用Transform.scale值!= 1

    还不开心吗?那么接下来的测试是从高速开始但没有加速。在这个阶段,我们想要知道,如果高速度本身或加速度是造成问题的原因。知道物理引擎开始失败的速度值会很有趣 - 请发布它们以便我们比较它们。


    编辑:还有一些需要调查的事情
    6.7米/秒听起来不是那么多,所以我猜有一个特殊的原因或出现问题的原因组合。

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