public enum과 private Class

버그

이전에 버그 먼저 제거해야했다.

무기를 교체할 때 무기 인스턴스가 꺼져서 코루틴을 제대로 실행을 못해서 _canShoot가 true가 안 되는 경우가 있었다.

OnEnable에서 true로 바꿔줘서 해결했는데 총 스왑시 바로 쏠 수 있는 것 때문에 총 딜레이만큼 기다리게 하였다.

 

public enum

enum은 enumeration의 약자인데, 특정 숫자와 단어를 같은 것으로 만들어 주는 코드이다.

- 숫자를 기억할 필요 없이 단어를 사용하기 위해 사용한다.

private class

Ammo 클래스에서 AmmoSlot에 접근 가능하고 내부 변수나 메서드도 사용 가능하지만 외부 클래스에서 Ammo 클래스에 접근한다 하더라도 private class인 AmmoSlot에 접근하지는 못한다. => 효율성과 수정 용이성 때문에 사용한다.

Seriaizable은 인스펙터에서 내부를 보여주기 위해 사용한다.

SerializeField로 AmmoSlot 배열을 선언한 후에 Ammo 스크립트 위에 보이게 된다.

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 좀비 러너 게임' 카테고리의 다른 글

탄약 픽업  (0) 2022.09.20
무기에 따른 탄약  (0) 2022.09.20
무기 교체하기  (0) 2022.09.20
무기 구별  (0) 2022.09.20
중첩 프리펩과 다양한 무기 타입  (0) 2022.09.20

무기 교체하기

버튼으로 바꾸기

무기 교체시 currentWeapon을 조절해 처음 시작 무기를 고를 수 있다.

Weapon의 자식 transform을 돌아 weaponIndex와 currentWeapon이 같을 때 해당 weapon을 SetActive시키고 다른 weapon들은 끈다.

이후 weaponIndex를 추가하면 된다.

Input을 받아 currentWeapon의 값을 바꿔준다면 Input에 따라 쉽게 무기 교체를 할 수 있다.

마우스 휠로 바꾸기

마우스 휠을 올릴 때는 인덱스를 증가시켜서 childCount만큼으로 나눠서 나머지를 대입하여 개수를 넘지 않게 했고

마우스 휠을 내릴 때는 인덱스를 감소시켜서 currentWeapon이 0보다 작다면 childcount를 더해주는 식으로 인덱스가 음수가 안 되게 했다.

게임 오버시에도 무기를 교체하는 버그를 고치려고 WeaponSwitcher를 꺼줬다.

무기 구별

먼저 줌인 줌아웃이 가능한 무기를 구분해주었다.

Player 프리펩에서 WeaponZoom을 제거하고 Carbine 프리펩에 붙였다.

이후 GetComponent RigidbodyFirstPersonController 참조를 SerializeField 참조로 바꿨다.

발사 지연 시간

bool타입인 canShoot을 체크하는데 코루틴으로 일정 시간이 지나야  canShoot이 true가 되어 Shoot 함수를 호출할 수 있게 했다. timeBetweenShots를 SerializeField로 선언해서 각 Weapon마다 발사 지연 시간을 다르게 주었다.

이후 무기마다 수치를 조절해줘서 다양성을 추가한다.

* 레이캐스트를 사용해서 무기의 Range까지 조절할 수 있으니 좋은 방법 중 하나인 것을 알 수 있다.

중첩 프리펩

Player 프리펩이나 Carbine 프리펩의 Weapon클래스에 None 값이 참조되어 있어도 괜찮다.

왜냐하면 Player 인스턴스 하위, 게임 화면에 보이는 요소들이 값을 참조하고 있기 때문이다. => Player 인스턴스 안에 Carbine 오브젝트가 이미 소속되어 있고 이는 Carbine 인스턴스라고도 할 수 있다.

그리고 Weapon클래스를 보면 Override 된 부분이 좌측의 파란색 띠와 굵은 글씨로 나타나는 걸 볼 수 있다. => 이처럼 서로 달라도 프리펩끼리 인스턴스를 포함시킬 수 있다.

중첩 프리펩에서 하위 프리펩의 공통되는 부분은 하위 프리펩에 적용시키는 게 편하다.(하위 프리펩 쪽에 있거나 프로젝트 창에서 참조하는 경우)

그러나 아래의 FP Camera나 Ammo Slot은 Player 프리펩(상위 프리펩)의 요소이므로 상위 프리펩에서 참조해주는 것이 맞다.

Override 된 요소를 클릭하여 Rever버튼을 누르면 해당 프리펩의 설정으로 돌아가게 된다. 이러면 프리펩과 인스턴스가 설정이 동일해져 프리펩에 바뀐 것들이 인스턴스에도 적용되게 된다.

Player 프리펩 모드에서 Carbine의 FP Camera와 Ammo Slot을 Revert하면 Carbine 프리펩의 원래 참조 값인 None으로 돌아가게 된다.

공통적으로 적용되는 부분은 Revert하여 수정되는 부분이 같이 적용될 수 있게 하면 된다.

 

다양한 무기 타입

이런 식으로 Shotgun이라는 개체를 만들고

Carbine의 컴포넌트를 복사하는데 Scale은 샷건 프리펩 설정으로 Revert하면 된다.

한 프리펩을 복사해서 다른 프리펩을 만들 때 쉐이더도 같이 복사되니 같은 쉐이더의 Albedo에 텍스처를 집어넣지 말고 프리펩 모드의 씬 창의 오브젝트에 집어넣으면 새로운 쉐이더가 생성되는 걸 볼 수 있다.

기본 탄약 기능

Ammo라는 클래스를 만들어 총알은 10발로 하고 현재 총알을 가져오는 함수와 총알 갯수를 줄이는 함수를 만들었다.

이후 Weapon 클래스에서 총알을 쐈을 때 총알 갯수가 0개보다 커야 AmmoSlot의 ReduceCurrentAmmo를 호출하게 했다.

실행

무기 확대 / 축소

시야

플레이어의 카메라를 인스펙터에서 참조하여 마우스 우클릭을 했을 때 Camera 컴포넌트의 Field of View를 조정하여 줌인 줌아웃 기능을 만들었다.

확대
축소

마우스 민감도

RigidbodyFirstPersonController 스크립트의 Mouse Look에 마우스 민감도를 조절할 수 있는 X Sensitivity와 Y Sensitivity가 있다.

Weapon Zoom 스크립트에서 RigidbodyFirstPersonController를 참조하여 줌인/줌아웃 상태에 따라 민감도도 맞춰주게 하였다. (줌인 상태일 때 민감도 낮아지게)

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 좀비 러너 게임' 카테고리의 다른 글

중첩 프리펩과 다양한 무기 타입  (0) 2022.09.20
기본 탄약 기능  (0) 2022.09.20
BroadcastMessage  (0) 2022.09.19
게임오버 UI  (0) 2022.09.16
회전하기  (0) 2022.09.16

BroadcastMessage

어떤 스크립트가 해당 함수를 실행하는 지 정해놓지 않고, 전체에게 해당 함수가 있으면 실행하라는 것을 알리는 함수이다.

- 게임 오브젝트 또는 그 하위에 있는 메서드만 불러온다.

적 오브젝트에 있을 때
적 오브젝트와 하위 오브젝트에 있을 때

게임오버 UI

TextMeshPro

Hierachy창에 우클릭하여 UI의 TextMeshPro를 사용할 수 있는데

Essential들을 모두 다운 받고 사용할 폰트를 Font Asset Creater로 source Font File에 집어넣어서 만들어주고

텍스트에 적용해주면 된다.

UI 버튼 연결

이후 버튼에 OnClick부분에 Event를 생성하여 필요한 함수를 연결해준다.(public이어야 함)

DeathHandler라는 스크립트를 만들어 플레이어에 붙이고 시작할 때 게임오버 UI를 꺼준다.

이후 HandleDeath라는 메서드를 통해 게임오버 UI를 켜주고 게임을 일지정지하고 마우스를 켜준다.(다른 것과 충돌하는 걸 방지하기 위해 일시정지, 마우스는 안보여서 키게 했음)

위 메서드를 플레이어가 사망시 불러준다.

그리고 SceneLoader 스크립트에서 씬 로드를 하면서 정지된 시간을 다시 흘러가게 한다.

 

회전하기

벡터에는 방향과 거리가 포함되는데 여기선 회전이므로 방향이 중요하다.

먼저 방향을 정해주기 위해 타겟 포지션에서 현재 포지션을 빼주고 normalized 시켰다. (현재 포지션 -> 타겟 포지션 방향)

Quaternion.LookRotation(Vector3)을 그냥 transform.rotation에 넣으면 바로 그 방향으로 이동되므로 Quaternion.Slerp를 사용하여 부드럽게 이동하게 했다.

EngageTarget에서 불렀는데 이는 적이 플레이어를 발견한 후 회전도 같이 동기화되게 시켜준 것이다. 

실행

 

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 좀비 러너 게임' 카테고리의 다른 글

BroadcastMessage  (0) 2022.09.19
게임오버 UI  (0) 2022.09.16
플레이어 체력  (0) 2022.09.16
애니메이션 이벤트  (0) 2022.09.16
코드에서 애니메이션 실행  (0) 2022.09.15

플레이어 체력

플레이어를 드래그 앤 드롭을 사용하여 인스턴스로 옮기는 것은 프리펩에서 불가능하고 씬마다 인스턴스에서 옮겨줘야 한다. => 비효율적

그래서 PlayerHealth를 FindObjectOfType으로 받아 애니메이션 Event에 등록된 함수인 AttackHitEvent에서 target으로 받은 PlayerHealth의 TakeDamage를 호출하는 방식을 사용하였다.

그러면 적이 공격 이벤트시 플레이어의 피가 닳게 된다.

실행

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 좀비 러너 게임' 카테고리의 다른 글

게임오버 UI  (0) 2022.09.16
회전하기  (0) 2022.09.16
애니메이션 이벤트  (0) 2022.09.16
코드에서 애니메이션 실행  (0) 2022.09.15
애니메이션  (0) 2022.09.15

+ Recent posts