Get it on Google Play


Wm뮤 :: 스파인 관련함수

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2020. 7. 2. 17:50 Unity/C#

스파인 컴포넌트 써오면서 깨달은점은 스파인 만든놈들은 유니티를 존나 못한단것이다

 

 

 

스파인 애니메이션 변경관련

 

 

using계열

using Spine.Unity

 

-스파인 애니메이션 변경시 해당 오브젝트 하위에 SkeletonAnimation이 있을경우

public SkeletonAnimation skeletonAnimation;

[SpineAnimation(dataField: "skeletonAnimation")]
public String spineAnim;
    
    
 SkelAnim.AnimationName = spineAnim;

-스파인 애니메이션 변경시 다른 오브젝트에서 SkeletonAnimation를 호출할경우

(SkeletonAnimation타입)

public SkeletonAnimation skeletonAnimation;
public AnimationReferenceAsset spineAnim;

SkelAnim.loop = false; //루프는 반드시 애니메이션 설정전에 실행되어야함
SkelAnim.AnimationName = spineAnim.name;

(SkeletonGraphic타입)

public SkeletonGraphic skeletonGraphic;
public AnimationReferenceAsset spineAnim;

skeletonGraphic.AnimationState.SetAnimation(trackIndex:0, spineAnim.name, loop:false); //false는 루프, 0은 인덱스 번호

 

 

-현재 SkeletonAnimation의 애니메이션의 지속시간

(SkeletonAnimation타입)

SkeletonAnimation skeletonAnimation = GetComponent<SkeletonAnimation>();
float Duration=skeletonAnimation.skeleton.Data.FindAnimation(skeletonAnimation.AnimationName).Duration;

(SkeletonGraphic타입)

SkeletonGraphic skelGrap = GetComponent<SkeletonGraphic>();
string animName = skelGrap.AnimationState.Tracks.Items[0].ToString();
float duration=skelGrap.SkeletonData.FindAnimation(animName).Duration;

 

스파인 특정 본의 y축 좌표 추적

skeletonGraphic.Skeleton.FindBone("본이름").Y * 100f;

스파인 스킨 변경

GetComponent<Spine.Unity.SkeletonGraphic>().Skeleton.SetSkin("스킨 이름");

스파인 스킨을 번호로 가져올때

var skeletonGraphic = GetComponent<Spine.Unity.SkeletonGraphic>();
var skins = skeletonGraphic.AnimationState.Data.SkeletonData.Skins.ToArray();
skeletonGraphic.Skeleton.SetSkin(skins[번호]);

 

 

 

해당 skeletonGraphic의 애니메이션 리스트 가져오기

skeletonGraphic.AnimationState.Data.SkeletonData.Animations.ToArray()

해당 skeletonGraphic의 스킨 리스트 가져오기

skeletonGraphic.AnimationState.Data.SkeletonData.Skins.ToArray()

 

SkeletonDataAsset을 가져올때

public Spine.Unity.SkeletonDataAsset skeletonDataAsset;

 

SkeletonDataAsset 변경

public Spine.Unity.SkeletonDataAsset skeletonDataAsset;

var skeletonGraphic = GetComponent<Spine.Unity.SkeletonGraphic>();
if(skeletonGraphic.skeletonDataAsset!= SkeletonDataAsset)
{
    skeletonGraphic.skeletonDataAsset = SkeletonDataAsset;
    skeletonGraphic.Initialize(true);
}

 

현재 애니메이션의 최대시간

SkeletonGraphic skeletonGraphic = GetComponent<SkeletonGraphic>();
if (skeletonGraphic.gameObject.activeInHierarchy && skeletonGraphic.IsActive())
{
    float duration = skeletonGraphic.AnimationState.Tracks.Items[0].AnimationTime;
}

 

 

정지

skeletonGraphic.timeScale = 0;
if (skeletonGraphic.gameObject.activeInHierarchy && skeletonGraphic.IsActive())
{
    skeletonGraphic.AnimationState.Tracks.Items[0].TrackTime = 0;
}

 

일시정지

skeletonGraphic.timeScale = 0;

 

 

재생


var entry = skeletonGraphic.AnimationState.SetAnimation(0, animation.Name, loop);
entry.MixDuration = 0f;

 

되감기

SkeletonGraphic skeletonGraphic = curtainNormal.GetComponent<SkeletonGraphic>();
if (skeletonGraphic.gameObject.activeInHierarchy && skeletonGraphic.IsActive())
{
    float duration = skeletonGraphic.AnimationState.Tracks.Items[0].AnimationTime;
    skeletonGraphic.unscaledTime = true;
    skeletonGraphic.AnimationState.Tracks.Items[0].TrackTime = duration;
    skeletonGraphic.timeScale = -1;
}

 

 

 

애니메이션이 끝났을때에만 재생(Update에 넣어야함)

if (skeletonGraphic.AnimationState.Tracks.Items.Length == 0)
{
    var entry = skeletonGraphic.AnimationState.SetAnimation(0, animation.Name, loop);
    entry.MixDuration = 0f;
    skeletonGraphic.Initialize(true);
    skeletonGraphic.Update(0f);
}
else
{
    Spine.TrackEntry trackItemNow = skeletonGraphic.AnimationState.Tracks.Items[0];
    trackItemNow.Loop = loop;
    float duration = skeletonGraphic.SkeletonData.FindAnimation(trackItemNow.ToString()).Duration;
    float trackTime = trackItemNow.TrackTime;
    if (trackTime > duration-0.1f)
    {
        var entry = skeletonGraphic.AnimationState.SetAnimation(0, animation.Name, loop);
        entry.MixDuration = 0f;
        skeletonGraphic.Initialize(true);
    }
}

 

 

애니메이션 종료 콜

단점은 루프가 꺼져있어도 애니메이션이 타임만 증가하며 영원히 돌아가는거로 나오기 때문에 작동을 제대로 안함

void Awake()
{
	//애니메이션 루틴이 끝났을경우 호출(루프중이면 주기마다 호출됨)
    GetComponent<SkeletonGraphic>().AnimationState.Complete -= SpineEndEvent;
    GetComponent<SkeletonGraphic>().AnimationState.Complete += SpineEndEvent;
	//애니메이션이 종료되었을경우 호출(제대로 작동 안 함)
    GetComponent<SkeletonGraphic>().AnimationState.End -= SpineEndEvent;
    GetComponent<SkeletonGraphic>().AnimationState.End += SpineEndEvent;
}
void SpineEndEvent(Spine.TrackEntry te)
{
//동작할 코드
}

 

 

스켈레톤 그래픽 사이즈

skeletonGraphic.SkeletonData.Width //가로
skeletonGraphic.SkeletonData.Height //세로

 

 

 

특정폴더의 스켈레톤 데이터를 전부 불러옴


#if UNITY_EDITOR
    public static Spine.Unity.SkeletonDataAsset[] GetFolderToSkeletonDatas(UnityEngine.Object folder)
    {
        var folderPath = UnityEditor.AssetDatabase.GetAssetPath(folder);
        var filePathSkeletonDatas = UnityEditor.AssetDatabase.FindAssets($"t:{typeof(Spine.Unity.SkeletonDataAsset).Name}", new string[] { folderPath });
        var skeletonDatas = new Spine.Unity.SkeletonDataAsset[filePathSkeletonDatas.Length];
        for (int i = 0; i < skeletonDatas.Length; i++)
        {
            skeletonDatas[i] = UnityEditor.AssetDatabase.LoadAssetAtPath<Spine.Unity.SkeletonDataAsset>(UnityEditor.AssetDatabase.GUIDToAssetPath(filePathSkeletonDatas[i]));
        }
        return skeletonDatas;
    }
#endif

 

 

'Unity > C#' 카테고리의 다른 글

사소한 c# 테크닉  (0) 2020.07.08
Parent of RectTransform is being set with parent property  (0) 2020.06.29
SQLite 유니티 사용방법  (0) 2020.05.24
posted by 모카쨩

저사양 유저용 블로그 진입