本文主要是介绍Unity2D_角色移动跳跃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
水平移动
Rigidbody2D
使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动
-
声明Rigidbody2D属性,以及角色移动速度
public float playerSpeed = 5f; private Rigidbody2D rigidbody2D;
-
在Start方法中将rigidbody2D绑定上物体的对应组件
void Start() {rigidbody2D = GetComponent<Rigidbody2D>(); }
-
读取键盘,并修改rigidbody2D的velocity,以实现移动
private void move() {//读取键盘的水平方向输入//这里hotizontal的取值为[-1,1],根据按键时长变化float horizontal = Input.GetAxis("Horizontal");//修改rigidbody2D的速度,这里只修改水平方向速度,竖直方向保持原状rigidbody2D.velocity = new Vector2(horizontal*playerSpeed, rigidbody2D.velocity.y); }
GetAxisRaw()
的返回值就只有1和-1,不是线性变化可以通过上述方法修改角色朝向,修改
transform.localScale
即可实现角色翻转float forward = Input.GetAxisRaw("Horizontal"); if (forward != 0) {transform.localScale = new Vector3(transform.localScale.x * forward, transform.localScale.y, transform.localScale.z); }
-
将我们自定义的方法在Update()中调用即可
void Update() {move(); }
Transform
直接利用sprite的transform中的position属性,直接在该属性的基础上加上一个new Vector3即可
//获取键盘水平输入
float horizontal = Input.GetAxisRaw("Horizontal");
//在本身位置基础上向量位移
transform.position = transform.position + new Vector3(horizontal * playerSpeed * Time.deltaTime, 0, 0);
其中
Time.deltaTime
是帧之间间隔的时间(由于这里是直接改变物体位置,Update()是每帧执行一次,乘上后代表每秒移动的距离transform有2个position相关的属性:
- position:世界坐标系下物体的坐标
- localPosition:父坐标系下物体的坐标
跳跃
跳跃实现
这里同样使用Rigidbody2D来实现角色的跳跃
在给物体施加有重力的情况下,给物体施加一个向上的初速度,同时要考虑到角色的跳跃判定,即接触到地面时才能进行跳跃
-
定义物体跳跃的初速度
public float jumpSpeed = 5f
-
给物体设定跳跃次数
//初始设定的跳跃次数 public int jumpTimes; //Player还能跳跃的次数 private int canJump;void Start() {//初始Player在空中,可将跳跃次数赋为0canJump = 0; }
-
判断物体是否还在地面上
//Player落地,跳跃次数重置 private void OnCollisionEnter2D(Collision2D collision) {if(collision.gameObject.layer == 3){canJump = jumpTimes;} }//Player离开地面,跳跃次数相应减一(跳离地面不算) private void OnCollisionExit2D(Collision2D collision) {if (collision.gameObject.layer == 3 && rigidbody2D.velocity.y<=0){canJump--;} }
layer==3是根据在unity的Layer中设置的3为Ground并将地面都设为Ground
-
检测到跳跃键,给物体施加向上的初速度
private void jump() {//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;} }
-
在Update()中调用jump()函数即可
void Update() {jump(); }
注意,实际游戏场景中有的墙会有摩擦导致物体挂在墙上
新建一个
Physics Material 2D
将摩擦调为0即可
手感优化
2D横版跳跃闯关游戏中最经典的就是马里奥了,通过某UP分析了马里奥的跳跃方式后发现:
- 马里奥的跳跃会根据按键时间的长短来控制跳跃的高度
- 马里奥上升与下降的帧数对比,大约是18:10
因此,可以根据这些分析得出以下优化思路:
- 跳跃实现时给的是初速度,跳跃高度无非就是由加速度决定,而在无附加情况下加速度只由重力决定。因此,可以根据是否按住按键为角色附加向上的加速度(抵消部分重力加速度带来的减速),以此增加角色的跳跃高度。
- 下落时比上升时要快,同样可以给下落时增加一个加速度,使物体能够快速下落。
- 如果觉得物体滞空时间太长,可以考虑增加物体的初速度,并增大全局重力(Project Settings -> Physics 2D -> Gravity),使跳跃高度不变的情况下滞空时间减少
示例:
//跳跃初速度
public float jumpSpeed = 8f;
//初始设定的跳跃次数
public int jumpTimes;
//Player还能跳跃的次数
private int canJump;
//上升时抵消几倍的重力加速度
public float upAddAce = 0.5f;
//下降时附加几倍重力加速度
public float fallAddAce = 1.0f;private void jump()
{//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;}//判断是否按住空格bool holdJump = Input.GetKey(KeyCode.Space);//按住空格且物体在上升状态则附加一个向上的加速度if (holdJump && rigidbody2D.velocity.y > 0){rigidbody2D.velocity += Vector2.down * Physics2D.gravity.y * upAddAce * Time.deltaTime;}//物体在下落时,附加向下加速度if(rigidbody2D.velocity.y < 0){rigidbody2D.velocity += Vector2.up * Physics2D.gravity.y * fallAddAce * Time.deltaTime;}
}
这篇关于Unity2D_角色移动跳跃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!