npc 캐릭터가 추가될 때 마다 걷기 등 기본 애니메이션을 일일히 생성해야 한다는 사실이 너무 귀찮아서
이미지를 넣으면 자동으로 애니메이션을 생성하도록 했다.
(물론 챗GPT의 도움을 빌렸다 😉)
// 텍스처의 경로를 가져옴
string path = AssetDatabase.GetAssetPath(charTexture);
// 텍스처의 스프라이트 정보 로드
Object[] sprites = AssetDatabase.LoadAllAssetsAtPath(path);
// 스프라이트 필터링
List<Sprite> spriteList = new List<Sprite>();
foreach (Object obj in sprites)
{
if (obj is Sprite sprite)
{
spriteList.Add(sprite);
}
}
Sprite[] spriteArray = spriteList.ToArray();
🔼 텍스처를 입력 후 텍스처에서 해당하는 스프라이트를 전부 가져옴
원래는 Object[]
형으로 받지 않고 Sprite[]
으로 받으려고 했는데 문제가 생겼다.
Sprite[] spriteArray = System.Array.FindAll(sprites, item => item is Sprite) as Sprite[];
spriteArray
에 아무것도 저장이 되지 않았다.
GetType()
으로 디버깅을 해봐도 Sprite
로 인식이 되는데.. 원인을 알수가 없었다.
GPT도 모르겠다고 했다!
내부 캐스팅 과정에서 제대로 이루어지지 않았거나, 캐싱된 데이터가 어딘가에 남아있거나.. 😒
AnimationClip animClip = new AnimationClip
{
frameRate = frameRate
};
EditorCurveBinding spriteBinding = new EditorCurveBinding
{
type = typeof(SpriteRenderer),
path = "",
propertyName = "m_Sprite"
};
// 스프라이트를 키프레임으로 추가
ObjectReferenceKeyframe[] keyframes = new ObjectReferenceKeyframe[spriteArray.Length];
for (int i = 0; i < spriteArray.Length; i++)
{
keyframes[i] = new ObjectReferenceKeyframe
{
time = i / frameRate,
value = spriteArray[i]
};
}
type = typeof(SpriteRenderer)
// SpriteRenderer 컴포넌트를 조작
path = ""
// 현재 오브젝트
propertyName = "m_Sprite"
// SpriteRenderer의 m_Sprite 속성을 변경
EditorCurveBinding은 Unity 에디터 스크립팅에서 애니메이션 클립에 애니메이션 데이터를 설정할 때 사용하는 구조체입니다.
Unity의 애니메이션 시스템은 객체의 속성(property)을 시간에 따라 변경하는 방식으로 동작하며, EditorCurveBinding은 애니메이션 클립에서 조작할 속성을 지정하는 역할을 합니다.
- 출처 : 챗GPT
AnimationUtility.SetObjectReferenceCurve(walkClip, spriteBinding, walkKeyframes);
// 애니메이션 파일 저장
savePath = Path.Combine($"Assets/Resources/Animation/{charName}/", walkClipNames[i] + ".anim");
AssetDatabase.CreateAsset(walkClip, savePath);
AssetDatabase.SaveAssets();
코드를 많이 수정해서 사용중이라 최대한 기본 틀 부분만 기록하고자 했다.
아직 애니메이터에 연결은 일일히 해야하지만 일단 할일이 반이나 줄었다는 점에 만족한다!