【Unity】模型渐变技术 BlendShapes变形

模型fbx拖拽到场景并赋予脚本上SkinnedMeshRenderer参数 按下空格即可演示渐变

可去到3DsMax 或 Blender等软件制作 这种带有BlendShapes的模型 (Sphere002)是另一个模型,3DsMax叫变形器。

可参考:【技术美术百人计划】美术 3.5 BlendShape基础_哔哩哔哩_bilibili

变形器大概用法:

  1. 先复制一份这个原本的模型,拉到旁边,并编辑这个复制体,改改顶点(编辑顶点)

  1. 原本的模型 添加变形器, 如上图 点击空的位置 右键 选中 场景中的复制体。

  2. 选中要导出的模型 文件 - 导出 - 导出选定对象 ,后面要注意勾选变形 默认勾选的

假如不勾选变形会发生如下事情:

导出的fbx 放入Unity会发现没有BlendShapes 取而代之的是一个普通的MeshRenderer模型

cs 复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BlendShapesTest : MonoBehaviour
{
    public SkinnedMeshRenderer skinMesh;
    public float speed = 4f;
    public float timer;
    public bool isPlaying;
    public int dir = 1;
    private int index;

    private void Awake()
    {
        index = skinMesh.sharedMesh.GetBlendShapeIndex("Sphere002");
        Debug.Log("index:"  + index);
    }

    void Update()
    {
        //按下空格 进行A->B 或 B->A渐变模型
        if (!isPlaying && Input.GetKeyDown(KeyCode.Space))
        {
            isPlaying = true;
            float weight = skinMesh.GetBlendShapeWeight(index);
            if (weight <= 0)
            {
                dir = 1;
                skinMesh.SetBlendShapeWeight(index, 0f);
                timer = 0;
                Debug.Log("开始动画 0 -> 100");
            }
            else
            {
                dir = -1;
                skinMesh.SetBlendShapeWeight(index, 100f);
                timer = 100f;
                Debug.Log("开始动画 100 -> 0");
            }
        }

        if (isPlaying)
        {
            timer += Time.deltaTime * dir * speed;
            skinMesh.SetBlendShapeWeight(index, timer);
            if (dir == 1 && timer >= 100)
            {
                skinMesh.SetBlendShapeWeight(index, 100);
                isPlaying = false;
                Debug.Log("0 -> 100 完成动画!");
            }
            else if (dir == -1 && timer <= 0)
            {
                skinMesh.SetBlendShapeWeight(index, 0);
                isPlaying = false;
                Debug.Log("100 -> 0 完成动画!");
            }
        }
    }
}
相关推荐
RPGMZ5 小时前
RPGMakerMZ 地图存档点制作 标题继续游戏直接读取存档
开发语言·javascript·游戏·游戏引擎·rpgmz·rpgmakermz
郝学胜-神的一滴8 小时前
[简化版 GAMES 101] 计算机图形学 07:图形学投影完全推导
c++·unity·图形渲染·three.js·unreal engine
晴夏。9 小时前
UE垃圾回收的全方面讲解(通俗易懂)【底层实现、触发方式、引用保持、优化、工具】
ue5·游戏引擎·ue·垃圾回收
相信神话202121 小时前
3.2《酒魂》规则设计文档
游戏引擎·godot·2d游戏编程·godot4·2d游戏开发
Avalon7121 天前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎
风酥糖1 天前
Godot游戏练习01-第33节-新增会爆炸的敌人
游戏·游戏引擎·godot
ellis19701 天前
Unity UI性能优化一之插件【Unity UI Optimization Tool】
unity·性能优化
Zik----1 天前
Unity基础学习笔记(B站视频课整理)
unity·vr
郑寿昌2 天前
UE5与UE6在Lumen和Nanite的差异解析
游戏引擎·图形渲染·着色器
郝学胜-神的一滴2 天前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal