Actor 가 생성되는 시점 = BeginPlay 에
로또번호:
~를 콘솔에 출력하는 코드를 구현하기
※ 요구사항
1) 언리얼 엔진의 FMath::RandRange() 를 사용해서
1~45 사이의 랜덤 숫자를 생성
2) 배열에 값이 이미 존재하는지 확인하기 위해
TArray::Contains 를 사용
ex)
// 함수: ExampleContainsUsage
// 목적: 이 함수는 TArray의 Contains 메서드를 사용하여 배열에 특정 값이 포함되어 있는지 확인하는 방법을 보여줍니다.
// Contains 메서드는 배열 내에서 주어진 값이 존재하면 true, 존재하지 않으면 false를 반환합니다.
//
// 실행 결과:
// - 배열에 10이 포함되어 있기 때문에 "The array contains the value: 10" 로그가 출력됩니다.
// - 배열에 20은 포함되어 있지 않기 때문에 "The array does not contain the value: 20" 로그가 출력됩니다.
void ExampleContainsUsage()
{
// 1. 정수형 배열(TArray<int32>) 생성
TArray<int32> Numbers;
// 2. 배열에 값 추가
Numbers.Add(5); // 배열에 5 추가
Numbers.Add(10); // 배열에 10 추가
Numbers.Add(15); // 배열에 15 추가
// 3. 배열에 특정 값이 포함되어 있는지 확인
// 첫 번째 값 확인: 10
int32 SearchValue = 10;
if (Numbers.Contains(SearchValue))
{
UE_LOG(LogTemp, Warning, TEXT("The array contains the value: %d"), SearchValue);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("The array does not contain the value: %d"), SearchValue);
}
// 두 번째 값 확인: 20
SearchValue = 20;
if (Numbers.Contains(SearchValue))
{
UE_LOG(LogTemp, Warning, TEXT("The array contains the value: %d"), SearchValue);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("The array does not contain the value: %d"), SearchValue);
}
}
3) 출력 예시


실행하면 에러가 발생한다

일단 36행에 문제가 있고
"Out of bounds" 문제가 있는 것으로 보인다
일단 예상으로는
랜덤 숫자가 혹시 겹쳤을 때는 배열이 6개가 안될수도 있으니까
무조건 6개는 만들어질수 있도록 수정이 필요
while 문 사용해서 수정해보기로

렉걸리면서 실행이 안된다
while (!LottoNumbers[5]) 로 수정하자
똑같은 out of bounds 오류가 뜨는 상황
일단은 반복문 범위 설정을 고쳐야하는게 맞아 보인다
혹은 처음 배열 크기를 지정해주면서 out of bounds를 막는..
확인 결과,
TArray 에서는 Num() 함수를 통해 원소 개수를 확인할 수 있다고.
< 로 지정하니 오류가 나서!= 로 지정

// 게임이 시작되거나 엑터가 생성될 때 호출됨
//본인 액터의 BeginPlay()함수에 아래 코드를 넣으면 됩니다.
void MyActor::BeginPlay()
{
Super::BeginPlay();
TArray<int32> LottoNumbers;
const int32 MinNumber = 1;
const int32 MaxNumber = 45;
const int32 TotalNumbers = 6;
// 랜덤한 숫자 6개 생성 (중복되지 않도록)
while (LottoNumbers.Num() < TotalNumbers)
{
int32 RandomNumber = FMath::RandRange(MinNumber, MaxNumber);
if (!LottoNumbers.Contains(RandomNumber))
{
LottoNumbers.Add(RandomNumber);
}
}
// 숫자 배열을 문자열로 변환
FString LottoNumbersStr;
for (int32 Number : LottoNumbers)
{
LottoNumbersStr += FString::FromInt(Number) + TEXT(", ");
}
LottoNumbersStr.RemoveFromEnd(TEXT(", "));
// 로또 번호 출력
UE_LOG(LogTemp, Warning, TEXT("로또 번호: %s"), *LottoNumbersStr);
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::Printf(TEXT("로또 번호: %s"), *LottoNumbersStr));
}
}
while (LottoNumbers.Num() < TotalNumbers)
여기선 < 로 범위지정이 되는 모습..
for (int32 Number : LottoNumbers) { LottoNumbersStr += FString::FromInt(Number) + TEXT(", "); } LottoNumbersStr.RemoveFromEnd(TEXT(", "));
FString 으로 변환해준 모습