개요
개인과제 - 탑뷰 게임 클론 2D 게임 개발하기
이번 스파르타 강의의 개인과제는 2D 게임 개발하기인데 1번 요구사항을 보자마자 고민에 빠졌다.
에셋을 써서 한다면 되게 간단하고 빠르게 개발을 할 수 있겠지만 이번 개인과제만큼은 내꺼라는 느낌을 가지고싶었기 때문이다.
사실 캐릭터를 만드는 것 자체가 시간이 오래 걸리기때문에 마감 시간을 못지킬까봐 고민을 했지만 이왕 만드는거 다른 사람들 게임과 차이점을 줘보자 하고 다들 열심히 게임을 만들때 캐릭터를 찍고 있었다..
괜찮아... 당당해져도돼.. 넌 귀여우니깐..
필수요구사항은 어느정도 끝내고 이제 선택 위주로 만들면 되기때문에 조금은 여유롭게 개발을 한 것 같다.
하면서 시간이 제일 오래 걸렸던 부분은 애니메이션을 넣는 부분이였는데.
내가 전에 개발할때는 Player 오브젝트 밑에 상황별 오브젝트를 넣어 스프라이트와 애니메이션을 각각 적용시킨다음에 하나가 켜지면 나머지는 비활성화가 되는식으로 진행했었다.
하지만 이렇게 하는건 굉장히 비효율적이라는 생각이 들었고 어떻게하면 이걸 해결할 수 있을까 생각을 하다가 첫번째 미니프로젝트에서 사용했던 애니메이터 Bool 파라미터로 뒤집기를 연출했던게 생각나서 그렇게 해보자! 하고 도전했다
.
Animator
> 지금 생성해둔 애니메이션은 총5개로
1. 아무 행동도 하지않았을때 서있는 WalkStand,
2. 위로 올라갈때 뒷면이 보이는 WalkUp,
3. 밑으로 내려갈때 정면을 바라보는 WalkDown,
4. 좌우를 볼때 WalkLeft와 WalkRight가 있다.
> 파라미터는 어떤 방향을 눌렀는지 판단할 int 자료형의 Direction과 누르고 있는 상태인지 아닌지 여부를 판단할 Bool 자료형의 IsWalk 파라미터를 생성했다.
방향은 총 4개로 0, 1, 2, 3으로 조건을 판단하면 된다.
> Conditions에서 조건을 어떻게 줄 것인지 설정하면 되는데 서있는상태에서 Down을 실행하는 조건을 확인하면
IsWalk가 True (키보드에 입력값이 있을때) 이고
Direction이 1일때 실행
반대 화살표는 그 반대로 설정해주면 된다.
> 애니메이션 확인
코드
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerInputController : TopDownController
{
private new Camera camera;
private Animator animator;
private int direction; // 방향을 나타내는 변수
private bool isWalk; // 플레이어가 움직이는지 여부
public Sprite upSprite; // 애니메이션 파라미터 0
public Sprite downSprite;// 애니메이션 파라미터 1
public Sprite leftSprite;// 애니메이션 파라미터 2
public Sprite rightSprite;// 애니메이션 파라미터 3
private SpriteRenderer spriteRenderer;
private void Awake()
{
camera = Camera.main; // mainCamera 태그에 붙어있는 카메라를 가져온다.
animator = GetComponent<Animator>();
spriteRenderer = GetComponent<SpriteRenderer>();
}
// 움직임이 없을 때
private void FixedUpdate()
{
if (!isWalk)
{
animator.SetBool("IsWalk", false);
}
}
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
if (moveInput != Vector2.zero)
{
isWalk = true;
direction = GetDirection(moveInput);
UpdateAnimation();
}
else
{
isWalk = false;
animator.SetBool("IsWalk", false); // 가만히 있는 상태
}
// 움직임 이벤트 호출
CallMoveEvent(moveInput);
}
private int GetDirection(Vector2 moveInput)
{
if (Mathf.Abs(moveInput.y) > Mathf.Abs(moveInput.x))
{
if (moveInput.y > 0) return 0;
else return 1;
}
else
{
if (moveInput.x < 0) return 2;
else return 3;
}
}
// 애니메이션 업데이트
private void UpdateAnimation()
{
animator.SetInteger("Direction", direction);
animator.SetBool("IsWalk", isWalk);
// 방향에 따라 스프라이트 설정.. 근데 잘 안됨
switch (direction)
{
case 0:
spriteRenderer.sprite = upSprite;
break;
case 1:
spriteRenderer.sprite = downSprite;
break;
case 2:
spriteRenderer.sprite = leftSprite;
break;
case 3:
spriteRenderer.sprite = rightSprite;
break;
}
}
public void OnLook(InputValue value)
{
Vector2 newAim = value.Get<Vector2>();
Vector2 worldPos = camera.ScreenToWorldPoint(newAim);
newAim = (worldPos - (Vector2)transform.position).normalized;
CallLookEvent(newAim);
}
}
기능 영상
해결하지 못한 것
애니메이션이 끝난 후 기존에 설정되어있는 스프라이트로 돌아가는 문제가 생긴다.
(어디 방향으로 이동하든 애니메이션이 끝나면 제일 처음 설정해놨던 스프라이트로 변경됨)
그걸 고치려고 코드에 스프라이트 변수도 넣어놓고 해봤는데 아직은 잘 안되는 것 같다.
애니메이션이 끝난 후 이벤트 함수를 호출해서 해보는것도 했는데 그것도 안되는걸로 봐서는 어디서 중첩이 생겼거나 한 것 같다.
내일 더 열심히 고쳐봐야겠다. 오늘은 정의, 어떻게 하는지보다는 내 공부 내용 위주로 올려서 아마 나중에 유니티 카테고리로 한번 더 올라올 수 있다.
끝~
'Record > TIL' 카테고리의 다른 글
[Unity] 탑다운뷰 게임 개인프로젝트 마무리 (2) | 2024.05.14 |
---|---|
[Unity] 스크롤뷰 사용해서 참석인원 불러오기 (1) | 2024.05.13 |
[Unity] Input system package 사용하기 (New Input Manager) (2) | 2024.05.09 |
[Unity] Input.GetAxis (ps.WASD상하좌우 기본 컨트롤하기) (4) | 2024.05.08 |
[Unity] 팀프로젝트 던전 마무리 (2) | 2024.05.07 |