이번에는 게임중 적을 스폰시 임의의 위치를 랜덤으로 발생시킬수도 있지만, 보통 여러 후보지를 미리 설정해 놓고 그중 하나를 랜덤으로 선택해서 사용하는 것이 더 편할 수 있다. 무작위 발생시 다른 오브젝트와의 충돌까지 계산해야 하므로.
후보지의 위치를 Vector로 저장할 수도 있지만 여기서는 오브젝트레퍼런스를 사용해 후보지위치에 접근할 것 같다.
1. 시간 콘텐츠가 포함된 삼인칭 템플릿을 기반으로 프로젝트를 생성한다. 블로거는 기존의 프로젝트를 그대로 사용하였다.
2. Content폴더에 BookUE5폴더를 만든다.
3. BookUE5폴더로 들어가 추가버튼을 클릭하고 블루프린트 클래스를 만든다. 부모는 액터로 하고 이름은 BP_RandomSpawner로 지정하고 에디터를 연다.
4. 마이블루프린트 변수+를 클릭하고 targetPoints라고 이름을 바꾼후타입을 타입을 TargetPoint를 선택후 ObjectReference를 선택해준다.
5. TargetPoint 옆 감은눈을 눌러 뜨게 해주면 디테일에서 Instance Editable체크와 같다. 디테일에서 타입옆 파란아이콘을 눌러 배열로 바꿔준다. Instance Editable체크는 이미 되어 있다.
6. SpawnClass라는 이름의 변수를 만들어 타입을 Actor로 해준다. 타입은 배열이 아닌 싱글이고 InstanceEditable체크해준다.
7.이벤트그래프탭에서 BeginPlayEvent에 Branch노드를 추가한다.
8. 변수 SpawnClass를 끌어 GET으로 놓고 다시 끌어 Is ValidClass를 추가하고 ReturnValue를 끌오 AND를 추가한다.
SpawnClass가 유효할 경우만 다른 로직을 진행하기 위해서이다.
9. TargetPoints변수를 GET으로 끌어놓고 IS NOT EMPTY노드를 추가후 그출력을 AND로 연결해준다. AND의 출력은 Branch노드의 아래입력핀으로 연결해준다. TargetPoints배열안이 유효하고 비어있지 않는걸 체크해준다.
10. Branch흰색 출력핀에서 SpawnActor노드를 추가하고 파란class입력핀을 끌어 GET SpawnClass를 추가한다. 이제서야 SpawnClass를 스폰한다. 유니티의 Instatiate같은 함수 같다.
11. 좌측 TargetPoints에서 RandomArrayItem노드를 추가후 위쪽파란출력핀에서 GetActorTransform노드를 추가후 SpawnActor의 SpawnTransform입력핀에 연결해준다. 스폰할 임의의 위치를 얻어오기 위해서다.
12. 컴파일후 저장한다. 블루프린트는 다 만들었으니 이제 레벨을 준비해 사용해 보자.
BP_RandomSpawner테스트
1. 레벨에디터에서 위쪽 툴바중 +를 눌러 PlaceActorPanel을 클릭후 Target을 검색해후 TargetPoint Actor끌어다 뷰포트로 추가하자
2. 몇개더 TargetPoint Actor끌어다 뷰포트로 추가하자
3. 컨텐트브루우저를 열어 방금만든 BP_RandomSpawner를 끌어 레벨에 놓는다.
4. TargetPoins와 SpawnClass는 인스턴스에디터블이기에 디테일 중간쯤 Default카테고리에서 볼수 있는데 TargetPoints배열 +를 눌러 추가한 개수만큼 엘리먼트를 만들어준후 드롭다운메뉴를 눌러서 레벨에 있는 타깃포인트 인스턴스를 선택해준다.
5. 맨 아래 SpawnClass를 드롭다운메뉴에서 smoke를 검색해 Blueprint_Effect_Smoke를 선택한다.
6. 플레이 버튼을 누르면 방금 반든 포인트중 임의의 장소에서 스모크효과가 일어난다.
체크결과 스모크가 배열의 위치와는 좀 다른 위치에 표시되었다. 입력전 위치와 배치된 위치가 좀 달랐다. 아직은 원인은 모르겠다. ㅠㅠ 실행중에도 Outliner에서 인스턴스를 선택해보면 디테일에서 위치를 확인할 수 있다.
'블루프린팅 > 13. 데이터구조및 흐름제어' 카테고리의 다른 글
[13장 데이터 구조및 흐름제어] 흐름제어 (0) | 2023.06.18 |
---|---|
[13장 데이터 구조및 흐름제어] 세트와 맵 (0) | 2023.06.18 |
4부 고급 블루프린트 13장 데이터 구조및 흐름제어 (0) | 2023.06.18 |