본문 바로가기
개발 (Game)/(2021) Unity RTS 포트폴리오

[Day 7] 외교관계 시스템 구축 및 게임 매니저 기능 추가

by 진현개발일기 2021. 7. 18.

[2021. 07. 18, Sun]

 

[게임 매니저]

게임 매니저에 추가 기능이 있다.

턴을 넘길 때마다 유닛들의 스텟(공격 횟수, 이동 횟수)이 초기화되어야 한다. 이를 한 번에 실행시키기 위해 Action을 활용하였다. 

 

Unit.cs 유닛 생성시 마지막에 GameManager의 Action에 체인을 걸고있다.

[외교관계]

ref. https://assetstore.unity.com/packages/templates/systems/rts-toolkit-free-30247

 

RTS Toolkit Free | 시스템 | Unity Asset Store

Use RTS Toolkit Free from chanfort to elevate your next project. Find this & more 시스템 and templates on the Unity Asset Store.

assetstore.unity.com

위의 RTS Toolkit 에셋을 보면서 공부하고 참조하였다. 

(말 그대로 참조이다. 이 툴킷의 스크립트 중 원리를 완전히 이해한 부분만 응용하면서 내 입맛대로 바꾸면서 사용하였다.)

 

 

일단 외교 관계의 상태를 나타내주기 위해 enum을 만들었다.

1. 아무관계아님

2. 동맹

3. 적대관계이다.

 

[▼ Diplomacy.cs, [진현, 2021. 07. 18]

Diplomacy.cs

원리는 이렇다. WorldBuilng의 Start함수에서 Diplomacy.ties.addNationTies()를 하게 된다.

-------------------------------------------------------

addNationTies() 구조

1. 첫 번째 for문

  기존에 relations에 존재하는 국가들의 각각이 보유한 relations[i] 외교 관계에서 새로운 나라를 추가하는 것이다. 기본 값은 Nothing이다.  

2. relations.Add(new List <NationRelations>());

  새로운 국가의 다른 나라 간의 외교관계 리스트를 생성한다.

 

3. 두 번째 for문

   새로운 국가의 외교관계 리스트 안에  각각의 다른 나라들 간의 관계를 생성해준다.

-------------------------------------------------------

그러나, 이 구조에는 큰 단점이 있다

이런 구조는 모두 전쟁을 하는 함수, 모두 평화를 지키는 함수 이 두가지 밖에 할수없다.

(왜냐하면, 내가 전쟁을 선포해야하는 대상 국가가 몇 번째 인덱스인지 정확하게 알 수가 없다.)

 

내가 원하는 것은 그게 아니다. 각각의 나라가 전쟁중인 국가가 있고, 동맹인 국가가 있는 것이다. 그래서 다시 한 번

수정해봤다.

[수정 후  Diplomacy.cs [진현, 2021. 07. 18]]

addNationTies의 함수는 차례대로 함수에 들어오는 국가들의 오브젝을 인자로 받는다.

WorldBuilding.cs에서 자기 자신을 인자로 준다.
Diplomacy.cs의 각 국가의 외교관계 리스트를 반환해주는 함수

 

 

List<List<NationRelations>>의 구조

딕셔너리를 활용하여 각각의 국가들은 다른 나라와 어떤 관계를 가지고있는지의 리스트를 외부에서 참조할수있다.

 

저 리스트를 받아서 AI 스크립트에다가 현재 해당 국가의 '적국 리스트'를 받아서 랜덤으로 유닛을 보낼 수 있을 것 같다.  (AI간의 싸움 가능)

 

Diplomacy.cs 성공

이제 이를 활용하면서 유닛 AI 스크립트를 짜봐야겠다.

728x90