转换为3D后

时间:2018-08-08 13:48:12

标签: c# unity3d vector physics

一段时间以来,我一直在开发基于《勇者斗恶龙英雄》火箭史莱姆的坦克战斗系统的游戏。我需要做的第一件事是它的运动系统,玩家可以在这个系统上伸展和悬吊自己。当他们撞到墙时,应该真实地反射掉它(例如:对角撞到墙将对角地反射出来)

我的游戏大部分是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内,但是我不确定如何解决。

1 个答案:

答案 0 :(得分:0)

似乎问题是我的播放器在向左或向右打时没有朝运动方向看。在我调用MoveTowards之前,将其添加到零件中。

transform.LookAt(endPos);