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 |