13

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

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

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

这是我的球体代码

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);
}

编辑添加了更多信息

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

2 回答 2

4

看:

  1. 类似的问题
  2. 使用光线追踪来帮助管理快速对象的社区脚本
  3. UnityAnswers 帖子导致 (2) 中的脚本

您也可以尝试更改物理的固定时间步长。该值越小,Unity 计算场景物理的次数就越多。但请注意,将此值设置得太小,例如 <= 0.005,可能会导致游戏不稳定,尤其是在便携式设备上。

上面的脚本最适合子弹或小物体。您可以手动强制刚体碰撞测试:

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");

    }
}
于 2013-01-14T22:10:31.860 回答
2

我认为主要问题是Rigidbody's的操纵velocity。我会尝试以下方法来解决问题。

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

我偶然发现的另一点是非常缩放的网格。具有GameObject比例 <= 0.01 或 >= 100 肯定会对物理计算产生负面影响。根据其中一位大师的文档这个 Unity 论坛条目,您应该避免 Transform.scale 值!= 1

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


编辑:要调查的更多事情
6.7 m/sec 听起来并不多,所以我想有一个特殊原因或多种原因导致事情出错。

  • 您的最大允许时间步长是否足够高?对于测试,我建议 5 到 10x Fixed Timestep。请注意,这可能会降低帧速率,但可以稍后修复。
  • 在编辑器播放器和 Android 上运行游戏有什么区别吗?
  • 您是否注意到由于0.01 FixedTimestep. 这表明物理引擎可能有问题。
  • 是不是有静态对撞机(具有对撞机但没有 collider 的对象Rigidbody)被移动或以其他方式操纵?这将导致在 PhysX 中进行大量重新计算。
  • 图层怎么样:所有墙壁都在同一图层上吗?所涉及的层在碰撞检测矩阵中是否正确配置?
  • 无反弹效果总是发生在同一面墙上吗?如果是这样,您可以复制第一面墙并将其放在第二面的位置,看看这面墙是否有问题。
  • 如果不是付出太多努力,我会尝试设置一些标准立方体作为墙壁,以确保这transform.scale不是罪魁祸首(我在这方面的经历非常糟糕)。
  • 你是操纵重力还是TimeManager.timeScale从脚本中操纵?
  • 顺便说一句:你在使用重力吗?(应该没问题只是
于 2013-01-17T20:54:57.233 回答