---
title: StudyCase2
date: 2025-11-27 16:35:05
tags: [studycase, unity]
pinned: true
head:
- - meta
- name: description
content: vitepress-theme-bluearchive StudyCase2
- - meta
- name: keywords
content: vitepress theme bluearchive StudyCase2
---
# 绑定动画
- [世界构筑的起始篇章-编辑器](#_1-世界构筑的起始篇章-编辑器)
- [光芒汇聚之所-章节目标](#_2-光芒汇聚之所-章节目标)
- [光流影卷-演示视频](#_3-光流影卷-演示视频)
- [初始祭坛-前置准备](#_4-初始祭坛-前置准备)
- [勇者行迹录-章节任务](#_5-勇者行迹录-章节任务)
- [异闻录-FAQ](#_6-异闻录-faq)
## 1.世界构筑的起始篇章-编辑器
- **Unity 2022.3.62f2**:
- **Visual Studio 2022**
## 2.光芒汇聚之所-章节目标
- **导入模型修改材质**
- **控制器绑定动画**
## 3.光流影卷-演示视频
## 4.初始祭坛-前置准备
### 导入[FBX模型](/resources/studycase2/FBX.zip),导入[shader](/resources/studycase2/SimpleURPToon.zip)
- 新健文件夹导入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.cs`
```csharp
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();
forward = transform.Find("Forward");
model = transform.Find("Model");
animator = model.GetComponentInChildren();
vCam = transform.Find("Virtual Camera").GetComponent();
inputAction = Resources.Load("PlayerInputActions");
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();
else moveInput = Vector2.zero;
}
public void OnJump(InputAction.CallbackContext context)
{
if (characterController.isGrounded)
{
moveDir.y = jumpSpeed;
}
}
}
}
```
### 代码讲解
在Awake中自动获取组件,移除PlayerInput
```csharp
private void Awake()
{
characterController = GetComponent();
forward = transform.Find("Forward");
model = transform.Find("Model");
animator = model.GetComponentInChildren();
vCam = transform.Find("Virtual Camera").GetComponent();
inputAction = Resources.Load("PlayerInputActions");
inputAction.FindAction("Move").started += OnMove;
inputAction.FindAction("Move").performed += OnMove;
inputAction.FindAction("Move").canceled += OnMove;
inputAction.FindAction("Jump").performed += OnJump;
inputAction.Enable();
}
```
```csharp
//设置动画控制器参数
//true:播放Moveing动画
//false:播放Move end动画,然后回到Idle
animator.SetBool("Move", true);
```
### Player节点设置
挂载studycase2的控制器,移除PlayerInput组件
## 6.异闻录-FAQ
- **代码查找组件报错**:确认获取物体的名字和物体实际名字一致。
- **代码加载InputActionAsset报错**:确认处于`Resources`文件夹下,名字和查找名字一致。
- **移动不播放动画**:确认动画控制器的参数名字和脚本中设置的一样。
- **动画只播放一遍**:检查是否勾选循环播放,在模型上看。
- **动画状态切换有延迟**:确认动画控制器中连接线的`HasExitTime`是否勾选。
完成以上步骤,即可得到一个带动画的第三人称控制器。[项目地址](http://home.gtuantuan.online:8300/TuanTuan/StudyCase)