如何制作2D平台小游戏 3

一 状态机
1. 初步实现动画状态机
1.1 添加Animation和使用

​ 创建:Window => Animation => Animation

​ 或者:ctrl + 6 快捷键

2.1 Animation的使用

在这里插入图片描述

在这里插入图片描述

​ 当文件保存后会在生成:

2. 使用Animator(状态机)
1.1 实现idle 和 jump 之间的转换

在这里插入图片描述

其中running参数是用来判断是否跑动的状态

​ ↓

双箭头(Transition) 给两个状态添加条件

在这里插入图片描述

​ ↓

添加脚本

void playerAnim()
{
 	anim.SetBool("running", moveX != 0);
    //判断速度是否等于0,如果不等于则执行run动画,否则执行idea
}
3.多种状态

采用枚举的方法来实现

在这里插入图片描述

private enum PlayState
{
     idle,
     run,
     jump,
     fall,
     doublejump
}
void playerAnim()//动画专用
{
     PlayState state;
     if(Mathf.Abs(moveX) > 0)
     {
          state = PlayState.run; //奔跑
     }
          else
     {
          state=PlayState.idle; //站立
     }
          if(rb.velocity.y > 0.1f)
     {
          state = PlayState.jump; //跳起
     }
          else if(rb.velocity.y < -0.1f)
     {
          state = PlayState.fall; //下落
     }
          if(jumpCount==0&&rb.velocity.y>0)
     {
          state =PlayState.doublejump;  //翻转
     }
     anim.SetInteger("state",(int)state);
}
二 实现摄像头跟随
1. 添加摄像头最简单的方法

​ 把main Camera 拖到角色上

2. 使用Cinemachine 组件添加

在这里插入图片描述

3. 设置摄像机

在这里插入图片描述
在这里插入图片描述

4 碰撞事件

1)OnCollisionEnter2D(Collision2D collision):
当一个游戏对象的碰撞器开始与另一个游戏对象的碰撞器接触时,这个函数会被调用。
collision参数包含了关于碰撞的信息,如碰撞的点和速度等。

2)OnCollisionExit2D(Collision2D collision):
当一个游戏对象的碰撞器停止与另一个游戏对象的碰撞器接触时,这个函数会被调用。
collision参数包含了关于碰撞的信息。

3)OnCollisionStay2D(Collision2D collision):
当两个游戏对象的碰撞器保持接触时,这个函数会在每一帧被调用。
collision参数包含了关于碰撞的信息。

4)OnTriggerEnter2D(Collider2D other):
当一个游戏对象的碰撞器(设为触发器)开始与另一个游戏对象的碰撞器接触时,这个函数会被调用。
注意,要使碰撞器成为触发器,你需要在碰撞器的Inspector面板中勾选“Is Trigger”复选框。
other参数代表与触发器接触的游戏对象的碰撞器。

5)OnTriggerExit2D(Collider2D other):
当一个游戏对象的碰撞器(设为触发器)停止与另一个游戏对象的碰撞器接触时,这个函数会被调用。
other参数与OnTriggerEnter2D中的相同。

6)OnTriggerStay2D(Collider2D other):
当一个游戏对象的碰撞器(设为触发器)持续与另一个游戏对象的碰撞器接触时,这个函数会在每一帧被调用。
other参数与OnTriggerEnter2D中的相同。
三 游戏中的道具
1. 食物道具

1 右键 => 2D object => sprites => Square => 命名为Melon

2 把食物的img 挂载到 Sprite Render 的 Sprite组件上

在这里插入图片描述
在这里插入图片描述

3 挂载碰撞体 Box Collider 2D

4 制作食物动画 :在Animator 创建食物的动画 让后挂载到 Melon 上

5 挂载角色和食物碰撞的脚本

private int bananas = 0;
[SerializeField] private Text melonText;
private void OnCollisionEnter2D(Collision2D collision) //当触碰时调用
{
   if (collision.gameObject.CompareTag("Banana"))
   {
      Destroy(collision.gameObject); //销毁碰到的对象
   }
      if (collision.gameObject.CompareTag("Melon"))
  {
      Destroy(collision.gameObject); //销毁碰到的对象
   }
}   

7 制作预制体:把Melon 拖进 Perfabs 中

​ 预制体的作用:当要重复使用每个道具时就可以使用预制体,方法管理和修改

2. 简易的陷阱道具

跟食物道具大致相同,只是碰撞逻辑不同

private void OnCollisionEnter2D(Collision2D collision)
{
    //OnCollisionEnter2D  当俩者都,没有勾选Is trugger时进入函数
    if (collision.gameObject.tag=="Trap")
    {
        Death(); //当碰到陷阱后会死亡
    }
}

private void Death()  //死亡并播放死亡动画
{
    rb.bodyType = RigidbodyType2D.Static;//当触碰到陷阱后不能移动
    Destroy(playerPS,1f);//清除粒子特效
    anim.SetTrigger("death");  //播放死亡动画
}
四 制作简易的UI

1 右键 => UI => legacy => text

在这里插入图片描述

2 让吃到食物时统计食物个数

private int bananas = 0;
private int melons = 0;
[SerializeField] private Text bananaText;
[SerializeField] private Text melonText;

 private void OnCollisionEnter2D(Collision2D collision) //当触碰时调用
{
   if (collision.gameObject.CompareTag("Banana"))
   {
       Destroy(collision.gameObject); //销毁碰到的对象
       bananas++;
       bananaText.text = "Bananas:" + bananas;//当吃到一个食物时,个数自加1
   }
 }

sion) //当触碰时调用
{
if (collision.gameObject.CompareTag(“Banana”))
{
Destroy(collision.gameObject); //销毁碰到的对象
bananas++;
bananaText.text = “Bananas:” + bananas;//当吃到一个食物时,个数自加1
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值