본문 바로가기

유니티 프로그래밍

유니티 애니메이션에 조건 추가 해주고 컨트롤러 설정 방법

오늘은 유니티 애니메이션 중에 조건을 추가해주고, 

 

그 조건에 따라 어떤 애니메이션을 캐릭터에 적용해줄지를 설정하는 법을 블로깅 한다.

 

 

혹시 애니메이션을 처음 달아주는 법을 모른다면 밑의 링크를 누르면 자세히 나와있으니 참고 바란다.

https://zetezz.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%BA%90%EB%A6%AD%ED%84%B0-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98-%EC%A3%BC%EB%8A%94-%EB%B0%A9%EB%B2%95

 

유니티 캐릭터 애니메이션 주는 방법

유니티 캐릭터 애니메이션 주는 방법은 1. 이미지 파일을 씬에 드래그앤 드랍을 해서 객체화 시킨다. 2. Hierarchy 창에서 방금생성된 오브젝트(애니메이션을 적용할 객체)를 클릭 후 3. 상단 파일

zetezz.tistory.com

 

 

위와 같이 했다면 프로젝트 창(애셋을 보여주는 창)에 보면 아래와 같이 2가지 타입의 파일이 위치할텐데

하나는 애니메이터 컨트롤러(Animator Contoller), 다른 하나는 애니메이션 클립(Animation Clip) 이다.

 

여기서 애니메이션 클립의 역할은 시간(타임라인)에 따라 애니메이션 그래픽이 움직이는 모습들을 구현하고

 

애니메이터 컨트롤러는 그 애니메이션들을 동작하게 하는 조건이나 흐름들을 제어하는 역할을 수행하게 된다.

 

즉 둘 중 하나만 없어도 안되니, 유의 할 것.

 

 

 

위의 파일에서 예제로 보여줄 파일과 역할은 아래와 같다.

BA (컨트롤러) <- BA라는 캐릭터 애니메이션의 조건이나 흐름 제어

BA_Attack (애니메이션 클립) <- BA라는 캐릭터의 공격 애니메이션 클립

Default_Idle (애니메이션 클립) <- BA뿐만아니라 모든 캐릭터들의 대기 모션(Scale을 y축만 줄였다 높였다 하는 애니메이션)

 

이 예제의 모션은 한마디로 2가지 인데

대기 모션, 공격 모션 이 2가지이다.

 

이 모션에 대해 bool로 attack이라는 변수 조건을 하나 만들어서,

 

true일 경우 공격 모션, false 일 경우 대기 모션으로 지정해주는 방법을 그림으로 설명해주려 한다.

 

 

1. 먼저 BA 컨트롤러를 더블 클릭 한다.

 

그러면 위와 같이 Animator 창이 뜰텐데 1번 동그라미 안에 애니메이션의 흐름 들을 볼 수 있다.

그림과 같이 Entry 를 통해 BA_Idle 이라는 애니메이션 클립으로 연결된다.(나중에 이 BA_Idle은 Default_Idle로 바꿔주었으나 변경사항이 적용되서 보여주진 않음. 신경 안쓰고 넘어가도 됨)

 

2번 동그라미 안의 탭을 누른 후 3번 동그라미 안의 + 버튼을 누르면 어떤타입의 파라메터를 줄지 결정하게 되는데 이번 예제에서는 bool 파라메터를 눌러준 후 이름 명을 그림처럼 attack 로 지정해준다.

(참고로 이 attack 파라메터는 나중에 C# 스크립트에서 제어가 가능하다)

그래서 Default Idle State(스테이트는 여기서 하나의 항목이라고 생각하면 편함)을 오른쪽 마우스로 클릭하면

위 그림과 같이 Make Transition이라고 나오는데 클릭해주면

 

위와 같이 나오고, 반대로 BA_Attack 의 State도 오른쪽 마우스 - Make Transition을 통해 아래 그림처럼 완성 시켜준다.

 

이 상태에서 내려가는 화살표(Default_Idle -> BA_Attack)을 클릭하면

 

위와 같이 나오는데,

1번 동그라미 안의  Has Exit Time 체크박스를 해제해 준다.

왜냐면 이 예제의 경우 attack 이라는 조건이 달성되면 바로 애니메이션이 Idle 모션에서 Attack 모션으로 바껴야 하고 그 반대 상황도 마찬가지인데, 만약 Has Exit Time 버튼이 활성화 되있으면 바로 애니메이션이 전환되는 것이 아니라,

바뀌기전 애니메이션이 모두 끝난 후에야 바뀔 애니메이션으로 넘어가기 때문에 딜레이가 생겨서

게임 흐름이 자연스럽지 않기 때문이다.

때문에, 1번을 체크 해줘야 하고

 

2번 Condtions 부분에 + 버튼을 클릭하여 위의 그림처럼 attack 파라메터를 추가해주고 true 로 설정 해주면 완료된다

 

이처럼 왼쪽 Animator 창의 올라가는 화살표(BA_Attack -> Default_Idle)을 클릭해 준후

Has Exit Time 을 마찬가지로 풀어주고,

Conditions 는 attack으로 주되 값은 false로 지정해주면 된다.

 

위와 같이 하면 유니티에서의 세팅은 끝이고 C# 스크립트는 

public class Unit : MonoBehaviour
{
    public float _attackRange = 1.75f; // 캐릭터의 공격 사정거리
    public GameObject _enemyObj; // 적진영 캐릭터 (유니티에서 드래그 드랍으로 갖고오기)
    
    Animator _anim;

    void Start()
    {
        _anim = GetComponent<Animator>();
    }

    void Update()
    {
		CheckDistance(); // 거리 체크 함수 호출
    }


    }
    void CheckDistance() // 거리를 체크하는 함수
    {
        // 나와 적 캐릭터 간의 거리를 계산 해서, 설정된 공격범위 안에 들어오면 공격개시

        float pos1 = transform.position.x; // 내 캐릭터의 위치
        float pos2 = _enemyObj.transform.position.x; // 적 캐릭터의 위치

        float distance = Mathf.Abs(pos1 - pos2); // 두 캐릭터 간의 거리를 나타내는 메서드 ( 두 객체간의 x좌표 사이의 거리 )

        if (distance < _attackRange) // 나와 적 캐리터간의 거리가 공격범위 안에 들어오면
        {
            // 공격
            _anim.SetBool("attack", true);
        }
        else // 공격범위를 벗어나면
        {
            // 공격 애니메이션 해제
            _anim.SetBool("attack", false);
        }
    }
}

 

위와 같이 설정 해 주고, 유니티에서 한가지만 더 해주면 되는데 그건

 

적 캐릭터의 객체를 아래변수처럼 public으로 받았기 때문에 유니티에서 객체를 넣어줄 수 있다.

 public GameObject _enemyObj;

 

그래서 유니티 창으로 돌아가서 위 C# 스크립트를 적용할 오브젝트(객체, Hierarchy창에 있는 것, 예제의 경우 BA) 에

 

C# 스크립트를 컴포넌트로 추가해준 후, 그 컴포넌트의 _enemyObj 변수 부분에 적 캐릭터 객체 (예제의 경우 RA) 를 넣어주면 

 

애니메이션이 정상 작동된다.