-
안녕하세요.
오랜만에 MestalSlug 모작 프로젝트를 업데이트하러 들어왔습니다.
Player가 발사할 총알과
원하는 시간에 맞춰 발사를 구현 할 예정입니다.
총알은 머신건으로 시각적 효과를 줄 것이며
이미지를 무료로 다운로드하였습니다.
바로 제작 과정을 보겠습니다!
가장 먼저 이미지의 Typ과 Mode를 바꿔 주었습니다.
Type은 2D에서 제작을 할 것이기에 Sprite(2D and UI)로 바꿔 주었으며
Texture Type은 존재하지만 기본값인 default 나
텍스처가 2D 게임에서 Sprite로 사용할 경우 권장 등 많은 Type들이 있습니다.
Sprite Mode는 Multiple로 여러 개의 Sprite를 갖게 해 주었습니다.
Sprite Mode는 3가지 타입이 존재하며
(single, Multiple, Polygon)
single : 한 개의 수프 라이트
Multiple : 여러 개의 스프라이트
Polygon : 4 각형뿐만 아니라 원 삼각형 오각형 등의 모양을 지원
(아직 Polygon은 안 써봤습니다.)
이후 Sprite editor에 들어가서 Slice를 해주었습니다.
스프라이트로 애니메이션을 만든 Bullet은 프리팹화를 시켜 놓았습니다.
처음에는 Bullet의 애니메이션의 Event를 생성해 발사를 해 주려고 했었습니다.
하지만 이렇게 조건을 걸어 줬을 시 총을 앞으로 발사할 때는 괜찮지만
위로 발사하거나 아래로 발사를 하게 되어도 Vector2.right의 방향으로 가게 되었고,
다른 조건을 걸어 줄 필요가 있었습니다.
그리 하여 Bullet은 무조건 생성이 되면 앞으로 가는 동작을 하게끔 만들었으며
Event를 삭제해 주는 걸로 조건을 Event를 걸어주지 않았습니다.
또 한 발사 모션인 앞, 위, 아래 방향은 각 애니메이션에서 Event를 추가해 담당해 주기로 했습니다.
(추가 적으로 계속 테스트를 해본 결과 앞의 애니메이션 동작 부분은 필요가 없기에 두 가지 모션만 쓰기로 했습니다.)
이후 플레이어의 상체에 새로운 스크립트를 생성해 입혀 주어 각 애니메이션에 Event를 걸어 주었습니다.
선언 변수부터 보겠습니다.
Bullet : 프리팹화 된 총알입니다.
bulletPosition : 앞 발사 시 총알이 생성될 위치입니다.
bulletPositionUp : 위 발사 시 총알이 생성될 위치입니다.
bulletPositionDown : 아래 발사 시 총알이 생성될 위치입니다.
각 애니메이션의 위치에 맞게 빈 오브젝트를 플레이어 상체에 자식으로 붙여 주어
플레이어를 따라가게 만들었습니다.
각 검은색 원의 위치가 각 발사될 위치인데
빈 오브젝트라 보이지 않기에, 시각화를 해 주려고 스크립트를 입혀 주어
알아볼 수 있게 해 주었습니다.
검은 원 (시각화) OnDrawGizmos입니다. 한번 생성을 해 두었더니 재활용으로 잘 사용하고 있습니다.
계속해서 Attack_F 스크립트를 보겠습니다.
OnFire() : 플레이어가 앞 발사 모션을 할 때 Event로 실행될 함수입니다.
OnFireUp() : 플레이어가 위 발사 모션을 할 때 Event로 실행될 함수입니다.
OnFireDown() : 플레이어가 아래 발사 모션을 할 때 Event로 실행될 함수입니다.
OnKnife() : 플레이어가 칼 공격을 할 때 Event로 실행될 함수입니다.
간단히 제어를 하기 위해 GameObject fire 변수를 선언하였으며
fire 변수에 Instantiate(생성될 오브젝트, 위치)로 생성을 해 주었습니다.
fire.transform.SetParent(null)로 해준 이유는,
생성된 Bullet이 플레이어에게 계속 붙어 있을 경우, 총을 발사한 뒤 플레이어가 점프를 뛰면
이미 나간 총알이 플레이어를 따라서 위치가 바뀌기에 SetParent로 bullet의 부모를 null로 바꿔주었습니다.
또한 앞 발사 모션이 아닐 시에는 총알이 위로 향하거나 앞으로 이동되어야 합니다.
이동의 방향을 제어하는 것이 아닌 총알의 회전 값을 바꿔 주어 총알의 이동하는 방향이 바뀌는 것처럼 해 주었습니다.
fire.transform.rotation = Quaternion.Euler(0, 0, 90f)
사용된 함수는 Quaternion.Euler이며, 오일러 각을 쿼터니언으로 변경시켜 주는 함수입니다.
주의 까진 아니지만, Event를 해 줄 함수들은 앞에 public을 붙여 주어야 설정을 할 수 있습니다.
(public을 깜빡하고 왜 안 뜨지? 하는 저 같은 실수는 하지 마시길...)마지막으로 각 애니메이션 동작에 맞게 이벤트를 걸어 주시면!
원하는 동작에 Bullet이 생성이 됩니다.
무한 생성되어 있는 상태면 안되니
time값을 정해 주어 함수를 지연 후 실행시켜주는 Invoke 함수로 Destroy(gameObject)해주는
이 스크립트를 bullet에 넣어 주었습니다.
00 : 17초 현재 고민거리가 있는데.. 가장 큰 게 플레이어가 앞 발사 모션을 하면서 위 발사 모션을 할 시
Bullet이 위, 아래 나뉘어 있는 것이 아닌 자연스럽게 총알이 올라가는 것을 구현하고 싶은 점입니다.
모션을 더 추가해도 원하는 동작 연출이 안돼서.. 아직 영상들을 많이 찾아봐야겠습니다.
또한 해야 할 점은 아직 많이 남았지만, 총알을 오브젝트 풀로 관리를 하는 방식, 적 구현과 맵 구현 등등 남은 듯합니다.
감사합니다.
'연습 프로젝트 > 2D.Metal Slug' 카테고리의 다른 글
2D.MetalSlug 06. Manager (0) 2022.05.07 2D.MetalSlug 05. Map 02 / 02 (0) 2022.05.01 2D.MetalSlug 04. Map 01 / 02 (0) 2022.04.27 2D.MetalSlug 02. Player 이동 구현 (0) 2022.04.20 2D.MetalSlug 01. Intro 영상 (0) 2022.04.11