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

可去到3DsMax 或 Blender等软件制作 这种带有BlendShapes的模型 (Sphere002)是另一个模型,3DsMax叫变形器。
可参考:【技术美术百人计划】美术 3.5 BlendShape基础_哔哩哔哩_bilibili

变形器大概用法:
- 先复制一份这个原本的模型,拉到旁边,并编辑这个复制体,改改顶点(编辑顶点)
-
原本的模型 添加变形器, 如上图 点击空的位置 右键 选中
场景中的复制体。
-
选中要导出的模型 文件 - 导出 - 导出选定对象 ,后面要注意勾选变形 默认勾选的


假如不勾选变形会发生如下事情:
导出的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 完成动画!");
}
}
}
}