Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

만재송

[Unity] Spine(4) - 스킨변경(2) 본문

프로그래밍/Unity

[Unity] Spine(4) - 스킨변경(2)

만재송 2019. 8. 8. 17:39

두번째 방법은 미리 정의된 스킨이 없을 때, 일정 파츠만 바꿀려고 할 때 사용하는 방법입니다. 예로들면 무기를 변경하고싶은데 변경할 무기가 스파인 atlas 에 포함되어 있지 않아서 기존 방법으로는 변경할 수 없을 때 사용하는 방법입니다.

 

이방법을 이용해서 spine boy의 고글과 총을 변경해보겠습니다.

 

먼저, 변경 할 고글과 총의 리소스가 필요합니다. 이때 변경 할 리소스의 크기는 해당 atlas 슬롯의 사이즈가 같아야합니다. 슬롯의 사이즈는 .atlas.txt 에서 확인하면됩니다. 예로들어 고글의 사이즈를 확인하면,

goggles // 슬롯의 이름. 스파인 애니메이션 제작자가 정하기 나름
  rotate: false
  xy: 466, 856
  size: 261, 166 // 사이즈
  orig: 261, 166
  offset: 0, 0
  index: -1

사이즈가 261, 166 으로 나오므로 변경할 고글 리소스도 261, 166 이어야합니다. 상단에 goggles 는 슬롯의 이름입니다. 이부분은 스파인 애니메이션 제작자가 정하는 이름이라서 사전에 합의를 해서 이름을 정하면 될 것 같습니다.

 

간단하게 고글을 변경하는 코드를 작성해보겠습니다. 먼저 프로퍼티는 아래와 같이 정의합니다.

[SpineSkin] public string baseSkinName; // 복사 할 스킨의 이름
public Material baseMaterial; // 기본 머터리얼

public Sprite gogglesSprite; // 고글 스프라이트
[SpineSlot] public string gogglesSlot; // 고글 슬롯의 이름
[SpineAttachment] public string gogglesKey; // 고글 어테치먼트의 이름

스파인에는 여러 어트리뷰트를 사용 할 수 있습니다. 위에서 사용한 SpineSkin, SpineSlot, SpineAttachment 은 해당 애니메이션의 스킨, 슬롯, 어테치먼트의 목록을 에디터에서 enum 형태로 보여주기 때문에 선택이 용이합니다. 해당 어트리뷰트를 사용하려면 Spine.Unity 를 using 해줘야 합니다.

using Spine.Unity;

위와 같이 프로퍼티를 설정하면 인스펙터 창에서 값들을 설정 할 수 있습니다.

위와 같이 선택을 할수있어서 키값을 잘못입력해서 오류를 범 할 일이 줄어들게됩니다.

 

다음은 새로운 스킨을 생성합니다. 그다음 기존에 정의된 스킨의 정보를 새로운 스킨에 추가해줍니다. 예로들어 고글의 슬롯정보같은 내용이 필요하기 때문에 기존 스킨의 정보를 복사합는겁니다.

SkeletonAnimation skeletonAnimation = GetComponent<SkeletonAnimation>(); // SkeletonAnimation 컴포터넌트 가져오기
Skeleton skeleton = skeletonAnimation.Skeleton; // 스켈레톤 클래스

Skin newSkin = new Skin("custom skin"); // 새로운 스킨생성
var baseSkin = skeleton.Data.FindSkin(baseSkinName); // 기존에 있는 스킨 가져오기
newSkin.AddAttachments(baseSkin); // 기존에 있는 스킨에 정의된 값을 새로운 스킨에 추가

다음은 새로운 스킨에 변경 할 고글을 추가하는 코드입니다.

int gogglesSlotIndex = skeleton.FindSlotIndex(gogglesSlot); // 고글 슬롯값 얻어오기
Attachment baseAttachment = baseSkin.GetAttachment(gogglesSlotIndex, gogglesKey); // 고글의 어테치먼트 얻어오기
Attachment newAttachment = baseAttachment.GetRemappedClone(gogglesSprite, baseMaterial); // 변경할 스프라이트로 다시 매핑된 어테치먼트 얻어오기
newSkin.SetAttachment(gogglesSlotIndex, gogglesKey, newAttachment); // 스킨에 변경된 어테치먼트 설정

FindSlotIndex 는 슬롯의 인덱스값을 가져옵니다. 이 값을 통해서 Attachment의 값을 얻어올 수 있습니다. 고글의 이미지를 변경하는 방법은 GetRemappedClone 로 변경을 해주며, SetAttachment 로 새로운 스킨에 추가해줍니다.

 

마지막으로 스킨을 적용하면 끝납니다.

skeleton.SetSkin(newSkin); // 새로운 스킨적용
skeleton.SetSlotsToSetupPose();
skeletonAnimation.AnimationState.Apply(skeleton);

아래는 위의 코드를 실행한 결과입니다.

Comments