碰撞不能高速检测

时间:2015-08-14 14:06:31

标签: unityscript unity3d-2dtools

我决定学习如何使用unity2D引擎,并开始尝试制作乒乓球。这是非常好的,直到我发现一个问题我无法找到/不理解谷歌的答案。

每次球员/ AI击球时,我都会让球快一点。这样可以正常运行,直到球速度相当快(尽管仍然可以玩)并且只是通过球员/ AI。我通过制作播放器/ AI的盒式对撞机来解决这个问题,但是在高速(且无法播放)的速度下,它仍然可以通过。

我的解决方案有效,但不是那么漂亮,我想知道是否有更好的解决方案(让引擎更频繁地检查碰撞?)。

这是球运动的脚本(Javascript):

#pragma strict

var StartSpeed : int;
var speedFactor : float;

function Start () {
    yield WaitForSeconds(2);
    StartBall();
}

function ResetBall () {
    GetComponent.<Rigidbody2D>().velocity.x = 0;
    GetComponent.<Rigidbody2D>().velocity.y = 0;
    transform.position.x = 0;
    transform.position.y = 0;

    yield WaitForSeconds(0.5);
    StartBall();
}

function StartBall () {
    var randomDirection = Random.Range(0f,1f);
    var randomAngle = Random.Range(-Mathf.PI/4, Mathf.PI/4);


    if(randomDirection < 0.5f){
        GetComponent.<Rigidbody2D>().velocity.x = Mathf.Cos(randomAngle) *        StartSpeed;
        GetComponent.<Rigidbody2D>().velocity.y = Mathf.Sin(randomAngle) * StartSpeed;
    }else{
        GetComponent.<Rigidbody2D>().velocity.x = - Mathf.Cos(randomAngle) * StartSpeed;
        GetComponent.<Rigidbody2D>().velocity.y = Mathf.Sin(randomAngle) * StartSpeed;
    }

}

function OnCollisionEnter2D (colInfo : Collision2D) {
    if(colInfo.collider.tag == "Player"){
         GetComponent.<Rigidbody2D>().velocity.x = speedFactor * GetComponent.<Rigidbody2D>().velocity.x;
        if(colInfo.collider.GetComponent.<Rigidbody2D>().velocity.y == 0){
            GetComponent.<Rigidbody2D>().velocity.y = speedFactor * GetComponent.<Rigidbody2D>().velocity.y;
        }

    var vel = GetComponent.<Rigidbody2D>().velocity;
    Debug.Log("Speed: " + vel);
    }
}

欢迎任何其他可能改进它的脚本评论!

编辑:我尝试了以下内容(正如安德鲁建议的那样):

function OnCollisionEnter2D (colInfo : Collision2D) {
    if(colInfo.collider.tag == "Player"){
        GetComponent.<Rigidbody2D>().AddForce( Vector2 (speedFactor * GetComponent.<Rigidbody2D>().velocity.x, speedFactor * GetComponent.<Rigidbody2D>().velocity.y));

        var vel = GetComponent.<Rigidbody2D>().velocity;
        Debug.Log("Speed: " + vel);
    }
}

这仍然导致我之前遇到的问题。

2 个答案:

答案 0 :(得分:0)

您不应该直接使用velocity,而只需使用AddForce()

答案 1 :(得分:0)

整个物理(包括碰撞检测)在FixedUpdate上运行,因此实际检测任何碰撞碰撞器必须在调用FixedUpdate时发生碰撞。让我们说一个对撞机没有移动(例如墙)而另一个正在向右移动,当前正在移动的FixedUpdate对撞机的调用正好在墙前,而在下一次调用FixedUpdate对撞机时移动已经过了墙,因为这是它每帧的位置步。在视觉上我们看到碰撞器确实发生了碰撞,但它们在对FixedUpdate的任何调用中都没有碰撞。现在,有两个解决方案,降低速度或降低FixedUpdate(http://docs.unity3d.com/Manual/class-TimeManager.html)的时间步长,但这对于帧速率来说可能不好,这完全取决于您的目标机器以及您的游戏硬件需求。

还有这个开源脚本,您应该看一下: http://wiki.unity3d.com/index.php?title=DontGoThroughThings#C.23_-_DontGoThroughThings.js