Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

92 行
2.5 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
[CreateAssetMenu(fileName = "SpriteMeshGenerator.asset", menuName = "2D/Sprite Mesh Generator", order = 1)]
public class SpriteMeshGenerator : ScriptableObject
{
public Sprite[] sprites;
[SerializeField] private string hash;
private void OnValidate()
{
if (sprites != null && sprites.Length > 0)
{
Debug.Log("doing things");
var curHash = "";
foreach (var sprite in sprites)
{
if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(sprite, out var guid, out long _))
{
curHash += guid;
}
}
if (hash == curHash) return;
GenerateAndSaveMesh();
hash = curHash;
}
}
void GenerateAndSaveMesh()
{
try
{
AssetDatabase.StartAssetEditing();
CleanSubassets();
foreach (var sprite in sprites)
{
if(sprite == null) continue;
var mesh = GenerateMeshFromSprite(sprite);
AssetDatabase.AddObjectToAsset(mesh, this);
}
}
finally
{
AssetDatabase.StopAssetEditing();
}
}
public static Mesh GenerateMeshFromSprite(Sprite sprite)
{
// verts
var verts = new List<Vector3>();
sprite.vertices.ToList().ForEach(x => verts.Add(new Vector3(x.x, x.y, 0.0f)));
// triangles
var tris = new List<int>();
sprite.triangles.ToList().ForEach(x => tris.Add(x));
// normals
var normals = new Vector3[verts.Count];
for (var index = 0; index < normals.Length; index++)
{
normals[index] = Vector3.forward;
}
var mesh = new Mesh
{
name = sprite.name.Replace('.', '_'),
vertices = verts.ToArray(),
triangles = tris.ToArray(),
normals = normals.ToArray(),
colors32 = new Color32[verts.Count],
uv = sprite.uv
};
return mesh;
}
void CleanSubassets()
{
var subassets = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(this));
foreach (var t in subassets)
{
if(t == this) continue;
Debug.Log(t);
DestroyImmediate(t, true);
}
}
}