unity 2D像素类 跑酷小游戏

本文详细介绍了使用Unity开发2D游戏的过程,包括素材管理、2D地形和角色创建、物理特性添加、动画控制、摄像机跟随、物体收集与碰撞检测,以及关卡结束判定。教程基于B站内容,适合初学者了解Unity游戏开发基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、游戏素材来源于unity assert store,搜索素材并添加至我的资源。

二、游戏制作过程

1.创建 unity 2D(核心模板)项目,在Window->package Manager里导入资源。
2.地形建立 

(1)设置sprite

找到资源文件夹里Background,将里面的背景图素材设置改为如下图:

点击右下角Sprite Editor,点击Slice,选择Grid By Cell Size,将 X、Y 轴的 Pixel size都改为16,就可以将图片切片

找到资源文件中的 Terrain 文件夹里 Terrain Sliced (16x16) 素材 Pixels Per Unit 改为16。

(2)绘制背景及地型

点击Window->2D->Tile Palette,点击Cteat new Palette,将刚才改好的Terrain Sliced (16x16) 和Background图形素材拖入,现在就可以开始绘制地形了。

在层级面板创建Tilemap->Rectangular,如图:

创建两个Rectangular,一个命名为Background,为背景;一个命名为Terrian,为地形。

绘制主要用到Tile Palette的三个工具,第三个笔刷工具,第四个填充工具(这里是用于绘制背景),第六个橡皮工具。

在绘制Terrian层时会被Background层遮住,此时在检查器窗口 点击 Tilemap Render->Sorting Layer->Add Sorting Layer,点击“+”分别创建两个层,注意调节层的顺序,如下图:

注:越下面的层越先显示

(3)为地形添加物理特性。

添加Tilemap Collider 2D、Composite Collider 2D(自动会添加 Rigidbody 2D)、Platform Effector 2D。

具体设置细节可以看https://mp.csdn.net/mp_blog/creation/editor/135748901

3、创建角色

Hierarchy窗口右键,2D Object->Sprite->Square,命名为Player;

找到资源文件中Main Characters,选择其中一个角色,将角色Idle中第一张图片拖到Sprite中。

为角色添加刚体和碰撞体,将刚体中Freeze Rotation勾选。

4、创建动画(动画以站立动画Idle为例)

在项目中创建Animition(可根据自己需要创建文件夹,将所有Animition放到里面),命名为Idle,拖到Player上。

双击点开动画,选中Player,将Idle中所有Sprite选中拖入Animition 中。

新版如果没有Samples,可以在右侧调试出。

5、控制角色移动及跳跃(含动画过渡)

Animator窗口创建int型参数state用于角色 Idle、Run、Jump、Fall状态转换。

如下图创建过渡,过渡条件为state对应值0 1 2 3。

玩家移动代码:

private Rigidbody2D rb;
private BoxCollider2D coll;
private SpriteRenderer sprite;
private Animator anim;

private float dirX = 0f;
private enum MovementState{ Idle, Run, Jump, Fall };//分别是0 1 2 3,对应动画过渡state值
[SerializeField] private float moveSpeed = 7f;//移动速度
[SerializeField] private float jumpForce = 7f;//跳跃力
[SerializeField] private LayerMask jumpableGround;
[SerializeField] private AudioSource jumpSoundEffect;//控制跳跃音效

// Start is called before the first frame update
void Start()
{
    rb = GetComponent<Rigidbody2D>();
    coll = GetComponent<BoxCollider2D>();
    sprite = GetComponent<SpriteRenderer>();
    anim = GetComponent<Animator>();
}

// Update is called once per frame
void Update()
{
    Move();
    UpdateAnimationState();
    
}
void Move()
{
    dirX = Input.GetAxisRaw("Horizontal");//获取水平轴上的输入存储在dirX中
    rb.velocity = new Vector2(dirX * moveSpeed, rb.velocity.y);//使用刚体(rb)的velocity属性来设置物体水平方向的速度
    
    if (Input.GetButtonDown("Jump")&&IsGround())
    {
        jumpSoundEffect.Play();
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);//跳跃时改变垂直方向上速度
    }
}
void UpdateAnimationState()
{
    MovementState state;
    if (dirX > 0f)//跑
    {
        state = MovementState.Run;
        sprite.flipX = false;//控制人物转向
    }
    else if (dirX < 0f)
    {
        state = MovementState.Run;
        sprite.flipX = true;
    }
    else//站立
    {
        state = MovementState.Idle;
    }

    if (rb.velocity.y > .1f)//跳跃
    {
        state = MovementState.Jump;
    }
    else if(rb.velocity.y<-.1f)//下落
    {
        state = MovementState.Fall;
    }
    anim.SetInteger("state", (int)state);
}
private bool IsGround()
{
    return Physics2D.BoxCast(coll.bounds.center, coll.bounds.size, 0f, Vector2.down, .1f, jumpableGround);//判断是否在地面上
}
6、摄像机跟随移动

(1)将摄像机移为Player子物体。

(2)代码控制:为Camera创建脚本。

 void Update()
 {
     transform.position = new Vector3(player.position.x, player.position.y, transform.position.z);
 }
7.物体收集

与创建角色步骤一样创建物体,只不过将Sprite Renderer的Sprite改为物体的图片(这里以cherry为例)。

为cherry添加Tag:

为cherry添加碰撞体,勾选IsTrigger。


 private void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.gameObject.CompareTag("Cherry"))//判断是否碰触到Tag为Cherry的物体
     {
         Destroy(collision.gameObject);
         cherries++;
         cherriesText.text = "Cherries:" + cherries;
     }
 }
    
8、碰触陷阱死亡

陷阱添加Tag;添加碰撞体,勾选IsTrigge。

  private void OnCollisionEnter2D(Collision2D collision)
  {
      if (collision.gameObject.CompareTag("Trap"))
      {
          Die();//碰触到陷阱触发死亡           
      }
  }
  private void Die()
  {

      rb.bodyType = RigidbodyType2D.Static;//使角色静止
      anim.SetTrigger("death");
  }
  private void RestarLevel()
  {
      SceneManager.LoadScene(SceneManager.GetActiveScene().name);//重新开始
  }
9、判定关卡结束(玩家碰到终点旗子结束)

2D Object->Sprite->Square,更改Sprite为旗子,添加碰撞体,勾选IsTrigge。

 private void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.gameObject.name == "Player" && !levelCompleted)//旗子碰到玩家
     {           
         levelCompleted = true;
         Invoke("CompleteLevel", 2f);//两秒后跳转
     }
 }
 private void CompleteLevel()
 {
     SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);//跳转下一场景
 }

注:使用上述语句跳转场景时注意场景在Build Settings的顺序。

该游戏课程源于B站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值