[Unity2D]在2D游戏里面实现人物的移动[消除抖动]

[Unity2D]在2D游戏里面实现人物的移动

先来一张效果图:
在这里插入图片描述

一般的Unity2D游戏中

用WASD控制来移动人物角色的移动
缺陷:与含有碰撞器的强行碰撞时会发生抖动
原因:例如我人物要向左边走,利用脚本获取键盘输入,给人物角色一个向左边的力,物体会向左边走,但是物体有碰撞器,发生碰撞检测后,会给物体一个方向相反的力,让其向右边走。
在这里插入图片描述
2D人物需要添加的组件:Rigidbody2D、注意将其 Gravuty Scale设置为0,不然2D人物会发生平面掉落,如果不冻结Freeze Rotation的Z轴,人物还会发生旋转,冻结这些角度就是为了让其发生碰撞时不会发生旋转,对于一些加了碰撞器的组件和Rigidbody2D的物体,一般会冻结它的Freeze Position的X,Y轴以及其Freeze Rotation,既不让它碰撞后移动,也不让他旋转在这里插入图片描述
人物没有归零重力和冻结旋转的效果,可以发现人物发生了自然下落以及碰撞物体后的转向
在这里插入图片描述
那么如果场景没有冻结呢?
在这里插入图片描述
这主要是针对一些物体,如果给他加了Tilemap Collider后会自动给他加上Rigidbody2D,记得要归零其重力
在这里插入图片描述
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    private float horizontal;
    private float vertical;
    public float MoveSpeed=3;
    
    Vector2 Player_Move;
    
    void Start()
    {
        Application.targetFrameRate = 45; //控制游戏界面刷新的频率 可写可不写 不写默认60次
    }

    void Update()
    {
        float h = Input.GetAxis("Horizontal");  //获取水平轴的输入
        float v = Input.GetAxis("Vertical");    //获取纵轴的输入
        
        Vector2 position = transform.position;    //创建一个二维变量
        position.x = position.x + MoveSpeed * h * Time.deltaTime;  //更新变量
        position.y = position.y + MoveSpeed * v * Time.deltaTime;  //更新变量
        
        transform.position = position;  //赋值更新变量
    }
}

如何去消除抖动?
方法:需要使控制人物角色移动的力相同,都用物理属性来控制
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    private float horizontal;
    private float vertical;
    public float MoveSpeed=3;

    public int maxHealth = 5;  //定义生命值
    private int curHealth;

    Rigidbody2D rigidbody; 

    Vector2 Player_Move;
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 45; //刷新频率
        rigidbody = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector2 position = transform.position;
        position.x = position.x + MoveSpeed * h * Time.deltaTime;
        position.y = position.y + MoveSpeed * v * Time.deltaTime;
        //transform.position = position;  // 用统一的方法移动Ruby
        rigidbody.MovePosition(position);  //利用rigidbody来移动人物
    }
}

最终效果如下
在这里插入图片描述

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值