Animation Preview Auto Play

2023. 9. 11. 13:31·Unity/Tip
반응형
더보기

필자는 Unity로 게임을 개발하고 있다. 현재 개발에 사용중인 오브젝트의 Animation은 300개가 넘어간다.

이전에는 PreView의 Play 버튼을 눌러 일일이 하나씩 재생시켜 확인을 하였는데 이제는 이또한 귀찮아졌다...

 

GPT 4 사용

우리의 멍청한 친구 GPT에게 "I want the preview to play automatically when an animation file is selected." 라고 질문을 했다.

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;

[InitializeOnLoad]
public class AutoPlayAnimationPreview
{
    static AutoPlayAnimationPreview()
    {
        Selection.selectionChanged += OnSelectionChanged;
    }

    static void OnSelectionChanged()
    {
        if (Selection.activeObject is AnimationClip)
        {
            var animationClip = Selection.activeObject as AnimationClip;
            if (AnimationUtility.GetAnimationClipSettings(animationClip).loopTime)
            {
                // If the animation is set to loop, play the animation automatically in the preview
                EditorApplication.ExecuteMenuItem("Window/Animation/Animation");
            }
        }
    }
}
#endif

코드를 하나 작성해줬는데 질문의 의도와는 다르게 작동하지 않는다.

 

구글링

구글링을 해보니 이와 같은 코드가 있어 사용해보았는데 정상적으로 작동한다

using System;
using System.Linq;
using System.Reflection;
using JetBrains.Annotations;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;

namespace EditorScripts
{

    [InitializeOnLoad]
    public static class AutoPlayAnimationPreview
    {

        private const BindingFlags PRIVATE_FIELD_BINDING_FLAGS = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField;
        private const BindingFlags PUBLIC_FIELD_BINDING_FLAGS = BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetField;
        private const BindingFlags PUBLIC_PROPERTY_BINDING_FLAGS = BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty;

        private static Type animationClipEditorType;
        private static Type avatarPreviewType;
        private static Type timeControlType;

        private static Object selectedObject;
        private static bool shouldFindTimeControl;

        static AutoPlayAnimationPreview()
        {
            animationClipEditorType = Type.GetType("UnityEditor.AnimationClipEditor,UnityEditor");
            avatarPreviewType = Type.GetType("UnityEditor.AvatarPreview,UnityEditor");
            timeControlType = Type.GetType("UnityEditor.TimeControl,UnityEditor");
        }

        private static void Update()
        {
            if (Selection.activeObject != selectedObject)
            {
                selectedObject = Selection.activeObject;

                if (selectedObject is AnimationClip)
                {
                    shouldFindTimeControl = true;
                }
                else if (selectedObject is GameObject)
                {
                    var assetPath = AssetDatabase.GetAssetPath(selectedObject);

                    if (!string.IsNullOrWhiteSpace(assetPath))
                    {
                        foreach (var child in AssetDatabase.LoadAllAssetsAtPath(assetPath))
                        {
                            if (child is AnimationClip)
                            {
                                shouldFindTimeControl = true;
                                break;
                            }
                        }
                    }
                }

                return;
            }

            if (shouldFindTimeControl)
            {
                var animationClipEditor = Resources.FindObjectsOfTypeAll(animationClipEditorType).FirstOrDefault();
                if (animationClipEditor == null) return;

                var avatarPreview = animationClipEditorType.GetField("m_AvatarPreview", PRIVATE_FIELD_BINDING_FLAGS)?.GetValue(animationClipEditor);
                if (avatarPreview == null) return;

                var timeControl = avatarPreviewType.GetField("timeControl", PUBLIC_FIELD_BINDING_FLAGS)?.GetValue(avatarPreview);
                if (timeControl == null) return;

                shouldFindTimeControl = false;

                var playingProperty = timeControlType.GetProperty("playing", PUBLIC_PROPERTY_BINDING_FLAGS);
                if (playingProperty == null) return;

                playingProperty.SetValue(timeControl, true);
            }
        }

        [InitializeOnLoadMethod, UsedImplicitly]
        private static void SubscribeToUpdate()
        {
            EditorApplication.update += Update;
        }

    }
}

코드출처

저작자표시 비영리 변경금지 (새창열림)

'Unity > Tip' 카테고리의 다른 글

IEnumerator 메서드에서 async await 사용  (0) 2023.10.24
클릭한 위치가 특정 오브젝트 안에 속해 있는지 판단하는 방법  (0) 2023.10.04
~~~ is missing the class attribute 'ExtensionOfNativeClass'!  (0) 2023.08.21
오브젝트 자연스럽게 이동하기 : Mathf.PingPong  (0) 2023.08.04
Unity Unique ID 스크립트  (0) 2023.07.14
'Unity/Tip' 카테고리의 다른 글
  • IEnumerator 메서드에서 async await 사용
  • 클릭한 위치가 특정 오브젝트 안에 속해 있는지 판단하는 방법
  • ~~~ is missing the class attribute 'ExtensionOfNativeClass'!
  • 오브젝트 자연스럽게 이동하기 : Mathf.PingPong
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    cv2
    리스트
    유니티
    리뷰이관
    programming101
    쇼핑몰리뷰
    Python
    unity
    긴유통기한우유
    appdevelopment
    상품 리뷰 크롤링
    devlife
    카페24리뷰
    ipcamera
    programmerlife
    카페24리뷰이관
    C#
    codingcommunity
    스크립트 실행
    라떼우유
    rtsp
    list
    learntocode
    셀레니움
    codingtips
    믈레코비타멸균우유
    리뷰관리
    스크립트 실행 순서
    파이썬
    스마트스토어리뷰
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
Animation Preview Auto Play
상단으로

티스토리툴바