Skip to content

Commit 50e6461

Browse files
committed
Add optional material presets
1 parent 60283a0 commit 50e6461

2 files changed

Lines changed: 42 additions & 7 deletions

File tree

Runtime/Scripts/MeshAnimationAsset.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@ public class MeshAnimationAsset : ScriptableObject
1717
[SerializeField]
1818
internal Shader shader = default;
1919

20+
[SerializeField]
21+
internal Material materialPreset = default;
22+
2023
[Required]
2124
[SerializeField]
2225
[ListDrawerSettings(Expanded = true, ShowPaging = false, AlwaysAddDefaultValue = true)]
2326
internal AnimationClip[] animationClips = new AnimationClip[0];
2427

2528
[Required]
2629
[SerializeField]
27-
[ListDrawerSettings(ShowPaging = false, AlwaysAddDefaultValue = true)]
28-
internal List<string> extraMaterials = new List<string>();
30+
[TableList(ShowPaging = false)]
31+
internal List<ExtraMaterial> extraMaterials = new List<ExtraMaterial>();
2932

3033
[DisableIf("@true")]
3134
[SerializeField]
@@ -45,6 +48,15 @@ public class MeshAnimationAsset : ScriptableObject
4548
[SerializeField]
4649
internal List<AnimationData> animationData = new List<AnimationData>();
4750

51+
[Serializable]
52+
internal class ExtraMaterial
53+
{
54+
[Required]
55+
public string name;
56+
57+
public Material preset;
58+
}
59+
4860
[Serializable]
4961
internal class ExtraMaterialData
5062
{

Runtime/Scripts/MeshAnimationBaker.cs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace CodeWriter.MeshAnimation
66
using System.Collections.Generic;
77
using JetBrains.Annotations;
88
using UnityEditor;
9+
using UnityEditor.Presets;
910
using UnityEngine;
1011
using Object = UnityEngine.Object;
1112

@@ -95,34 +96,56 @@ private static void CreateMaterial(MeshAnimationAsset asset)
9596
asset.bakedMaterial.shader = asset.shader;
9697
asset.bakedMaterial.name = materialAssetName;
9798
}
99+
100+
if (asset.materialPreset != null)
101+
{
102+
var preset = new Preset(asset.materialPreset);
103+
if (preset.CanBeAppliedTo(asset.bakedMaterial))
104+
{
105+
preset.ApplyTo(asset.bakedMaterial);
106+
}
107+
108+
Object.DestroyImmediate(preset);
109+
}
98110
}
99111

100112
private static void CreateExtraMaterials(MeshAnimationAsset asset)
101113
{
102-
foreach (var materialName in asset.extraMaterials)
114+
foreach (var extra in asset.extraMaterials)
103115
{
104-
var data = asset.extraMaterialData.Find(it => it.name == materialName);
116+
var data = asset.extraMaterialData.Find(it => it.name == extra.name);
105117
if (data == null)
106118
{
107119
data = new MeshAnimationAsset.ExtraMaterialData
108120
{
109-
name = materialName
121+
name = extra.name
110122
};
111123
asset.extraMaterialData.Add(data);
112124
}
113125

114126
if (data.material == null)
115127
{
116-
data.material = new Material(asset.shader) {name = $"{asset.name}_{materialName} Material"};
128+
data.material = new Material(asset.shader) {name = $"{asset.name}_{extra.name} Material"};
117129
AssetDatabase.AddObjectToAsset(data.material, asset);
118130
}
119131

120132
data.material.shader = asset.shader;
133+
134+
if (extra.preset != null)
135+
{
136+
var preset = new Preset(extra.preset);
137+
if (preset.CanBeAppliedTo(data.material))
138+
{
139+
preset.ApplyTo(data.material);
140+
}
141+
142+
Object.DestroyImmediate(preset);
143+
}
121144
}
122145

123146
foreach (var data in asset.extraMaterialData)
124147
{
125-
if (asset.extraMaterials.Contains(data.name))
148+
if (asset.extraMaterials.Any(extra => extra.name == data.name))
126149
{
127150
continue;
128151
}

0 commit comments

Comments
 (0)