[Unity] 3주차 - 고양이 밥주기

MINO·2024년 3월 22일

게임 개발 종합반

목록 보기
3/6
post-thumbnail

2024-03-22
다양한 Sprite 와 물리 법칙에 사용되는 Rigidbody 2D, Collider 2D 의 특징에 대해 알아보았다. RPG 게임에서 자주 쓰이는 HP바의 간소화된 버전인 포만감 게이지바를 만들어보았다.

Update() 와 다른 함수에서 같은 변수를 참조할 때, 시간 차이가 발생하는 것을 방지하기 위해 bool 변수를 통해 제어하는 방법을 배웠다.

2D Object

게임 오브젝트는 Unity의 기초적인 오브젝트로 캐릭터, 소품, 배경을 나타낸다.
독자적으로 많은 것을 하기보다는 실질적 기능을 수행하는 컴포넌트의 컨테이너 역할을 한다.


Sprite

Unity 프로젝트의 에셋 타입 중 하나. ( 2D 그래픽 오브젝트 )

  • 기본 Sprite 크기는 256 × 256 픽셀.
    • Capsule 크기는 256 × 512 픽셀, Isometric Diamond 크기는 256 × 128 픽셀.

9-Sliced

크기가 1×1 단위인 모서리가 둥근 사각형

Hexagon Flat-Top

폭이 1 단위인 정육각형

Hexagon Pointed-Top

높이가 1 단위인 정육각형

Isometric Diamond

크기가 1×0.5 단위인 다이아몬드


9-slicedHexagon Flat-TopHexagon Pointed-TopIsometric Diamond
육각형 Flat-Top 타일맵육각형 Pointed-Top 타일맵


Physics

런타임 시점에 움직임의 유무로 동적 게임 오브젝트, 정적 게임 오브젝트로 구분한다.

Dynamic Sprite

런타임 시점에 움직이는 게임 오브젝트.

  • 외부 힘(충돌, 중력 등)의 영향을 받으며 힘/속도(AddForce( )) 등을 통해 이동
  • 생성 시 Circle Collider 2D 와 Rigidbody 2D 컴포넌트가 자동으로 부착
    • Rigidbody 2D 의 BodyType 이 Dynamic 으로 설정되어 있음

Static Sprite

런타임 시점에 움직이지 않는 게임 오브젝트.

  • 이 오브젝트가 움직이지 않을 것이라는 것을 Unity 의 다른 시스템에게 알림
  • 생성 시 Box Collider 2D 와 RigidBody 2D 컴포넌트가 자동으로 부착
    • Rigidbody 2D 의 BodyType 이 Static 으로 설정되어 있음
BodyType기능
Dynamic마찰, 중력, 충돌 등의 "현실적인" 물리학이 필요한 항목을 사용할 수 있음
Kinematic명시적으로 움직이지만, 힘이나 중력의 영향을 받지 않음 ( 주변을 감지하는 플랫폼 등에 활용 )
Static움직이지 않게 설계되어 질량이 무한한 부동 오브젝트처럼 작동

고양이가 위에서 내려오지만, 중력의 영향이 아닌 transform.position 과 Vector3.down 의 코드로 이동한다. -> 중력의 영향을 받지 않음 ( Kinematic 설정 )
Food, FishShop 과의 충돌은 감지해야하므로 Collider 2D 의 isTrigger를 체크
( isTrigger : 충돌은 감지되지만, 물리적인 충돌은 발생하지 않는 옵션 )


Static Editor Flags Property

정적 게임 오브젝트가 움직이지 않기 때문에 오브젝트에 대한 정보를 미리 계산하여 사용할 수 있다.
이는 Unity 가 런타임 계산을 줄이고 잠재적 성능을 향상시키는데 도움을 준다.

Unity - Static Editor Flags Property


HP바 구현

World Space

저번 포스팅에서 Render Mode 3가지를 공부하였는데, 이번 강의에서 World Space 가 쓰였다.

Cat 의 포만감 게이지 바 (HP bar)를 나타내기 위해 Canvas 를 생성하여 World Space 로 설정해주었다.

Canvas 로 묶은 Hp 바의 Back 과 FrontWorld Space 지정 후, Pos 설정

로직

  1. Back - 흰색, Front - 주황색 설정 후, Front 의 X Scale 를 0으로, X 피벗을 0으로 설정
  2. Cat 이 Food을 먹으면 ( 충돌 이벤트 ), X Scale 값을 조금씩 증가
    • (Food 1개 / HP 최대 치) 만큼씩 증가
    • Ex) Food = 1, Full = 10 -> 0.1 씩 증가
  3. 포만감 게이지 바를 다 채울 때까지만 증가

Scripts

StartBtn.cs

  • SceneManager 를 통해 MainScene 호출
    ( StartScene 에서 StartBtn 버튼으로 )

3주차 - StartBtn.cs

Food.cs

  • 위 방향을 향해 계속 진행
  • 무수히 생성되는 Food 처리 필요
    - Food 가 화면 밖으로 벗어나면 제거

3주차 - Food.cs

Dog.cs

  • Food 프리팹을 복제 생성
    • Dog 의 position 보다 조금 위쪽에서 생성
  • 유저가 조작하는 마우스 커서를 따라다니는 Dog
    • y 좌표는 Dog 에 고정하고, x 좌표만 마우스 커서를 따라다니게 설정
    • 마우스 커서의 좌표를 카메라가 찍고 있는 월드 좌표로 변환 필요
    • 마우스 커서가 FishShop 밖으로 벗어나지 않게 설정

3주차 - Dog.cs

Cat.cs

  • Cat 을 랜덤한 위치에서 생성
  • Cat 의 타입마다 속도와 최대 포만감을 지정
  • 포만감 관리
    1) 포만감이 덜 찼을 때 -> Cat 이 아래로 계속 이동, FishShop 위치까지 내려오면 게임 종료
    2) 포만감이 찼을 때 -> 더 이상 다가오지 않고, 옆으로 이동하여 퇴장
  • Food 와 충돌하는 상황 처리
    • 포만감이 덜 찼을 때 -> hp 바를 채우는 로직
    • 포만감이 찼을 때
      1) hungry Cat 을 full Cat 으로 변환
      2) Cat 이 퇴장하는 시간을 기다려준 뒤, Cat 오브젝트 제거
      3) GameManager 를 통해서 점수 추가

3주차 - Cat.cs

GameManager.cs

  • 싱글톤 패턴
  • 점수와 레벨을 관리
    • AddScore( ) 함수가 호출될 때 마다 점수 추가
    • 점수에 따라 레벨, 레벨 경험치 바 표시
    • 레벨에 따라 Normal Cat, Fat Cat, Pirate Cat 프리팹을 복제 생성

3주차 - GameManager.cs


3주차 - 고양이 밥주기

결과물

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글