Developer: Ian Kleton
Genre: Animator/Animations
Code: C# Unity



Beschrijving: Een klein project waarbij ik voor Vincent van Geel een animator heb gebouwd die gebruikt kan worden voor alle characters in de game. Er wordt gebruik gemaakt van Mixamo animations zodat alles makkelijk aan te passen is en de animator bestaat uit een base animator en vervolgens verschillende override animators per character. Op deze manier is alles erg toegankelijk voor veranderingen indien nodig. Jammer genoeg zijn de animaties zo gemaakt dat ze zonder RootMotion werken. Dit gaat eigenlijk heel erg tegen het principe van Mixamo in maar dit was noodzakelijk want dat was wat de makers van de uiteindelijke game wilde met de animaties.




Met deze override animator kon je duidelijk zien welke animatie verwacht wordt en kan je deze makkelijk vervangen per character. Wat ook handig is aan de override animator is dat je deze motions in runtime kan veranderen zonder dat je allemaal animator van tevoren hoeft te maken.

Vervolgens voor de animaties die niet goed werken of door het lichaam van een character clippen heb ik met gebruik van Unity's animation window de animation


 
De volgende stap was om de characters levend te maken. Dit heb ik gedaan door de blendshapes in de models te animeren. Ik heb elk character verschillende emoties gegeven zoals: verdrietig, blij, verrast en boos. Ook knippert elk character nu zoals een mens.



Voordat ik deze blendshapes kon animeren moest ik erbij kunnen want ze waren per model anders genoemt en de Animation window werkte ook nog tegen. 

Mijn oplossing was om voor elke waarde een variable te maken en deze te animeren in plaats van de blendshape zelf. Vervolgens update ik deze waarde op de characters over in de blendshapes variable voor het juiste resultaat. Er moesten wel veel string checks komen omdat de 3D models allemaal unieke benamingen hadden voor deze blendshapes.

Code blendshapes


using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class FaceAnimations : MonoBehaviour {

    private SkinnedMeshRenderer skinnedMeshRenderer;

    //BlendShape variables
    //These values are used in the Face_ animations to animate all the Human characters. This script is required to execute the Face_ animations.
    [HideInInspector] public float blendshapes_Angry;
    [HideInInspector] public float blendshapes_Angry_Mouth;
    [HideInInspector] public float blendshapes_Eye_R;
    [HideInInspector] public float blendshapes_Eye_L;
    [HideInInspector] public float blendshapes_Sad;
    [HideInInspector] public float blendshapes_Smile;
    [HideInInspector] public float blendshapes_Eye_Surprised;

    void Awake() {
        skinnedMeshRenderer = GetComponentInChildren<SkinnedMeshRenderer>();
    }

    void Update()
    {
        UpdateBlendShapes();
    }

    private void UpdateBlendShapes()
    {
        //Get the meshrenderer
        Mesh m = skinnedMeshRenderer.sharedMesh;
        for (int i = 0; i < m.blendShapeCount; i++)
        {
            string s = m.GetBlendShapeName(i);
            //search for each blendshape variable (Had to be hardcoded since I do not have acces to the 3D files to change them and they all differ in name)
            string[] name = s.Split("_"[0]);
            if (name[1] == "Angry" || name[1] == "angry")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Angry);
            else if (name[1] == "AngryMouth" || name[1] == "U")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Angry_Mouth);
            else if (name[1] == "Sad" || name[1] == "sad")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Sad);
            else if (name[1] == "Smile" || name[1] == "happy")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Smile);
            else if (name[1] == "ReyeBlink" || name[1] == "Reye")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Eye_R);
            else if (name[1] == "LeyeBlink" || name[1] == "Leye")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Eye_L);
            else if (name[1] == "Surprised" || name[1] == "surprised" || name[1] == "SurprisedEye")
                skinnedMeshRenderer.SetBlendShapeWeight(i, blendshapes_Eye_Surprised);
        }
    }
}

Categories

Powered by Blogger.

Languages & Programs

Expert
Unity
Visual Studio
C#

Advanced
Unity Editor Tools
Javascript
Xamarin

Intermediate
CG
ASP.NET
HTML
PHP
PHP (Laravel)
Node.JS

Beginner
C++
Unreal Engine
CSS

- Copyright © Ian Kleton