sstream 활용toupper(), tolower() 활용bitset 활용 혹은 직접 계산을 통해 이진 변환count() 활용 혹은 직접 순회하면서 세기 -> 둘 다 O(N)vector<int> solution(string s) {
int transform = 0;
int zero_count = 0;
while(s != "1") {
transform++;
zero_count += count(s.begin(), s.end(), '0');
int one_count = count(s.begin(), s.end(), '1');
// bitset 변환
bitset<32> temp = one_count;
s = temp.to_string();
s = s.substr(s.find('1')); // 32비트로 변환했기 때문에 1이 처음에 나오는 위치 찾아서 자르기
// 직접 변환
// s = "";
// while(one_count >= 1){
// s = to_string(one_count % 2) + s;
// one_count /= 2;
// }
}
return {transform, zero_count};
}캐릭터가 스턴 걸리는 시간이 5초인데, AI가 화내는 시간이 다소 짧음
현재 GameplayAbility의 UAbilityTask_PlayMontageAndWait를 통해 화내는 애니메이션 몽타주 재생
화내는 애니메이션 몽타주를 5초로 늘리고자 하는데, 기존의 애니메이션 시퀀스는 34프레임으로 약 1.13초임
화내는 애니메이션을 (Start, Loop, End)로 분리를 해서 Loop를 계속 반복재생을 통해 애니메이션 몽타주 길이를 조절하고자 함
기존의 애니메이션을 프레임 단위로 자른 결과, Loop 애니메이션 시퀀스의 처음과 끝의 위치가 달라서 반복재생할 때, 입이나 팔이 텔포되는 현상이 발생
| 처음 | 끝 (수정 전) |
|---|---|
![]() | ![]() |
-> 처음과 끝의 위치를 최대한 맞추고자, Loop 애니메이션의 끝에 키를 추가해서 본의 위치를 수정 (본을 클릭하고, +Key를 누르면 Curve Editor를 통해 수정 가능)

| 처음 | 끝 (수정 후) |
|---|---|
![]() | ![]() |
몽타주에서 Loop Count를 통해 Loop 시퀀스를 반복재생시켜 몽타주의 길이를 약 5초 정도로 수정
EBTNodeResult::Succeeded 반환AbilityEndedCallbacks의 어빌리티 종료 시 발생하는 콜백 함수에 델리게이트 바인딩EBTNodeResult::Type UBTTask_ActivateAbility::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
CachedOwnerComp = &OwnerComp;
...
if (AbilityToActivate)
{
FGameplayAbilitySpec* Spec = ASC->FindAbilitySpecFromClass(AbilityToActivate);
if (Spec)
{
// Delegate calls when ability ends
ASC->AbilityEndedCallbacks.AddUObject(this, &ThisClass::OnAbilityEnded);
bool bActivated = ASC->TryActivateAbilityByClass(AbilityToActivate);
if (bActivated)
{
return EBTNodeResult::InProgress;
}
}
}
return EBTNodeResult::Failed;
}
void UBTTask_ActivateAbility::OnAbilityEnded(UGameplayAbility* Ability)
{
if (Ability && Ability->GetClass() == AbilityToActivate)
{
if (CachedOwnerComp.IsValid())
{
FinishLatentTask(*CachedOwnerComp.Get(), EBTNodeResult::Succeeded);
}
}
}
UKismetMathLibrary::FindLookAtRotation() 함수를 통해 현재 위치를 기반으로 바라봐야 할 회전 값 받아오기void AEGAICharacter::OnAngryMode(FVector AttackLocation)
{
if (HasAuthority())
{
...
FVector curLocation = GetActorLocation();
FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(curLocation, AttackLocation);
LookAtRotation.Pitch = 0.f;
LookAtRotation.Roll = 0.f
SetActorRotation(LookAtRotation);
}
}

| 문을 닫은 상태 | 문을 연 상태 |
|---|---|
![]() | ![]() |
Ensure condition failed: InvocationList[CurFunctionIndex] != InDelegate
File: ScriptDelegates.h Line: 1009
ensure()로 걸어준 상황이라고 함Cast<>)-> C++와는 다르게 교차상속 불가능
UCLASS 매크로로 정의된 모든 클래스는 UObject를 상속받게 됨UObject의 메타클래스로 클래스 자체를 설명하는 객체