一 状态机
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
}
}