Home [Unity] 유니티 첫 게임 - 닌자
Post
Cancel

[Unity] 유니티 첫 게임 - 닌자

1. 개요

Unity로 개발한 첫 게임에서 구현한 닌자 몬스터를 소개한다.

사용한 에셋은 Ninja Sprite Sheet이며 유니티 에셋 스토어에서 무료로 구할 수 있다.
참고로 스킬, 이동, 체력 관리는 모두 직접 코딩해야 한다. 에셋에는 스프라이트 관련 파일만 존재한다.

구현된 닌자 몬스터의 특징은 다음과 같다.

  • 플레이어가 도망칠 수 없을 정도의 굉장히 빠른 이동속력
  • 높은 점프력(추후 업데이트 함)
  • 굉장히 짧은 주기로 스킬 사용
  • 강한 공격력과 약한 방어력
  • 사망 시 시간 경과에 따른 투명 처리(에셋에 사망 애니메이션이 존재하지 않음)

2. 움직임

이동

플레이어가 감지 되었을 때 장애물을 피해 플레이어의 위치를 추적하여 이동하는 처리는 A* Pathfinding Project 유니티 에셋을 활용했다. A* Pathfinding Project 에셋에서 제공하는 API를 활용해 움직이는 처리는 직접 코딩했다. 기본적인 아이디어와 활용법은 2D PATHFINDING - Enemy AI in Unity에서 얻었다.

아래는 닌자의 이동 장면이다.

닌자 이동

위 장면을 보면 알 수 있듯이 상당히 빠른 속력으로 플레이어에게 접근한다. 플레이어는 닌자를 죽이지 않으면 사실상 벗어날 수 없다.
이 때 원으로 된 파란색 영역빨간색 영역이 있는데, 파란색 영역은 몬스터의 이동속력이 느려지는 영역이며 빨간색 영역은 정지하는 영역이다. 참고로 이동은 등속이 아닌 가속 이동으로 구현했다.

3. 점프

플레이어가 감지 되었을 때 이동 과정 중에 장애물이 있거나 플레이어가 높이 점프하는 등 점프를 해야만 플레이어에게 도달할 수 있을 때 점프를 시도한다.

점프를 위한 전처리

점프를 무작정 해서는 안되기 때문에 제약조건을 주었다. 아래는 점프를 하기 위한 조건을 체크하는 과정이다.

점프 필터링

점프는 여러 필터링을 거쳐 실행이 되기 떄문에 다소 연산이 비싸다. 아래는 사용된 필터링 중 일부이다.

  • 지면에 닿아있어야 한다.
  • 타겟까지의 변위와 다음 경로까지의 변위의 $x$성분의 방향이 같아야 한다.
  • 전방에 장애물이 없고 걸어갈 시 밟을 수 있는 지면이 없을 떄 다음 경로가 점프를 위한 최소 높이보다 낮게 위치하면 점프를 실행하지 않는다.
  • 플랫폼 사이를 점프 시 천장과 충돌 위험이 있을 경우 점프를 실행하지 않는다.

포물선 구성

위 필터링이 끝나면 점프를 위한 포물선 궤적을 그려 포물선 궤적 사이에 장애물 존재 여부와 장애물 특성을 검사해 점프 가능 여부를 조사한다. 아래는 포물선의 구성 요소이다.

  • 포물선의 시작점은 객체의 position이다.
  • 포물선의 꼭짓점의 $x$성분은 다음 경로까지의 변위의 $x$성분이고, $y$성분은 점프 시 최대 높이이다.
  • 끝점은 시작점과 포물선의 꼭짓점까지의 $x$성분의 거리의 2.5배 떨어진 포물선 위의 점이다.

포물선 궤적의 레이캐스트

위에서 구성한 포물선 궤적의 레이캐스트를 발사한다. 각 점에서의 레이캐스트의 방향은 포물선 위의 점에서의 접선 벡터 방향이다. 연산을 줄이기 위해 점을 최대한 적게 사용했다. 아래는 포물선 궤적의 레이캐스트를 발사한 방법이다.

  • 포물선 위의 임의의 점에서 접선벡터 방향으로 레이캐스트를 쏘기 위해 포물선을 접선을 이용해 근사화했다. 각 점에서 접선을 그릴 시 그 접선은 인접한 점에서 그린 접선과 교차한다. 즉, 포물선은 실제 포물선 위의 점과 각 접선의 교점들로 구성된다.
  • 점과 점사이의 레이캐스트를 사용하기 위해 Physics2D.Linecast() 메서드를 사용했다.
  • 레이캐스트를 쏘면서 장애물이 감지 될 시 충돌한 장애물의 법선 벡터를 확인한다. 착지해도 무리가 없는 법선벡터를 가진 장애물이라면 점프를 시도 한다. 나는 Vector2.up과 법선벡터가 이루는 각이 45도 이하일 때 점프를 실행하도록 했다.

점프 실행

위 전처리를 거치면 실제로 점프를 하기 위해 힘을 가한다. 힘을 가하는 원리와 알고리즘은 포물선 운동(점프) 구현에서 자세히 확인할 수 있다.

점프 장면

위 알고리즘을 적용한 점프 장면은 아래와 같다.

점프

위 장면에서 레이캐스트를 포물선 형태로 쏘는 모습을 빨간색으로 나타냈다. 포물선 궤적으로 점프 하는 모습을 볼 수 있다. 몰론 점프 중에도 닌자는 플레이어를 따라서 $x$방향으로 이동 중이기 때문에 실제 궤적과는 약간 다른 움직임을 가진다.

4. 스킬

스킬은 총 3개이며 모두 원거리 공격이다. 에셋에 근접 공격과 관련한 여러 좋은 애니메이션들이 있는데 구현하기 귀찮아서 원거리 공격만 구현했다. 다만 닌자 특성 상 빠르게 플레이어에게 접근하기 때문에 시간적인 여유가 있다면 근접 공격도 구현해볼 생각이다. 추후 닌자 스킬이 추가된다면 이 포스트를 업데이트 하겠다.

나는 스킬 시스템을 구축할 때 적의 모든 공격을 스킬로 취급했다. 즉 기본 공격, 근접 공격, 원거리 무기 공격, 마법 스킬 등의 공격 종류에 관계 없이 모두 스킬이다.

기본 공격

기본 공격은 표창 1개를 플레이어를 향해 날린다. 다만 표창은 에셋 내에 포함되어 있지 않기 때문에 직접 다른 곳에서 구해야 한다. 나는 구글링 하다가 한 사이트에서 무료 라이센스이면서 상업적 용도로도 사용 가능한 표창 이미지를 구해 이용했다. 어디서 구했는지는 잊어버려서 링크 공유는 어려울 듯 싶다. 추후 발견하면 포스트를 업데이트하겠다.

이 스킬을 사용할 때 다음과 같은 특징을 고려해야 한다.

  • 플레이어의 위치를 추적할 수 있어야 한다.
  • 표창을 생성하고 플레이어의 위치를 향해 발사해야 한다.
  • 표창 충돌 시 플레이어에게 데미지를 가해야 한다.

위 특징에 따라 표창을 날리는 스킬 발동은 Ninja 오브젝트에서 담당하고 데미지를 가하는 처리는 포창 오브젝트에서 담당했다.

아래는 기본 공격 스킬 사용 장면이다.

기본 공격

3표창

이 스킬은 기본 공격을 발전시킨 원거리 공격이다. 표창 3개를 동시에 날리는 스킬이다. 특징은 아래와 같다.

  • 기본 공격보다 사거리가 짧고 데미지가 약간 낮다.
  • 발사 시 플레이어를 향해 3개의 표창이 동일한 방향으로 평행하게 발사된다.
  • 표창 생성 시 발사 방향에 수직인 방향으로 생성된다.

아래는 3표창 스킬 사용 장면이다.

3표창

연속 표창

이 스킬은 일정 시간 동안 기를 충전한 후 표창 5개를 순차적으로 발사하는 하이 리스크 하이 리턴형 스킬이다. 특징은 아래와 같다.

  • 기충전 시 어떤 동작도 할 수 없으며 기충전 애니메이션이 재생된다.
  • 기충전 동안 표창을 일정 시간 간격으로 생성한다. 생성 위치는 닌자가 바라보는 방향을 기준으로 바로 앞 3개, 생성된 표창 3개의 앞에 다시 2개를 생성해 총 5개를 생성한다.
  • 표창 5개를 일정 시간 간격으로 플레이어를 향해 날린다.
  • 상당히 데미지가 강하고, 유효 사거리가 길다.

아래는 연속 표창 스킬 사용 장면이다.

연속 표창

5. 전투

닌자 하나로도 상당히 강력하지만 닌자가 여러 명일 경우 파괴력이 어마무시하다. 닌자의 특징은 1. 개요에서 언급했듯이 이동속력이 굉장히 빠르고, 스킬 사용 텀이 상당히 짧다. 닌자는 플레이어를 향해 빠르게 접근해 여러 스킬을 지속적으로 사용하며 위력 또한 상당히 높다. 다만 그만큼 방어력은 낮다. 하지만 그럼에도 밸런스를 깨기에는 충분하기에 실제 게임 필드 내에는 적게 존재하는 것이 적절하다.

아래는 플레이어가 3명의 닌자 몬스터와 전투하는 장면이다.

전투

This post is licensed under CC BY 4.0 by the author.

[Unity] 유니티 첫 게임 - 미니 보스

[Unity] 포물선 운동(점프) 구현