Jump to content
  • 0
Monio

Blender / Unity. Animacja szkieletowa plus shapekeys.

Question

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?

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

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]);
       }
   }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy