find (vector.begin(), vector.end(), "Search") - vector.begin(); 로 인덱스BeginPlay()의 역할은 다르다. 생성자는 초기 세팅, BeginPlay()는 실제 게임 시작 이후 상호작용 시점이다.Tick()은 편하지만 비싸다.DeltaTime과 조건 체크를 꼭 같이.PostInitializeComponents()Destroyed() EndPlay(const EEndPlayReason::Type EndPlayReason)Super::Endplay(EndPlayReason)Pitch Yaw Roll - 끄덕 도리도리 갸우뚱SetActorLocation()AddActorLocalRotation();AddActorWorldRotation()UCLASS(Blueprintable, BlueprintType)UPROPERTY(EditAnywhere, BlueprintReadWrite,Category = "Item|Components")UFUNCTION(BlueprintCallable, Category = "Item|Actions")seoul에서 "Kim"의 위치를 찾아 "김서방은 x에 있다" 형식으로 반환하는 문제.#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<string> seoul) {
string answer = "";
auto it = find (seoul.begin(), seoul.end(), "Kim");
answer = "김서방은 " + to_string(it-seoul.begin()) + "에 있다";
return answer;
}
std::find, to_string() string 더하기 다 잘 씀find 후 인덱스 구하기 = iterator - begin()BeginPlay()CreateDefaultSubobject 등 컴포넌트 생성, 초기 변수 세팅에 활용PostInitializeComponents() : Post Initialize임. 컴포넌트들 생성/초기화 후 자동 호출.BeginPlay(): 런타임 상에서 배치(Spawn) 직후Tick(float DeltaTime): 매 프레임. - 성능상 부담 크다.Destroyed(): Destroy()는 실제 파괴하는 함수. 이러면 Destroyed() 가 호출이 됨. 삭제 되기 직전. 이거 이후 EndPlay() 도 같이 호출됨.EndPlay() 만 호출되므로 Destroyed() 에 과한 의존 금지.EndPlay(): 액터가 월드에서 활동하지 않게 될 때.EEndPlayReason::Type은 Enum. 종료사유구분.Destroyed() 보다 호출 보장도 높다.GetWorldTimerManager().ClearTime())virtual void PostInitializeComponents() override;Tick 인자는 float DeltaTime, Endplay 인자는 const EEndPlayReason::Type EndPlayReason.cpp에 void AItem::BeginPlay(){}Super::BeginPlay(), Super::Endplay(EndPlayReason) 같이 부모 클래스 호출 해야 함에 주의.Pitch Yaw Roll -> Pitch Y축, Yaw (Z축), Roll은 X축SetActorLocation(FVector(300.0f, 200.0f, 100.0f))SetActorRotation(FRotator NewRotation): 360도 기반 각도Quaternion 이 있다. FQuatSetActorScale3D(FVector NewScale): 그냥 2.0f 해도 전체 2배 됨.SetActorTransform() 의 경우 한방대입 가능
GetActorLocation(), GetActorRotation(), GetActorScale3D()SetActorTransform(FTransform NewTransform)SetRelativeLocation(), SetRelativeRotation() 같이 부모 기준으로.PrimaryActorTick.bCanEverTick = true; 필요 -> 성능 최적화를 위해 Tick 필요없는 놈들은 꺼두는 게나을 수도 있다.AddActorLocalRotation(FRotator(0.0f, RotationSpeed, 0.0f)); 이렇게 쓰면?DeltaTime = 프레임 당 시간. 120프레임이면 1/120초RotationSpeed*DeltaTime 하면 틱당 필요속도 나온다.if(RotationSpeed != 0.0f){} 안에 넣기.if(!FMath::IsNearlyZero(RotationSpeed)){} 씀.AddActorWorldRotation()#include "Item.generated.h": 무조건 #include 가장 아래에. 리플렉션/엔진 통합에 필요한 코드 생성UCLASS() GENERATED_BODY() : 둘이 세트. 언리얼 엔진의 리플렉션 시스템에 해당 클래스 등록 -> 언리얼이 생성하는 코드들 집어넣는 용도.UCLASS() 내부에 (Blueprintable, BlueprintType): Blueprintable은 상속 가능한 클래스로 만드는 것. NotBlueprintable 하면 불가능하게. BlueprintType은 변수나 참조로 다른 클래스에서 이용 가능. 둘 중 하나만 넣어도 된다. 기본은 (Blueprintable, BlueprintType)Create Blueprint class based on Item 이런 식으로 블루프린트 자손 클래스를 만들어 에디팅하고 사용 가능.
UPROPERTY() 넣어서 리플렉션 시스템에 등록VisibleAnywhere: 읽기 전용으로 표시되며, 수정은 불가능EditAnywhere: 클래스 기본값, 인스턴스 모두에서 수정 가능EditDefaultsOnly: 클래스 기본값에서만 수정 가능EditInstanceOnly: 인스턴스에서만BlueprintReadWrite: Getter, Setter 둘다 가능BlueprintReadOnly: Getter만Category = "Item|Components" 부분.meta=(ClampMin="0.0"): 에디터 변수 지정할 때 최소값 지정 가능. Max는 최대겠지?meta=(AllowPrivateAccess="true"): 해당 변수가 private 이어도 에디터/블루프린트에서 접근 가능 -> 쓸 일이 있을까?StaticMeshComp 이런 거는 실제 주소를 가져와서 C++에서 붙여넣어서 하는 것보다 걍 에디터에서 설정하는 게 훨씬 쉽다.UFUNCTION() 넣어서.BlueprintCallable: 블루프린트 이벤트 그래프에서 호출(Execute) 가능한 함수로. 흰색 이벤트 핀이 있는 노드로 만든다는 뜻.BlueprintPure: Getter 역할. Return Value 핀만 있다.BlueprintImplementableEvent: 선언은 C++에서. 구현은 블루프린트에서 -> 블루프린트 함수 구현은 해봤지?Append -> 스트링 더하는 노드. A에 원하는 하드코딩 B에 변수 입력하는 식으로 가능
Fab에서 적절한 애셋 모음집을 구해서 이걸 기반으로 플랫폼 맵을 생성하기로 했다.

이걸 기반으로 Empty Level을 만든 후 바닥에 용암 머티리얼을 채워 넣어 기본 맵을 만들었다.

|
|
이후 C++ 액터 클래스를 생성하고 내부에 리플렉션을 설정한 코드를 써놓고, Blueprint 자손을 만들어서 이를 이용해 맵에 배치하였다.

FVector를 붙여버려서 선언 충돌이 난 경우였다. 이를 지워서 해결.
MovingActor 의 경우 내가 생각한 대로 코드가 동작하지 않아 왕복동작이 아닌 영원히 한 방향으로 움직이는 플랫폼이 되어버렸다. 내일 수정 예정. 현재 코드 상태:void AMovingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (!FMath::IsNearlyZero(FVector::Dist(TargetLocation, GetActorLocation())))
{
AddActorWorldOffset(MoveSpeed * DeltaTime);
}
else
{
SetActorLocation(TargetLocation);
ReverseMovement();
}
}
void AMovingActor::ReverseMovement()
{
MoveSpeed *= -1.f;
if (TargetLocation.Equals(Destination, 1.0f))
{
TargetLocation = StartLocation;
}
else
{
TargetLocation = Destination;
} UE_LOG(LogTemp, Warning, TEXT("Movement Reversed"));
}