Monio Napisano 4 Lipiec 2017 Napisano 4 Lipiec 2017 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?
Vaticinator Napisano 5 Lipiec 2017 Napisano 5 Lipiec 2017 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]); } } }
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się