Trilib2에서 게임을 실행할 때 Fbx 애니메이션 불러오기

21787 단어 Unitytrilib2fbxtech
Trilib2를 사용하여 Unity에서 게임을 실행할 때 Fbx 애니메이션의 노트를 불러옵니다.
  • Unity 2020.3
  • Trilib2
  • Mixamo에서 다운로드한 Fbx 파일에서 모델 및 애니메이션 로드
  • 임의의 Humanoid 모델에 불러오는 Mixamo의 애니메이션 응용 프로그램
  • Trilib2 정보


    Unity는 Editor에서 Fbx를 쉽게 로드할 수 있지만 게임 실행 중 Fbx를 로드하는 방법은 제공되지 않습니다.
    게임 실행 과정에서 Fbx를 탑재할 때 유료 자산Trilib2을 사용하면 간단하게 실현할 수 있다.
    공식 사이트
    https://ricardoreis.net/trilib-2/
    자산 상점
    https://assetstore.unity.com/packages/tools/modeling/trilib-2-model-loading-package-157548?locale=ja-JP
    Trilib2의 사용법에 대해 다음과 같은 Qita의 글은 매우 참고 가치가 있다.
    https://qiita.com/jyouryuusui/items/46e70da01e4281864cee

    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.AnimationTypeAnimationType.Humanoid
  • 로 설정
  • assetLoaderOptions.HumanoidAvatarMapper 모델에 해당하는 HumanoidAvatarMapper 지정
  • Mixamo에서 다운로드한 모델을 불러오면 기본적으로 맵 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의 제한으로 메카임 애니메이션을 가져올 수 없습니다.
    https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations
    따라서 애니메이션을 재생하려면 다음 설정을 사용하여 기본 애니메이션으로 로드해야 합니다.
  • assetLoaderOptions.AnimationType에서 지정AniamtionType.Legacy
  • MyFbxLoader.cs
    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 모델에는 기본적으로 적용되지 않는다.
    다만, 이동만 한다면 아래의 방법으로 강제로 이동할 수 있다.
  • Humanoid를 지원하는 Avatar 읽기 모델
  • Humanoid를 지원하는 모델의 Animation
  • 읽기
  • Avatar이 있는 모델에 Animation
  • 재생
  • Avatar 모델이 있는 HumanPose를 애니메이션을 적용하려는 모델의 HumanPose
  • 로 복사
    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);
    	}
    }
    

    후기


    애니메이션은 다른 모델에 적용되고 어쨌든 움직여야 할 정도이기 때문에 더 좋은 방법을 모색하고 싶습니다.

    좋은 웹페이지 즐겨찾기