Статьи:Импорт моделей с анимацией

Материал из Blitz3D to Unity3D Wiki Project
Перейти к: навигация, поиск

Данная статья устарела, все что касается анимации в последних версиях Unity ищите здесь

Основная задача импорта анимации в проект - получение анимационных клипов, необходимых для различных задач (idle/walk/run и т.д.). В этой статье я бы хотел рассказать о нескольких способах сделать это.


Разбиение анимаций вручную

Первый способ довольно прост, но накладывает некоторые ограничения. Он заключается в ручном редактировании промежутков анимации в специальной табличке импортера модели в разделе Animations.


Animations-0.jpg

Табличка становится активной, если отметить флажок Split Animations

Данная табличка имеет следующие поля:

  • name Определяет имя импортируемого клипа для указанного отрезка.
  • start frame Первый кадр анимации. Номер соответствует номеру кадра анимации в 3D пакете.
  • stop frame Последний кадр анимации.
  • WrapMode Определяет, как должно время за диапазоном воспроизведения клипа обрабатываться (Once, Loop, PingPong, ClampForever - соответственно: проиграть один раз, зациклить, зациклить методом пинг-понг, бесконечно повторять последний кадр).
  • loop frame Если включено, будет добавлен дополнительный зацикливающий кадр в конец анимации. Этот кадр будет соответствовать первому кадру клипа. Используйте это для создания циклических анимаций при условии что в вашей анимации первый и последний кадр не совпадают.

Разбиение анимации скриптом и файлом описания

Есть способ - разделять анимации с помощью txt файлика, в котором находится описание отрезков анимации и специального скрипта FbxAnimListPostprocessor.

Такой способ может помочь, если вам присылают файлы с анимацией, и вы можете попросить присылать дополнительно такой файлик с описанием.


Импорт клипов из отдельных файлов моделей

Существует способ более гибкого импорта анимаций, который не заставит вас высчитывать кадры всякий раз, когда вы меняете длину какой-либо анимации.

Этот способ основан на импорте анимаций из отдельных файлов моделей, именованных особым образом:

  • основная модель должна иметь обычное имя
  • файлы анимаций должны иметь тоже имя, но иметь суффикс, добавленный с помощью знака собаки - @
  • суффикс является названием анимации
  • все файлы должны лежать в одной папке

Animations-1.jpg

таким образом Unity3D автоматически импортирует в основную модель анимации из дополнительных файлов.


Дополнительные заметки

Если Вы хотите использовать одинаковую анимацию в разных моделях - можно использовать те же самые клипы анимации, если модели имеют одинаковый скелет. Для такого варианта достаточно создать префаб модели, для которой надо добавить импортированные анимации другой модели и в компоненте Animation заполнить массив клипов анимаций.


Если есть необходимость сохранить импортированный клип анимации отдельно от модели, то можно воспользоваться вот таким Editor скриптом:

using UnityEditor;
using UnityEngine;
using System.Collections;

public class CurvesTransferer
{
    const string duplicatePostfix = "_copy";

    static void CopyClip(string importedPath, string copyPath)
    {
        AnimationClip src = AssetDatabase.LoadAssetAtPath(importedPath, typeof(AnimationClip)) as AnimationClip;
        AnimationClip newClip = new AnimationClip();
        newClip.name = src.name + duplicatePostfix;
        AssetDatabase.CreateAsset(newClip, copyPath);
        AssetDatabase.Refresh();
    }

    [MenuItem("Assets/Transfer Clip Curves to Copy")]
    static void CopyCurvesToDuplicate()
    {
        // Get selected AnimationClip
        AnimationClip imported = Selection.activeObject as AnimationClip;
        if (imported == null)
        {
            Debug.Log("Selected object is not an AnimationClip");
            return;
        }

        // Find path of copy
        string importedPath = AssetDatabase.GetAssetPath(imported);
        string copyPath = importedPath.Substring(0, importedPath.LastIndexOf("/"));
        copyPath += "/" + imported.name + duplicatePostfix + ".anim";

        CopyClip(importedPath, copyPath);

        AnimationClip copy = AssetDatabase.LoadAssetAtPath(copyPath, typeof(AnimationClip)) as AnimationClip;
        if (copy == null)
        {
            Debug.Log("No copy found at " + copyPath);
            return;
        }
        // Copy curves from imported to copy
        AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(imported, true);
        for (int i = 0; i < curveDatas.Length; i++)
        {
            AnimationUtility.SetEditorCurve(
                copy,
                curveDatas[i].path,
                curveDatas[i].type,
                curveDatas[i].propertyName,
                curveDatas[i].curve
            );
        }

        Debug.Log("Copying curves into " + copy.name + " is done");
    }
}

Скрипт взят отсюда.