Unity 从零开始的2D游戏开发 —— 角色移动脚本

       角色移动脚本是一个游戏最基础的脚本,通常也是改动最多的脚本,因此在后期会变得异常臃肿,不过这不是我们讨论的问题,本文主要说明角色移动脚本的设计和一些区别。


1.通过控制角色的Transform来移动角色

通过改变Transform组件里的position的值来改变角色的位置是一种简单的方法

h = Input.GetAxis("Horizontal");
transform.position += new Vector3(h, 0, 0);

大概的代码如上,通过Input获取到方向键的值直接加到transform.position上,这样做的好处是简单直观,然而有一些缺点

(1)没有办法控制移动速度

解决办法是添加一个移动速度变量来控制,于是代码就变成了:

public float MoveSpeed;
h = Input.GetAxis("Horizontal");
transform.position += new Vector3(h*MoveSpeed, 0, 0);

通过在unity面板改变MoveSpeed的值来改变移动速度。

(2)过快的移动可能会超过帧率,此时会出现一个问题,就是有残影

解决办法暂时没有想到,也许把移动速度控制在适合范围内可以解决这个问题。

(3)不够自然,不够真实

突然的移动位置不真实,而且没有一个速度渐变的过程,解决办法同(2),或者可以添加一个渐变的过程来解决,不过这样就显得比较麻烦。

接下来我介绍第二种办法来解决上面的第(3)个问题。

 


 

2.通过控制角色的刚体速度来移动角色

通过控制角色的刚体速度来控制角色的方法,也是一种较为直观的方法,代码如下

Rigidbody2D rig;
rig = GetComponent<Rigidbody2D>();

h = Input.GetAxis("Horizontal");
rig.velocity = new Vector2(h, rig.velocity.y);

通过Input获取到方向键的值直接加到刚体速度上,这里要注意一个问题,为什么赋值还有一个rig.velocity.y呢?

这是因为我们2D游戏的移动,通常还要添加跳跃动作,如果跳跃动作也是通过赋值速度或者力的话,要注意保持原来y轴上的速度不变。

但是这种方法也是缺点的。

 

(1)受到摩擦力影响

摩擦力会使你的速度比你预设的值稍微小点,是因为刚体存在摩擦力的设定,虽然可以通过取消摩擦力来控制,但是这样会让操作手感完全改变。不过这个也可以看做优点,因为更加的真实,接近现实世界,不同游戏有不同的设定。

(2)按键停止时,不会立即停下

这点很好理解,因为你给的是刚体的速度,如果你按键停止了,那就会做有初速度受到摩擦力的直线运动了(瞬间回到高中物理课堂)。不过这个可以通过代码来解决。

我以为通过直接改变velocity.x的值可以停下,结果发现不行,因为h还没有清0,于是又把h给赋值为0,发现还是不行。猜测可能是因为刚体的惯性问题,问题先放着。

 

这种方法比较普遍,也是我推荐使用的角色移动脚本的编写。第三种可以通过给刚体一个力来移动,不过实在过于硬核,就不实现出来了,如果以后有机会接触这种操作手感,再来完善本文。


 

 

接下来是本文的第二个部分,角色光有移动不行,还得会跳跃,接下来介绍一个个人比较推荐,应该也是运用比较广泛的跳跃实现方法。

通过给刚体施加力来实现跳跃

通过给刚体施加力是一种简单的方法,也较为接近现实世界。

Rigidbody2D rig;
rig = GetComponent<Rigidbody2D>();

public float jumpForce;

if (Input.GetKeyDown(KeyCode.Space))
{
    rig.AddForce(new Vector2(0, jumpForce));
}

通过敲击空格直接给刚体一个力来实现跳跃的效果,jumpForce可以在unity面板调试,这种方法非常简单直观,不过跳跃有些细节,比如跳跃检测,目前的代码并没有实现,简单来说就是角色可以无限跳,而且力是可以叠加的,如果角色可以二连跳,三连跳等,在跳跃瞬间多次敲击空格就可以以几倍的加速度跳出去,又是一个物理问题,给角色施加一单位的力,两单位,三单位等等,所展现出来的物理效果是完全不同的,而且速度过快会有穿模问题

 


总结:本文主要介绍2D游戏里左右移动和跳跃脚本,左右移动两种方法各有优劣,不过本人较为推荐通过刚体速度来控制角色的移动,不过也有通过控制position来的游戏,不同的游戏侧重点不同,就会选择不同的方式来实现。跳跃也可以通过速度来控制,不过画面过于鬼畜,大家可以动手尝试一下。简单的实现移动和跳跃,本文到此为止,谢阅。

 

猜你喜欢

转载自blog.csdn.net/Zhidai_/article/details/86628519