Spine 사용
Spine 패키지를 사용한 이유?
모바일(안드로이드) 플랫폼의 방치형 게임으로 개발을 하기에 Player 캐릭터의 스킨을 제작하거나 무기를 장착하는데에 일반 Sprite를 사용하는것보다 Spine을 사용하는것이 더욱 좋다고 생각하였기에 Player 객체에만 Spine을 적용시키기로 하였다.
- 메모리 효율성: SpriteSheet 방식보다 메모리를 절약하며 고품질 애니메이션 제공.
- 동적 애니메이션 조합: 다양한 부위(스킨, 무기 등)를 프로그래밍적으로 조합 가능.
- 애니메이션 재사용성: 동일한 애니메이션을 다양한 스킨이나 캐릭터에 적용 가능.
현재 우리 프로젝트에는 아트 직업군이 없어서 Spine의 효율을 100% 끌어올리지 못하지만 , 아트 직업군과의 협업에 분명 도움이 될것이다 판단하고 진행하였습니다.
Spine SetUp
Spine은 각종 플랫폼에서 사용 할 수 있게 지원이 잘 되어있기에 , 세팅하는법은 어렵지 않았다.
https://ko.esotericsoftware.com/spine-runtimes
해당 Spint 홈페이지의 GitHub에 접근하여 직접 패키지를 다운 받아도 되고
https://ko.esotericsoftware.com/spine-unity-download/
해당 홈페이지에서 버전에 맞게 Import 패키지를 받아 적용시켜도 된다.
패키지를 Import하면 예제 레퍼런스를 주기에 잘 활용하는것이 좋다.
Spine에셋을 사용하면 해당 구조들로 구성되어야 사용가능하며 Atlas를 이용하여 최적화를 하는 방식인것같다.
Unity에서도 Sprite Atlas를 제공하는것으로 알고 있다.
SkeletonAnimation을 생성하면 AnimatorController처럼 사용할수 있게된다.
해당 Inspector에 Spine SkeletonData를 적용하고 코드로 호출하여 사용하면된다.
PlayerAnimaitonController.cs
using System;
using Spine;
using Spine.Unity;
using UnityEngine;
public class PlayerAnimationController : MonoBehaviour
{
#region Inspector
// [SpineAnimation] attribute allows an Inspector dropdown of Spine animation names coming form SkeletonAnimation.
[SpineAnimation]
public string idleAnimationName;
[SpineAnimation]
public string runAnimationName;
[SpineAnimation]
public string MeleeAttackAnimationName;
[SpineAnimation]
public string ShotAttackAnimationName;
[SpineAnimation]
public string VictoryAnimationName;
//[Header("Transitions")]
//[SpineAnimation]
//public string idleTurnAnimationName;
//[SpineAnimation]
//public string runToIdleAnimationName;
//public float runWalkDuration = 1.5f;
#endregion
private SkeletonAnimation skeletonAnimation;
public Spine.AnimationState spineAnimationState;
public Spine.Skeleton skeleton;
public void Initialize()
{
//spineanimation 초기화
skeletonAnimation = GetComponent<SkeletonAnimation>();
spineAnimationState = skeletonAnimation.AnimationState;
skeleton = skeletonAnimation.Skeleton;
}
}
해당 스크립트에서는 SkeletonAnimation 컴포넌트를 초기화하는 클래스 코드영역이다.
PlayerIdelState.cs 일부분
public override void Enter()
{
string animName = stateMachine._Player.PlayerAnimationController.idleAnimationName;
stateMachine._Player.PlayerAnimationController.spineAnimationState.SetAnimation(0, animName, true);
}
애니메이션 동작법은 Unity의 AnimatorController와 유사하다. 해당 애니메이션 Index , 애니메이션이름,loop 설정을 하면된다.
PlayerBaseState.cs의 일부분
public void FlipCharacter(bool isFacingRight)
{
// true이면 ScaleX를 1로 설정, false이면 -1로 설정
stateMachine._Player.PlayerAnimationController.skeleton.ScaleX = isFacingRight ? 1f : -1f;
}
SpriteRender의 Flipx,Flipy 기능은 해당 메서드를 사용하여서 캐릭터를 뒤집어 사용 할 수 있다.
아직 Spine의 기능을 100프로 활용하지 못하고있다.
내일은 게임 플레이어 로직을 완성 시키고 무기 장착및 스킨 변경 구현을 해야 될것 같다.
현재 플레이어 로직은 범위 안에 제일 가까운 Enemy를 탐색하여 이동후 공격범위 안에 있는경우 공격을 실행하는 방식을 사용하고있다.
또한 장착되는 Soul에 의해 근접 기본 공격 , 원거리 기본 공격을 구현해야된다.