2023. 9. 8. 23:54ㆍ내일배움캠프 Unity
오늘 학습한 것
- 게임개발 입문 개인과제 : 언데드 서바이벌(뱀서라이크)
1. 스프라이트 관리
2. 키보드 입력 관리, 플레이어 이동
3. 방향 바라보기
4. 플레이어 애니메이션과 애니메이션 재활용
5. 타일 그리기, 재배치
6. 카메라 설정(카메라 플레이어 따라가기, pixelPerfectCamera)
7. 몬스터 만들기, 플레이어 제작, 몬스터 재배치
8. 오브젝트 풀링, 주변에 생성하기
0. 사용한 에셋
캐릭터 및 타일 스프라이트 등 이미지는 에셋 스토어를 이용하였다.
1. 스프라이트 관리
준비된 스프라이트 이미지를 나누어준다(Slice)
이후 나누어진 이미지에 각자 이름을 부여하여 관리
2. 키보드 입력 관리, 플레이어 이동
입력을 받아 해당하는 방향으로 이동하는 메소드. InputAction에서 설정한 값과 연계되어
w : 위, s : 아래, a : 왼쪽, d : 오른쪽의 방향값을 얻는다.
PlayerController.cs에서 OnMove함수를 통해 Vector2 방향값을 가져와 FixedUpdate에서 Player의 rigidbody에 접근해
위치를 이동시킨다.(MovePosition)
여기서 물리 관련 함수인 FixedUpdate와 Time.fixedDeltaTime을 알게 되었다. 기능은 기존의 것과 같다.
3. 방향 바라보기
spriter = GetComponent<SpriterRenderer>();
오른쪽으로 갈 때 => inputVec.x가 0보다 크므로 flipX = false => flipX를 실행하지 않음(기본이 오른쪽을 보는 이미지)
왼쪽으로 갈 때 => inputVec.x가 0보다 작으므로 filpX=true => flipX를 실행함(왼쪽을 보게 됨)
4. 플레이어 애니메이션과 애니메이션 재활용
Speed(float)와 Dead(trigger) 파라미터를 만들고 Speed가 0.1보다 클때와 작을때를 기준으로 Stand와
Run 애니메이션 발생
Animator Override Controller를 사용해 같은 로직의 다른 스프라이트를 사용한 애니메이션을 많이 만들 수 있음.
5. 타일 그리기, 재배치
RuleTile의 Output-Random으로 설정하여 Size 안에 있는 Tile들을 랜덤으로 그려줌
확률 및 점유율을 조절하기 위해 원하는 수만큼 같은 타일을 넣는것도 방법이며 Noise를 조절하며 원하는 맵을 제작
Brush 종류를 Line Brush로 변경하면 시작점과 끝점을 클릭했을 때 사이를 모두 채워준다.
Line Brush로 테두리를 만들고 Paint툴을 사용해 안을 메운다.
재배치란 메모리를 아끼기 위한 방법으로 타일맵을 크게 4개로 묶어 관리한다.(왼위, 왼아, 오위, 오아)
플레이어에 Area라는 Collider만 가진 오브젝트를 만들어 주고 충돌하지 않도록 IsTrigger를 체크해준다.
Area를 벗어난 Tilemap은 플레이어가 벗어난 방향의 앞쪽으로 위치를 이동시켜 무한한 맵을 구현한다.
* 위의 코드에서 Translate(.. * .. * 40) 중 40을 곱한 이유는 하나의 타일맵 크기가 20이므로 하나의 타일맵을 건너뛰어
배치해 주기 위해 그 2배 값인 40을 곱한것이다.
6. 카메라 설정(카메라 플레이어 따라가기, pixelPerfectCamera)
Input Controller와 같이 Package Manager에서 "Cinemachine"을 import받는다.
Hirearchy에 Cinemachine - VirtualCamera를 만들어준다.
만들어주면 MainCamera에 CinemachineBrain이라는 컴포넌트가 생기고 VirtualCamera와 연결된다.
VirtualCamera는 카메라 감독에 해당하는 오브젝트로 생각하면 되며 Fllow를 플레이어로 설정하면 MainCamera가
플레이어를 따라다녀 플레이어를 중심으로 시점이 이동하는 것이 구현된다.
7. 몬스터 만들기, 플레이어 제작, 몬스터 재배치
먼저 플레이어와 같이 애니메이션을 Override 해준다. 새로운 몬스터를 추가할때도 Override를 이용하면 쉽다.
EnemyController.cs를 만들어 플레이어와 자신의 위치 차이 및 방향값을 구하고 MovePosition을 이용해 플레이어를
추적한다. 플레이어와 부딪혔을때 반동으로 속도가 조절되지 않도록 Rigidbody.velocity = Vector2.zero를 추가하였다.
플레이어와 같이 flipX를 적용하되 자신의 위치가 플레이어 위치보다 좌 / 우측일때 flipX를 실행하도록 했다.
이후 몬스터 또한 타일맵과 같이 너무 멀어지면 재배치를 통해 플레이어를 압박하도록 한다.
8. 오브젝트 풀링, 주변에 생성하기
몬스터를 프리팹화 하고 몬스터를 생성하는 Pool을 관리하고 몬스터 프리팹들을 보관하는 PoolManager.cs와
몬스터를 생성할 Spawner.cs를 만들고 PoolManager의 prefabs 배열에 기존 프리팹들을 넣어준다.
timer > 1f => 1초마다 Spawn()을 실행해 랜덤 spawnPoint.position에서 몬스터를 생성한다.
Spawner는 여러 포인트를 미리 플레이어 주변에 뿌려둔다. 이 때 몬스터가 화면 바깥에서 몰려오는 느낌을 살리기
위해 카메라 바깥에 포인트를 두었다.
!최종 결과물!
'내일배움캠프 Unity' 카테고리의 다른 글
[내일배움캠프 TIL] 22. 코루틴(coroutine) 개념 익히기 (0) | 2023.09.13 |
---|---|
내일배움캠프 (Unity_8기) TIL 21일차 (0) | 2023.09.11 |
내일배움캠프 (Unity_8기) TIL 18일차 (0) | 2023.09.05 |
내일배움캠프 (Unity_8기) TIL 17일차 (0) | 2023.09.04 |
내일배움캠프 (Unity_8기) TIL 16일차 (0) | 2023.09.01 |