전시간에는 Enemy 오브젝트랑 Player 오브젝트가 서로 부딪히게되면 파괴되는 그런 코드까지 작성해봤습니다.

자 오늘은 적자동생성 관련해서 한번 진행해보려고 합니다.

 

자 그러면 적이 꾸준히 많이 나와야겠죠? 그러니까 저희는 첫번째로 먼저 Enemy 오브젝트를 인스턴트화 시켜보도록

하겠습니다.

 

자 전시간에 배웠듯 총알을 인스턴스화 시키면 복제품 설계도는 만들어진겁니다. 그러면 하이어라키에 있는 오브젝트를

삭제하겠습니다.

 

자이제 적을 찍어낼만한 공장을 한번 만들어 보겠습니다.

1차적으로 하이어라키 > Create Empty > Enemy Manager 로 이름을 변경

 

자이러면 공장을 만들 그릇은 완성된겁니다.

그다음에 해야될것은 이 공장의 위치를 표시하기위해 표시모양으로 바꿔주겠습니다.

저걸 누르면 비어있던 Empty의 모양을 설정할 수 있습니다.

저희는 빨간색 루비 모양으로 해보겠습니다.

자 그러면 공장 모양이 눈에 보이죠? 이걸 카메라 바깥화면으로 밀어버립시다.

왜냐하면 카메라 안에 스폰지점이 있으면 갑자기 적이 나타나는거같아 자연스러워 지지 않습니다.

흰색선은 카메라가 직접적으로 비춰주는 영역이기 때문에 그밖으로 스폰지점을 끌고 나가서 적이 자연스레 생성된거처럼

만들어주시길 바랍니다.

 

그다음 스폰지점은 만들었으니까. 우리가 이제 해야될것은 스폰지점에서 계속 자동으로 공장을 돌릴 수 있도록

스크립트를 작성하는 일입니다.

 

자 전시간에 배웠던거처럼 Enemy Manager 스크립트를 먼저 만들어서 EnemyManager 오브젝트안에 넣어주도록합시다.

 

자그러면 스크립트 안에 내용을 작성해봅시다.

 

목표와 필요한 순서를 먼저 생각해보겠습니다.

 

목표:일정 시간마다 적을 생성해 내 위치에 갖다놓고싶다.

필요 속성:일정 시간, 현재 시간, 적 공장

순서

1.시간이 흐르면

2.만약 현재 시간이 일정시간이 되면

3.적 공장에서 적을 생성해 내 위치에 갖다 놓고싶다.

 

먼저 필요 속성(변수)부터 선언하겠습니다. 일정 시간은 저희는 1초로 기준을 잡읍시다.

 

자 처음에 들어가는 코드는 이렇게 설정을 해주시면됩니다.

 

자그러면 저기 EnemyFactory 에 적 인스턴스(설계도)를 넣어봅시다.

설계도를 일단 넣어주고 난뒤에 나머지 스크립트를 작성해봅시다.

 

매초 시간이 지난뒤에 생성하는 코드를 작성해줘야합니다.

업데이트문은 항상 time.deltaTime 의 영향을 받아서 계속 게임이 켜져있는동안 카운트를 하게됩니다.

그렇기 때문에 어떻게 보면 While 문과 같은 느낌을 받을 수 있습니다.

 

지금 코드를 보시면 맨끝에 currentTime 이부분이 맨마지막에 0으로 초기화 되는걸 볼 수 있습니다.

즉 0>1초까지 간이후에 생성을 하고 마지막에 다시 0으로 바꿔주는 역할을 하게되는걸 볼 수 있습니다.

 

자이제 한번 실행을 해보면 지정했던 EnemyManager 이라는 오브젝트에서 계속 적이 내려오는걸 볼 수 있습니다.

근데 계속 한곳에서만 내려오면 진짜 재미가 1도 없겠죠? 그러니까 다양한 방향에서 오도록 할 수 있게 해야합니다.

그러면 저희들이 해야될것은?

 

카메라 밖에 지점 윗 상단 부분에 스폰지점을 몇개 더 복사해서 추가해봅시다.

 

하이어라키 > EnemyManager 오브젝트클릭 > Ctrl+D (복사) > 기존 스폰지점을 기준으로 좌우로 벌려주기

 

그러면 이런 모양이 됩니다. 이렇게 스폰지점을 5개로 늘리고 다시한번 Play를 눌려봅시다.

자 어떤가요? 5개의 스폰지점에서 애들이 내려오니까 신기하죠? 

 

근데 더 생각해봅시다.

여기서 5개의 스폰지점에서 1자로 같은 간격을 가지고 계속 내려오니까 너무 재미가 없어요.

그래서 우리는 각자 스폰시간을 다르게 한번 설정해 보려고합니다.

 

자 그러면 아까 들어갔던 EnemyManager 스크립트 부분을 한번 수정해 봅시다.

 

먼저 스폰을 할때 최대시간과 최소시간을 미리 변수로 하나 만들어두고 각자 시간을 입력해줍니다.

 

그런 다음에 void Start() 부분에 랜덤 시간을 부여할 수 있도록 한번 코드를 작성해봅시다.

대강 이제 뭘 할지 감이오나요? 그쵸? 지금 cratetime 을 만들었는데 이거그러면

1.00000~ 5.00000 초 어딘가에 계속해서 만들어집니다! 신기하죠? 자그러면 이것을 아까 update() 쪽에 if문에 넣어서

생각을 해보게되면?

 

이제 랜덤한 시간이 계속 측정되겠지요?

 

근데 아까 if문에 createTime 을 설정을 안해줬어요. 그러니까 저희는 위에 만든 craetetime을 if문에 넣어봅시다.

 

자그럼 제각기 스폰지점에서 랜덤한 시간의 격차를 가져서 그런지 다양한 타이밍에 엇박자를 타면서 적이 스폰됩니다.

하지만 이제 뭔가 살짝 애매해요. 그냥 떨어지기만하면 좋긴합니다.

하지만!

 

저희는 좀더 어렵게 만들어볼생각입니다.

어떻게?

적들이 나를 따라오게 만들 수 있도록 한번 해보도록 하겠습니다.

저희는 30% 확률로 생성되는 적이 나를 따라오는 그런 시스템을 한번 구축해 보도록 하겠습니다.

 

자 이번에는 EnemyManager > 애는 생산 위주의 스크립트 입니다.

그러면 Enemy C# 스크립트로 가서 한번 나를 따라오겠끔 스크립트를 한번 수정해봅시다.

스크립트를 보면 ranValue는 0~9까지의 값을 랜덤으로 갖고 3보다 적으면 30%의 확률로 적을 생성하는 코드와

그냥 내려가는 코드의 조건문을 생성해줬습니다.

 

자 그다음에는 어떻게 해야될까요?

 

1. 방향 벡터3 dir 이라는 변수를 선언

2.GameObject target 을 Find "player" 명칭해서 타겟설정

3.dir 변수에 내위치와 플레이어의 위치를 계속 꾸준히 비교 함

4.방향은 Normalize로 1로 설정

5.30%확률이 아닌 70%확률로는 그냥 dir=Vector3.down; 코드작성

 

이렇게하면 30%확률로 target을 따라가게 되어있고 동시에 나머지애들은 밑으로 쭉 내려옵니다.

 

자그럼 코드를 작성하고 한번Play를 눌려볼까요? 과연 30%확률로 Player를 따라오는 Enemy가 있을까요?

없죠? 맞습니다 저희는 Start() 안에 한번만 방향을 선언했기 때문에 꾸준히 target방향으로 꾸준히 따라와야합니다.

그럼 매시간 초에 반응하는 update() 안에 뭔가 수정하고 Start() 쪽을 살짝 건드려서 저희가 원하는 방향으로 

스크립트를 작성하겠습니다.

지금 update() 안에 Vector3 dir 부분을 주석처리시켰습니다.

왜냐하면 저희는 start() 안에서 dir을 설정하면 지역변수가 되기 때문인데 그렇게 안하기 위해서 전역변수로 바꿔줬습니다.

그리고 update() 안쪽에 장소를 꾸준히 그쪽으로 가게 하기위해 스크립트를 작성해준 모습입니다.

 

오늘은 적 스폰지점 +인공지능 을 만들어준 모습입니다.

자 오늘 챕터는 여기까지고 다음챕터에 만납시다.

다음챕터에는 총알을 쏘고난뒤에 그 총알이 무한히 날아가기때문에 메모리 소비를 줄이기위해 그부분을 지워주는 코드와 다른 다양한것들을 배워보려고합니다. 그러면 안녕!

+ Recent posts