unity-tilemap&角色移动&刚体&碰撞

制作地图(Tilemap)

  1. 设置素材大小Pixels Per Unit为合适的数值
  2. 设置sprite Mode为Multiple用于切割
  3. 打开素材Sprite Editor编辑,选择不同slice方式切割素材
  4. 选择每个单元格的素材在scene中绘制地图

添加角色

  1. 设置素材大小为合适数值
  2. 将角色拖至Hierarchy中,设置其sorting layer
  3. Animation窗口添加多张图片以添加动画
  4. 拖拽时间轴使动画频率合适

刚体–Rigidbody

让平面物体拥有重量,使其有重力,阻力等,可以受力的作用

  1. Add Component中选择Rigidbody 2D
  2. 设置Gravity Scale重力为合适的数值
  3. 若使角色保持直立,则勾选ConstraintsFreeze Rotation的Z轴使之锁定

碰撞–Collider

让物体可碰撞,接触。

  1. Add Component中选择需要的collider
  2. 勾选Edit Collider编辑角色碰撞的范围
  3. 设置不同图层,使角色与环境分离

角色移动

  1. Edit->Project Settings->Input Manager获取需要的输入信息
  2. 左右方向Horizontal,-1为左,0不动,1为右
  3. 编写脚本,距离=速度speed*单位位移*Time.delTime(delTime保证不同环境下都能顺滑移动),speed越高,移动的越快
  4. 跳跃时给角色添加跳跃的力jumpForce,在unity脚本页面设置的jumpForce越大跳的越高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[SerializeField]private Rigidbody2D rb;
public float speed;
public float jumpForce;

void movement()
{
float horizontalMove = Input.GetAxis("Horizontal");
float faceDirection = Input.GetAxisRaw("Horizontal");
//角色移动
if(horizontalMove != 0)
{
rb.velocity = new Vector2(horizontalMove * speed * Time.deltaTime, rb.velocity.y);
anim.SetFloat("running", Mathf.Abs(faceDirection));
}
if(faceDirection != 0)
{
transform.localScale = new Vector3(faceDirection, 1, 1);
}
//角色跳跃
if (Input.GetButtonDown("Jump"))
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce * Time.deltaTime);
anim.SetBool("jumping", true);
}
}

角色移动时动画的改变

  1. 新建动画
  2. 打开Animator设置不同改变顺序
  3. 点击各箭头关闭Has Exit TimeTransition Duration使变化没有延迟时间
  4. 若需要变化条件,则在Parameter中新建不同的参数用于脚本使用
  5. 并在Conditions处设置不同的条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[SerializeField]private Rigidbody2D rb;
[SerializeField]private Animator anim;

void switchAnim()
{
anim.SetBool("idle", false);

//跳跃到下落动画切换
if (anim.GetBool("jumping"))
{
if(rb.velocity.y < 0)
{
anim.SetBool("jumping", false);
anim.SetBool("falling", true);
}
}else if (coll.IsTouchingLayers(ground))//下降到地面动画切换
{
anim.SetBool("falling", false);
anim.SetBool("idle", true);
}
}

一些记录

Input.GetAxis()//获取-1~0,0~1
Input.GetAxisRaw()//仅获取-1.0.1,左,不动,右

Vector2: 2维变化
Vector3: 3维变化

FixedUpdate();
Update();

LayerMask: 在脚本中获取图层

public可以在script里看到
private不能看到,在start里初始化
[SerializeField]private则可以看到,但不能改

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2024 Aweso Lynn
  • PV: UV: