[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의자료에 있는 bmp이미지 파일은 정상적으로 잘 출력이 됩니다. 다만, 다른 bmp파일로 출력을 할 경우 이미지로드에 실패합니다. 파일을 보니 출력되지 않는 bmp파일의 경우 비트심도가 32이고 강의자료에있는 bmp파일의 경우 24인 것을 확인하고 비트심도를 동일하게 24로 변경했는데도 출력이 되지않습니다. 정확한 원인이 궁금하여 질문드립니다. 항상 좋은 강의 감사드립니다.
안녕하세요 교수님, 람다 함수 캡쳐 관련 질문이 있어서 글을 올렸습니다. fps 프로젝트를 만들고 있는데, VICharacter 에서 reload 를 호출하면 VIWeaponbase를 상속받는 AKWeapon 에서 Reload 함수가 호출이 되는 형식입니다. VICharacter 에 bIsReloading 을 선언해 놓았는데, AKWeapon에서 캐릭터 참조를 가져와 재장전이 끝난 후 setter 로 false 설정을할 때 Timerdelegate 람다식에서 Character에 액세스를 하지 못합니다. 제 생각에는 참조의 생명 주기에 문제는 없는 것 같은데,, 왜 람다식 안에서만 캐릭터 참조를 사용 못하는지 모르겠습니다. 아래는 Reload 코드와 프로젝트 깃허브 주소입니다. void AVIAKWeapon::Reload() { Super::Reload(); if (UWorld* World = GetWorld()) { APlayerController* PC = UGameplayStatics::GetPlayerController(World, 0); if (PC) { AVICharacter* Character = Cast<AVICharacter>(PC->GetCharacter()); if (Character) { if (AmmoCount < MaxAmmo) { if (!bDoOnceReload && !Character->GetbIsReloading()) { Character->SetbIsReloading(true); Character->GetFirstPersonMesh()->GetAnimInstance()->Montage_Play(AKReloadActionMontage, 1.0f); Mesh->PlayAnimation(ReloadActionAnimation, false); FTimerHandle ReloadTimeHandle; GetWorld()->GetTimerManager().SetTimer(ReloadTimeHandle, FTimerDelegate::CreateLambda([&]() { Character->SetbIsReloading(false); AmmoCount = MaxAmmo; //DF("EndTimer bisRelaoding %d", Character->GetbIsReloading()) // TimerHandle 초기화 GetWorld()->GetTimerManager().ClearTimer(ReloadTimeHandle); }), ReloadTime, false); bDoOnceReload = false; } } } } } } https://github.com/chataeg/VI/tree/Part7
강의에서 사용한 Play Anim Montage는 현재 메시 컴포넌트가 사용하는 ABP_Player(애니메이션 블루프린트) 안에 있는 몽타주에 접근해 재생시키는 것인가요? 애니메이션 관련 액션을 검색하다 Play Animation을 발견해서 사용해봤는데 ABP_Player(애니메이션 블루프린트)를 무시하고 Play Animation으로 재생한 것만 1순위로 실행하더라구요. (설명을 읽어도 안전하지 않으니 비추천한다는 것 같고) 그럼 Play Animation은 ABP_Player(애니메이션 블루프린트)의 실행을 무시하고 메시를 강제로 특정 애니메이션을 재생시키도록 작동하는 것일까요? 강의 잘 듣고 있습니다. 감사합니다. ps. 추가로 강의 관련 궁금한 점이 있습니다. 유니티 MMORPG 만들기 강의와 켠김에 출시까지 강의 시리즈 중에서 실무적인 팁이나 지식을 얻기 위해서는 켠김에 출시까지를 들어보는 것이 좋을까요?
안녕하세요 교수님. 교수님께서 만들어주시는 양질의 강의에 언제나 많은 배움을 얻게 되어 감사드립니다. 강의를 듣던 도중 궁금한 점이 생겨 이렇게 질문을 작성하게 되었습니다. ShoulderLook()에서 플레이어 컨트롤러의 로테이션 Yaw값과 Pitch값을 더하는 것은 알게 되었지만, 다음의 코드들이 작동하는 원리를 자세히 이해하지 못한 것 같습니다. 특히 이 코드들이 작동하는 수학적 원리가 어떻게 되는지 알고 싶습니다. 추가적으로 위의 코드들이 Quater 뷰와 Shoulder 뷰를 구현하는 최선의 방법인지, 다른 더 간소화할 수 있는 방법이 있다면 무엇인지 알려주시면 감사하겠습니다. 다시 한번 좋은 강의를 만들어주셔서 감사합니다.
입력키를 사진처럼 설정하면 W(앞), D(우), S(뒤), A(좌) 방향으로 제대로 움직이는데 원래 설정되어 있던 WSDA순서로 설정하면 W(우), D(뒤), S(좌),A(앞) 이렇게 움직입니다. 일반적으로 DASW, Up Down Right Left 순서를 어떻게 맞추면 될까요?
수업에서는 AttackInRange 데코레이터를 CalculateRawConditionValue() 만 구현해서 사용했는데요. aborts 발동 조건같은걸 따로 지정안해도 자동으로 되는 건가요?? BlackBoard 데코레이터의 경우에는 값이나 결과? 가 바뀌면 aborts가 발동되는 걸로 이해해서 코드를 보니 상당히 복잡하게 aborts 구현이 되어있더라구요.... 어설프게 이해한 바로는 블랙보드의 키에 델리게이트 등록해서 값 변경 이벤트를받아 ConditionalFlowAbort() 라는 함수를 호출하고 있습니다. 이 과정에서 CalculateRawConditionValue()가 또 호출되고 활성/비활성으로 나뉘어져 뭔가 복잡하게 수행하는데요. 결국 aborts를 해야하는지 말아야하는지 체크는 ConditionalFlowAbort() 를 호출함으로서 시작되는 것 같아 보이는데.... 이걸 안 한 AttackInRange 데코레이터는 aborts 가 어떻게 동작하는지 알고 싶습니다..
안녕하세요. 저는 무기 아이템 액터가 무기를 휘두르는 몽타주를 재생하는 어빌리티를 멤버 변수로 갖고 있게 하고, 해당 무기를 장착했을 때 무기의 어빌리티를 매개변수로 전달받아 어빌리티를 활성화 하도록 구현하려고 하는데요. 이 경우에 어빌리티를 활성화하고 등록된 어빌리티를 다시 제거해 줄 필요는 없을까요? 같은 무기를 여러번 장착할 수도 있을텐데 ASC에 같은 어빌리티 여러 개가 등록되어 있는게 문제가 될 수도 있지 않나 해서 질문드립니다.
안녕하세요. 블록 태그 관련해서 질문 있습니다.강의에서는 각 어빌리티별로 블록할 태그들을 설정하고 있는데 이런 방식이라면 새로운 태그를 추가할 때마다 기존에 있던 어빌리티들의 블록할 태그에 해당 태그를 일일이 추가해줘야 하잖아요? enum 클래스를 사용해서 state패턴으로 구현하는 방법처럼 더 나은 방식은 없을까요?일반적으로 게임에서는 두 가지 이상의 행위를 동시에 하는 것은 막고 있기 때문에 블록 태그 같은 부정문 방식보다는 state패턴처럼 긍정문 방식이 더 좋을 것 같아 질문합니다.
안녕하세요 강의를 보고 열심히 따라해보고 있습니다. 뷰포트에서 play 버튼을 누르는데, 항상 origin 위치로 초기화가 되더라구요. 강사님께서 마지막 슬라임 경주 강의 찍으실 때 보면, play 버튼 누르면 편집하던 위치에서 시작되던데, 어떻게 그렇게 할 수 있나요?
안녕하세요 좋은 강의 정말 감사드립니다. 다름이 아니라 delegate wrapper 사용 이유가 궁금하여 질문 드립니다. 선생님께서 delegate를 다수 배열로 관리하기 해야 하는데 이 자체를 인자로 쓸 수 없다고 하신 부분이 잘 이해가 되지가 않습니다. 어느 부분을 인자로 쓸 수 없는지에 대해 구체적으로 말씀해주실 수 있나요? FTakeItemDelegateWrapper 랩퍼 구조체가 아닌 FOnTakeItemDelegate 델리게이트를 TArray 배열에 넣을 수도 있고 이런 식으로 바인드도 되고, 실행도 되는데 왜 델리게이트 랩퍼 구조체를 따로 만들어야하는지가 궁금합니다.
안녕하세요 교수님, void APACharacterPlayer::Move(const FInputActionValue& Value) { FVector2D MovementVector = Value.Get<FVector2D>(); const FRotator Rotation = Controller->GetControlRotation(); const FRotator YawRotation(0, Rotation.Yaw, 0); FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); if (bIsRunning) { if (MovementVector.Y != 0) MovementVector.Y = 0; if (MovementVector.X == -1) MovementVector.X = 1; AddMovementInput(ForwardDirection, MovementVector.X); } else { if (MovementVector.Y != 0 || MovementVector.X == -1) bCanSprint = false; else bCanSprint = true; AddMovementInput(ForwardDirection, MovementVector.X); AddMovementInput(RightDirection, MovementVector.Y); UE_LOG(LogTemp, Log, TEXT("X = %f y = %f"),ForwardDirection.X, RightDirection.Y); } } 위 코드는 3인칭 게임플레이를 위해 강의 기반으로 작성한 코드입니다. bCanSprint 및 Running 로직은 무시하셔도 됩니다. 발생한 문제는 키의 동시 입력을 받을 때 입니다. 왼쪽 방향키를 누른 채로 오른쪽 방향키를 누르면 MovementVector 값이 1.0 으로 변해서 오른쪽으로 잘 이동 하는데, 오른쪽 방향키를 누른 채로 왼쪽 방향키를 누르면 벡터 값이 변하지 않아 계속 오른쪽으로 갑니다. 똑같이 앞 방향키를 누른 채로 뒷 방향키를 누르면 뒤로 가지는데, 뒷 방향키를 누른채로는 앞으로 갈 수가 없습니다. 물론 따로따로 한 버튼씩 서로 역이 되는 방향키를 누를 때는 값이 알맞게 잘 변경됩니다. 원하는 로직은 두 가지 중에 하나입니다. 동시입력이 들어왔을 경우 마지막 입력 방향으로 이동 동시입력이 서로 반대 방향으로 들어왔을 경우 상쇄되어 정지 로직을 어떻게 수정해야 할까요? 동시입력(오른쪽 홀드+왼쪽이동, 뒤쪽홀드 + 앞쪽이동) 할 때만 벡터값이 제대로 변하지 않는 이유를 못 찾겠습니다..
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이벤트 경우에 시작되는 지점은 알 수 있지만 끝나는 시기를 모른다는 의미를 잘 모르겠습니다. 일단 실행되면 끝날 때까지 이벤트 함수에 머무는 것이 아니라 비동기적으로 처리하는 건가요? 딜레이를 이벤트에서는 사용가능하지만 함수에서는 사용하지 못 하는 게 함수는 점유율을 100% 다 가져가서 다른 코드가 실행될 여지를 빼았기 때문인가요? 반대로 이벤트는 점유율이 왔다갔다 왕복하면서 실행이 되는 건가요?
섹션3 애니메이션 - 애니메이션 커브 강의에서 궁금한점이 있느데요. Get Curve Value가 리턴하는 값을 print text 함수를 통해서 로그를 찍어보았는데, Right로 돌리는걸 기준으로 해서 제 예상에는 -90, -80, -70 ... 0 이렇게 될거라고 예상을 했는데, 실제로 로그를 찍어보니, -1, -10, -20, ... -80, -75, -70, .... 0 이런느낌으로 찍히는데, 이유를 잘 모르겠습니다. Right Animation에서 Rotation Curve는 -90~0으로 세팅되어있습니다.