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);
}