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