Unity Assets:Sunnyland
Day3
1. 添加idle动画
添加Animator组件:
建文件夹并创建Animator Controller,拖入上面的组件:
创建一个名为idle的动画,拖入图片。如果播放速度太快,减少Samples。
注意:拖入图片前,记得修改
Window->Animator中可以看见idle是默认动画,点击试玩,即开始播放。
2. run和idle的切换
同上,新建clip。
记得勾选:
在Animator中,设置两个状态的切换条件。
添加一个布尔型的参数判断是否在跑动状态。
还要取消两个运动状态中间的过渡。
脚本中,设置参数的变化。
//角色移动
if(horizontalmove!=0)
{
rb.velocity = new Vector2(speed * horizontalmove * Time.deltaTime, rb.velocity.y);
anim.SetBool("isRunning", true);
}
else
{
anim.SetBool("isRunning", false);
}
3. 添加jump
jump这里和run、idle的不同之处在于,它分为跳起和下落。需要分别创建clip。
jump:
fall:
关系:
设置参数调整切换状态:
我们希望跳到最高点时,isJumping变为false,isFalling变为true。
//最高点切换为下落动画
if(anim.GetBool("isJumping"))
{
if(rb.velocity.y < 0)
{
anim.SetBool("isJumping", false);
anim.SetBool("isFalling", true);
}
}
4. 切换为idle(LayerMask)
到地上时,isFalling变为false,isIdle变为true。
在脚本中创建一个变量来获取地面tilemap。
如何判断到达地面呢?
y = 0?!不行。地图中地面的位置不一定。
public LayerMask ground;//获取地面信息
设置LayerMask
给tileMap添加一个Layer为Ground:
将LayerMask设置为Ground,告诉系统哪一个才是地面。
利用碰撞体判断是否碰到地面:
//碰到地面切换为idle
else if(coll.IsTouchingLayers(ground))
{
anim.SetBool("isFalling", false);
anim.SetBool("isIdle", true);
}
脚本中完整代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 400;
public float jumpforce = 400;
public LayerMask ground;//获取地面信息
private Rigidbody2D rb;
private Animator anim;
public Collider2D coll;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
//coll = GetComponent<Collider2D>();
}
// Update is called once per frame
void FixedUpdate()
{
Movement();
SwitchAnim();
}
void Movement()
{
float horizontalmove = Input.GetAxis("Horizontal");
float direction = Input.GetAxisRaw("Horizontal");
//角色移动
if(horizontalmove!=0)
{
rb.velocity = new Vector2(speed * horizontalmove * Time.deltaTime, rb.velocity.y);
anim.SetBool("isRunning", true);
}
else
{
anim.SetBool("isRunning", false);
}
//角色朝向
if(direction!=0)
{
transform.localScale = new Vector3(direction, 1, 1);
}
//角色跳跃
if(Input.GetButtonDown("Jump"))
{
rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
anim.SetBool("isJumping", true);
anim.SetBool("isIdle", false);
}
}
void SwitchAnim()
{
//最高点切换为下落动画
if(anim.GetBool("isJumping"))
{
if(rb.velocity.y < 0)
{
anim.SetBool("isJumping", false);
anim.SetBool("isFalling", true);
}
}
//碰到地面切换为idle
else if(coll.IsTouchingLayers(ground))
{
anim.SetBool("isFalling", false);
anim.SetBool("isIdle", true);
}
}
}