이웃 경로 찾기

빈 목록을 생성하여 grid의 키 값에 지금 노드 좌표에 각 방향의 좌표를 더한 값이 있으면 neighbors리스트에 grid 노드를 넣어준다.

TODO 주석은 아래에 것들을 테스트 후에 삭제할 것을 나타낸 것이다.

이웃 탐색
실행

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

왔던 경로 다시 찾기  (0) 2022.09.12
전체 경로 찾기  (0) 2022.09.12
디버깅2  (0) 2022.09.08
딕셔너리  (0) 2022.09.08
순수 C# 클래스  (0) 2022.09.08

디버깅

Node 가져오기

Get메서드와 딕셔너리의 ContainsKey

Get메서드

 

WayPoint 대신 GridManager의 값 사용하기

경로 종류마다 컬러 값을 줬고 WayPoint대신 GridManager로 관리하게 했다.

GridManager

색을 칠할 때 GridManager와 Node의 값이 null이면 return하게 했다. (Coordinate 클래스가 에디터 모드에서도 실행되므로 nullReference오류가 에디터 모드에서 뜸)

null 체크

경로 찾기의 각 경우마다 색을 바꿔주게 했다.

경로 색 바꾸기

아직 그리드 딕셔너리 안에 존재하는 일부가 제대로 막히게끔 색칠되지 않았다. - 아직 기능 추가를 안 해서(경로 찾기)

실행

 

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

전체 경로 찾기  (0) 2022.09.12
이웃 경로 찾기  (0) 2022.09.08
딕셔너리  (0) 2022.09.08
순수 C# 클래스  (0) 2022.09.08
길 찾기 알고리즘  (0) 2022.09.07

딕셔너리

- Key-Value 키-값 한 쌍을 저장한다. (Key는 딕셔너리에서 찾는 단어, Value는 설명)

- Key와 Value는 연결되어있다.

- 딕셔너리에 있는 Key들은 고유의 값을 가진다. - 이것들이 고유하기 때문에 굉장히 단순한 데이터 유형을 사용한다. (이 프로젝트에선 coordinates)

- Value는 고유의 값이 아니라 복잡한 유형의 데이터가 될 수 있다. (이 프로젝트에선 노드 오브젝트)

- Value는 null이 될 수 있지만 Key는 null이 될 수 없다.

- 실제 사전처럼  Key에서 Value를 찾으려고 할 때 굉장히 빠르게 찾을 수 있다.

- Value에서 Key를 찾으려고 하면 정말 느리다.

 

코드에서 사용

List처럼 선언할 때 new 생성자를 사용해주면 된다.

딕셔너리 선언

딕셔너리 요소 추가와 key, value 값 받기

요소 추가, 키 값 받기

5,5라 25개가 찍혔다.

실행

 

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

이웃 경로 찾기  (0) 2022.09.08
디버깅2  (0) 2022.09.08
순수 C# 클래스  (0) 2022.09.08
길 찾기 알고리즘  (0) 2022.09.07
리팩토링  (0) 2022.09.06

순수 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

+ Recent posts