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

先来一张效果图:

unity2D角色控制 unity2d控制角色移动_unity2D角色控制

一般的Unity2D游戏中

用WASD控制来移动人物角色的移动

缺陷:与含有碰撞器的强行碰撞时会发生抖动

原因:例如我人物要向左边走,利用脚本获取键盘输入,给人物角色一个向左边的力,物体会向左边走,但是物体有碰撞器,发生碰撞检测后,会给物体一个方向相反的力,让其向右边走。

unity2D角色控制 unity2d控制角色移动_游戏开发_02


2D人物需要添加的组件:Rigidbody2D、注意将其 Gravuty Scale设置为0,不然2D人物会发生平面掉落,如果不冻结Freeze Rotation的Z轴,人物还会发生旋转,冻结这些角度就是为了让其发生碰撞时不会发生旋转,对于一些加了碰撞器的组件和Rigidbody2D的物体,一般会冻结它的Freeze Position的X,Y轴以及其Freeze Rotation,既不让它碰撞后移动,也不让他旋转

unity2D角色控制 unity2d控制角色移动_unity_03


人物没有归零重力和冻结旋转的效果,可以发现人物发生了自然下落以及碰撞物体后的转向

unity2D角色控制 unity2d控制角色移动_unity_04


那么如果场景没有冻结呢?

unity2D角色控制 unity2d控制角色移动_游戏开发_05


这主要是针对一些物体,如果给他加了Tilemap Collider后会自动给他加上Rigidbody2D,记得要归零其重力

unity2D角色控制 unity2d控制角色移动_unity2D角色控制_06


代码如下:

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来移动人物
    }
}

最终效果如下

unity2D角色控制 unity2d控制角色移动_System_07