检查检查:Blocking wall
检查检查:character
它仍然穿过阻挡墙。
在剧本中:
if (Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(Vector3.forward * 15 * Time.deltaTime);
}
if (Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(-Vector3.forward * 15 * Time.deltaTime);
}
答案 0 :(得分:1)
使用rigidbody.AddForce函数移动播放器/对象。 翻译变换更像是传送而不是移动。所以你的物体通过transform.Translate传送到墙的另一边。 检查此链接是否为rigidbody.AddForce移动方法:Unity - Moving the player
更新1
您还应该将碰撞检测设置为连续而不是离散。
答案 1 :(得分:1)
您的组件设置正确:角色中的一个刚体和角色和墙壁中的碰撞器。
正如格雷格所说:如果你想以更逼真的方式移动你的角色(基于统一物理学),你可能想要改变你的代码而不是使用AddForce。但是,它不是强制性的。如果你正在做类似太空入侵者游戏的事情,那么按照你正在做的方式移动角色就可以了。
应该考虑的另一件事是墙碰撞器太薄的可能性。如果是这种情况,团结就无法正确检测到碰撞。
答案 2 :(得分:1)
如果您的对象快速移动,您可能需要在检查器中更改Collision Detection: Descrete to a Continuous。此外,您可能希望修改刚体移动速度。
另外。确保您没有使用3d对象和2d对象。他们不匹配。 2D对象不会与3D对象发生碰撞。
RigidBody rb;
void Start() {
rb = GetComponent<RigidBody>();
}
void Update() {
if (Input.GetKey(KeyCode.UpArrow))
{
rb.velocity = Vector3.forward * 15 * Time.deltaTime;
}
if (Input.GetKey(KeyCode.DownArrow))
{
rb.velocity = -Vector3.forward * 15 * Time.deltaTime;
}
}
免责声明:可能需要稍微调整一下数值!
答案 3 :(得分:0)
首先。你的墙上确实需要刚体部件。碰撞器本身会引起碰撞。
要使Unity物理系统正常工作,您不应直接修改变换位置,而应使用力来移动角色。
试试这个:
void FixedUpdate() {
Rigidbody rb = this.GetComponent<Rigidbody>();
if (Input.GetKey(KeyCode.UpArrow))
{
rb.AddForce(Vector3.forward * 15f);
}
if (Input.GetKey(KeyCode.DownArrow))
{
rb.AddForce(-Vector3.forward * 15f);
}
}