参考 https://www.163.com/dy/article/EVNITUM10526E124.html
工程类型:High Definition RP
工程截图
脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.VFX;
/// <summary>
/// 对模型粒子化
/// </summary>
public class ParticleAvatar : MonoBehaviour
{
public GameObject VFX;
private GameObject VFXInstance;
private Texture2D pointCache;
private float size;
void Start()
{
CreateVFX();
StartCoroutine(OnVFXLoop());
}
IEnumerator OnVFXLoop()
{
yield return null;
while (true)
{
this.UpdateSize(gameObject);
this.UpdateCachePoint(gameObject);
this.VFXInstance.GetComponent<VisualEffect>().SetTexture("PointCache", this.pointCache);
this.VFXInstance.GetComponent<VisualEffect>().SetFloat("Size", this.size);
yield return new WaitForEndOfFrame();
}
}
void CreateVFX()
{
this.VFXInstance = Instantiate(this.VFX);
this.VFXInstance.transform.position = transform.position;
this.VFXInstance.transform.rotation = transform.rotation;
}
void UpdateSize(GameObject character)
{
SkinnedMeshRenderer[] renderers = character.GetComponentsInChildren<SkinnedMeshRenderer>();
Bounds bound = new Bounds();
foreach (SkinnedMeshRenderer renderer in renderers)
{
Mesh baked = new Mesh();
renderer.BakeMesh(baked);
bound.Encapsulate(baked.bounds);
}
this.size = Mathf.Max(bound.extents.x * 2, bound.extents.y * 2, bound.extents.z * 2);
}
void UpdateCachePoint(GameObject character)
{
Mesh baked;
Vector3[] vertices;
Transform parent;
SkinnedMeshRenderer[] renderers = character.GetComponentsInChildren<SkinnedMeshRenderer>();
List<Color> normalizedVertices = new List<Color>();
foreach (SkinnedMeshRenderer renderer in renderers)
{
parent = renderer.gameObject.transform.parent;
baked = new Mesh();
renderer.BakeMesh(baked);
vertices = baked.vertices;
for (int i = 0; i < vertices.Length; i++)
{
vertices[i] = (character.gameObject.transform.InverseTransformPoint(renderer.gameObject.transform.TransformPoint(vertices[i])) + new Vector3(size * 0.5f, 0, size * 0.5f)) / size;
normalizedVertices.Add(new Color(vertices[i].x, vertices[i].y, vertices[i].z));
}
}
if (this.pointCache == null || this.pointCache.width != normalizedVertices.Count)
{
this.pointCache = new Texture2D(1, normalizedVertices.Count, TextureFormat.RGBA32, false, true);
this.pointCache.filterMode = FilterMode.Point;
}
this.pointCache.SetPixels(normalizedVertices.ToArray());
this.pointCache.Apply();
}
}
运行效果
未隐藏模型时的效果
隐藏模型的效果