统一的2D角色控制器(试图将老式的平台游戏带回来)


11

这几天,我试图创建一个统一的2D角色控制器(使用物理)。我对物理引擎刚起步,因此很难获得想要的控制感。如果有人可以为我发现的问题提供解决方案,我将非常高兴:

这是我现在的FixedUpdate:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

我在这里尝试通过向左和向右施加重力和线性力来移动刚体。我设置了一种物理材料,该材料在运动时不会弹跳,摩擦力为0,在静止时摩擦力为1。主要问题是我的撞机具有坡度,并且速度从上升(慢),下坡(更快)和在直线对撞机(正常)上行走而变化。如何解决?如您所见,我始终对x轴应用相同的速度。

对于玩家来说,我在脚位置设置了一个球体,这是我要施加力的刚体。

欢迎其他任何可以使我的生活更轻松的提示:)。

PD在回家时,我注意到我可以解决这个问题,方法是平行于玩家正在行走的表面施加恒定的力,但是不知道这是否是最佳方法。


4
老式的平台游戏者使用手动调整的“卡通物理学”来进行跳跃力学,并使用直接速度控制(即完全没有物理学)来进行步行运动。如果您可以重写角色控制器,则可以这样做,因为要戳戳和模仿老式学校游戏中的清脆动作很难进行柔和的物理模拟。
Patrick Hughes 2012年

编写自定义脚本的问题是丢失了冲突检测。而且不使用raycast重建它也不容易(取决于环境等,可能是一堆)。您如何处理这种情况?
2012年

当您使用运动刚体时,可以对仍然自定义动画的对象进行碰撞。我保证在大多数情况下,您对于此类应用程序并不需要真正的物理/力等。如果您正在寻找更多技术角度,也许可以研究“人类IK
Runonthespot”,2012年

1
Def沟物理场在这种情况下。
Ray_Garner 2014年

Answers:


7

如果您想模仿老式的学校平台游戏,第一步就是完全放弃物理学。您最终将要与物理系统作斗争,以获得老式平台游戏机的绝对不现实的动作。看一下这个CharacterController替代品,替代品可以完全干扰物理,从而获得一种实现它的好方法。


3

您可能会更喜欢mheona推荐的产品。但是,如果您要使用Unity的物理学,那么您可能要使用ForceMode.VelocityChange

例:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

您还应该在项目的Physics设置中应用全局重力,对于要坠落得更快的对象,添加Constant Force组件

ForceMode.Impulse相似,但受刚体质量的影响。使其难以调整。


2

即使您不喜欢内置的Character Controller组件(就像我一样),也请查看Unity的2D Gameplay Tutorial示例代码。

该代码使用角色控制器使用移动的平台,敌人和有碰撞的盒子实现了完整的2D游戏玩法。

但是,如果您甚至不想看一眼,我建议您尽量减少使用物理,并尝试使用自己的代码复制其行为。根据您计划的2D游戏类型,它可能会很好地工作。例如,与其Rigidbody.velocity直接施加力来移动角色,不如直接将其弄乱Transform.Translate(),它会根据对象Transform.position的轴来移动对象。你可以决定forwardback相关对象本身也许平台或地板上Transform.up,这样你就会知道,如果和种类的斜坡知道它的角度。

同样,如果您创建了某种速度控制属性(例如,按下按键的时间),则可以将其与方向一起应用,同时进行平移,以防止角色在没有任何速度的情况下过于倾斜地行走,就像他们在《刺猬索尼克》中所做的一样用于Genesis / Mega Drive。

如果您选择继续使用物理学,那么我就帮不上忙,因为我不太擅长物理,但是请注意,由于身体需要更多的力量来保持缓慢的运动,因此缓慢上坡是正常的行为,就像现实生活一样。


团结一致时,我读的第一件事是该教程。问题是控制感很差。这就是为什么我想找到自己的解决方案。另一方面,当您提到要使用Transform.Translate()时,进行坡度和其他操作并不是那么容易。您必须多次射线投射(地板为2或3次,根据英雄的大小,您的移动方向更多)。对于移动设备,光线投射效果不好,如果每次碰撞检测迭代都需要进行5..n操作,光线投射效果会更好。也许我可能是错的,但我不这么认为。
2012年

1

您想要的是内置的Character Controller。通过step offset在此组件上设置属性,您可以使玩家轻松地在斜坡上上下移动。


对不起,我没有发表评论,我知道有一个统一的角色控制器,我已经使用了几次,但是我不喜欢它的行为。它仅适用于FPS,而不适合平台游戏,在该平台上,动作力学是最重要的事情之一。
2012年

我认为一旦您弄弄了角色控制器上的设置,它就会很好地工作。您发现缺少什么?
NoobsArePeople2 2012年

我不喜欢的第一件事是,相对于通常的带有射线投射的刚体而言,它速度较慢。知道如何实现它,我想我可以做一个更轻巧的控制器。另一个问题是在平台边缘处的胶囊/球体为奇数行为(可以用更多的射线投射解决)。这就是为什么我要自己动手。
2012年

0

在此处输入图片说明我想这是因为力不平行于平台,结果最终上升时下降得较低,而下降时则上升了。

如果对坐标系施加相对力

AddRelativeForce

您希望将最大速度保持在“ x”并将其与标量进行比较,请记住,速度是一个矢量,由vx和vy组成,在平坦地形中vy为零,但在坡度上必须大于零。

速度根据身体的方向而变化,其相对vx相对于其整体vx发生变化

这可能会以您不希望的方式修改您的V:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

保持相同的全局Vx在您看来似乎很奇怪。(不需要的加速度)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.