Files
BA-VitePress-Pages/posts/studycase2.md
2025-11-26 15:32:18 +08:00

5.3 KiB
Raw Blame History

title, date, tags, pinned, head
title date tags pinned head
StudyCase2 2025-11-25 15:38
studycase
unity
true
meta
name content
description vitepress-theme-bluearchive StudyCase2
meta
name content
keywords vitepress theme bluearchive StudyCase2

绑定动画

编辑器

  • 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

完成以上步骤,即可得到一个带动画的第三人称控制器。项目地址