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)
      • DataBase (0)
        • MongoDB (4)
        • PostgreSQL (0)
      • 하드웨어 (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)
  • 인기 글

  • 태그

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

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

티스토리툴바