花了一些时间,但最后我有一个适当的碰撞检测,我现在需要做的是使碰撞正常工作,我有点难以正确完成它,所以也许有人有提示或一个很好的建议,因为我现在已经尝试了几个小时..
在我的代码中,我将有一个布尔值,当检测到碰撞时它变为真,当发生这种情况时,我想我会反转我的相机的移动速度以使碰撞工作,但我知道事实上,这会导致一些问题:
int Up_Down = 0;
int Left_Right = 0;
if(Input.GetKey(w_Key)) { Up_Down = 1; System.out.println("w = " + Up_Down); }
if(Input.GetKey(s_Key)) { Up_Down = 2; System.out.println("s = " + Up_Down); }
if(Input.GetKeyDown(a_Key)) { Left_Right = 1; System.out.println("lastPressed = a"); }
if(Input.GetKeyDown(d_Key)) { Left_Right = 2; System.out.println("lastPressed = d"); }
我在这里检查最后按下了什么键,以便在前一个标题的反方向上反转移动速度。
if(collision == true) // true when collision detection is true
{
// See what key was pressed last and reverse direction by movAmt
if(Up_Down == 1) {
Move(GetTransform().GetRot().GetForward(), -movAmt);
}
if(Up_Down == 2) {
Move(GetTransform().GetRot().GetForward(), movAmt);
}
if(Left_Right == 1) {
Move(GetTransform().GetRot().GetLeft(), -movAmt);
}
if(Left_Right == 2) {
Move(GetTransform().GetRot().GetRight(), -movAmt);
}
}
这是我发现的唯一可以防止任何可能在墙上出现问题的方法,如果你足够努力,所有其他想法最终都会出现问题。不过,还有一个问题:
当你给出足够多的不同输入时,相机将从墙上滑落而不是仅仅撞到它们并停止,例如:
如果我按下' w'并直接进入墙壁一切正常,但如果我例如按下' d'在某一点上再次直接进入墙壁,并且' w'我会向左滑动,因为整数' Left_Right = 2'现在,这会导致“反向运动”的反向运动。 (向左而不是向右),即使我只是直接走进某个东西......
到目前为止,我还没有解决这个问题而没有引起其他问题,我感谢任何帮助..如果您需要更多代码或信息,请告诉我。非常感谢!
更新:只是将速度设置为零不会起作用,因为那时我会被困在墙上,除非我从物体上退了一步,否则碰撞将永远是真的:
if(collision == true)
{
if(Input.GetKey(w_Key))
Move(GetTransform().GetRot().GetForward(), 0);
if(Input.GetKey(s_Key))
Move(GetTransform().GetRot().GetBack(), 0);
if(Input.GetKey(a_Key))
Move(GetTransform().GetRot().GetLeft(), 0);
if(Input.GetKey(d_Key))
Move(GetTransform().GetRot().GetRight(), 0);
}
答案 0 :(得分:0)
好的,我已经尝试了一些东西,最后让它发挥作用。现在,当你将拖车移到墙上时,你会完全停下来,当你松开钥匙时,你会从墙上移回一点 - 这让它看起来很漂亮'靠在墙上'的感觉:
if(collision == true) {
if(lastKey == 1) {
if(Input.GetKey(w_Key)) {
Move(GetTransform().GetRot().GetForward(), movAmt);
}
Move(GetTransform().GetRot().GetForward(), -movAmt);
}
if(lastKey == 2) {
if(Input.GetKey(s_Key)) {
Move(GetTransform().GetRot().GetBack(), movAmt);
}
Move(GetTransform().GetRot().GetBack(), -movAmt);
}
if(lastKey == 3) {
if(Input.GetKey(a_Key)) {
Move(GetTransform().GetRot().GetLeft(), movAmt);
}
Move(GetTransform().GetRot().GetLeft(), -movAmt);
}
if(lastKey == 4) {
if(Input.GetKey(d_Key)) {
Move(GetTransform().GetRot().GetRight(), movAmt);
}
Move(GetTransform().GetRot().GetRight(), -movAmt);
}
} else
if(collision == false) {
if(Input.GetKeyDown(w_Key)) { lastKey = 1; System.out.println("w = "+lastKey); }
if(Input.GetKeyDown(s_Key)) { lastKey = 2; System.out.println("s = "+lastKey); }
if(Input.GetKeyDown(a_Key)) { lastKey = 3; System.out.println("a = "+lastKey); }
if(Input.GetKeyDown(d_Key)) { lastKey = 4; System.out.println("d = "+lastKey); }
if(Input.GetKey(l_shift))
{
if(Input.GetKey(w_Key))
Move(GetTransform().GetRot().GetForward(), movAmt*4);
if(Input.GetKey(s_Key))
Move(GetTransform().GetRot().GetBack(), movAmt*4);
if(Input.GetKey(a_Key))
Move(GetTransform().GetRot().GetLeft(), movAmt*4);
if(Input.GetKey(d_Key))
Move(GetTransform().GetRot().GetRight(), movAmt*4);
} else {
if(Input.GetKey(w_Key))
Move(GetTransform().GetRot().GetForward(), movAmt);
if(Input.GetKey(s_Key))
Move(GetTransform().GetRot().GetBack(), movAmt);
if(Input.GetKey(a_Key))
Move(GetTransform().GetRot().GetLeft(), movAmt);
if(Input.GetKey(d_Key))
Move(GetTransform().GetRot().GetRight(), movAmt);
}
希望这也可以帮助其他人!