Ассет аватара описывает отображение персонажа в Animator.
Используйте Avatar ассета на персонажа с Animator чтобы управлять тем, как иерархия анимирует. Вы должны создать Avatar для использования с гуманоидной анимацией. Если нет Avatar на персонажа с общей анимацией, а Avatar internal to the Animator Вместо этого создается новый файл. Avatar создается ModelImporter, но его можно создать вручную с помощью AvatarBuilder
или через пункт меню "Создать общий аватар" в Animator контекстное меню.
Общий аватар
Для общей анимации используйте AvatarBuilder.BuildGenericAvatar чтобы указать, что является корнем анимированной иерархии (Это может быть вложено в иерархию Animator) и имя узла, который содержит анимацию движения корня.
Человеческий аватар
Для анимации гуманоидов используйте AvatarBuilder.BuildHumanAvatar чтобы указать, что является корнем анимированной иерархии (это может быть вложено в иерархию Animator) и HumanDescription который обеспечивает отображение трансформаций на человеческие кости.
Дополнительные ресурсы: Animator.avatar, AvatarBuilder, HumanDescription, ModelImporter.
using UnityEngine;
// This example automatically builds a generic avatar
// for the GameObject it is attached to and assigns it
// to the Animator.
[RequireComponent(typeof(Animator))]
public class GenericAvatarBuilderExample : MonoBehaviour
{
void Start()
{
var animator = GetComponent<Animator>();
var avatar = AvatarBuilder.BuildGenericAvatar(gameObject, "");
avatar.name = "RuntimeAvatar";
animator.avatar = avatar;
}
}
using System;
using System.Collections.Generic;
using UnityEngine;
// This example automatically builds a humanoid avatar
// for the GameObject it is attached to and assigns it
// to the Animator.
[RequireComponent(typeof(Animator))]
public class HumanAvatarBuilderExample : MonoBehaviour
{
[Serializable]
public struct BoneMapping
{
public BoneMapping(HumanBodyBones bone)
{
this.bone = bone;
transform = null;
}
public HumanBodyBones bone;
public Transform transform;
}
// Lightweight version of the mapping tool available in
// the Avatar Mapping tab.
public BoneMapping[] boneMappings =
{
new BoneMapping(HumanBodyBones.Hips),
new BoneMapping(HumanBodyBones.LeftUpperLeg),
new BoneMapping(HumanBodyBones.RightUpperLeg),
new BoneMapping(HumanBodyBones.LeftLowerLeg),
new BoneMapping(HumanBodyBones.RightLowerLeg),
new BoneMapping(HumanBodyBones.LeftFoot),
new BoneMapping(HumanBodyBones.RightFoot),
new BoneMapping(HumanBodyBones.Spine),
new BoneMapping(HumanBodyBones.Chest),
new BoneMapping(HumanBodyBones.Neck),
new BoneMapping(HumanBodyBones.Head),
new BoneMapping(HumanBodyBones.LeftShoulder),
new BoneMapping(HumanBodyBones.RightShoulder),
new BoneMapping(HumanBodyBones.LeftUpperArm),
new BoneMapping(HumanBodyBones.RightUpperArm),
new BoneMapping(HumanBodyBones.LeftLowerArm),
new BoneMapping(HumanBodyBones.RightLowerArm),
new BoneMapping(HumanBodyBones.LeftHand),
new BoneMapping(HumanBodyBones.RightHand),
new BoneMapping(HumanBodyBones.UpperChest)
};
HumanBone[] GetHumanBones()
{
var humanBones = new List<HumanBone>();
string[] boneName = HumanTrait.BoneName;
foreach (var kvp in boneMappings)
{
if (kvp.transform == null)
continue;
humanBones.Add(new HumanBone
{
humanName = boneName[(int)kvp.bone],
boneName = kvp.transform.name
});
}
return humanBones.ToArray();
}
void Start()
{
var animator = GetComponent<Animator>();
var avatar = AvatarBuilder.BuildHumanAvatar(gameObject, new HumanDescription
{
human = GetHumanBones(),
skeleton = Array.Empty<SkeletonBone>(),
});
avatar.name = "RuntimeAvatar";
animator.avatar = avatar;
}
}