[Unity Editor] Animaker #1 - Diff column counts

qweasfjbv·2024년 12월 27일

UnityEditor

목록 보기
1/12
post-thumbnail

개요


학기중에 만들어뒀던 Unity AutoAnimaker의 추가적인 기능들을 구현해보겠습니다.

AutoAnimaker는 스프라이트와 옵션들을 통해 자동으로 애니메이션 클립, 애니메이터 등을 만들어주는 에디터 툴입니다.

이번에 할 일은 스프라이트의 각 Row의 Column 개수가 다른 경우에 대해 예시를 만들고 데모씬에 적용하는 것입니다.
아래 사진을 보시면 클립에 들어가야하는 Column의 각각 다르고, 아예 비어있는 경우도 있습니다.
해당 경우들을 처리해보도록 하겠습니다.

구현


우선 넣고 실행해보면, 에러가 발생합니다.
이 에러는 sprite 배열에 접근할 때 발생하는 에러로, sprite 배열에 아무것도 없는 경우에도 0번 Index에 접근하려다가 발생한 에러입니다.

즉, Row가 아예 비어있는 경우의 처리부터 넣어주겠습니다.


        public static List<AnimationClip> CreateClipsFromSprite(Texture2D texture, in AnimationOptions animOpt)
        {
        	// ...
            
            for (int i = 0; i < rowCount; i++)	// 각 row마다 sprite들을 모아서 clip으로 만듭니다.
            {
                int columnCount = GetColumnCounts(texture, i, animOpt.sliceOptions);
				
                // columnCount를 세고 0인 경우 예외처리
                if (columnCount == 0) continue;
                
                sprites.Clear();
                for (int j = 0; j < columnCount; j++)
                {
                    sprites.Add(objects[spritePointer++] as Sprite);
                }

                string clipName = StringUtils.GetConventionedName(new string[] {"Anim", animOpt.spriteName, animOpt.animNames[i] }, animOpt.fileNameConvention);

                tmpClip = CreateAnimationClip(sprites, animOpt.clipOptions);
                clips.Add(tmpClip);
                AssetDatabase.CreateAsset(tmpClip, $"{animOpt.savePath}/{clipName}.anim");
                AssetDatabase.SaveAssets();
            }

            return clips;
        }

여기까지 하고 실행해보면, 에러는 나지 않지만 이상한 점이 있습니다.

분명히 스프라이트의 아랫쪽 두 칸이 비어있었는데, Animation Names 의 아래쪽 Element 인 motion6motion7 이 사용되었습니다.

이렇게 된 이유는 제가 사용한 함수 Texture2D.GetPixel() 이 왼쪽 위에서 부터 읽는게 아닌, 왼쪽 아래에서부터 읽기 때문입니다.
(간단해 보이지만 해결하는데 꽤 걸렸습니다.)

특정 Index만 거꾸로 세도록 바꿔주면 정상적으로 작동하게 됩니다.
아래는 데모씬 영상입니다.

마무리


아직 "간편하게" 사용하기에는 부족한 부분이 많습니다.
특히 테스트를 할때마다 Option들을 넣어줘야 하는게 생각보다 많이 귀찮습니다.
다음에는 해당 부분을 개선시키기 위해 Option Save/Load 기능을 만들어보겠습니다.

0개의 댓글