一段时间以来,我一直在开发基于《勇者斗恶龙英雄》火箭史莱姆的坦克战斗系统的游戏。我需要做的第一件事是它的运动系统,玩家可以在这个系统上伸展和悬吊自己。当他们撞到墙时,应该真实地反射掉它(例如:对角撞到墙将对角地反射出来)
我的游戏大部分是2D的,但要弄清楚2D空间中的伪3d碰撞以及其他问题,几乎是不可能继续进行的,所以我将其移至完全3d。
一切正常,直到我尝试弹跳墙壁。如果我的玩家碰到一堵上升的墙,他就会下降,反之亦然。但是,如果我的玩家碰到了向左走的墙,它将在试图向右反射时试图向左“反射”(反之亦然,当向右走时将其击中)。
“速度”在我的游戏中的工作方式是:拉伸Vector2时,称为pVelocity的速度取决于拉伸的程度。当他们放手时,会基于currentPosition + pVelocity创建一个“ endPos”。然后,播放器将以恒定速度通过Vector3.MoveTowards移动到该endPos。碰到墙时,我这样做:
if (hit && foundHit.transform!=transform && curState != state.wallHit && foundHit.transform.tag!="Object")
{
//we've hit a wall while blasting
//now we make the player 'squish' up against the wall and bounce off!
Vector3 reflectedVelocity = Vector3.Reflect(new Vector3(pVelocity.x,0,pVelocity.y), foundHit.normal);
//playerAnimator.SetFloat("VelocityX", reflectedVelocity.x);
//playerAnimator.SetFloat("VelocityY", reflectedVelocity.y);
curState = state.wallHit;
playerSound.Play();
transform.position = foundHit.point;
playerAnimator.Play("Squish");
StartCoroutine(wallBounce(reflectedVelocity));
}
在wallBounce中,我这样做:
IEnumerator wallBounce(Vector3 hitVelocity)
{
playerAnimator.enabled = true;
yield return new WaitForSeconds(.5f);
playerAnimator.Play("Walk blend tree");
pVelocity = new Vector2(hitVelocity.x,hitVelocity.z);
endPos = transform.position + (-transform.forward * pVelocity.magnitude);
curState = state.blasting;
Vector3 diff = endPos - transform.position;
diff.Normalize();
float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, rot_z - 90, 0f);
}
在悬吊时,玩家始终朝着前进的方向,因此我认为在创建新的endPos时问题出在wallBounce内,但是我不确定如何解决。
答案 0 :(得分:0)
似乎问题是我的播放器在向左或向右打时没有朝运动方向看。在我调用MoveTowards之前,将其添加到零件中。
transform.LookAt(endPos);