实现人物的移动和翻转

一旦一个物体上被挂载了Rigidbody刚体组件之后,那么他的坐标就由这个刚体来进行驱动了

我们打开Rigid body 2D下面的info可以看见它可以有position,rotation和velocity,代表他的position,rotation就可以覆盖原有的transform这部分的内容

还有在之前的视频当中我们演示过,我们可以通过修改坐标的方式,来让任务产生移动,我们也可以通过添加速度的方式,来让人物产生真实的移动效果

我们如何使用速度来驱动一个物体,双击打开代码,接着之前的代码内容来写

在之前的内容,我们已经成功地获得了键盘的输入和手柄的输入,他输入一个坐标值,我们传递到了我们的input direction当中,那么我们就可以把左右的正负值给到我们的速度上,我们也在对应的方向施加一个速度就行了,那么既然我们要添加速度,那我们就势必要有一个速度的值,我们可以创建一个这个变量

起名叫做speed ,他是一个float的变量值,浮点值,可以有小数 ,创建之后保存代码,返回到unity当中返回到unity当中,我们就可以看到,在Player Controller中出现speed

我们可以给speed输入一个值200

返回到代码当中,我们接下来要实现人物的移动,我们要把移动的数据也持续不断的更新上去,那么在使用刚体Rigidbody刚体这个组件产生移动的时候,我们通常会在FixedUpdate当中去执行

FixedUpdate是一个固定更新的值,他确保在不同的设备上,无论你的运算速度有多快,他都以一个固定的时钟频率来进行执行,所以通常和物理有关的,我们会放在这儿执行(我们修改物理判断的更新模式有Fixed Update和Update,暂时我们就按照传统的方式Fixed Update里面来写)

接下来我们来写一个函数方法用来我们人物的基本移动,起名叫做Move

void代表函数没有任何的返回值,这就是一个基本的函数

在Move当中写的内容要在Fixed Update里面执行

所以在Move当中 ,我们要做的就是修改我们刚体的速度,那我们还没有获得刚体的组件,就没有办法更改他,我们可以在上面来创建我们的刚体组件,然后来获取一下他

第一种获取的方法,在上方创建刚体类型

public class PlayerController : MonoBehaviour
{
    public Playerinputcontrol inputControl;//inputsystem,与控制有关的代码
    public Vector2 inputDirection;
    public float speed;
    public Rigidbody2D rb;//创建刚体类型

保存代码,返回到unity当中,接下来我们可以在Player的Player Controller当中看到变量Rb,这里面现在是空的,没有获得任何的Rigidbody 2D的组件,那我想要获得一个简单的方法,我可以将自身身上的Rigidbody 2D点击拖拽,放到这个位置,那么我们就获得了这个组件的使用权,有了这个组件后,我们就可以调用这个组件当中的所以变量参数

这些所有的参数都可以用变量的方式来修改

以上是第一种方法,这种拖拽方法的好处就是他获取速度非常快,不需要等待编译器或者是游戏执行,他就直接能获得这个组件的使用权

如果游戏的一些组件需要在游戏开始前最早最早执行的时候,那么我们通常用这种拖拽的方式进行复制

第二种方法(不是一定要在所有的代码执行之前要执行的话,我们会在我们的Awake当中去获得这个变量的赋值)

将public换为private

private私有的,标记的变量只能在我当前标记的这个类型PlayerController中进行访问和使用,我没有办法再另外一个代码当中进行调用

而被标记为public类型的变量,除了可以在inspect窗口当中看到以外,也可以通过其他的代码进行访问和编辑

标记为private,保存代码返回到unity

public class PlayerController : MonoBehaviour
{
    public Playerinputcontrol inputControl;//inputsystem,与控制有关的代码
    public Vector2 inputDirection;
    public float speed;
    private Rigidbody2D rb;//创建刚体类型

在我们inspector当中就没有我们的rb变量了

打开代码,来获得我们的赋值

GetComponent获得组件

让我们自身获得Rigidbody2D的组件

 private void Awake()
 {
     inputControl = new Playerinputcontrol();
     rb = GetComponent<Rigidbody2D>();//获得Rigidbody2D的组件
 }

我们有了这个Rigidbody之后,我们就可以修改他的速度

rb.velocity获得速度(" . "访问里面的函数方法和变量参数)

划线部分表示:在每一秒钟已固定的单位线性的执行更改他的速度

Vector2二维的数据x和y

主要的移动在x轴方向,用输入的方向值来乘以我们刚才编辑的速度再乘上一个我们时间的修订值

Vector2.Vector2(float x,float y)都是浮点型的数值

时间的修订值(可以帮助我们在不同配置的电脑上面都获得相同的实验效果)

先给y轴的值设置为0,x轴的inputDirection设置为.x

    private void Move()
    {
        rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, 0);//方向值*速度*时间修订值
    }
}

我们保存代码,返回unity,尝试左右移动

点击运行,我们会发现人物降落速度变得非常慢,说明rb.velocity中的y值不应该为零

等待人物成功落地我们在键盘输入A和D,可以观察一下inspect窗口当中的变量xy的值

现在我就可以通过左右移动来控制人物的移动方向了

如果觉得速度过慢,可以在speed当中进行修改,我们将速度变快一点,设置为290

现在我们就成功实现了人物的左右移动

接下来更改人物的降落速度,y轴的数值不应该为0

在unity当中2D的物理引擎y轴的速度是-9.81,也就是模拟的真实的重力,要维持其原有的重力

保存代码,返回unity

 private void Move()
 {
     rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);//x轴:方向值*速度*时间修订值,y轴:保持原有的重量不变
 }

再来运行测试一下,降落速度正常,左右移动正常,

可以尝试使用手柄来移动一下,缓慢移动左侧摇杆,在inputDirection当中的x值是缓慢变化的,不是直接是1或者-1,可以看出手柄和键盘的输入中也存在着一些差别

接下来实现人物的翻转

第一种最简单的方法实现翻转,通过修改transform当中的scale的数值(scale是三维向量,都是围绕着对应的轴来进行比例的缩放,调整x轴人物会缩小,x轴的比例变小了,x轴的数值小于0,向着相反的方向)

把x轴的值改为-1,可以看到人物翻转

第二种做法,点开player下方的Sprite Renderer这个组件

Flip翻转,可实现xy轴的翻转,勾选选项人物翻转

在y轴翻转时,以脚底为中心点,是因为我们在切割人物图片时候,锚点位置设置为底部中心

在本项目中采用第一种方法,改变x的值进行翻转,我们需要获得transform这个组件,transform作为一个默认组件,可以直接拿来使用,不需要Getcomponent

打开代码,写下操作

在Move这个函数中

除了人物的左右移动,我们也想不断的更新,按照人物的方向进行翻转

要修改scale用到transform的组件(大写Transform是类型,小写transform是变量扳手样式)

localScale是一个三维变量,xyz,重新赋值

向左为-1,向右为1,通过input Direction大于0和小于0两种情况来判断方向

创建一个临时变量faceDir用来记录真实方向,默认情况下等于transform.localScale.x

因为我的transform.localScale.x是一个浮点型,可以用小数,这里我们把他设置成立int整数型,强制转换

(我们如何将两个不同的数据类型之间进行转换,我们可以强制把float后面的小数全部省略掉,强制改为int类型)

这种写法叫做cost,(强制转换)

 private void Move()
 {
     rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);//x轴:方向值*速度*时间修订值,y轴:保持原有的重量不变

     int faceDir = (int)transform.localScale.x;
     //人物翻转
     transform .localScale=new Vector3()//当前的scale
 }

faceDir的初始值为1,变为-1实现翻转

y和z都是1,这个是确定的

 private void Move()
 {
     rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);//x轴:方向值*速度*时间修订值,y轴:保持原有的重量不变

     int faceDir = (int)transform.localScale.x;
     //人物翻转
     transform.localScale = new Vector3(faceDir, 1, 1);//当前的scale
 }

faceDir变化由inputDirection.x的正负决定

写一个判断语句(如果if的判断语句下方只有一行命令,我们可以省略大括号)

 private void Move()
 {
     rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);//x轴:方向值*速度*时间修订值,y轴:保持原有的重量不变

     int faceDir = (int)transform.localScale.x;//设置变量,监控方向
     if(inputDirection.x >0)
         faceDir = 1;
     if(inputDirection.x<0)
         faceDir = -1;
     //人物翻转
     transform.localScale = new Vector3(faceDir, 1, 1);//当前的scale
 }

保存代码,返回unity进行测试

运行之前,我们要把人物变为原来的方向

可以发现,人物实现翻转

我们还要注意一点,在上面情况下可以使用localScale的方法进行修改,

首先第一点要确定我们的人物的图片,图片的锚点位置决定图片的翻转,这个位置决定了我们人物的中心轴的翻转方向,要注意翻转的轴

还有一中情况,人物在场景当中本身的scale不是1,一旦修改了人物的比例,在代码当中也要进行修改

如果要是有Sprite Renderer来实现翻转,我们可以通过将Sprite Renderer.flip x=true,代表勾选,x轴翻转

获得Sprite Renderer组件就想获得Rigidbody组件一样,然后获得.flip x就可以实现这个效果了

写完的函数一定要放在FixedUpdate当中去执行,不然没有代码去调用他,就不可以执行

FixedUpdate,Update,OnDisable,OnEnable这些都叫做代码周期性函数,周期性的开启OnEnable和关闭OnDisable,周期性的每帧执行Update和周期性的固定执行FixedUpdate,所以在这FixedUpdate里面执行的内容才会持续不断,在游戏的过程当中都会执行的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值