7.7 KiB
7.7 KiB
title, date, tags, pinned, head
| title | date | tags | pinned | head | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| StudyCase2 | 2025-11-26 15:38 |
|
true |
|
绑定动画
1.世界构筑的起始篇章-编辑器
- Unity 2022.3.62f2:
- Visual Studio 2022
2.光芒汇聚之所-章节目标
- 导入模型修改材质
- 控制器绑定动画
3.光流影卷-演示视频
4.初始祭坛-前置准备
1. 导入FBX模型,导入shader
- 新健文件夹导入FBX
- 导入shader
5.勇者行迹录-章节任务
创建StudyCase2
- 复制场景和脚本改名为StudyCase2
- 修改控制器的命名空间
模型处理
- 导出FBX材质球到Mats文件夹方便修改
- 替换模型材质Shader
- 嘴巴贴图特殊处理
- 属于脸部材质需勾选isFace,嘴部材质特殊处理
用模型替换之前的胶囊体
- 替换模型
- 调整模型大小和位置
创建动画控制器,添加Idle和Move动画片段
- 创建动画控制器
- 模型节点添加动画控制器组件
- 打开动画控制器界面,Idle作为默认动画
- 添加移动动画,创建连接,创建bool参数
- moving和idle设置为循环播放
创建状态条件
- 设置idle到moving的条件
- 设置moving到move end的条件
- 设置move end到moving的条件的条件
编写脚本ThirdCharacterController.cs
- 修改
Assets\Scripts\StudyCase2下脚本ThirdCharacterController
using UnityEngine;
using UnityEngine.InputSystem;
namespace StudyCase2
{
public class ThirdCharacterController : MonoBehaviour
{
CharacterController characterController;
InputActionAsset inputAction;
Animator animator;
Transform forward;
Transform model;
Cinemachine.CinemachineVirtualCamera vCam;
public float moveSpeed = 5f;
public float jumpSpeed = 2f;
public float turnSpeed = 10f;
public float gravity = 10f;
Vector3 moveDir;
Vector2 moveInput;
private void Awake()
{
characterController = GetComponent<CharacterController>();
forward = transform.Find("Forward");
model = transform.Find("Model");
animator = model.GetComponentInChildren<Animator>();
vCam = transform.Find("Virtual Camera").GetComponent<Cinemachine.CinemachineVirtualCamera>();
inputAction = Resources.Load<InputActionAsset>("Player");
inputAction.FindAction("Move").started += OnMove;
inputAction.FindAction("Move").performed += OnMove;
inputAction.FindAction("Move").canceled += OnMove;
inputAction.FindAction("Jump").performed += OnJump;
inputAction.Enable();
}
private void Update()
{
moveDir = new Vector3(moveInput.x, moveDir.y, moveInput.y);
forward.eulerAngles = new Vector3(0, vCam.transform.eulerAngles.y, 0);
moveDir = forward.TransformDirection(moveDir);
if (moveInput != Vector2.zero)
{
animator?.SetBool("Move", true);
Quaternion target = Quaternion.LookRotation(new Vector3(moveDir.x, 0, moveDir.z));
model.rotation = Quaternion.Slerp(model.rotation, target, turnSpeed * Time.deltaTime);
}
else animator?.SetBool("Move", false);
if (!characterController.isGrounded)
moveDir.y -= gravity * Time.deltaTime;
characterController.Move(moveDir * moveSpeed * Time.deltaTime);
}
public void OnMove(InputAction.CallbackContext context)
{
if (characterController.isGrounded)
moveInput = context.ReadValue<Vector2>();
else moveInput = Vector2.zero;
}
public void OnJump(InputAction.CallbackContext context)
{
if (context.performed && characterController.isGrounded)
{
moveDir.y = jumpSpeed;
}
}
}
}
代码讲解
在Awake中自动获取组件,移除PlayerInput
private void Awake()
{
characterController = GetComponent<CharacterController>();
forward = transform.Find("Forward");
model = transform.Find("Model");
animator = model.GetComponentInChildren<Animator>();
vCam = transform.Find("Virtual Camera").GetComponent<Cinemachine.CinemachineVirtualCamera>();
inputAction = Resources.Load<InputActionAsset>("Player");
inputAction.FindAction("Move").started += OnMove;
inputAction.FindAction("Move").performed += OnMove;
inputAction.FindAction("Move").canceled += OnMove;
inputAction.FindAction("Jump").performed += OnJump;
inputAction.Enable();
}
//设置动画控制器参数
//true:播放Moveing动画
//false:播放Move end动画,然后回到Idle
animator.SetBool("Move", true);
Player节点设置
挂载studycase2的控制器,移除PlayerInput组件

6.异闻录-FAQ
- 移动不播放动画:确认动画控制器的参数名字和脚本中设置的一样。
- 动画只播放一遍:检查是否勾选循环播放,在模型上看。
- 动画状态切换有延迟:确认动画控制器中连接线的HasExitTime是否勾选。
完成以上步骤,即可得到一个带动画的第三人称控制器。项目地址