Napisano 4 Lipiec 20177 l Pytanie do ludzi którzy dłubią w Unity. W jednej scenie mam 4 meshe postaci i do nich prawie takie same szkielety (minimalne przesunięcie paru kostek). Animki takie same dla wszystkich postaci, mam je w akcjach. Eksportuje wybrany szkielet z meshem jako FBX z zaznaczonym "All Actions", Unity widzi to jako osobne klipy, good. Teraz pytanie. Będę robił dla tych meshy animacje Blendshapeów zsynchronizowaną z animacją szkieletową i chciałbym to przenieść do Unity. Macie pomysł jak to zrobić? Jest na to jakiś sposób eksportu z blendka czy trzeba to będzie składać w unity, jeśli tak to gdzie?
Napisano 5 Lipiec 20177 l Wydaje mi się, że animacje blendshape'ów trzeba oskryptować, bo działają niezależnie od akcji szkieletu (chociaż chciałbym się mylić). Możesz pobierać informację, która akcja jest akurat odgrywana i ustawiać wartości blendshapów w zależności od np. AnimationState.normalizedTime. Poniżej napisałem prosty przykład. Dla akcji o nazwie "Armature|ArmatureAction" pierwszy blendShape będzie wzrastał wprost proporcjonalnie do postępu animacji tej akcji (to można łatwo rozwinąć). Każda akcja powinna mieć osobnego case'a. W przypadku odgrywania kilku akcji na raz, trzeba będzie interpolować wartości dla blendshape'ów (to jest wersja uproszczona). using System.Collections; using System.Collections.Generic; using UnityEngine; public class testMonioBlend : MonoBehaviour { // skrypt przypisany do nadrzędnego obiektu, który ma komponent "Animation" private Animation anim; private GameObject mesh; private SkinnedMeshRenderer meshRenderer; private Mesh skinnedMesh; float[] blendShapeValues; int blendShapeCount; void Start () { anim = gameObject.GetComponent(); // przypisanie mesza, który ma blendshape'y (można to zrobić ładniej) mesh = GameObject.Find ("Cube"); meshRenderer = mesh.GetComponent (); skinnedMesh = mesh.GetComponent ().sharedMesh; blendShapeCount = skinnedMesh.blendShapeCount; blendShapeValues = new float[blendShapeCount]; meshRenderer.SetBlendShapeWeight (0, 50); } void LateUpdate () { foreach (AnimationState state in anim) { switch (state.name){ case "Armature|ArmatureAction": blendShapeValues[0] = state.normalizedTime*100; //bo blenshape'y przybierają 0-100 break; } } for (int i = 0; i meshRenderer.SetBlendShapeWeight (i, blendShapeValues[i]); } } }
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto