상세 컨텐츠

본문 제목

유니티 procedural animation, rigging 연구중

유니티/기능

by MJ_119 2024. 9. 29. 12:58

본문

구현 방식:

  1. 탑을 구성하는 큐브들에 본을 추가하고, 그 본을 기반으로 리깅을 설정합니다.
  2. 프로시저럴 리깅을 통해 코드로 큐브들에 자동으로 리깅과 IK를 적용합니다.
  3. IK 컨트롤러를 통해 개별 큐브나 상위 본들이 캐릭터를 추적할 수 있도록 구성합니다.

1. 본과 리깅 생성:

우선, 큐브들을 자동으로 리깅하기 위해 각 큐브에 본을 추가하고, 이 본들이 계층적으로 연결되도록 해야 합니다. 이 과정은 코드로 자동으로 수행됩니다.

본과 리깅 구조 설정:

각 큐브마다 **본(bone)**을 만들어야 합니다. 본은 Transform을 기반으로 생성되고, 리깅에 필요한 구성 요소가 됩니다.

 

using UnityEngine;
using UnityEngine.Animations.Rigging;

public class ProceduralRigging : MonoBehaviour
{
    public GameObject[] cubes;  // 탑을 구성하는 큐브들
    public Transform player;  // 캐릭터를 추적할 목적지

    private void Start()
    {
        // 각 큐브에 본을 추가하고 리깅 설정
        foreach (GameObject cube in cubes)
        {
            // 큐브마다 빈 본을 추가
            GameObject bone = new GameObject(cube.name + "_Bone");
            bone.transform.SetParent(cube.transform);
            bone.transform.localPosition = Vector3.zero;  // 본의 위치는 큐브의 중심
            
            // 본을 부모로 리깅 오브젝트를 생성
            Rig rig = cube.AddComponent<Rig>();
            
            // IK Constraint 추가 (Two Bone IK Constraint 사용)
            TwoBoneIKConstraint ik = rig.gameObject.AddComponent<TwoBoneIKConstraint>();
            ik.data.target = player;  // 플레이어를 추적
            ik.data.root = cube.transform;
        }
    }
}

 

 

2. 자동으로 리깅 적용:

위 코드를 통해 탑을 구성하는 각각의 큐브에 본과 리깅이 자동으로 추가됩니다. 이렇게 하면 씬 뷰에서 일일이 리깅을 설정할 필요 없이, 코드로 리깅과 IK를 자동화할 수 있습니다.

 

 

 

3. IK를 적용하여 캐릭터를 추적하게 만들기:

IK 시스템은 특정 본이 타겟(캐릭터)을 향해 움직일 수 있도록 도와줍니다. 위의 코드에서는 TwoBoneIKConstraint를 사용하여 각 큐브가 캐릭터 방향으로 회전하거나 움직이도록 설정했습니다.

IK 설정 확장:

이제 큐브들의 본이 캐릭터 쪽으로 움직이도록 하는 코드를 추가합니다. 각 큐브는 개별적으로 캐릭터를 향해 움직일 수 있으며, 상위 큐브(머리 역할을 하는 큐브)는 전체 탑의 머리처럼 행동합니다.

 

 

using UnityEngine;
using UnityEngine.Animations.Rigging;

public class ProceduralRigging : MonoBehaviour
{
    public GameObject[] cubes;  // 탑을 구성하는 큐브들
    public Transform player;  // 캐릭터를 추적할 목적지
    public float ikWeight = 1.0f;  // IK의 영향력 (0~1)

    private void Start()
    {
        // 각 큐브에 본을 추가하고 리깅 설정
        foreach (GameObject cube in cubes)
        {
            // 큐브마다 빈 본을 추가
            GameObject bone = new GameObject(cube.name + "_Bone");
            bone.transform.SetParent(cube.transform);
            bone.transform.localPosition = Vector3.zero;  // 본의 위치는 큐브의 중심
            
            // 본을 부모로 리깅 오브젝트를 생성
            Rig rig = cube.AddComponent<Rig>();

            // IK Constraint 추가 (Two Bone IK Constraint 사용)
            TwoBoneIKConstraint ik = rig.gameObject.AddComponent<TwoBoneIKConstraint>();
            ik.data.target = player;  // 플레이어를 추적
            ik.weight = ikWeight;  // IK의 영향력 설정
        }
    }

    private void Update()
    {
        // 실시간으로 플레이어의 위치를 추적
        foreach (GameObject cube in cubes)
        {
            // 각 큐브의 본이 플레이어를 향해 움직임
            TwoBoneIKConstraint ik = cube.GetComponent<TwoBoneIKConstraint>();
            ik.data.targetPosition = player.position;
        }
    }
}

 

 

4. 결과:

  • 탑을 구성하는 큐브들이 자동으로 본과 리깅을 설정하여 움직임을 제어할 수 있습니다.
  • 각 큐브가 독립적으로 리깅되며, 필요에 따라 상위 큐브가 캐릭터를 추적하도록 설정할 수 있습니다.
  • 씬 뷰에서 일일이 본과 리깅을 설정할 필요 없이, 코드로 모든 과정이 자동화됩니다.

결론:

이 방식은 각각의 큐브에 대해 본과 리깅을 자동으로 추가하고, IK 시스템을 통해 타겟을 추적하게 만듭니다. 따라서, 탑을 구성하는 여러 개의 큐브가 리깅을 통해 유기적으로 움직이고, 개별 큐브들이 머리나 팔처럼 행동할 수 있게 됩니다.

이를 통해 Unity 씬에서 일일이 리깅을 지정할 필요 없이 코드로 프로시저럴 리깅과 IK 제어를 완성할 수 있습니다.

 

 

 

 

 

관련글 더보기