순수 C# 클래스

MonoBehaviour를 상속받지 않으므로 게임 오브젝트에 컴포넌트로 추가할 수 없다. 그리고 MonoBehaviour 내부의 메서드도 사용이 불가능하다.

순수 C# 클래스
추가하려할 때 오류

순수 C# 클래스에는 생성자 사용이 가능한데 Vector2Int에 new를 사용해서 매개변수로 초기화를 시켜주듯이 생성자도 new처럼 초기화를 할 수 있다.

클래스 생성자
new 생성자

this 사용으로 이 클래스의 멤버 변수를 지정해줄 수 있다.

this

순수 C# 클래스는 다른 MonoBehaviour 클래스에서 SerializeField로 인스펙터에 표시하려 해도 Node클래스 자체에서 추가적인 것을 안 하면 보이지 않는다.

[SerializedField]
안 보임

대신 이렇게 MonoBehaviour를 상속받지 않더라도 순수 C#클래스 위에 Serializable을 사용하면 Node를 인스펙터에서 볼 수 있고 [SerializedField] 변수나 public 변수들도 볼 수 있다.

[Serializable]
볼 수 있음

 

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

디버깅2  (0) 2022.09.08
딕셔너리  (0) 2022.09.08
길 찾기 알고리즘  (0) 2022.09.07
리팩토링  (0) 2022.09.06
UI 텍스트  (0) 2022.09.06

너비 우선 탐색(BFS)

- 가장 단순한 방법

- 몇 가지 수정하면 다익스트라 알고리즘이 됨

- 항상 최단 거리 반환

- 지도의 타일이 동일한 이동 비용을 가지게 돼서 지도에 다양한 타일을 추가할 수 없음

- 여러 개의 시작점과 종료점이 있어도 상관 없음

- 중간 정도 속도

다익스트라(Dijkstra)

- 휴리스틱 탐색법을 추가해서 몇 가지를 수정하면 A* 알고리즘이 됨

- 항상 최단 거리 반환

- 이동 비용을 잘 다룸

- 여러 개의 시작점과 종료점이 있어도 상관 없음

- 속도가 느림

A* 알고리즘

- 항상 최단 거리 반환 설정도 가능, 변수를 추가해 속도와 정확성 사이에서 트레이드 오프를 할 수도 있음 => 알고리즘을 훨씬 빠르게 실행할 수 있지만 최단 경로를 보장하지는 않음

- 이동 비용을 잘 다룸

- 여러 개의 시작점과 종료점이 있으면 안 됨 => 한 포인트에서 한 포인트로 연결되는 알고리즘임

- 실행속도가 아주 빠름 (그래서 경로찾기에 A* 알고리즘을 추천하는 것임) *속도에서 중요한 점은 정확성을 높이면 실행 속도가 느려지게 됨 - 휴리스틱 탐색법 때문에

 

【한글자막】 C#과 Unity로 3D 게임 개발하기

길찾기 알고리즘

 

너비 우선 탐색

1. 탐색 방향을 정한다. - 설계자가 알아서 선택하도록 놔둬도 되고 알고리즘에서 하드코딩해 방향을 정해도 된다.

2. 노드를 트리에 추가한다. - 시작점이라면 시작 노드를 추가한다.

3. 탐색 방향을 사용해서 트리에 현재 노드의 이웃을 추가한다.

4. 아직 탐색하지 않은 다음 노드로 넘어간다.

5. 목표에 도달하지 못했다면 3단계로 돌아가서 트리에 현재 노드의 이웃을 추가한다.

6. 결과가 나오면 트리에서 거꾸포 그 순서를 기록한다.

7. 그 리스트를 뒤집어서 경로를 바른 순서대로 찾는다.

 

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

딕셔너리  (0) 2022.09.08
순수 C# 클래스  (0) 2022.09.08
리팩토링  (0) 2022.09.06
UI 텍스트  (0) 2022.09.06
통화 시스템  (0) 2022.09.06

난이도 높이기

maxHitPoints에 difficultRamp를 더함으로써 적이 죽을 수록 나오는 적들의 hp가 많아지게 했다. 

체력 높이기

 

리팩토링

경로를 문자열로 체크해 배열에 넣는 방법은 씬의 태그 객체를 찾을 때 계층에서 명시한 순서대로 되지 않을 수 있다. (경로 순서) => 무작위로 움직일 수도 있다.

각각 타일의 Tag를 없애고

Tag 떼기

그 상위 객체에 Tag를 붙인다.

Tag 붙이기

부모의 transform으로부터 foreach로 자식을 검색하는 것이 가능하다.

foeach 부모 transform

이후 WayPoint에 잘못된 값이 들어가는 것을 방지하기 위해 조건을 걸어준다.

null 방지

경로 완료를 코루틴으로부터 떼어냈다.

리팩토링1

spawnTimer가 0보다 작으면 에러가 나고 0이면 게임이 터질 수도 있다. -> 양수로 제한을 걸어야함

문제

30까지 해준 이유는 보스전 등 이벤트일 때 30초까지 설정할 수 있게 해준 것이다.

리팩토링2

위와 같은 이유로 양수로 설정해야 한다.

문제2
리팩토링3

CoordinateLabeler는 label을 변수에 할당하는데 같은 객체여야 한다.

문제3
리팩토링4

함수의 이름을 알아보기 힘든 것은 쉽게 바꿔준다.

ColorCoodinates
SetLabelColor

UnityEditor.EditorSnapSettings와 같은 유니티 에디터 관련 요소는 최종 프로젝트에 들어갈 수 없다는 문제가 있어 에러가 날 것이다.

UnityEditor.EditorSnapSettings

에디터 폴더는 최종 프로젝트를 설계할 때 무시되는 걸 이용하여 여기에 해당 스크립트를 넣는다.

Editor

* 하지만 저 파일에 넣으면 이 폴더 안에 있는 스크립트도 모든 씬 객체에 추가되지 않게 되니 최종 프로젝트를 설계할 때만 옮기면 된다.

 

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

순수 C# 클래스  (0) 2022.09.08
길 찾기 알고리즘  (0) 2022.09.07
UI 텍스트  (0) 2022.09.06
통화 시스템  (0) 2022.09.06
타워 가까운 타겟 찾기  (0) 2022.09.06

UI Text

Anchor Preset을 통해 Alt + Shift 좌클릭하면 위치, 기준점, 중심점을 설정할 수 있다. 

좌측 하단 앵커

TextMeshPro의 Font는 Window - TextMeshPro - Font Asset Creator에서 생성 후 TextMeshPro 컴포넌트의 Font Asset에 넣어주면 된다.

Font Asset Creator

TextMeshPro의 Underlay는 아래 그림자 같은 효과와 관련있다.

TextMeshPro

TextMeshProGUI에 text를 동적으로 최신화 해주었다.

골드 최신화
실행

 

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

길 찾기 알고리즘  (0) 2022.09.07
리팩토링  (0) 2022.09.06
통화 시스템  (0) 2022.09.06
타워 가까운 타겟 찾기  (0) 2022.09.06
오브젝트 풀링  (0) 2022.09.06

통화시스템

은행

- 플레이어를 위해 통화의 잔액을 보관하고 보증금과 계좌 인출을 담당한다.

타워

- 타워를 지을려면 은행에서 돈을 인출해야한다.

- 타워가 적을 죽이면 계좌에 돈을 예금한다.

- 경로의 끝에 이르면 계좌에서 돈을 훔친다.

 

Bank에서 Deposit과 Withdraw를 관리하고 Mathf.Abs로 amout 값이 -가 들어와도 양수 값으로 받게 했다.

예금, 인출

Enemy 스크립트에선 goldReawrd와 goldPenalty 설정하여 bank의 Deposit, Widraw를 호출하게 했다.

goldReward goldPenalty

EnemyHealth에서 적이 죽었을 때 RewardGold를 호출하게 했다.

적 사망시 골드 획득

적이 경로 끝에 도착했을 때 StealGold를 호출하게 했다.

StealGold
실행

타워 프리펩을 설치할 수 있으면 bool을 반환하는 CreateTower를 호출하여 isPlaced에 대입하고 isPlaceable의 값을 다시 바꿔준다.

isPlaced

타워와 위치 값을 받아서 Bank의 잔고보다 비용이 작으면 타워를 생성하고 비용만큼 인출하는 코드이다.

타워 비용 인출

타워의 잔고가 0 미만일 때 씬을 재로드한다.

씬 재로드

 

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

리팩토링  (0) 2022.09.06
UI 텍스트  (0) 2022.09.06
타워 가까운 타겟 찾기  (0) 2022.09.06
오브젝트 풀링  (0) 2022.09.06
경로 찾기  (0) 2022.09.06

타워 가까운 타겟 찾기

Update문에서 가까운 타겟을 찾는 FindCloseTarget을 호출하여 Enemy타입을 다 가져오고 타워와 타겟과의 거리를 Vector3.Distance로 계산하여 최대 거리인 maxDistance보다 작은지 체크한다. 작으면 가까운 타겟을 해당 적으로 설정하고 최대 거리를 타겟과의 거리로 설정하고나서 메인 타겟을 가까운 타겟으로 설정한다.

FindClosestTarget

FindClosestTarget에서 설정한 타겟을 LookAt하여 바라보게하고 현재 타겟과의 거리가 공격 범위보다 작으면 Attack 함수를 호출한다.

projectileParticle의 emission모듈을 참조하여 enabled를 인자로 받은 isActive로 체크한다.

조준과 공격
실행

 

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

UI 텍스트  (0) 2022.09.06
통화 시스템  (0) 2022.09.06
오브젝트 풀링  (0) 2022.09.06
경로 찾기  (0) 2022.09.06
프로퍼티와 디버깅  (0) 2022.09.06

오브젝트 풀링

반복되는 개체의 생성과 파괴는 리소스 면에서 과부하가 걸릴 수 있고 게임이 커질수록 성능의 문제가 생길 수도 있다.

=> 오브젝트 풀을 사용하면 필요한 모든 개체를 레벨이 시작할 때 생성한다.

- 개체를 파괴 대신 비활성화 시킴으로써 필요할 때 풀에서 꺼내 월드에 활성화 시킬 수 있다.

- 원하는 만큼 반복해 발생시킬 수 있다.

- 개체는 정해진 크기로 생성되기 때문에 풀을 만든 이후에는 추가로 적을 추가할 수 없다.

적 풀링하기

먼저 적을 담을 배열을 만들고 적을 생성하여 담은 후 SetActive(false) 해준다.

적 생성 후 끄기

이후 1초마다 풀을 모두 돌아 비활성화된 적을 활성화하고 반환하는 식으로 반복한다.

적 활성화 후 반환
실행

 

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

통화 시스템  (0) 2022.09.06
타워 가까운 타겟 찾기  (0) 2022.09.06
경로 찾기  (0) 2022.09.06
프로퍼티와 디버깅  (0) 2022.09.06
적에게 데미지 입히기  (0) 2022.09.02

경로 찾는 방법

Path와 WorldTiles의 isPlaceable 차이로 경로를 찾을 수도 있지만 플레이 모드에서 타워를 설치했을 때 버그가 발생할 여지가 많다.

Path
World Tiles

 

태그로 체크하기

태그로 체크하는 것은 문자열을 참조하는 방법으로 최선의 방법이라고 할 수는 없지만 쉬운 방법 중에 하나이다.

태그로 체크하기

Path라는 태그를 찾아서 waypoints배열에 담고 waypoints의 각 요소를 WayPoint타입 리스트에 담는다.

Path.Clear()는 경로를 미리 찾아둔 후 특정 상황에서 경로를 또 찾았을 때 새 것을 기존 경로 아래에 추가하는 걸 막기 위해서이다.

* 이 방식은 이것들이 특정 순서에 따라 작동할 것이라는 보장이 없다. - 나중에 수정할 것임

태그로 체크하기 로직
실행

 

경로 도착

경로 루프가 끝난 후 적을 Destroy하게 한다.

Destroy
실행

 

프로퍼티

Get메서드 vs 프로퍼티

프로퍼티가 간결함 → 가독성이 높다.

외부 값 받기

 

좌표 구분

Text의 Color를 다르게 주어 타워 설치가 가능한 타일들을 시각적으로 구분할 수 있게 해주었다.

Color선언
설치 가능 / 불가능
실행

 

레이블 껐다 키기

C키를 눌렀을 때 label이 활성화 되어있으면 꺼지게 했다.

!IsActive()
켜기
끄기

레이블이 활성화 상태일 때 타워를 설치하면 isPlaceable이 false가 되어 회색이 된다.

타워 설치

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

오브젝트 풀링  (0) 2022.09.06
경로 찾기  (0) 2022.09.06
적에게 데미지 입히기  (0) 2022.09.02
타워 설치, 적 추적하기  (0) 2022.09.02
마우스 입력 탐지  (0) 2022.09.02

배운 것들

이번 주에는 3D 픽셀 모델링 툴인 Magica Voxel에 대해 배웠다.

https://ephtracy.github.io/

 

MagicaVoxel

 

ephtracy.github.io

Magica Voxel은 포토샵 툴과 비슷한 인터페이스 구조를 가지고 3D 픽셀 모델링을 할 수 있다.

내가 만든 것들 중 하나

모델링이 끝난 후 우측 하단에 있는 Object 타입으로 Export하면 3개의 파일이 생성된다.

생성된 파일들

이후에 이 세 개의 파일을 유니티에 넣어주면 된다.

* 이것들을 다 넣어주지 않으면 기본색인 회색 빛이 되어서 수동으로 Material을 지정해줘야 하는 경우가 생긴다. 

회색 빛인 에셋

defaultMat의 Material을 palette로 바꿔주면 해결된다.

Material 바꿔주기

 

과제 내용

Magica Voxel을 이용하여 캐릭터 2명 이상, NPC 2명 이상, 외부 건물, 내부 건물, 아이템 3개 이상을 만드는 것이다.

아래 사진은 내가 만든 외부 건물과 캐릭터들이다.

외부 건물, 캐릭터들

아래 사진은 내부 건물과 아이템들이다. * 바나나 집

바나나 집 내부
아이템들 1
아이템들 2

 

 

한 주 후기

 이번 주 수업은 내가 사용할 에셋들을 내가 만들어보는 시간이어서 좋았다. 사실 모델링적인 부분이나 이런 것들은 내가 만들 일이 없을 것 같았는데 이번에 경험해보니 어렵기도 하고 막상 해보면 몰입하게 되고 꽤나 재밌었던 시간이었다.

모델링한 패키지들을 받아와서 Size Factor들을 조절하고 Material을 입히는 것을 새로 배울 수 있었다. 어려웠던 점들 중에 하나가 이 가져온 캐릭터의 애니메이션을 적용하는 게 쉽지 않았던 것이다. 나는 어도비사의 Mixamo라는 애니메이션 생성 사이트를 이용했는데 애니메이션이 잘 적용되려면 캐릭터들의 팔 다리가 기본적으로 길어야 한다는 것을 깨닫고 다시 늘리고 비율 맞추는 작업을 여러번 진행했던 것 같다. 확실히 내가 만든 것들이 모델링적인 부분에서 퀄리티가 떨어지는 게 느껴졌다. 디테일적인 부분을 신경 쓰면 밑도 끝도 없을 뿐만 아니라 그런 센스가 있는 편도 아니라 나중에 제대로 만들게 된다면 먼저 여러 영상들을 참고하여 따라해보면서 실력을 길러야겠다는 생각이 들었다.

 한 주 한 주 지내면서 새로운 것을 배울 때마다 '아직 부족하구나'라는 생각과 '이런 게 있었어?' 하는 호기심이 생기는 것 같다. 미래의 발전된 나를 위해서 긍정적으로 생각하고 실력을 기르는 시간이 더 필요한 것 같다. 다음주도 화이팅하자!

 

 

유데미코리아 바로가기

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

+ Recent posts