一、游戏素材来源于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();

coll = GetComponent();

sprite = GetComponent();

anim = GetComponent();

}

// 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站

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。