개발/게임 교육

게임 교육 7 - 캐릭터 애니메이션

이게될까 2023. 12. 28. 23:46
728x90
728x90

Window의 animation에서 애니메이션 설정을 한다.

애니메이션을 할 수 있는 공간이다.

애니메이션을 적용할 캐릭터를 선택 후 크리에이트를 누른다.

크리에이트를 누르면 아래와 같은 창이 뜬다.

여기서 우리는 새로운 파일을 만든다. 그 후 파일 이름을 Character_Idle 이렇게 만들고 저장을 누르면 새로운 창이 나온다.

sprite를 추가해준다.

이 모습은 서 있는 모습이므로 이 애니메이션은 이렇게 끝난다.

움직이는 모습을 만들기 위해 새로운 클립생성

같은 폴더 안에 새롭게 Character_Walk를 만들어 준다.

여기엔 1~ 7까지 넣어준다.

이제 이 두가지의 애니메이션을 이어줘야 한다.

animator를 선택해준다.
가장 처음에 만들어져서 디폴트로 되어 있다.

전환을 위해 Make Transition을 눌러주고 walk를 눌러주면 아래와 같은 그림이 나온다.

흰색 화살표를 클릭하면 이러한 화면이 나온다.

우린 터치가 끝나면 바로 움직일 것이기 때문에 Has Exit Time를 해제해준다. 

딜레이와 움직임 설정 시간도 바꿔준다.

이렇게 하면 바로 움직이는 것을 볼 수 있다.
parameters의 bool형이다.

움직이는 조건을 주기 위해 파라미터를 설정한다. 이름은 isWalk이다.

이렇게 나온다.

그럼 옆에 Condition에서 +를 눌러주게 되면 아래와 같은 화면이 나온다.

isWalk가 true면 바뀌는 것이다.

 이제 반대도 만들어 줘야 한다. 화살표도 반대로 하나 생성해준다.

위와 같이 설정해준다. 그리고 아까 걷는 모션이 너무 빨랐으므로 그것도 수정해준다. 

걷는 모션이 너무 빨랐으므로 스피드를 1에서 0.2로 줄여준다.

이제 isWalk를 스크립트 상에 집어넣어야 한다. playerCtrl을 수정한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick;

    Animator anim;

    public float speed;
    public bool isJoyStick;

    private void Start()
    {
        anim = GetComponent<Animator>();
        Camera.main.transform.parent = transform; //캐릭터 이탈 방지
        Camera.main.transform.localPosition = new Vector3(0, 0, -10);
    }
    private void Update()
    {
        Move();
    }
    
    // 캐릭터 움직임 관리
    void Move()
    {
        if (isJoyStick)
        {
            joyStick.SetActive(true);
        }
        else
        {
            joyStick.SetActive(false);

            // 상하좌우를 터치하여 움직이기

            //클릭했는지 판단.
            if (Input.GetMouseButton(0))
            {            // 좌클릭 누르고 있는 중 컴퓨터 모바일 다 해준다.
                Vector3 dir = (Input.mousePosition - new Vector3(Screen.width * 0.5f, Screen.height * 0.5f)).normalized; // 화면 정중앙을 빼서 얼마나 이동하는지를 노말 백터화 한다.

                transform.position += dir * speed * Time.deltaTime;

                anim.SetBool("isWalk", true);// 어떤 불값을 어떻게
            }
            else
            { // 이동하지 않을경우
                anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

            }
        }

    }
}

강의에서는 조이스틱이 아니라 화면 터치 기준으로 작성하여서 조이기준 스틱으로 코드를 변경했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 1. 스틱 드래그 + 제한 값 (스틱에 이벤트 트리거를 만들어줘야 한다.)
// 2. 드래그한 만큼 캐릭터를 이동

public class JoyStick : MonoBehaviour
{
    public RectTransform stick, backGround; // 큰원의 반지름을 받아온다.
    PlayerCtrl playerCtrl_script;
    bool isDrag;
    float limit;
    Animator anim;


    public void Start()
    {
        anim = GetComponent<Animator>();

        playerCtrl_script = GetComponent<PlayerCtrl>();
        limit = backGround.rect.width * 0.5f;
    }
    public void Update()
    {
        // 드래그 하는 동안
        if (isDrag)
        {// 스틱의 위치를 마우스로 가져간다.
            //stick.position = Input.mousePosition;
            Vector2 vec = Input.mousePosition - backGround.position; // 큰 동그라미 기준으로 계산한다.
            stick.localPosition = Vector2.ClampMagnitude(vec, limit);

            Vector3 dir = (stick.position - backGround.position).normalized;
            transform.position += dir * playerCtrl_script.speed * Time.deltaTime;

            anim.SetBool("isWalk", true);// 어떤 불값을 어떻게

            // 드래그 끝나면
            if (Input.GetMouseButtonUp(0))
            {// 터치가 끝났을 때
                stick.localPosition = new Vector3(0, 0, 0);
                //로컬 포지션은 부모(조이스틱)으로 부터의 위치

                isDrag = false;
            }
        }
        else
        {
            anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

        }
    }
    //스틱을 누르면 호출 될 함수
    public void ClickStick()
    {
        isDrag = true;
    }

}

이렇게 움직일 때 애니메이션이 활성화 되는 것을 볼 수 있다.

그러나 계쏙 오른쪽만 보고 있따. 왼쪽이동인지 오른쪽 이동인지 판단해야한다. 그러나 강의에서 계속 터치기준이라서 일단 조이스틱을 아래와 같이 지운다.

is Joy Stick를 해제해 준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick;

    Animator anim;

    public float speed;
    public bool isJoyStick;

    private void Start()
    {
        anim = GetComponent<Animator>();
        Camera.main.transform.parent = transform; //캐릭터 이탈 방지
        Camera.main.transform.localPosition = new Vector3(0, 0, -10);
    }
    private void Update()
    {
        Move();
    }
    
    // 캐릭터 움직임 관리
    void Move()
    {
        if (isJoyStick)
        {
            joyStick.SetActive(true);
        }
        else
        {
            joyStick.SetActive(false);

            // 상하좌우를 터치하여 움직이기

            //클릭했는지 판단.
            if (Input.GetMouseButton(0))
            {            // 좌클릭 누르고 있는 중 컴퓨터 모바일 다 해준다.
                Vector3 dir = (Input.mousePosition - new Vector3(Screen.width * 0.5f, Screen.height * 0.5f)).normalized; // 화면 정중앙을 빼서 얼마나 이동하는지를 노말 백터화 한다.

                transform.position += dir * speed * Time.deltaTime;

                anim.SetBool("isWalk", true);// 어떤 불값을 어떻게

                //왼쪽으로 이동
                if (dir.x < 0)
                {
                    transform.localScale = new Vector3(-1, 1, 1);
                }
                else
                {
                    //오른쪽으로 이동
                    transform.localScale = new Vector3(1, 1, 1);

                }

            }
            else
            { // 이동하지 않을경우
                anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

            }
        }

    }
}

dir로 얻은 백터를 기준으로 모습을 변경해준다.

왼쪽을 누르면 오른쪽을 보는 모습이 잘 해결 되었다. 그런데 강의에서 바로 조이스틱으로 만드네요,....

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 1. 스틱 드래그 + 제한 값 (스틱에 이벤트 트리거를 만들어줘야 한다.)
// 2. 드래그한 만큼 캐릭터를 이동

public class JoyStick : MonoBehaviour
{
    public RectTransform stick, backGround; // 큰원의 반지름을 받아온다.
    PlayerCtrl playerCtrl_script;
    bool isDrag;
    float limit;
    Animator anim;


    public void Start()
    {
        anim = GetComponent<Animator>();

        playerCtrl_script = GetComponent<PlayerCtrl>();
        limit = backGround.rect.width * 0.5f;
    }
    public void Update()
    {
        // 드래그 하는 동안
        if (isDrag)
        {// 스틱의 위치를 마우스로 가져간다.
            //stick.position = Input.mousePosition;
            Vector2 vec = Input.mousePosition - backGround.position; // 큰 동그라미 기준으로 계산한다.
            stick.localPosition = Vector2.ClampMagnitude(vec, limit);

            Vector3 dir = (stick.position - backGround.position).normalized;
            transform.position += dir * playerCtrl_script.speed * Time.deltaTime;

            anim.SetBool("isWalk", true);// 어떤 불값을 어떻게
            //왼쪽으로 이동
            if (dir.x < 0)
            {
                transform.localScale = new Vector3(-1, 1, 1);
            }
            else
            {
                //오른쪽으로 이동
                transform.localScale = new Vector3(1, 1, 1);

            }
            // 드래그 끝나면
            if (Input.GetMouseButtonUp(0))
            {// 터치가 끝났을 때
                stick.localPosition = new Vector3(0, 0, 0);
                //로컬 포지션은 부모(조이스틱)으로 부터의 위치

                isDrag = false;
            }
        }
        else
        {
            anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

        }
    }
    //스틱을 누르면 호출 될 함수
    public void ClickStick()
    {
        isDrag = true;
    }

}

조이스틱 코드 입니다.

 

728x90