// Use this for initialization void Start() { for (int i = 0; i < _skinMesh.sharedMesh.blendShapeCount; i++) { // Debug.Log (_skinMesh.sharedMesh.GetBlendShapeName(i)); GameObject _target = GameObject.Instantiate(_BtnItem, ContentOBJ); _target.name = _skinMesh.sharedMesh.GetBlendShapeName(i); BlendShapeController _blendShape = _target.GetComponent <BlendShapeController> (); _blendShape.BlendShapeName.text = _target.name.Replace(PastName, ""); _blendShape.SliderValue.value = _skinMesh.GetBlendShapeWeight(i); _blendShape.BlendShapeValue.text = _blendShape.SliderValue.value.ToString(); _blendShape.SliderValue.onValueChanged.AddListener(delegate { OnBlendShapeValueChange(_target); }); } Btn_reset.onClick.AddListener(ResetBlendShape); for (int i = 0; i < _toggleType.Length; i++) { GameObject target = _toggleType [i].gameObject; // _toggleType [i].onValueChanged.AddListener (delegate { // TypeSelect (target); // }); _toggleType [i].onValueChanged.AddListener(delegate(bool arg0) { TypeSelect(target, arg0); }); } layoutTransform.sizeDelta = new Vector2(layoutTransform.sizeDelta.x, 60.0f * ContentOBJ.childCount); }
public override void OnInspectorGUI() { base.OnInspectorGUI(); BlendShapeController blendShapeController = (BlendShapeController)target; Mesh blendMesh = blendShapeController.skinnedMeshRenderer.sharedMesh; int blendShapeCount = blendMesh.blendShapeCount; for (int i = 0; i < blendShapeCount; i++) { float currentBlendWeight = blendShapeController.skinnedMeshRenderer.GetBlendShapeWeight(i); float setBlendWeight = EditorGUILayout.Slider(blendMesh.GetBlendShapeName(i), currentBlendWeight, 0f, 100f); blendShapeController.skinnedMeshRenderer.SetBlendShapeWeight(i, setBlendWeight); } }
// NOTE: This function is called at runtime and edit time. Keep that in mind when setting the values of properties. public override void ProcessFrame(Playable playable, FrameData info, object playerData) { BlendShapeController trackBinding = playerData as BlendShapeController; if (!trackBinding) { return; } var inputCount = playable.GetInputCount(); var blendValue01 = 0f; var blendValue02 = 0f; var blendValue03 = 0f; var blendValue04 = 0f; var blendValue05 = 0f; var blendValue06 = 0f; var blendValue07 = 0f; var blendValue08 = 0f; for (int i = 0; i < inputCount; i++) { float inputWeight = playable.GetInputWeight(i); ScriptPlayable <BlendShapeControllerPlayableBehaviour> inputPlayable = (ScriptPlayable <BlendShapeControllerPlayableBehaviour>)playable.GetInput(i); BlendShapeControllerPlayableBehaviour input = inputPlayable.GetBehaviour(); // Use the above variables to process each frame of this playable. blendValue01 += inputWeight * input.bindValue01; blendValue02 += inputWeight * input.bindValue02; blendValue03 += inputWeight * input.bindValue03; blendValue04 += inputWeight * input.bindValue04; blendValue05 += inputWeight * input.bindValue05; blendValue06 += inputWeight * input.bindValue06; blendValue07 += inputWeight * input.bindValue07; blendValue08 += inputWeight * input.bindValue08; } trackBinding.Value01 = blendValue01; trackBinding.Value02 = blendValue02; trackBinding.Value03 = blendValue03; trackBinding.Value04 = blendValue04; trackBinding.Value05 = blendValue05; trackBinding.Value06 = blendValue06; trackBinding.Value07 = blendValue07; trackBinding.Value08 = blendValue08; }
public override void OnInspectorGUI() { GUILayout.BeginVertical("", EditorStyles.helpBox); GUILayout.BeginHorizontal("box"); GUILayout.Label("Blend Shapes", EditorStyles.boldLabel); SerializedObject so = base.serializedObject; BlendShapeController blendShapeControl = (BlendShapeController)target; so.UpdateIfRequiredOrScript(); var BSTArray = so.FindProperty("blendShapeTargets"); int BSTArrayLength = BSTArray.arraySize; if (GUILayout.Button("Reload BlendShape Targets", GUILayout.Width(200))) { blendShapeControl.ReloadBlendShapeTargets(); } GUILayout.EndHorizontal(); if (BSTArray != null && BSTArrayLength > 0) { for (int i = 0; i < BSTArrayLength; i++) { GUILayout.BeginVertical("Box"); var target = BSTArray.GetArrayElementAtIndex(i); SerializedObject targetprop = new SerializedObject(target.objectReferenceValue); targetprop.UpdateIfRequiredOrScript(); string blendShapeInfo = "Name: " + targetprop.FindProperty("BlendShapeName").stringValue + " Index: " + targetprop.FindProperty("BlendShapeIndex").intValue.ToString(); EditorGUILayout.LabelField(blendShapeInfo); // EditorGUILayout.LabelField("Name", targetprop.FindProperty("BlendShapeName").stringValue); // EditorGUILayout.LabelField("BlendShape Index", targetprop.FindProperty("BlendShapeIndex").intValue.ToString()); GUI.enabled = false; EditorGUILayout.PropertyField(targetprop.FindProperty("BlendShapeValue"), true); GUI.enabled = true; EditorGUILayout.PropertyField(targetprop.FindProperty("BlendShapeDefaultValue"), true); targetprop.ApplyModifiedProperties(); GUILayout.EndVertical(); } } GUILayout.EndVertical(); so.ApplyModifiedProperties(); }
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) { if (_mTrackBinding == null) { BlendShapeController trackBinding = go.GetComponent <PlayableDirector>().GetGenericBinding(this) as BlendShapeController; _mTrackBinding = trackBinding; } //iterator for all currently existing clips IEnumerable <TimelineClip> clips = GetClips(); //check if track binding has been set if (_mTrackBinding != null) { List <string> clipGuids = new List <string>(); //check each clip foreach (var item in clips) { //rename clip if not customized by user if (item.displayName == "BlendShapeControlClip") { item.displayName = _mTrackBinding.transform.root.name + " " + _mTrackBinding.name; } //get blendShapeControlClip encapulated in TimelineClip BlendShapeControlClip blendShapeControlClip = item.asset as BlendShapeControlClip; //get BlendShapeControlBehaviour encapulated in BlendShapeControlClip BlendShapeControlBehaviour blendShapeControlBehaviour = blendShapeControlClip.template; //check just in case there aren't any blendshapes on the attached controller if (_mTrackBinding.blendShapeTargets.Length > 0) { //update blendShapeTargets from _mTrackBinding to BlendShapeController clipGuids.Add(blendShapeControlBehaviour.LoadBlendShapeTargets(_mTrackBinding.blendShapeTargets, clipGuids)); } //this is just informational so the inmspector will make it clear what object is being edited blendShapeControlBehaviour.name = _mTrackBinding.transform.root.name + " " + _mTrackBinding.name; } } return(ScriptPlayable <BlendShapeControlMixerBehaviour> .Create(graph, inputCount)); }
public override void GatherProperties(PlayableDirector director, IPropertyCollector driver) { #if UNITY_EDITOR //get the track binding for this track, if any BlendShapeController trackBinding = director.GetGenericBinding(this) as BlendShapeController; _mTrackBinding = trackBinding; if (trackBinding == null) { return; } var serializedObject = new UnityEditor.SerializedObject(trackBinding); var iterator = serializedObject.GetIterator(); while (iterator.NextVisible(true)) { if (iterator.hasVisibleChildren) { continue; } driver.AddFromName <BlendShapeController>(trackBinding.gameObject, iterator.propertyPath); } #endif base.GatherProperties(director, driver); }
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { // Debug.Log(" Mixer ProcessFrame"); m_TrackBinding = playerData as BlendShapeController; if (m_TrackBinding == null) { return; } if (!m_FirstFrameHappened) { m_FirstFrameHappened = true; if (m_TrackBinding.blendShapeTargets != null && m_TrackBinding.blendShapeTargets.Length > 0) { blendShapeDefaults = new float[m_TrackBinding.blendShapeTargets.Length]; for (int i = 0; i < m_TrackBinding.blendShapeTargets.Length; i++) { blendShapeDefaults[i] = m_TrackBinding.blendShapeTargets[i].BlendShapeDefaultValue; } } } int inputCount = playable.GetInputCount(); float[] blendShapeWeights = new float[m_TrackBinding.blendShapeTargets.Length]; float totalWeight = 0f; float greatestWeight = 0f; int currentInputs = 0; for (int i = 0; i < inputCount; i++) { float inputWeight = playable.GetInputWeight(i); ScriptPlayable <BlendShapeControlBehaviour> inputPlayable = (ScriptPlayable <BlendShapeControlBehaviour>)playable.GetInput(i); BlendShapeControlBehaviour input = inputPlayable.GetBehaviour(); if (blendShapeWeights.Length > 0 && input.blendShapeKeys != null && input.blendShapeKeys.Length == blendShapeWeights.Length) { for (int j = 0; j < blendShapeWeights.Length; j++) { blendShapeWeights[j] += input.blendShapeKeys[j].BlendShapeValue * inputWeight; } } totalWeight += inputWeight; if (inputWeight > greatestWeight) { greatestWeight = inputWeight; } if (!Mathf.Approximately(inputWeight, 0f)) { currentInputs++; } } float remainingweight = 1 - totalWeight; for (int i = 0; i < blendShapeWeights.Length; i++) { blendShapeWeights[i] += blendShapeDefaults[i] * remainingweight; } m_TrackBinding.SetBlendShapeValues(blendShapeWeights); }