[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来移动人物
}
}
最终效果如下