프로그래밍/Spine

Spine2D 튜토리얼 04. GroundConstraint 방법과, 스킨 변경, 쉐이더, delegate 등

windship 2017. 1. 29. 18:29

(출처 : http://blog.naver.com/ateliersera/220663775981)


* GroundConstraint *

스파인 캐릭터의 특정 본에 접근해서 제어를 하고싶다면, 해당 본 데이터를 꺼내야 합니다.


일단 모델이 있어야 하니, 뷰어 상에 Skelecton Animation 을 하나 생성 해서 제어 하고자 하는 Skelecton Data Asset을 연결시켜 줍니다.

여기에서는 기본적으로 제공하는 raptor_SkeletonData 를 이용하였습니다.



약간의 손질이 필요합니다. 포함중인 본 데이터를 제어할 수 있게 밖으로 꺼내야 하기에, Skelecton Utility Bone 스크립트를 사용합니다. 

Add Skelecton Utility를 눌러주면 생성되는 Skeleton Utility 스크립트의 BoneRoot에 위에서 만들어 놓은 testroot를 끌어다가 놓으면 사용할 수 있게 됩니다.


여기에는 바닥에 발을 붙이기 위한 스크립트를 사용 하였지만, 벽에 손을 붙인다거나 , 사다리를 팔 다리로 잡는 등의 액션을 한다면(어쌔신 크리드!?) 위의 스크립트와는 좀 더 다른 스크립트를 만들어서 써 줘야 합니다. 



* Skin 변경 방법 * 

튜토리얼에서는 Gobline이 남/녀 고블린으로의 스킨 변경 예제로 사용되어 있습니다.  

goblins 를 보면, 내부적으로 이미지 폴더 아래에 goblin 과 goblingirl 이라는 폴더가 있는데, 해당 폴더 내에는 동일한 이름의 이미지들이 들어가 있습니다.

실제로 root에서 바인딩 된 이미지를 보면 스킨 플레이스 홀더 라는 조각퍼즐 같은 부분 아래에 이미지가 위치해 있음을 알 수 있습니다.

 

이런 구조 입니다.  위에 이미지에서 right hand 부분에서 +새로만들기 버튼을 누른 후, 플레이스 홀더를 생성 하고, 그 아래쪽에 사용할 이미지를 넣으면 됩니다.

공용으로 사용하는 무기나 악세사리의 경우, 폴더 내부에 두지 말고, 그냥 이미지 아래에 둡니다. 공용 이미지는 플레이스 홀더를 사용하지 않습니다.



public void OnMouseDown () { // 마우스 클릭으로 스킨이 변경됩니다.

skeletonAnimation.skeleton.SetSkin(girlSkin ? "goblin" : "goblingirl"); //SetSkin이 스킨 변경 함수 입니다.  여기에 이름이 곧 이미지 폴더!

skeletonAnimation.skeleton.SetSlotsToSetupPose(); 

girlSkin = !girlSkin; //bool부호 값입니다. 

if (girlSkin) { 

skeletonAnimation.skeleton.SetAttachment("right hand item", null);

skeletonAnimation.skeleton.SetAttachment("left hand item", "spear");   //왼손의 아이템을 창으로 바꿉니다.

} else

skeletonAnimation.skeleton.SetAttachment("left hand item", "dagger"); // 왼손의 아이템을 단검으로 바꿉니다. 

}


skeletonAnimation.skeleton.SetSkin()을 통해 변경 합니다. Setskin("스킨 이름")으로 들어가는데, 여기에서는 간단하게 아닌지 맞는지로만 선택되게 되어있습니다.

일반 사용방법은 그냥 이름 스트링을 넣어주면 됩니다.



*지원하는 쉐이더 *

 


SPine 라는 카테고리 내의 쉐이더들 입니다. 

Bones : 가장 기본적인 Unlit 쉐이더 입니다. 라이팅을 받지 않습니다. 바리에이션이 2종류로 가장 가벼운 쉐이더중 하나 입니다. OpenGL과 Dx9 를 지원합니다.

HiddenPass : 그냥 렌더링이 안됩니다;;보이지 않아요...


Skeleton : 그림자를 적용 시킵니다. 디렉션 라이트에 영향을 받아서 그림자를 생성 합니다. 

Skeleton Lit : 그림자 적용도 되고, 스프라이트 이미지도 라이트에 영향을 받게 됩니다.

SkeletonGhost : 유령 만들때 쓰라는 걸까요??? 좀 애매한 쉐이더이긴 한데, MainColor 의 알파 값이 적용 됩니다. 그리고 Texture Fade Out값에 따라 Main Color의 색상 값이 씌워집니다. 정작 알파값이 적용되면 관절의 겹치는 부분이 보이는 불편한 진실이...

SkeletonGraphic(Premultiply Alpha) : 스탠실 지정 기능이 있습니다. 마스킹도 가능합니다. 예제중에 SkeletonGraphic부분에서 활용 되어있습니다. 캐릭터에서 쓸 일은 잘 모르겠지만, 어딘가 쓰이겠지요.


 그림자 생성의 경우,카메라에 비춰질 그림자 형태를 잡아다가 스프라이트에다가 그려주는 방식입니다. (3D 표면에 그리는 방식이 아닙니다!?)  2D 스프라이트랑 함께 그림자가 한 면에 붙어서 움직이는걸 볼 수 있습니다.  



* 애니메이션 컨트롤 샘플 코드 *


    [SpineEvent] public string footstepEventName = "footstep"; 


    void Start () {

        var skeletonAnimation = GetComponent<SkeletonAnimation>();

        if (skeletonAnimation == null) return;    // told you to add this to SkeletonAnimation's GameObject.


        // This is how you subscribe via a declared method. The method needs the correct signature.

        skeletonAnimation.state.Event += HandleEvent;


        skeletonAnimation.state.Start += delegate (Spine.AnimationState state, int trackIndex) {

            // You can also use an anonymous delegate.

            Debug.Log(string.Format("track {0} started a new animation.", trackIndex));

        };


        skeletonAnimation.state.End += delegate {

            // ... or choose to ignore its parameters.

            Debug.Log("An animation ended!");

        };

    }


    void HandleEvent (Spine.AnimationState state, int trackIndex, Spine.Event e) {

        // Play some sound if the event named "footstep" fired.

        if (e.Data.Name == footstepEventName) {            

            Debug.Log("Play a footstep sound!");

        }

    }

}