feat: remove override target from ShapeChanger and MaterialSetter

This commit is contained in:
nekobako 2024-08-19 19:43:10 +09:00
parent e5279dda88
commit 792b34da5f
25 changed files with 41 additions and 964 deletions

View File

@ -3,7 +3,6 @@
<ui:VisualElement name="root-box">
<ui:VisualElement name="group-box">
<ed:PropertyField binding-path="m_inverted" label="reactive_object.inverse" class="ndmf-tr"/>
<ed:PropertyField binding-path="m_targetRenderer" label="reactive_object.shape-changer.target-renderer" name="TargetRenderer" class="ndmf-tr"/>
<ui:VisualElement name="ListViewContainer">
<ui:ListView virtualization-method="DynamicHeight"

View File

@ -31,7 +31,6 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
root.Bind(serializedObject);
var listView = root.Q<ListView>("Shapes");
root.Q<PropertyField>("TargetRenderer").RegisterValueChangeCallback(_ => listView.RefreshItems());
listView.showBoundCollectionSize = false;
listView.virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight;

View File

@ -28,44 +28,14 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
var f_material_index = uxml.Q<DropdownField>("f-material-index");
var f_object = uxml.Q<ObjectField>("f-object");
f_object.objectType = typeof(Renderer);
f_object.allowSceneObjects = true;
var f_object = uxml.Q<PropertyField>("f-object");
var f_target_object = uxml.Q<ObjectField>("f-obj-target-object");
var f_reference_path = uxml.Q<TextField>("f-obj-ref-path");
f_object.RegisterValueChangedCallback(evt =>
f_object.RegisterValueChangeCallback(evt =>
{
var gameObj = (evt.newValue as Renderer)?.gameObject;
if (gameObj == null)
{
f_target_object.value = null;
f_reference_path.value = "";
}
else
{
var path = RuntimeUtil.AvatarRootPath(gameObj);
f_reference_path.value = path;
if (path == "")
{
f_target_object.value = null;
}
else
{
f_target_object.value = gameObj;
}
}
EditorApplication.delayCall += UpdateMaterialDropdown;
});
UpdateMaterialDropdown();
f_target_object.RegisterValueChangedCallback(_ => UpdateVisualTarget());
f_reference_path.RegisterValueChangedCallback(_ => UpdateVisualTarget());
// Link dropdown to material index field
var f_material_index_int = uxml.Q<IntegerField>("f-material-index-int");
f_material_index_int.RegisterValueChangedCallback(evt =>
@ -83,35 +53,19 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
return uxml;
void UpdateVisualTarget()
{
var setter = property.serializedObject.targetObject as ModularAvatarMaterialSetter;
var renderer = GetTargetRenderer(AvatarObjectReference.Get(property.FindPropertyRelative("Object")));
var overrideRenderer = GetTargetRenderer(setter?.targetRenderer.Get(setter));
f_object.SetEnabled(overrideRenderer == null);
f_object.SetValueWithoutNotify(overrideRenderer ?? renderer);
Renderer GetTargetRenderer(GameObject obj)
{
try
{
return obj?.GetComponent<Renderer>();
}
catch (MissingComponentException e)
{
return null;
}
}
}
void UpdateMaterialDropdown()
{
var setter = property.serializedObject.targetObject as ModularAvatarMaterialSetter;
var sharedMaterials = GetSharedMaterials(AvatarObjectReference.Get(property.FindPropertyRelative("Object")));
var overrideSharedMaterials = GetSharedMaterials(setter?.targetRenderer.Get(setter));
var toggledObject = AvatarObjectReference.Get(property.FindPropertyRelative("Object"));
Material[] sharedMaterials;
try
{
sharedMaterials = toggledObject?.GetComponent<Renderer>()?.sharedMaterials;
}
catch (MissingComponentException e)
{
sharedMaterials = null;
}
sharedMaterials = overrideSharedMaterials ?? sharedMaterials;
if (sharedMaterials != null)
{
var matCount = sharedMaterials.Length;
@ -155,18 +109,6 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
f_material_index.formatListItemCallback = _ => "<Missing Renderer>";
f_material_index.formatSelectedValueCallback = f_material_index.formatListItemCallback;
}
Material[] GetSharedMaterials(GameObject obj)
{
try
{
return obj?.GetComponent<Renderer>()?.sharedMaterials;
}
catch (MissingComponentException e)
{
return null;
}
}
}
}
}

View File

@ -1,13 +1,9 @@
<UXML xmlns:ui="UnityEngine.UIElements" xmlns:ed="UnityEditor.UIElements">
<ui:VisualElement class="toggled-object-editor">
<ui:VisualElement class="horizontal">
<!--<ed:PropertyField binding-path="Object" label="" name="f-object" class="f-object"/>-->
<ed:ObjectField label="" name="f-object" class="f-object"/>
<ed:PropertyField binding-path="Object" label="" name="f-object" class="f-object"/>
<ui:DropdownField name="f-material-index" binding-path="MaterialIndex"/>
<ui:VisualElement style="display:none">
<ui:TextField binding-path="Object.referencePath" label="" name="f-obj-ref-path"/>
<ed:ObjectField name="f-obj-target-object" binding-path="Object.targetObject"/>
<ed:IntegerField binding-path="MaterialIndex" name="f-material-index-int"/>
</ui:VisualElement>
</ui:VisualElement>

View File

@ -1,102 +0,0 @@
#region
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
#endregion
namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
{
public class AddShapePopup : PopupWindowContent
{
private const string Root = "Packages/nadena.dev.modular-avatar/Editor/Inspector/ShapeChanger/";
const string UxmlPath = Root + "AddShapePopup.uxml";
const string UssPath = Root + "ShapeChangerStyles.uss";
private VisualElement _elem;
private ScrollView _scrollView;
public AddShapePopup(ModularAvatarShapeChanger changer)
{
if (changer == null) return;
var target = changer.targetRenderer.Get(changer)?.GetComponent<SkinnedMeshRenderer>();
if (target == null || target.sharedMesh == null) return;
var alreadyRegistered = changer.Shapes.Select(c => c.ShapeName).ToHashSet();
var keys = new List<string>();
for (int i = 0; i < target.sharedMesh.blendShapeCount; i++)
{
var name = target.sharedMesh.GetBlendShapeName(i);
if (alreadyRegistered.Contains(name)) continue;
keys.Add(name);
}
var uss = AssetDatabase.LoadAssetAtPath<StyleSheet>(UssPath);
var uxml = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(UxmlPath);
_elem = uxml.CloneTree();
_elem.styleSheets.Add(uss);
Localization.UI.Localize(_elem);
_scrollView = _elem.Q<ScrollView>("scroll-view");
if (keys.Count > 0)
{
_scrollView.contentContainer.Clear();
foreach (var key in keys)
{
var container = new VisualElement();
container.AddToClassList("add-shape-row");
Button btn = default;
btn = new Button(() =>
{
AddShape(changer, key);
container.RemoveFromHierarchy();
});
btn.text = "+";
container.Add(btn);
var label = new Label(key);
container.Add(label);
_scrollView.contentContainer.Add(container);
}
}
}
private void AddShape(ModularAvatarShapeChanger changer, string key)
{
Undo.RecordObject(changer, "Add Shape");
changer.Shapes.Add(new ChangedShape()
{
Object = new(),
ShapeName = key,
ChangeType = ShapeChangeType.Delete,
Value = 100
});
PrefabUtility.RecordPrefabInstancePropertyModifications(changer);
}
public override void OnGUI(Rect rect)
{
}
public override void OnOpen()
{
editorWindow.rootVisualElement.Clear();
editorWindow.rootVisualElement.Add(_elem);
//editorWindow.rootVisualElement.Clear();
//editorWindow.rootVisualElement.Add(new Label("Hello, World!"));
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 1a8351fafb3740918363f60365adfeda
timeCreated: 1717205112

View File

@ -1,11 +0,0 @@
<UXML xmlns:ui="UnityEngine.UIElements">
<ui:VisualElement class="add-shape-popup">
<ui:VisualElement class="add-shape-popup">
<ui:Label text="Select Blendshape"/>
<ui:VisualElement class="vline"/>
<ui:ScrollView show-horizontal-scroller="false" name="scroll-view">
<ui:Label text="&lt;none remaining>" class="placeholder"/>
</ui:ScrollView>
</ui:VisualElement>
</ui:VisualElement>
</UXML>

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 6753a7b3eae1416cb04786cf53778c33
timeCreated: 1717205258

View File

@ -29,44 +29,14 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
var f_shape_name = uxml.Q<DropdownField>("f-shape-name");
var f_object = uxml.Q<ObjectField>("f-object");
f_object.objectType = typeof(SkinnedMeshRenderer);
f_object.allowSceneObjects = true;
var f_object = uxml.Q<PropertyField>("f-object");
var f_target_object = uxml.Q<ObjectField>("f-obj-target-object");
var f_reference_path = uxml.Q<TextField>("f-obj-ref-path");
f_object.RegisterValueChangedCallback(evt =>
f_object.RegisterValueChangeCallback(evt =>
{
var gameObj = (evt.newValue as SkinnedMeshRenderer)?.gameObject;
if (gameObj == null)
{
f_target_object.value = null;
f_reference_path.value = "";
}
else
{
var path = RuntimeUtil.AvatarRootPath(gameObj);
f_reference_path.value = path;
if (path == "")
{
f_target_object.value = null;
}
else
{
f_target_object.value = gameObj;
}
}
EditorApplication.delayCall += UpdateShapeDropdown;
});
UpdateShapeDropdown();
f_target_object.RegisterValueChangedCallback(_ => UpdateVisualTarget());
f_reference_path.RegisterValueChangedCallback(_ => UpdateVisualTarget());
uxml.Q<PropertyField>("f-change-type").RegisterCallback<ChangeEvent<string>>(
e =>
{
@ -83,56 +53,27 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
return uxml;
void UpdateVisualTarget()
{
var changer = property.serializedObject.targetObject as ModularAvatarShapeChanger;
var renderer = GetTargetRenderer(AvatarObjectReference.Get(property.FindPropertyRelative("Object")));
var overrideRenderer = GetTargetRenderer(changer?.targetRenderer.Get(changer));
f_object.SetEnabled(overrideRenderer == null);
f_object.SetValueWithoutNotify(overrideRenderer ?? renderer);
SkinnedMeshRenderer GetTargetRenderer(GameObject obj)
{
try
{
return obj?.GetComponent<SkinnedMeshRenderer>();
}
catch (MissingComponentException e)
{
return null;
}
}
}
void UpdateShapeDropdown()
{
var changer = property.serializedObject.targetObject as ModularAvatarShapeChanger;
var shapeNames = GetShapeNames(AvatarObjectReference.Get(property.FindPropertyRelative("Object")));
var overrideShapeNames = GetShapeNames(changer?.targetRenderer.Get(changer));
f_shape_name.SetEnabled(overrideShapeNames != null || shapeNames != null);
f_shape_name.choices = overrideShapeNames ?? shapeNames ?? new();
f_shape_name.formatListItemCallback = name => f_shape_name.enabledSelf ? name : "<Missing SkinnedMeshRenderer>";
f_shape_name.formatSelectedValueCallback = f_shape_name.formatListItemCallback;
List<string> GetShapeNames(GameObject obj)
var targetObject = AvatarObjectReference.Get(property.FindPropertyRelative("Object"));
List<string> shapeNames;
try
{
try
{
var mesh = obj?.GetComponent<SkinnedMeshRenderer>()?.sharedMesh;
if (mesh == null) return null;
return Enumerable.Range(0, mesh.blendShapeCount)
.Select(x => mesh.GetBlendShapeName(x))
.ToList();
}
catch (MissingComponentException e)
{
return null;
}
var mesh = targetObject?.GetComponent<SkinnedMeshRenderer>()?.sharedMesh;
shapeNames = mesh == null ? null : Enumerable.Range(0, mesh.blendShapeCount)
.Select(x => mesh.GetBlendShapeName(x))
.ToList();
}
catch (MissingComponentException e)
{
shapeNames = null;
}
f_shape_name.SetEnabled(shapeNames != null);
f_shape_name.choices = shapeNames ?? new();
f_shape_name.formatListItemCallback = name => shapeNames != null ? name : "<Missing SkinnedMeshRenderer>";
f_shape_name.formatSelectedValueCallback = f_shape_name.formatListItemCallback;
}
}
}

View File

@ -1,14 +1,8 @@
<UXML xmlns:ui="UnityEngine.UIElements" xmlns:ed="UnityEditor.UIElements">
<ui:VisualElement class="changed-shape-editor">
<ui:VisualElement class="horizontal">
<!--<ed:PropertyField binding-path="Object" label="" name="f-object" class="f-object"/>-->
<ed:ObjectField label="" name="f-object" class="f-object"/>
<ed:PropertyField binding-path="Object" label="" name="f-object" class="f-object"/>
<ed:PropertyField binding-path="ChangeType" label="" name="f-change-type"/>
<ui:VisualElement style="display:none">
<ui:TextField binding-path="Object.referencePath" label="" name="f-obj-ref-path"/>
<ed:ObjectField name="f-obj-target-object" binding-path="Object.targetObject"/>
</ui:VisualElement>
</ui:VisualElement>
<ui:VisualElement class="horizontal">
<ui:DropdownField name="f-shape-name" binding-path="ShapeName"/>

View File

@ -3,7 +3,6 @@
<ui:VisualElement name="root-box">
<ui:VisualElement name="group-box">
<ed:PropertyField binding-path="m_inverted" label="reactive_object.inverse" class="ndmf-tr"/>
<ed:PropertyField binding-path="m_targetRenderer" label="reactive_object.shape-changer.target-renderer" name="TargetRenderer" class="ndmf-tr"/>
<ui:VisualElement name="ListViewContainer">
<ui:ListView virtualization-method="DynamicHeight"

View File

@ -35,7 +35,6 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
root.Bind(serializedObject);
var listView = root.Q<ListView>("Shapes");
root.Q<PropertyField>("TargetRenderer").RegisterValueChangeCallback(_ => listView.RefreshItems());
listView.showBoundCollectionSize = false;
listView.virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight;
@ -44,18 +43,7 @@ namespace nadena.dev.modular_avatar.core.editor.ShapeChanger
var field_addButton = typeof(BaseListView).GetField("m_AddButton", NonPublic | Instance);
var addButton = (Button)field_addButton.GetValue(listView);
addButton.clickable = new Clickable(() =>
{
var changer = target as ModularAvatarShapeChanger;
if (changer.targetRenderer.Get(changer) != null)
{
PopupWindow.Show(addButton.worldBound, new AddShapePopup(changer));
}
else
{
OpenAddWindow();
}
});
addButton.clickable = new Clickable(OpenAddWindow);
return root;
}

View File

@ -251,6 +251,5 @@
"ma_info.param_usage_ui.no_data": "[ NO DATA ]",
"reactive_object.inverse": "Inverse Condition",
"reactive_object.material-setter.set-to": "Set material to: ",
"reactive_object.shape-changer.target-renderer": "Target Renderer for all",
"menuitem.misc.add_toggle": "Add toggle"
}

View File

@ -247,6 +247,5 @@
"ma_info.param_usage_ui.no_data": "[ NO DATA ]",
"reactive_object.inverse": "条件を反転",
"reactive_object.material-setter.set-to": "変更先のマテリアル ",
"reactive_object.shape-changer.target-renderer": "操作するレンダラーの一括指定",
"menuitem.misc.add_toggle": "トグルを追加"
}

View File

@ -250,6 +250,5 @@
"ma_info.param_usage_ui.no_data": "【無資訊】",
"reactive_object.inverse": "反轉條件",
"reactive_object.material-setter.set-to": "將材質設定為:",
"reactive_object.shape-changer.target-renderer": "所有目標 Renderer",
"menuitem.misc.add_toggle": "新增開關"
}

View File

@ -15,11 +15,9 @@ namespace nadena.dev.modular_avatar.core.editor
foreach (var changer in changers)
{
var overrideRenderer = changer.targetRenderer.Get(changer)?.GetComponent<SkinnedMeshRenderer>();
foreach (var shape in changer.Shapes)
{
var renderer = overrideRenderer ?? shape.Object.Get(changer)?.GetComponent<SkinnedMeshRenderer>();
var renderer = shape.Object.Get(changer)?.GetComponent<SkinnedMeshRenderer>();
if (renderer == null) continue;
var mesh = renderer.sharedMesh;
@ -91,11 +89,9 @@ namespace nadena.dev.modular_avatar.core.editor
{
if (setter.Objects == null) continue;
var overrideRenderer = setter.targetRenderer.Get(setter)?.GetComponent<Renderer>();
foreach (var obj in setter.Objects)
{
var renderer = overrideRenderer ?? obj.Object.Get(setter)?.GetComponent<Renderer>();
var renderer = obj.Object.Get(setter)?.GetComponent<Renderer>();
if (renderer == null || renderer.sharedMaterials.Length < obj.MaterialIndex) continue;
var key = new TargetProp

View File

@ -39,14 +39,11 @@ namespace nadena.dev.modular_avatar.core.editor
bool active = context.ActiveAndEnabled(setter) && (mami == null || menuItemPreview.IsEnabledForPreview(mami));
if (active == context.Observe(setter, t => t.Inverted)) continue;
var overrideTarget = context.Observe(setter, c => c.targetRenderer.Get(setter));
var overrideRenderer = context.GetComponent<Renderer>(overrideTarget);
var objs = context.Observe(setter, s => s.Objects.Select(o => (o.Object.Get(s), o.Material, o.MaterialIndex)).ToList(), (x, y) => x.SequenceEqual(y));
foreach (var (obj, mat, index) in objs)
{
var renderer = overrideRenderer ?? context.GetComponent<Renderer>(obj);
var renderer = context.GetComponent<Renderer>(obj);
if (renderer == null) continue;
var matCount = context.Observe(renderer, r => r.sharedMaterials.Length);
@ -114,14 +111,11 @@ namespace nadena.dev.modular_avatar.core.editor
foreach (var setter in _setters)
{
var overrideTarget = context.Observe(setter, c => c.targetRenderer.Get(setter));
var overrideRenderer = context.GetComponent<Renderer>(overrideTarget);
var objs = context.Observe(setter, s => s.Objects.Select(o => (o.Object.Get(s), o.Material, o.MaterialIndex)).ToList(), (x, y) => x.SequenceEqual(y));
foreach (var (obj, mat, index) in objs)
{
var renderer = overrideRenderer ?? context.GetComponent<Renderer>(obj);
var renderer = context.GetComponent<Renderer>(obj);
if (renderer != original) continue;
if (index <= mats.Length)

View File

@ -49,14 +49,11 @@ namespace nadena.dev.modular_avatar.core.editor
bool active = ctx.ActiveAndEnabled(changer) && (mami == null || menuItemPreview.IsEnabledForPreview(mami));
if (active == ctx.Observe(changer, t => t.Inverted)) continue;
var overrideTarget = ctx.Observe(changer, c => c.targetRenderer.Get(changer));
var overrideRenderer = ctx.GetComponent<SkinnedMeshRenderer>(overrideTarget);
var shapes = ctx.Observe(changer, c => c.Shapes.Select(s => (s.Object.Get(c), s.ShapeName, s.ChangeType, s.Value)).ToList(), Enumerable.SequenceEqual);
foreach (var (target, name, type, value) in shapes)
{
var renderer = overrideRenderer ?? ctx.GetComponent<SkinnedMeshRenderer>(target);
var renderer = ctx.GetComponent<SkinnedMeshRenderer>(target);
if (renderer == null) continue;
if (!groups.TryGetValue(renderer, out var group))
@ -112,14 +109,11 @@ namespace nadena.dev.modular_avatar.core.editor
foreach (var changer in _changers)
{
var overrideTarget = context.Observe(changer, c => c.targetRenderer.Get(changer));
var overrideRenderer = context.GetComponent<SkinnedMeshRenderer>(overrideTarget);
var shapes = context.Observe(changer, c => c.Shapes.Select(s => (s.Object.Get(c), s.ShapeName, s.ChangeType, s.Value)).ToList(), Enumerable.SequenceEqual);
foreach (var (target, name, type, value) in shapes)
{
var renderer = overrideRenderer ?? context.GetComponent<SkinnedMeshRenderer>(target);
var renderer = context.GetComponent<SkinnedMeshRenderer>(target);
if (renderer != original) continue;
var index = mesh.GetBlendShapeIndex(name);
@ -147,16 +141,13 @@ namespace nadena.dev.modular_avatar.core.editor
foreach (var changer in _changers)
{
var overrideTarget = context.Observe(changer, c => c.targetRenderer.Get(changer));
var overrideRenderer = context.GetComponent<SkinnedMeshRenderer>(overrideTarget);
var shapes = context.Observe(changer, c => c.Shapes.Select(s => (s.Object.Get(c), s.ShapeName, s.ChangeType, s.Value)).ToList(), Enumerable.SequenceEqual);
foreach (var (target, name, type, value) in shapes)
{
if (type != ShapeChangeType.Delete) continue;
var renderer = overrideRenderer ?? context.GetComponent<SkinnedMeshRenderer>(target);
var renderer = context.GetComponent<SkinnedMeshRenderer>(target);
if (renderer != original) continue;
var index = mesh.GetBlendShapeIndex(name);

View File

@ -32,10 +32,6 @@ namespace nadena.dev.modular_avatar.core
public class ModularAvatarMaterialSetter : ReactiveComponent
{
[SerializeField] private AvatarObjectReference m_targetRenderer = new();
public AvatarObjectReference targetRenderer => m_targetRenderer;
[SerializeField] private List<MaterialSwitchObject> m_objects = new();
public List<MaterialSwitchObject> Objects
@ -46,7 +42,6 @@ namespace nadena.dev.modular_avatar.core
public override void ResolveReferences()
{
m_targetRenderer?.Get(this);
foreach (var obj in m_objects)
{
obj.Object?.Get(this);

View File

@ -49,11 +49,6 @@ namespace nadena.dev.modular_avatar.core
[HelpURL("https://modular-avatar.nadena.dev/docs/reference/shape-changer?lang=auto")]
public class ModularAvatarShapeChanger : ReactiveComponent
{
[SerializeField] [FormerlySerializedAs("targetRenderer")]
private AvatarObjectReference m_targetRenderer = new();
public AvatarObjectReference targetRenderer => m_targetRenderer;
[SerializeField] [FormerlySerializedAs("Shapes")]
private List<ChangedShape> m_shapes = new();
@ -65,7 +60,6 @@ namespace nadena.dev.modular_avatar.core
public override void ResolveReferences()
{
m_targetRenderer?.Get(this);
foreach (var shape in m_shapes)
{
shape.Object?.Get(this);

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c5cbd8e75a444d04e924fad2229100dc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,31 +0,0 @@
using modular_avatar_tests;
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEngine;
namespace ShapeChangerTests
{
public class TargetRenderer : TestBase
{
[Test]
public void SetTargetRenderers()
{
var root = CreatePrefab("TargetRenderer.prefab");
AvatarProcessor.ProcessAvatar(root);
var smrA = root.transform.Find("Mesh_A").GetComponent<SkinnedMeshRenderer>();
var smrB = root.transform.Find("Mesh_B").GetComponent<SkinnedMeshRenderer>();
var sharedMeshA = smrA.sharedMesh;
var sharedMeshB = smrB.sharedMesh;
Assert.AreEqual(100.0f, smrA.GetBlendShapeWeight(sharedMeshA.GetBlendShapeIndex("key1")), 0.1f);
Assert.AreEqual(0.0f, smrB.GetBlendShapeWeight(sharedMeshB.GetBlendShapeIndex("key1")), 0.1f);
Assert.AreEqual(0.0f, smrA.GetBlendShapeWeight(sharedMeshA.GetBlendShapeIndex("key2")), 0.1f);
Assert.AreEqual(100.0f, smrB.GetBlendShapeWeight(sharedMeshB.GetBlendShapeIndex("key2")), 0.1f);
Assert.AreEqual(100.0f, smrA.GetBlendShapeWeight(sharedMeshA.GetBlendShapeIndex("key3")), 0.1f);
Assert.AreEqual(0.0f, smrB.GetBlendShapeWeight(sharedMeshB.GetBlendShapeIndex("key3")), 0.1f);
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 9c352bef3b7d609439ea97ec53cd4736
timeCreated: 1719194190

View File

@ -1,580 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2598725701317979415
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1861262250770563182}
- component: {fileID: 8866671501173891171}
m_Layer: 0
m_Name: ShapeChanger_TargetRenderer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1861262250770563182
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2598725701317979415}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8936933457054072598}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8866671501173891171
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2598725701317979415}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2db441f589c3407bb6fb5f02ff8ab541, type: 3}
m_Name:
m_EditorClassIdentifier:
m_inverted: 0
m_targetRenderer:
referencePath: Mesh_A
targetObject: {fileID: 1811153483672793302}
m_shapes:
- Object:
referencePath:
targetObject: {fileID: 0}
ShapeName: key1
ChangeType: 1
Value: 100
--- !u!1 &3168344021053006676
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8933180929913504256}
- component: {fileID: 2529637401272473252}
m_Layer: 0
m_Name: Both
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8933180929913504256
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3168344021053006676}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8936933457054072598}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2529637401272473252
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3168344021053006676}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2db441f589c3407bb6fb5f02ff8ab541, type: 3}
m_Name:
m_EditorClassIdentifier:
m_inverted: 0
m_targetRenderer:
referencePath: Mesh_A
targetObject: {fileID: 1811153483672793302}
m_shapes:
- Object:
referencePath: Mesh_B
targetObject: {fileID: 4473282960748435466}
ShapeName: key3
ChangeType: 1
Value: 100
--- !u!1 &4036354067233245060
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2790466593341208730}
- component: {fileID: 2142433132622532481}
m_Layer: 0
m_Name: ChangedShape_Object
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2790466593341208730
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4036354067233245060}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8936933457054072598}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2142433132622532481
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4036354067233245060}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2db441f589c3407bb6fb5f02ff8ab541, type: 3}
m_Name:
m_EditorClassIdentifier:
m_inverted: 0
m_targetRenderer:
referencePath:
targetObject: {fileID: 0}
m_shapes:
- Object:
referencePath: Mesh_B
targetObject: {fileID: 4473282960748435466}
ShapeName: key2
ChangeType: 1
Value: 100
--- !u!1 &6855505756433160176
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8936933457054072598}
- component: {fileID: 6580323041906195452}
- component: {fileID: 146169679456758165}
- component: {fileID: 5146811121193962360}
m_Layer: 0
m_Name: TargetRenderer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8936933457054072598
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6855505756433160176}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.0024816, y: 0.25853348, z: -0.63345385}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1861262250770563182}
- {fileID: 2790466593341208730}
- {fileID: 8933180929913504256}
- {fileID: 1326682634762807916}
- {fileID: 3845963625508864688}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!95 &6580323041906195452
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6855505756433160176}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &146169679456758165
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6855505756433160176}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name:
m_EditorClassIdentifier:
Name:
ViewPosition: {x: 0, y: 1.6, z: 0.2}
Animations: 0
ScaleIPD: 1
lipSync: 0
lipSyncJawBone: {fileID: 0}
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
VisemeSkinnedMesh: {fileID: 0}
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
VisemeBlendShapes: []
unityVersion:
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
networkIDs: []
customExpressions: 0
expressionsMenu: {fileID: 0}
expressionParameters: {fileID: 0}
enableEyeLook: 0
customEyeLookSettings:
eyeMovement:
confidence: 0.5
excitement: 0.5
leftEye: {fileID: 0}
rightEye: {fileID: 0}
eyesLookingStraight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingUp:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingDown:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingLeft:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingRight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidType: 0
upperLeftEyelid: {fileID: 0}
upperRightEyelid: {fileID: 0}
lowerLeftEyelid: {fileID: 0}
lowerRightEyelid: {fileID: 0}
eyelidsDefault:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsClosed:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingUp:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingDown:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsSkinnedMesh: {fileID: 0}
eyelidsBlendshapes:
customizeAnimationLayers: 0
baseAnimationLayers:
- isEnabled: 0
type: 0
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 4
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 5
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
specialAnimationLayers:
- isEnabled: 0
type: 6
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 7
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 8
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
AnimationPreset: {fileID: 0}
animationHashSet: []
autoFootsteps: 1
autoLocomotion: 1
collider_head:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_torso:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &5146811121193962360
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6855505756433160176}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
m_Name:
m_EditorClassIdentifier:
launchedFromSDKPipeline: 0
completedSDKPipeline: 0
blueprintId:
contentType: 0
assetBundleUnityVersion:
fallbackStatus: 0
--- !u!1001 &1577363430154308999
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 8936933457054072598}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -3887185075125053422, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_DirtyAABB
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_Name
value: Mesh_A
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
--- !u!4 &1326682634762807916 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
m_PrefabInstance: {fileID: 1577363430154308999}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1811153483672793302 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
m_PrefabInstance: {fileID: 1577363430154308999}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &3662872316644877659
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 8936933457054072598}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -3887185075125053422, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_DirtyAABB
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
propertyPath: m_Name
value: Mesh_B
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
--- !u!4 &3845963625508864688 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
m_PrefabInstance: {fileID: 3662872316644877659}
m_PrefabAsset: {fileID: 0}
--- !u!1 &4473282960748435466 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cd28f61dacdc2424d951194ff69ba154, type: 3}
m_PrefabInstance: {fileID: 3662872316644877659}
m_PrefabAsset: {fileID: 0}

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 58df708603764094397a824d9c030c9b
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: