2025-01-21_UnrealCPP와BP 차이점

별빛에소원을·2025년 1월 21일

TeamSparta-Unreal1기-TIL

목록 보기
29/90
post-thumbnail

알고리즘 : 옹알이2

해당 알고리즘은 문자열을 받았을 때 특정 단어들로 이루어져 있는지 검사하는 알고리즘이다.
요즘 쪽잠만 자서 머리가 안돌아갔기 때문에 멍하게 바라만보는 시간이 있었고,
대충 생각한 답이 안맞아서 꽤 골아팠던 문제다.

내가 푼 방법

int solution(vector<string> babbling) 
{
    int answer = 0;
    for (string str : babbling)
    {
        string first;
        size_t size = str.size();
        unsigned int check = 0;
        for (int i = 0; i < size; ++i)
        {
            if (str.substr(i, 2) == "ye" && (check & 0x01) == 0)
            {
                i += 1;
                check = 0;
                check |= 0x01;
            }
            else if (str.substr(i, 2) == "ma" && (check & 0x02) == 0)
            {
                i += 1;
                check = 0;
                check |= 0x02;
            }
            else if (str.substr(i, 3) == "aya" && (check & 0x04) == 0)
            {
                i += 2;
                check = 0;
                check |= 0x04;
            }
            else if (str.substr(i, 3) == "woo" && (check & 0x08) == 0)
            {
                i += 2;
                check = 0;
                check |= 0x08;
            }
            else
            {
                check = 0;
                break;
            }
        }
        answer += check != 0 ? 1 : 0;
    }
    return answer;
}

작성을 하면서도 index값을 넘어설 수 있기 때문에 불안했고 통과는 했지만 마음에 드는 로직이 아니었기 때문에 한동안 더 고민했었다. 좋은 방법이 없었을까 고민했는데 정말 좋은 방법으로 푼 사람이 있었다.

int solution(vector<string> babbling) 
{
    int answer = 0;

    for (string str : babbling)
    {
        string temp1;
        string temp2;
        size_t size = str.size();
        for (int i = 0; i < size; ++i)
        {
            temp1 += str[i];
            if (temp1 == "aya" || temp1 == "ye" || temp1 == "woo" || temp1 == "ma")
            {
                if (temp1 == temp2)break;
                temp2 = temp1;
                temp1 = "";
            }
        }
        answer += temp1.size() == 0 ? 1 : 0;
    }

    return answer;
}

이렇게 작성하면 index를 넘어 설 일도 없고 연속된 값이 들어올 수 도 없다.
string이 문자열을 더할 수 있는 장점이 있는데 왜 이런 생각을 못하고 substring으로 검사할 생각만 했을까 ?
if문 안으로 들어오지 못하면 값또한 일치하는 값이 없는 것이기 때문에 깔끔하게 카운트가 가능하다.
문자열을 특정 문자열로 검사를 할 때 상당히 유용해 보인다.


Unreal CPP와 BP 장단점

BP

장점

  • 수정이 쉽고 빠르기 때문에 아이디어를 빠르게 검증하고 반복할 수 있다.
  • 프로그래밍에 익숙하지 않아도 쉽게 사용이 가능하다.

단점

  • 노드가 많아지면 그래프가 복잡해지기에 가독성과 유지보수가 어렵다.
  • 내부적으로 추가적인 해석을 해야하기 때문에 병목이 될 수 있다.

CPP

장점

  • 엔진 코어까지 직접 수정이 가능하며, 복잡하고 성능이 중요한 게임 로직을 빠르고 최적화 된 방식으로 구현이 가능하다.
  • 표준 라이브러리와, 외부 라이브러리를 자유롭게 사용이 가능하여 대규모 프로젝트에 적합하다.
  • 메모리에 접근할 수 있기에 최적화에 유리하다.
    단점
  • 많은 경우 프로젝트 빌드를 통해 CDO를 전달을 해야 하거나 LiveCoding을 다시 컴파일 해야 하므로, 반복해야 하는 작업이 많을 경우 번거롭다.
  • 위의 나열한 장 단점은 하나만 사용할 경우 한계점이 있지만 두 개 다 사용하면 시너지가 좋다.
    BP는 UI나, 간단한 이벤트 처리 혹은 시각적 연출에 특화되어 사용하면 좋고, CPP는 성능이 요구되는 플레이 로직이나 엔진레벨의 확장등 구조적인 문제를 해결하기에 적합하다.

6강 숙제

회전하면서 일정거리를 상승하는 것을 구현하라는 과제였는데 불변수는 없어도 z값을 조정하는데는 문제가 없지만 가독성이 좋아지기 때문에 이 상태가 더 좋다고 판단하였다.

void AVerticalMove::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	if (!FMath::IsNearlyZero(m_RotationSpeed))
	{
		FRotator rotation = FRotator(0, m_RotationSpeed * DeltaTime, 0);
		AddActorLocalRotation(rotation);
	}
	if (!FMath::IsNearlyZero(m_SpeedZ))
	{
		FVector Location = GetActorLocation();
		
		if (Location.Z >= m_Distance)
		{
			m_ReverseMove = true;
		}
		else if (Location.Z <= 0.f)
		{
			m_ReverseMove = false;
		}
		if (m_ReverseMove)
			Location.Z -= m_SpeedZ * DeltaTime;
		else
			Location.Z += m_SpeedZ * DeltaTime;
		
		SetActorLocation(Location); 		
	}
}

오늘 감상

과제를 진행하고싶은데 스테이지를 구성하는게 생각보다 어렵다
필요한 기능은 만들어 놨는데 더 고민해봐도 스테이지에는 손이 잘 안간다.
강의나 더 봐야겠다는 생각이 든다

profile
취미로 게임하는사람

0개의 댓글