我正在尝试在 3D 中重现类似突破的游戏来学习 Unity。我在搅拌机中设计了我的积木,并将它们作为 .blend 文件导入到 Unity 中。我将 Box Collider 应用于砖块对象。我希望他们在碰撞时恢复球的运动方向。它与球拍和墙壁配合得很好,但是球穿过了砖块,我把球放得特别慢,以确保它不是因为球移动得太快。碰撞被检测到,甚至碰撞时的 Destroy() 也起作用,但改变球的速度却不起作用。我用一个简单的立方体测试了同样的东西,它也能很好地工作。使用搅拌机制作的物体时,我需要考虑什么吗?这是我的球代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
public float maxX;
public float maxZ;
private Vector3 velocity;
private void OnTriggerEnter(Collider other)
{
float maxDist = 0.5f * other.transform.localScale.x + 0.5f * transform.localScale.z;
float actualDist = transform.position.z - other.transform.position.z;
float distNorm = actualDist / maxDist;
if (other.CompareTag("Paddle"))
{
velocity.z = distNorm * maxZ;
velocity.x *= -1;
}
else if (other.CompareTag("Side Wall"))
{
velocity.z *= -1;
}
else if (other.CompareTag("Wall"))
{
velocity.x *= -1;
}
else if (other.CompareTag("Brick"))
{
velocity.x *= -1;
Destroy(other.gameObject);
}
}
// Start is called before the first frame update
void Start()
{
velocity = new Vector3(-maxX, 0, 0);
}
// Update is called once per frame
void Update()
{
transform.position += velocity * Time.deltaTime;
}
}
砖块有一个盒子碰撞器(isTrigger 关闭),我也尝试添加一个刚体组件但没有结果。球是一个带有球体对撞机的简单球体,具有“Is Trigger”和具有连续碰撞检测的刚体。
我不知道这是否与问题有关,但我通过脚本生成积木,这是它的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BrickFactory : MonoBehaviour
{
public GameObject emptyBrick,
yellowBrick,
orangeBrick,
greenBrick,
cyanBrick,
pinkBrick,
purpleBrick,
darkBlueBrick,
redBrick;
private GameObject[] brickTypes;
private int[,] level1 = new int[25,10] {
{8,8,8,8,8,8,8,8,8,8},
{8,8,8,8,8,8,8,8,8,8},
{7,7,7,7,7,7,7,7,7,7},
{7,7,7,7,7,7,7,7,7,7},
{6,6,6,6,6,6,6,6,6,6},
{6,6,6,6,6,6,6,6,6,6},
{5,5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5,5},
{4,4,4,4,4,4,4,4,4,4},
{4,4,4,4,4,4,4,4,4,4},
{3,3,3,3,3,3,3,3,3,3},
{3,3,3,3,3,3,3,3,3,3},
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
{1,1,1,1,1,1,1,1,1,1},
{6,6,6,6,6,6,6,6,6,6},
{5,5,5,5,5,5,5,5,5,5},
{5,5,5,5,5,5,5,5,5,5},
{4,4,4,4,4,4,4,4,4,4},
{4,4,4,4,4,4,4,4,4,4},
{3,3,3,3,3,3,3,3,3,3},
{3,3,3,3,3,3,3,3,3,3},
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
{1,1,1,1,1,1,1,1,1,1}
};
// Start is called before the first frame update
void Start()
{
brickTypes = new GameObject[]{
emptyBrick, //empty 0
yellowBrick, //yellow 1
orangeBrick, //orange 2
greenBrick, //green 3
cyanBrick, //cyan 4
pinkBrick, //pink 5
purpleBrick, //purple 6
darkBlueBrick, //darkBlue 7
redBrick //red 8
};
float rowOffset = -7.877f;
float columnOffset = -7.5f;
for (int i = 0; i < 25; i++)
{
for (int j = 0; j < 10; j++)
{
if(level1[i, j] != 0)
{
GameObject newBrick = Instantiate(brickTypes[level1[i,j]], new Vector3(columnOffset, 1.28f, rowOffset), Quaternion.identity) as GameObject;
newBrick.transform.Rotate(0, 0, 90);
}
rowOffset += 1.75f;
}
rowOffset = -7.877f;
columnOffset += 0.6f;
}
}
// Update is called once per frame
void Update()
{
}
}
还有一个旁注:球在回到球拍并返回砖块后开始神奇地从砖块上弹起。
编辑:我发现这个错误只发生在球沿完美直线移动时,如果我为 velocity.z 设置初始值而不是 x ,则运动方向在第一次碰撞时会正确改变。然而,这不是一个有效的解决方案。会不会是Unity实现碰撞的bug?