营销型网站是什么样的,打开网站需要用户名密码,建站公司刚起步怎么接单,太原seo培训水平移动
Rigidbody2D
使用Unity自带的刚体组件#xff0c;通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性#xff0c;以及角色移动速度 public float playerSpeed 5f;
private Rigidbody2D rigidbody2D;在Start方法中将rigidbody2D…水平移动
Rigidbody2D
使用Unity自带的刚体组件通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性以及角色移动速度 public float playerSpeed 5f;
private Rigidbody2D rigidbody2D;在Start方法中将rigidbody2D绑定上物体的对应组件 void Start()
{rigidbody2D GetComponentRigidbody2D();
}读取键盘并修改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.y0){canJump--;}
}layer3是根据在unity的Layer中设置的3为Ground并将地面都设为Ground 检测到跳跃键给物体施加向上的初速度 private void jump()
{//判断是否按下空格bool isJump Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump canJump0){//给个跳跃初速度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 canJump0){//给个跳跃初速度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;}
}