https://www.youtube.com/watch?v=cp1YRaTZBfw 에서 블렌더 심플 Rigging 테크닉 강좌를 보고 따라하기.

Shift-A 누른 뒤 Amature-Single Bone 선택하여 본 하나 생성. Tab키를 눌러 에디트 모드로 들어간 뒤 이동시켜 엉덩이 부분에 위치시키기. Properties-Data-Display-X-Ray 체크하여 몸에 가리지 않게 하기.

꼭지점 부분을 선택한 상태에서 E키를 누르면 그곳에서부터 새 본이 생성된다.
엉덩이-등뼈-목-머리 4개 본을 생성. 정면과 측면에서 보며 위치 잡기.
Shift-A를 누르면 3d 커서 위치에 새 본이 생성된다. 어깨부분으로 이동시키고 윗팔-아래팔-손 3개 본 생성, 위치 잡기.
Shift-A 눌러 새 본 생성하고 다리부분으로 이동, 허벅지-종아리-발 3개 본 생성, 위치 잡기.

윗팔-아래팔-손 중 윗팔 선택한 뒤 Properties-Bone에서 이름 Arm.L으로 바꿔주고 아랫팔과 손도 각각 Arm2.L, Hand.L로 이름 바꿔주기.
허벅지-종아리-발도 각각 Leg.L, Leg2.L, Foot.L로 바꿔주기.
윗팔-아래팔-손 선택한 뒤 Shift-D로 복사하고 S 눌러 사이즈, X눌러 X축 방향 선택, -1 눌러 미러효과를 만든 뒤 오른쪽 어깨에 갖다 놓는다. 하단 메뉴 중 Amature-Flip Name 클릭하면 Arm.R.001 Arm2.R.001, Hand.L.001로 이름이 바뀐다.
허벅지-종아리-발도 동일하게 미러 복사하여 오른쪽 발에 위치시킨다. 역시 Flip Name하여 이름도 바꿔준다.

양쪽 윗팔 본을 선택한 뒤 등뼈 본 선택하고 Ctrl-P 누른 뒤 Keep Offset 선택하면 팔들이 등뼈에 연결된다.
양쪽 허벅지 본 선택 뒤 골반 본 선택, Ctrl-P, Keep Offset 선택하여 다리들 골반에 연결.

* 혹시 적용할 메쉬가 Mirror가 적용된 상태이면 Object Mode로 이동한 뒤Mirror를 Accept하여 하나로 붙여줘야 한다.

본 선택, Edit Mode에서 나간 Object Mode 상태에서 메쉬 선택 뒤 본 선택하고 Ctrl-P, With Automatic Weights 선택하면 자동으로 계산하여 붙여준다. 포즈모드로 가서 본들을 움직여 보면 메쉬가 본을 따라 움직인다. 한데 회전이 먹히지 않고 있다. 다시 처음부터 재적용 해봤는데 역시 회전이 안 먹히고 있다. 어찌된걸까?

18/10/4 목

어쨋건 리깅이 된 것을 FBX로 익스포트하고 유니티로 받아들인 다음 Animation Type: Humanoid로 변경한 뒤 Configure에서 빠진 오른쪽 다리 링크 옆 본들로 연결하고 T자형이 아니라고 뜨는 에러의 경우 어깨 본을 선택 회전시켜 T자로 만들어주자 모든 본들이 녹색으로 뜬다. 이렇게 된 뒤 기존 Idle.anim, Run.anim 등 다른 모델의 애니메이션 파일들을 적용시키니 제대로 애니메이션이 된다. 놀랍다.

PlayerCtrl.cs, CameraCtrl.cs 코드는 이전에 작성해 뒀던 것을 가져와 약간만 코드 수정을 하여 각각 캐릭터와 Main Camera에 부착하니 점프하는 플랫폼 게임스러운 구성이 된다.

PlayerCtrl.cs========================================
//주인공 좌우 이동, 점프
//점수 아이템, 골과의 충돌처리.

using UnityEngine;
using System.Collections;

public class PlayerCtrl : MonoBehaviour {
     Rigidbody rbody;
     Animator anim;
    
     public float jumpForce = 500.0f;
     float walkForce = 30.0f;
     float maxWalkSpeed = 3.0f;
     float threshold = 0.2f;
    
     void Start () {
          rbody = GetComponent ();
          anim = gameObject.transform.GetChild(0).GetComponent ();
          anim.SetTrigger ("Idle");
     }
    
     void Update () {
          //점프
          if (Input.GetKeyDown (KeyCode.UpArrow) && rbody.velocity.y == 0) {
               rbody.AddForce (transform.up * jumpForce);
          }
          //좌우이동
          int dir = 0;
          if (Input.GetKey (KeyCode.LeftArrow)) dir = -1;
          if (Input.GetKey (KeyCode.RightArrow)) dir = 1;
         
          //플레이어 속도
          float speedX = Mathf.Abs (this.rbody.velocity.x);
          //스피드 제한
          if (speedX < this.maxWalkSpeed) {
               this.rbody.AddForce (transform.right * dir * this.walkForce);
          }
          //화면 아래로 추락시 현 스테이지 재시작.
          if (transform.position.y < -30) {
               Application.LoadLevel(Application.loadedLevel);
          }
     }
     //점수 아이템, 골과의 충돌처리.
     void OnTriggerEnter2D(Collider2D other){
          if (other.gameObject.tag == "PointItem") {
               Debug.Log ("Point Up!");
               Destroy (other.gameObject);
          } else if (other.gameObject.tag == "Goal") {
               Debug.Log ("GOAL!!!");
               Application.LoadLevel("ClearScene");
          }
     }
}
CameraCtrl.cs=======================================
//Hierarchy-Main Camera에 적용
//카메라가 주인공 높이 따라가며 비추기

using UnityEngine;
using System.Collections;

public class CameraCtrl : MonoBehaviour {
     GameObject player;
    
     void Start () {
          player = GameObject.Find ("Player");
     }
    
     void Update () {
          Vector3 playerPos = this.player.transform.position;
          transform.position = new Vector3 (transform.position.x, 
		  				playerPos.y+1, transform.position.z);
     }
}