P13_8.Animator 打开Windows
窗口选择Animation
,并拖拽至Game
游戏窗口同侧。
打开Windows
窗口选择Animator
,并拖拽至Scene
场景窗口同侧。
创建动画控制器 关联Animotor
对象 点击create
按钮创建
将初始状态的图片移动到playerIdel
,可点击播放按钮查询动画,这里采样率设置10动画较为流畅。
采样率按钮,在Animation
选框的右边...
三个小点(竖着的)
忽略playerMove
(同上创建方式),动画选择参考截图。
关联动画并建立联系
部分主要涉及代码逻辑,其他省略
private Animator anim; [SerializeField] private bool isMoving;
// 获取子类的动画组件 anim = GetComponentInChildren<Animator>(); ... // 判断是否在移动 isMoving = rb.velocity.x != 0; anim.SetBool("isMoving", isMoving);
另一个动画,设置bool属性与截图相反即可。
P14_9.Clean up 将不同功能的代码封装一个函数方法。
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private Rigidbody2D rb; private Animator anim; [SerializeField] private bool isMoving; // SerializeField 修饰符可以使私有变量在Unity编辑器中显示 [SerializeField] private float moveSpeed; [SerializeField] private float jumpForce; private float xInput; // Start is called before the first frame update void Start() { // 获取刚体组件 rb = GetComponent<Rigidbody2D>(); // 获取子类的动画组件 anim = GetComponentInChildren<Animator>(); } // Update is called once per frame void Update() { Movement(); CheckInput(); AnimatorController(); } private void CheckInput() { // 获取水平输入 xInput = UnityEngine.Input.GetAxisRaw("Horizontal"); if (UnityEngine.Input.GetKeyDown(KeyCode.Space)) { Jump(); Debug.Log(DateTime.Now + "点击跳跃"); } } private void Movement() { rb.velocity = new Vector2(xInput * moveSpeed, rb.velocity.y); } private void Jump() { rb.velocity = new Vector2(rb.velocity.x, jumpForce); } private void AnimatorController() { // 判断是否在移动 isMoving = rb.velocity.x != 0; anim.SetBool("isMoving", isMoving); } }
P15_10.Flip charactor 实现动画的左右翻转。
P16_11 2D Collision Detection 限制无限次跳跃,检查是否在地面。
[SerializeField] private float groundCheckDistance; [SerializeField] private LayerMask whatIsGround; private bool isGrounded;
private void OnDrawGizmos() { Gizmos.DrawRay(transform.position, new Vector3(transform.position.x, transform.position.y - groundCheckDistance)); } private void CollisionChecks() { isGrounded = Physics2D.Raycast(transform.position, Vector2.down, groundCheckDistance, whatIsGround); }
白色线条标记地面距离
跳跃的时间检查是否在地面
private void Jump() { if(isGrounded) rb.velocity = new Vector2(rb.velocity.x, jumpForce); }