/ UNITY

미니게임 제작 03

앞으로는 간단한 게임들을 만들어보며 추가적인 기능에 대해 공부를 해보려한다. 간단한 것부터 만들기 시작하여 만든 결과물을 레퍼런스 하여 덩치를 조금씩 키워나가는 과정을 밟아보자. 지식이 많지 않아 부족할 수 있지만, 하는데까지 해보겠다.

이전 포스팅에 이어서 애니메이션을 적용하는 스크립트를 짜보겠다.

C# 스크립트를 생성한다. 이름은 PlayerControl으로 한다.

플레이어 이동은 방향키를 통해 이동할 수 있게 할 것이며, 방향키를 뗀 즉시 멈추도록 할 것이다.

    Animator anim;
    anim = GetComponent<Animator>();

애니메이터 컴포넌트를 스크립트로 제어하기 위해 변수를 선언해주고, Start 메서드 안에 GetComponent를 통해 불러와준다.

//Animation
if (anim.GetInteger("vAxisRaw") != V)
{
    anim.SetInteger("vAxisRaw", (int)V);
    anim.SetBool("isChange", true);
}
else if (anim.GetInteger("hAxisRaw") != H)
{
    anim.SetInteger("hAxisRaw", (int)H);
    anim.SetBool("isChange", true);
}
else
{
    anim.SetBool("isChange", false);
}

MoveSet 메서드 안에 위와 같은 코드를 추가한다. 수직, 수평 값을 애니메이터의 파라미터에 적용시킨다.

game_31

애니메이션 적용된 모습을 테스트 해보았다.

약간의 문제가 있는데, 대각선 이동에 대한 애니메이션이 없고, 그 애니메이션 적용에 대해 뒤죽박죽으로 적용된다.

위, 아래로 이동하던 중에 좌, 우이동을 추가하여 대각선 이동하면 좌,우 이동 애니메이션이 나오고,

좌,우로 이동하던중에 위, 아래로 이동하면 위, 아래 애니메이션이 나온다.

이 부분을 대각선으로 이동할 때는 무조건 좌,우 애니메이션만 나타나게끔 수정 해보려고 한다

//Animation
if (anim.GetInteger("vAxisRaw") != V)
{
    if (anim.GetInteger("hAxisRaw") != 0)
    {
        anim.SetInteger("hAxisRaw", (int)H);
        anim.SetBool("isChange", true);
    }
    else
    {
        anim.SetInteger("vAxisRaw", (int)V);
        anim.SetBool("isChange", true);
    }
}
else if (anim.GetInteger("hAxisRaw") != H)
{
    anim.SetInteger("hAxisRaw", (int)H);
    anim.SetBool("isChange", true);
}
else
{
    anim.SetBool("isChange", false);
}

애니메이션 변동이, 각각의 애니메이터 파라미터 값이 변동될 때마다 바뀌기 때문에, 수직에 대한 파라미터가 변경될 때, 수평 이동 중이었는지, 아니었는지를 구분하여 각각의 파라미터를 조절해주면 될 거라고 생각했다.

game_32

수정후 적용된 화면이다. 대각선으로 이동할 때는 무조건 좌우 이동 애니메이션이 적용되는 모습이다.

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

public class PlayerControl : MonoBehaviour
{
    // rigidbody 선언
    Rigidbody2D playerRigidbody;
    float H;
    float V;

    public float speed = 8;

    Animator anim;

    void Start()

    {
        // rigidbody 컴포넌트 가져와 할당하기
        playerRigidbody = GetComponent<Rigidbody2D>();
        // Animator 컴포넌트 가져와 할당하기
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        MoveSet();
    }

    void FixedUpdate()
    {
        Move();
    }



    void MoveSet()
    {
        H = Input.GetAxisRaw("Horizontal");
        V = Input.GetAxisRaw("Vertical");

        //Animation
        if (anim.GetInteger("vAxisRaw") != V)
        {
            if (anim.GetInteger("hAxisRaw") != 0)
            {
                anim.SetInteger("hAxisRaw", (int)H);
                anim.SetBool("isChange", true);
            }
            else
            {
                anim.SetInteger("vAxisRaw", (int)V);
                anim.SetBool("isChange", true);
            }
        }
        else if (anim.GetInteger("hAxisRaw") != H)
        {
            anim.SetInteger("hAxisRaw", (int)H);
            anim.SetBool("isChange", true);
        }
        else
        {
            anim.SetBool("isChange", false);
        }

    }


    void Move()
    {
        Vector2 dirVec = new Vector2(H, V);

        playerRigidbody.velocity = dirVec * speed;
    }

}

전체 소스코드는 다음과 같다.

다음에는 적 유닛을 랜덤하게 생성해보도록 하자.