도전과제 2번 동적스폰이용하여 엑터스폰하기
구현 목표 : 언리얼 엔진에서 제공하는 SpawnActor 메서드를 이용하여 회전 발판/이동 플랫폼의 동적스폰 구현하기
구현설계의사코드 : 플레이 버튼을 누르고 시작 시 등록해놓은 3종류의 회전/이동 발판이 스테이지의 범위 내에서 랜덤한위치에 스폰된 후 10~20초 동안 지속 이후 파괴됨 생성은 5초마다 반복
구현에 필요한 언리얼 키워드 : SpawnActor, FTimerHandle, TArray, TSubClassof
SpawnActor : 엑터의 동적생성을 도와주는 언리얼 메서드 GetWorld()->SpawnActor()을 통해 호출 가능
FTimerHandle : 언리얼에서 제공하는 타이머 구조체 Tick함수 보다 효율적인 퍼포먼스를 제공 특정시간에만 함수를 실행시키기 위해 사용
TArray<> : 언리얼에서 제공하는 컨테이너 템플릿 클래스로 타입이 같은 오브젝트들을 담을 수 있는 클래스
TSubClassof<>: 언리얼에서 특정 클래스의 서브 클래스를 안전하게 참조할 수 있도록 도와주는 템플릿 클래스
실제 구현 과정 설계도
1. 스폰을 담당하는 엑터 생성 ActorName:FlatformActorSpawner
2. 스폰엑터에 내가 소환할 발판객체들 변수로 등록 TSubclassof<타입>, TArray<타입> 사용
3. 사용할 타이머와 타이머에 등록할 함수 변수로 등록 FTimerHande, FTimerDelegate 사용
4. 생성자에서 타이머함수 바인딩[람다식 사용]
구현과정

움직여야하는 발판엑터가 다른엑터들을 직접소환하는건 뭔가이상하다고 생각되어서 발판들을 모아놓고 스폰을 담당하는 엑터를 생성해주었다.
해당엑터는 서로다른 3가지의 발판을 소환해야하기 때문에 소환할 발판의 정보를 가지고 있어야하는데 해당 발판의 정보들을 보관할 방법으로 언리얼에서 제공하는 TArray 컨테이너를 사용했다.
소환된 엑터들또한 정보가 존재할 상자가 필요함으로 해당 발판들의 부모클래스 포인터 타입으로 TArray 변수를 선언했다.
이후 일정한 시간마다 동적으로 발판을 생성하기위해 FTimerHandle 변수와 타이머에 사용할 바인딩함수 FTimerDelegate 멤버변수를 선언해주었다.
마지막으로 스폰위치 범위를 정해주기 위해 FVector SpawnLocation 변수를 선언해주었다.

생성자에서 Delegate 에 객체스폰람다함수를 구현해주었다. 클래스 내부 변수를 람다함수내에서 사용하기위해 캡처에 &연산자를 넣어주었다.
Z축은 0으로 모두 동일하게 설정했고 X,Y좌표만 랜덤 범위내에서 값을 추출했다.
소환하려는 클래스 배열이 비어있으면 안됨으로 예외처리 또한 추가해주었다.
멤버변수로 등록해놓은 공통부모를가진 3개의 클래스 중 랜덤으로 소환되게끔 FMath::RandRange를 사용해 인덱스 번호 0,1,2 중 랜덤한 발판으로 스폰될 수 있도록 구현했다.
BeginPlay() 함수가 호출되면 1초마다 랜덤한위치에 소환하도록 타이머를 호출해주었다.
구현완료

각각 다른 종류의 3가지의 발판이 범위내에서 소환되고 작동하며 소멸하는것을 확인 할 수 있다.
구현하면서 어려웠던점
어떠한 동작을 구현해야하는지 어떤 함수가 작동해야하는지는 쉽게 감을 잡을 수 있었으나 정작 함수작동에 필요한 변수를 선언하는 부분에서는 아예 감을 잡지못했을정도로 치명적인부분이 있었다. 이러한 일이 벌어진이유는 구현을 하려는부분의 초점이 함수의 기능에 맞춰져 있어서 벌어진 일인 것같다 해당단점을 보완하기위해 코드구조에 있어서 변수선언방법에관한 내용을 좀더 자세하게 공부해야할 필요성을 느꼇다.