미니게임 제작 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 메서드 안에 위와 같은 코드를 추가한다. 수직, 수평 값을 애니메이터의 파라미터에 적용시킨다.
애니메이션 적용된 모습을 테스트 해보았다.
약간의 문제가 있는데, 대각선 이동에 대한 애니메이션이 없고, 그 애니메이션 적용에 대해 뒤죽박죽으로 적용된다.
위, 아래로 이동하던 중에 좌, 우이동을 추가하여 대각선 이동하면 좌,우 이동 애니메이션이 나오고,
좌,우로 이동하던중에 위, 아래로 이동하면 위, 아래 애니메이션이 나온다.
이 부분을 대각선으로 이동할 때는 무조건 좌,우 애니메이션만 나타나게끔 수정 해보려고 한다
//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);
}
애니메이션 변동이, 각각의 애니메이터 파라미터 값이 변동될 때마다 바뀌기 때문에, 수직에 대한 파라미터가 변경될 때, 수평 이동 중이었는지, 아니었는지를 구분하여 각각의 파라미터를 조절해주면 될 거라고 생각했다.
수정후 적용된 화면이다. 대각선으로 이동할 때는 무조건 좌우 이동 애니메이션이 적용되는 모습이다.
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;
}
}
전체 소스코드는 다음과 같다.
다음에는 적 유닛을 랜덤하게 생성해보도록 하자.