5.3 KiB
5.3 KiB
title, date, tags, pinned, head
| title | date | tags | pinned | head | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| StudyCase2 | 2025-11-25 15:38 |
|
true |
|
绑定动画
编辑器
- Unity 2022.3.62f2:
- Visual Studio 2022
课程目标
- 导入模型修改材质
- 控制器绑定动画
演示视频
课前准备
1. 导入FBX模型,导入shader
- 新健文件夹导入FBX
- 导入shader
课堂任务
模型处理
- 导出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 System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
namespace StudyCase2
{
public class ThirdCharacterController : MonoBehaviour
{
public CharacterController characterController;
public Animator animator;
public Transform forward;
public Transform model;
public 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 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;
}
}
}
}
代码讲解
//获取动画控制器
public Animator animator;
//设置动画控制器参数
//true:播放Moveing动画
//false:播放Move end动画,然后回到Idle
animator.SetBool("Move", true);
Player节点设置
- 新增
Animator,其他同StudyCase1
完成以上步骤,即可得到一个带动画的第三人称控制器。项目地址