我决定学习如何使用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);
}
}
这仍然导致我之前遇到的问题。
答案 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