Trilib2에서 게임을 실행할 때 Fbx 애니메이션 불러오기
Trilib2 정보
Unity는 Editor에서 Fbx를 쉽게 로드할 수 있지만 게임 실행 중 Fbx를 로드하는 방법은 제공되지 않습니다.
게임 실행 과정에서 Fbx를 탑재할 때 유료 자산
Trilib2
을 사용하면 간단하게 실현할 수 있다.공식 사이트
자산 상점
Trilib2의 사용법에 대해 다음과 같은 Qita의 글은 매우 참고 가치가 있다.
Fbx 파일을 읽을 파일 경로를 지정합니다.
AssetLoader.LoadModelFromFile
방법이 지정한 경로에서 모델을 로드합니다.Material에 로드가 완료되면
OnMaterialsLoad
메서드가 호출에 호출됩니다.읽어들인 모델은
AssetLoaderContext.RootGameObject
에서 참조할 수 있습니다.MyFbxLoader.cs
using TriLibCore;
public class MyFbxLoader : MonoBehaviour
{
public void Load(string loadPath)
{
var asetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();
AssetLoader.LoadModelFromFile(loadPath, null, OnMaterialsLoad, null, null, null, assetLoaderOptions);
}
private void OnMaterialsLoad(AssetLoaderContext context)
{
var loadedGameObject = context.RootGameObject;
// goを色々処理
}
}
Humanoid 지원 모델의 Avatar 읽기
Humanoid를 지원하는 모델을 읽을 때 AssetLoader Options를 적절하게 설정하면 Avatar가 자동으로 구성됩니다.
assetLoaderOptions.AnimationType
를 AnimationType.Humanoid
assetLoaderOptions.HumanoidAvatarMapper
모델에 해당하는 HumanoidAvatarMapper
지정MixamoAndBipedByNameHumanoidAvatarMapper
이 포함되어 있습니다. 이것을 사용할 수 있습니다.MyFbxLoader.cs
using TriLibCore;
using TriLibCore.General;
using TriLibCore.Mappers;
// ~~ 中略 ~~
// MixamoAndBipedByNameHumanoidAvatarMapperを参照しておく
[SerializeField]
private HumanoidAvatarMapper avatarMapper;
private void Load(string loadPath)
{
var asetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();
// AnimationTypeをHumanoidに設定
assetLoaderOptions.AnimationType = AnimationType.Humanoid;
// HumanoidAvatarMapperを設定
assetLoaderOptions.HumanoidAvatarMapper = avatarMapper;
AssetLoader.LoadModelFromFile(loadPath, null, OnMaterialsLoad, null, null, null, assetLoaderOptions);
}
private void OnMaterialsLoad(AssetLoaderContext context)
{
var loadedGameObject = context.RootGameObject;
// Animator経由でAvatarを取得
var animator = loadedGameObject.GetComponent<Animator>();
var avatar = animator.avatar;
}
Fbx에서 애니메이션 불러오기
죄송합니다. Trilib2는 Mecanim 애니메이션을 동적으로 가져올 수 없습니다.
공식
Known Issues/Limitations
페이지에TriLib can't import Mecanim Animation Clips due to a Unity limitation.
에 기재되어 있으며, Unity의 제한으로 메카임 애니메이션을 가져올 수 없습니다.따라서 애니메이션을 재생하려면 다음 설정을 사용하여 기본 애니메이션으로 로드해야 합니다.
assetLoaderOptions.AnimationType
에서 지정AniamtionType.Legacy
using TriLibCore;
using TriLibCore.General;
using TriLibCore.Extensions;
// ~~ 中略 ~~
private void Load(string loadPath)
{
var asetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();
// AnimationTypeにLegacyを設定
assetLoaderOptions.AnimationType = AnimationType.Legacy;
AssetLoader.LoadModelFromFile(loadPath, null, OnMaterialsLoad, null, null, null, assetLoaderOptions);
}
private void OnMaterialsLoad(AssetLoaderContext context)
{
var loadedGameObject = context.RootGameObject;
// Animation経由でレガシーアニメーションのクリップを取得
var animation = loadedGameObject.GetComponent<Animation>();
// GetAllAnimationClipsはTriLibCore.Extensionsに定義されている
// 全てのアニメーションクリップを取得する
var clips = animation.GetAllAnimationClips();
}
다른 Humanoid 모델에 불러온 애니메이션(강제)을 적용합니다.
Trilib2가 읽는 애니메이션은 전통적이기 때문에 다른 Humanoid 모델에는 기본적으로 적용되지 않는다.
다만, 이동만 한다면 아래의 방법으로 강제로 이동할 수 있다.
HumanPose 복사 작업을 사용하면 개별 Humanoid 모델에 맞는 상태에서 모델을 이동할 수 있습니다.
원래 모형을 이동해야 하기 때문에 쓸 수 있는 상자는 한계가 있지만, 무엇이든 움직일 수 있는 상황이라면 그래도 쓸 수 있을 것 같다.
Avatar이 있는 모델에서 Animation 재생
AvatarGameObject와 AnimationGameObject에서 각각 Avatar와 Animation을 읽은 상태에서 AvatarGameObject에서 Animation을 복사합니다.
MyFbxLoader.cs
var animator = AvatarGameObject.GetComponent<Animator>();
// AnimatorはOFFにしておく
animator.enabled = false;
// Avatar側にAnimationを追加
var animation = AvatarGameObject.AddComponent<Animation>();
// 作成したAnimationにクリップを追加
foreach (var clip in clips)
{
// ループする場合
clip.wrapMode = WrapMode.Loop;
animation.AddClip(clip, clip.name);
}
// クリップを指定してアニメーションを再生
animation.clip = clips[0];
animation.Play();
Update에서 HumanPose 복사
애니메이션을 적용하려는 모델에 다음 스크립트를 적용하고
srcAnimator
에 가상 이미지를 탑재한 모델을 저장합니다.가상 이미지를 탑재한 모델로 애니메이션을 재생하면 이 모델에도 애니메이션이 함께 나온다.
public class HumanPoseCopier : MonoBehaviour
{
//
[SerializeField]
private Animator srcAnimator;
private Animator animator;
private HumanPoseHandler handler;
private HumanPoseHandler srcHandler;
private HumanPose humanPose;
private void Start()
{
animator = GetComponent<Animator>();
handler = new HumanPoseHandler(animator.avatar, transform);
srcHandler = new HumanPoseHandler(srcAnimator.avatar, srcAnimator.transform);
}
private void Update()
{
if (srcAnimator == null) return;
srcHandler.GetHumanPose(ref humanPose);
handler.SetHumanPose(ref humanPose);
}
}
후기
애니메이션은 다른 모델에 적용되고 어쨌든 움직여야 할 정도이기 때문에 더 좋은 방법을 모색하고 싶습니다.
Reference
이 문제에 관하여(Trilib2에서 게임을 실행할 때 Fbx 애니메이션 불러오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kurosan/articles/4a9c0238ab837e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)