묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[입문자를 위한 UE5] Part3. 언리얼 엔진 3D 게임 개발 입문
애니메이션 커브 Rotation관련 질문드립니다.
섹션3 애니메이션 - 애니메이션 커브강의에서 궁금한점이 있느데요.Get Curve Value가 리턴하는 값을 print text 함수를 통해서 로그를 찍어보았는데, Right로 돌리는걸 기준으로 해서 제 예상에는 -90, -80, -70 ... 0 이렇게 될거라고 예상을 했는데, 실제로 로그를 찍어보니, -1, -10, -20, ... -80, -75, -70, .... 0 이런느낌으로 찍히는데, 이유를 잘 모르겠습니다.Right Animation에서 Rotation Curve는 -90~0으로 세팅되어있습니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
단일쓰레드로 어디까지 커버가 될까요?
루키스님 강의 잘 듣고 여러가지 연동을 시도해서 컨텐츠를 만드는 중인데요 지금은 데이터나 오브젝트들이 많지 않아서 별 문제가 없는데 나중에 3d 포폴도 이걸 기반으로 만들고 싶어서 멀티쓰레드를 사용해야할 정도는 어느정도 되야하는지가 궁긍합니다. 그리고 마지막에 aws 에 서버 올리시는 부분을 잠깐 언급해주셨는데 c++서버강의엔 그런부분이 없는것 같아 그부분 강의 예정이 있는지도, 아니면 관련 자료나 공부를 어떻게 해야하는지도 궁급합니다
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Static UserManager um을 포인터로 만들어서 리턴 하면 안되는 이유가 궁금합니다.
아래의 코드와 같이 포인터로 변수를 만들어줘서 넘겨주면 AddUser() 함수를 부를때 '_userCount' 올려주는 변수에서 '액세스 위반 this가 nullptr 입니다.' 라고 뜹니다.그 이유가 객체를 생성해 주지 않았기 때문에 'nullptr'이 생성 되는 건가요? 이해가 잘 되지 않는 부분이 static 함수를 부를 때 변수를 초기화 되어 전역 변수로 사용되는데, 포인터는 객체가 생성되지 않는 것 같더라구요.그래서 new UserManager( ) 를 통해 동적 할당을 하니 객체가 하나씩 생기는 문제가 발생하고, static 메모리와 동적 할당 되는 메모리 위치(?), 특성(?)이 달라서 생기는 문제인가 싶습니다.public: UserManager() :_userCount(0) {} static UserManager* GetInstance() { static UserManager* um = new UserManager(); um->_userCount = 0; return um; } 주저리 주저리 궁금한 내용을 적다보니 제대로 설명했는지 모르겠네요... ㅡㅜ 답변해 주신다면 감사하겠습니다. 혹시 몰라 _userCount를 생성자로 초기화 시켜줬습니다.class UserManager { public: UserManager() :_userCount(0) {} static UserManager* GetInstance() { static UserManager* um = nullptr; return um; } public: void AddUser() { _userCount++; } int GetUserCount() { return _userCount; } private: int _userCount = 0; };
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
리소스 파일 경로
강사님 혹시 제 코드와 강사님 코드를 비교하려고 파일을 다운받았는데요 리소스파일 이미지 경로가 틀려서 확인을 못하는데 혹시 어디서 변경할 수 있는지 알 수 있을까요? 오류는 계속 이렇게 뜹니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
txt파일 삭제 시 빌드 오류
안녕하세요 강의 정말 잘 듣고 있습니다.다름이 아니라 마지막 32:13 쓸모 없는 파일을 삭제하는 부분에서 수업 자료에서 받은 파일 중 txt파일만 삭제하면 빌드 오류가 떠서 어떻게 없애야할지 궁금하여 질문 드립니다.위 사진처럼 삼인칭템플릿추가필요.txt 파일을 삭제하고 빌드를 하면 아래와 같이 빌드 오류가 뜨네요.Saved, Intermediate, DerivedDataCache, sin 파일을 지우고 txt파일도 지운 다음 Generate Visiual Studio를 실행했는데도 계속 똑같은 빌드 오류가 뜨네요. 어떻게 해결할 수 있을까요?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
knight 기본생성자
knight에 기타 생성자를 만들어 주면, 기본 생성자를 사용 할 수 없다고 했는데, 새로운 knight를 만들어 주어 기본 생성자를 이용하니깐 잘 만들어 지더라구요.제가 잘 못 이해 하는걸까요?같은 객체일 경우 기본 생성자가 실행이 안된다는 말씀 일까요?새로운 객체면 상관 없는거구요?
-
미해결[입문자를 위한 UE5] Part2. 언리얼 엔진 2D 게임 개발 입문
State 패턴듣고 질문드립니다..
안녕하세요 루키스님저는 비전공자로서, 강의 너무 잘듣고있습니다.이해가 아주 쏙쏙됩니다.이때까지 제 자존심이 허락하지 않아뭐 안되는거있으면 구글링이나 chatgpt한테 물어봐가면서 아득바득해결했는데이건 도저히 이해가 안되네요... 제가 공격을 구현하는 코드에서 실수로 UpdateAnimation 부분을 빼고 연결해버렸습니다.나머지는 강의랑 동일한 코드로 작성하였습니다근데 요상하게도 나머지 기능은 정상적으로 작동하는데 공격시, 2회연속공격을 하더라구요??아니 공격키가 먹히는 것도 요상한데 2회연속공격도 요상합니다. 공격키가 먹히는 이유는 Event Tick에 걸어준 코드 때문에Update Input 함수에서 노란선방향으로 쭉 나가서 UpateAnimation쪽으로 가주면서공격키를 눌러주긴했으니까 EState가 Skill값으로 받아줘서 결과적으로 공격 모션을 취한것으로 예상을하고있는데근데 왜 2회연속공격으로 실행될까요??예전에 말씀하시길 Tick이 frame단위로 굉장히 짧은시간이니깐공격키가 눌린 찰나의 시간동안 저 과정이 2번 반복되서 그런걸까요??
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
[문자열] 강의 부분에서 StrCpy함수 포인터로 구현 하는 부분 질문 있습니다.
글로 질문은 처음이라 두서 없을 수 있다는 부분 양해 부탁 드립니다. char* StrCpy(char dest, char src) 함수에서 char * ret = dest; 선언을 통해 기존 원본 위치값을 저장해 주는것은 알겠는데,while문이 다 돌고 나서 'dest'의 값을 확인해 보면 문자열이 없는 것을 데이터를 확인 하여 알았습니다.그 이유가 'dest++'을 통해 포인터의 시작 위치 값을 변경해 주어서 값이 없는 주소 부분을 가르키기 때문에 'dest'의 데이터가 아무것도 없는 것이 맞을까요? 그렇기 때문에 원본 데이터에는 정상적으로 들어있고,함수내에서 'dest'의 주소 시작점이 뒤로 밀려나 데이터가 없다고 판단해도 되는지 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
3강에서 시점 변경 부분이요
시점 변경 전까지 정상 적으로 작동 되었는데 변경 후부터 움직임도 먹통이고 해서 이것저것 수정하다가 ACharacterPlayer::ACharacterPlayer() { // 카메라 붐 생성 (충돌이 있으면 플레이어 쪽으로 당겨짐) CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom")); CameraBoom->SetupAttachment(RootComponent); CameraBoom->TargetArmLength = 400.0f; // 카메라가 캐릭터 뒤에서 이 거리만큼 따라갑니다 CameraBoom->bUsePawnControlRotation = true; // 컨트롤러를 기반으로 암을 회전시킵니다 // 팔로우 카메라 생성 FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera")); FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // 카메라를 붐 끝에 부착하고 붐이 컨트롤러 방향에 맞춰 조정되도록 합니다 FollowCamera->bUsePawnControlRotation = false; // 카메라는 암과 상대적으로 회전하지 않습니다 //Jump Input Action을 찾습니다. static ConstructorHelpers::FObjectFinder<UInputAction> InputActionJumpRef(TEXT("/Script/EnhancedInput.InputAction'/Game/KoreaSoul/Input/Actions/IA_Jump.IA_Jump'")); if (nullptr != InputActionJumpRef.Object) { JumpAction = InputActionJumpRef.Object; } static ConstructorHelpers::FObjectFinder<UInputAction> InputChangeActionControlRef(TEXT("/Script/EnhancedInput.InputAction'/Game/KoreaSoul/Input/Actions/IA_ChangeControl.IA_ChangeControl'")); if (nullptr != InputChangeActionControlRef.Object) { ChangeControlAction = InputChangeActionControlRef.Object; } // ShoulderMove Input Action static ConstructorHelpers::FObjectFinder<UInputAction> ShoulderMoveActionRef(TEXT("/Script/EnhancedInput.InputAction'/Game/KoreaSoul/Input/Actions/IA_ShoulderMove.IA_ShoulderMove'")); if (nullptr != ShoulderMoveActionRef.Object) { ShoulderMoveAction = ShoulderMoveActionRef.Object; } // ShoulderMoveLook Input Action static ConstructorHelpers::FObjectFinder<UInputAction> ShoulderMoveActionLookRef(TEXT("/Script/EnhancedInput.InputAction'/Game/KoreaSoul/Input/Actions/IA_ShoulderLook.IA_ShoulderLook'")); if (nullptr != ShoulderMoveActionLookRef.Object) { ShoulderLookAction = ShoulderMoveActionLookRef.Object; } // QuaterMove Input Action static ConstructorHelpers::FObjectFinder<UInputAction> QuaterMoveActionRef(TEXT("/Script/EnhancedInput.InputAction'/Game/KoreaSoul/Input/Actions/IA_QuaterMove.IA_QuaterMove'")); if (nullptr != QuaterMoveActionRef.Object) { QuaterMoveAction = QuaterMoveActionRef.Object; } CurrentCharacterControlType = ECharacterControlType::Quater; } void ACharacterPlayer::BeginPlay() { // 부모 클래스의 BeginPlay 함수를 호출합니다. Super::BeginPlay(); SetCharacterControl(CurrentCharacterControlType); } void ACharacterPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // PlayerInputComponent를 UEnhancedInputComponent로 캐스팅합니다. UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent); // 점프 액션을 트리거 이벤트에 바인딩합니다. // JumpAction이 발생하면 ACharacter의 Jump 함수를 호출합니다. EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::StopJumping); EnhancedInputComponent->BindAction(ChangeControlAction, ETriggerEvent::Triggered, this, &ACharacterPlayer::ChangeCharacterControl); // MoveAction이 발생하면 ACharacterPlayer의 Move 함수를 호출합니다. EnhancedInputComponent->BindAction(ShoulderMoveAction, ETriggerEvent::Triggered, this, &ACharacterPlayer::ShoulderMove); EnhancedInputComponent->BindAction(ShoulderLookAction, ETriggerEvent::Triggered, this, &ACharacterPlayer::ShoulderLook); EnhancedInputComponent->BindAction(QuaterMoveAction, ETriggerEvent::Triggered, this, &ACharacterPlayer::QuaterMove); Controller = GetController(); // 컨트롤러 초기화 // 바인딩 확인용 로그 추가 UE_LOG(LogTemp, Warning, TEXT("InputComponent bound successfully")); } void ACharacterPlayer::ChangeCharacterControl() { UE_LOG(LogTemp, Warning, TEXT("ChangeCharacterControl called")); if (CurrentCharacterControlType == ECharacterControlType::Quater) { SetCharacterControl(ECharacterControlType::Shoulder); } else if (CurrentCharacterControlType == ECharacterControlType::Shoulder) { SetCharacterControl(ECharacterControlType::Quater); } // SetupPlayerInputComponent를 다시 호출하여 새로운 입력 맵핑을 적용합니다. SetupPlayerInputComponent(InputComponent); // 상태 변경 로그 추가 UE_LOG(LogTemp, Warning, TEXT("Control type changed to %s"), CurrentCharacterControlType == ECharacterControlType::Quater ? TEXT("Quater") : TEXT("Shoulder")); } void ACharacterPlayer::SetCharacterControl(ECharacterControlType NewCharacterControlType) { // CharacterControlManager 맵에서 NewCharacterControlType 키에 해당하는 값을 검색합니다. UCharacterControlData* NewCharacterControl = CharacterControlManager[NewCharacterControlType]; // 검색된 NewCharacterControl이 유효한 값인지 확인합니다. check(NewCharacterControl); // 가져온 CharacterControlData를 적용합니다. SetCharacterControlData(NewCharacterControl); APlayerController* PlayerController = CastChecked<APlayerController>(GetController()); if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer())) { Subsystem->ClearAllMappings(); UInputMappingContext* NewMappingContext = NewCharacterControl->InputMappingContext; if (NewMappingContext) { Subsystem->AddMappingContext(NewMappingContext, 0); } } // 현재 캐릭터 컨트롤 타입을 새로운 타입으로 설정합니다. CurrentCharacterControlType = NewCharacterControlType; UE_LOG(LogTemp, Warning, TEXT("Character control changed to %s"), NewCharacterControlType == ECharacterControlType::Quater ? TEXT("Quater") : TEXT("Shoulder")); } void ACharacterPlayer::SetCharacterControlData(const UCharacterControlData* CharacterControlData) { // 각 프로퍼티를 CharacterControlData 값으로 설정합니다. Super::SetCharacterControlData(CharacterControlData); CameraBoom->TargetArmLength = CharacterControlData->TargetArmLength; // 대상의 팔 길이를 설정합니다. CameraBoom->SetRelativeRotation(CharacterControlData->RelativeRotator); // 상대 각도를 설정합니다. CameraBoom->bUsePawnControlRotation = CharacterControlData->bUsePawnControlRotation; // 폰의 제어 회전을 사용하는지 설정합니다. CameraBoom->bInheritPitch = CharacterControlData->bInheritPitch; // Pitch 상속을 사용하는지 설정합니다. CameraBoom->bInheritYaw = CharacterControlData->bInheritYaw; // Yaw 상속을 사용하는지 설정합니다. CameraBoom->bInheritRoll = CharacterControlData->bInheritRoll; // Roll 상속을 사용하는지 설정합니다. CameraBoom->bDoCollisionTest = CharacterControlData->bDoCollisionTest; // 충돌 검사를 수행하는지 설정합니다. UE_LOG(LogTemp, Warning, TEXT("Character control data set")); } void ACharacterPlayer::ShoulderMove(const FInputActionValue& Value) { // 입력 값에서 2D 이동 벡터를 가져옵니다. FVector2D MovementVector = Value.Get<FVector2D>(); // 컨트롤러가 유효한지 확인합니다. if (Controller) { // 컨트롤러의 현재 회전값을 가져옵니다. const FRotator Rotation = Controller->GetControlRotation(); // Yaw(좌우 회전)만 사용하여 회전 값을 만듭니다. const FRotator YawRotation(0, Rotation.Yaw, 0); // 회전 매트릭스를 사용하여 전방 방향 벡터를 구합니다. const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); // 회전 매트릭스를 사용하여 오른쪽 방향 벡터를 구합니다. const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); // 입력 값에 따라 전방 방향으로 이동을 추가합니다. AddMovementInput(ForwardDirection, MovementVector.X); // 입력 값에 따라 오른쪽 방향으로 이동을 추가합니다. AddMovementInput(RightDirection, MovementVector.Y); } UE_LOG(LogTemp, Warning, TEXT("ShoulderMove called")); } void ACharacterPlayer::ShoulderLook(const FInputActionValue& Value) { // 입력 값에서 2D 회전 벡터를 가져옵니다. FVector2D LookVector = Value.Get<FVector2D>(); // 컨트롤러가 유효한지 확인합니다. if (Controller) { // 입력 값에 따라 컨트롤러의 회전 값을 변경합니다. AddControllerYawInput(LookVector.Y); AddControllerPitchInput(LookVector.X); } UE_LOG(LogTemp, Warning, TEXT("ShoulderLook called: Yaw=%f, Pitch=%f"), LookVector.X, LookVector.Y); } void ACharacterPlayer::QuaterMove(const FInputActionValue& Value) { // 이동 벡터를 생성합니다. 입력 값으로부터 FVector2D 타입을 가져옵니다. FVector2D MovementVector = Value.Get<FVector2D>(); // 입력 값의 제곱의 크기입니다. float InputSizeSquared = MovementVector.SquaredLength(); // 이동 벡터의 크기를 기본값 1로 설정합니다. float MovementVectorSize = 1.f; // 이동 벡터의 제곱 크기입니다. float MovementVectorSizeSquared = MovementVector.SquaredLength(); // 이동 벡터의 제곱 크기가 1을 초과하는 경우 if (MovementVectorSizeSquared > 1.0f) { // 이동 벡터를 정규화합니다. MovementVector.Normalize(); // 이동 벡터의 제곱 크기를 1로 설정합니다. MovementVectorSizeSquared = 1.f; } else { // 이동 벡터의 크기를 이동 벡터의 제곱 크기의 제곱근으로 설정합니다. MovementVectorSize = FMath::Sqrt(MovementVectorSizeSquared); } // 이동 방향을 설정합니다. 입력 벡터의 x, y를 사용하고 z를 0으로 설정합니다. FVector MoveDirection = FVector(MovementVector.X, MovementVector.Y, 0.0f); // 캐릭터 생성자의 컨트롤러에 이동 방향의 로테이터를 설정합니다. GetController()->SetControlRotation(FRotationMatrix::MakeFromX(MoveDirection).Rotator()); // 이동 입력을 추가합니다. 이동 방향과 이동 벡터의 크기를 인자로 사용합니다. AddMovementInput(MoveDirection, MovementVectorSize); UE_LOG(LogTemp, Warning, TEXT("QuaterMove called: X=%f, Y=%f"), MovementVector.X, MovementVector.Y); }일단 여기까지 고쳤는데 마우스 동작도 안되고 방향키는 전부 반대로 되어있고 v키를 눌러도 숄더로 돌아가서 다시 안돌아옵니다3시간동안 헤맸는데 도저히 모르겠어요
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
59:34 게임플레이 이펙트 cost 기능
cost로 지정된 값이 소모값보다 작으면 자동으로 GA를 실행시키지 않는것이 추가가 되있는건가요? 남아있는 에너지가 30보다 작으면 실행 할 수 없게 설계가 되어있는 걸까요?
-
미해결언리얼 엔진4 입문 (C++ 기반)
크래쉬
분명 컴파일 할때는 아무 오류도 없는데 정작 동적으로 하니 해당 오류가 생깁니다. 몽타지 재생하는 코드에서 몽타지 주소 오류인지 알았는데 몽타지 재생코드를 다 지우고 ue_log 코드를 띄어서 확인해보니 똑같은 현상이 발생했습니다. 도움 주시면 정말 감사하겠습니다!
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
게임플레이 태그 컨테이너, GAS와 기존 액터컴포넌트 차이
안녕하세요. 두 가지 질문이 있습니다.게임플레이 태그도 FName으로 구현되었다면 해시테이블 자료구조로 저장되어 있을 것이라 예측했는데 계층구조를 지원하는 검색기능을 제공한다면 게임플레이태그 컨테이너는 Trie같은 자료구조로 만들어져 있는 건가요?GAS를 사용해서 구현하는 방식이 액터로부터 기능을 분리하는 것인데 기존에 언리얼에서 제공하는 액터컴포넌트와 차이가 있을까요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
Anim 그래프, 특정 노드 진입시 재생위치 초기화 질문
안녕하세요. 매번 양질의 강의 영상 감사드립니다.플레이어의 점프력을 조금 낮춰보고 점프를 했을때(JumpZVelocity 700->400 , Mass 200)첫번째 점프는 애니메이션 처음부터 재생하지만,착지 후 즉시 점프를 했을때,이전에 점프가 끝났던 프레임에서 재생하여, 바로 Falling 노드로 진입하는듯한 문제가 있었습니다. 혹시, 현재 노드를 벗어나거나, 진입하면, 무조건 첫 프레임부터 재생하겠다라는 옵션을 설정해줄 수 있을까요? 감사합니다
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
클래스로 매크로만들기 되나요?
안녕하세요.질문1. uproject로 regenrate되는게 계속 안보여서,(윈11이지만,며칠전까진 보였거든요) 매크로를 못만들어서 수업을 중단했습니다 ㅠㅠvs다시깔고,언리얼5.3(현재사용버전)다시깔려면,,시간이2시간은 날아갈거라(헤매면서 깔거든요) 아까워서,하지만,그방법밖엔 없는거같은데, 매크로를 못만들면,진행이 안되서...에디터에서 클래스만들듯이 만들진 못하나요? vs , ue5.3 다 새로 설치했는데, 메뉴만 안뜹니다.질문2. 작업할게있어서,커스텀엔진을 쓰고있는데,빌드된 에디터라 간혹 재빌드할거냐고 팝업이 뜰때가 있었는데(물론 소스코드없이 에디터만 있는거라 빌드하진않았습니다),그때 비주얼스튜디오를 켜놓은적이 있습니다. 혹시 그거때문에 프로그램이 바뀔수도 있나요?혹시나 지워봤는데, 상관이 없는거같습니다...
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
2강 11:20 전방 선언 불가인 이유가 궁금합니다.
안녕하세요!2강 11:20 부분에서 CreateDefaultSubobject<> 안에 UStaticMeshComponent를 전방 선언할 수가 없고 헤더에 포함시키는 이유가 궁금합니다!이유를 찾기가 힘들어서 질문드립니다
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
13강 헤드업 디스플레이 강의중 질문입니다
플레이어 컨트롤러의 코드 부분에서 TEXT 안에 부분을 레퍼런스를 복사한뒤_C 붙여서 넣어도 보고 지웠던 앞의 부분을 남겨두어도 보고 했는데 지속적으로 CDO Constructor Failed to Find 에러가 뜹니다. 게임 데이터 연동을 하기 전에는 잘 작동되었었는데 데이터 연동을 하니 이런 오류가 뜨는데 혹시 이유를 알 수 있을까요?static ConstructorHelpers::FClassFinder<UABHUDWidget> ABHUDWidgetRef(TEXT("")); if (ABHUDWidgetRef.Class) { ABHUDWidgetClass = ABHUDWidgetRef.Class; }
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
Cast함수 문법
Owner = Cast<ACharacter>(GetOwningActor()); if (Owner) { Movement = Owner->GetCharacterMovement(); }블프에서 캐스트를 당연한게 늘썼는데,코드에서 보니 반가워서 생략된건가싶어,Owner =ACharacter* Cast<ACharacter>(GetOwningActor());라고 쓰니까 에러가 납니다. F12눌럿 보니, FORCEINLINE To* Cast(From* Src)로 되있는데, 왜 지금은 자료형을 표시안하는게 맞나요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
GenerateVisualStudio메뉴와 폴더관리,개별강의공부문의
안녕하세요.제너레이트와 스위치메뉴가 있었는데,어느순간부터 메뉴가 안보이는거같습니다. 이경우는 언리얼을 다시 설치하나요? 비주얼스튜디오를 다시 설치하나요? 폴더위치를 잘못 넣은경우는 비주얼스튜디오에서 폴더만들어 이동하면되나요? Saved,DDC,Intermediate 는 지워도 되는폴더들이라고 알고있는데, 꼬여서 지우는경우에,언리얼에서 재빌드하라고 뜨고 uproject는 안열리고,비주얼스튜디오는 코드파일들이 안읽히는 경우는 어떻게 하면될까요? 위의 과정들로 프로젝을 몇번을 다시 만들어서 깃에 멀쩡할때 소스코드를 올려백업하고싶은데,로드맵강좌중에 관련강좌가있을까요? 매회차 강의내용이 많은편이라, 강의가 한번 넘어갈때마다 코드내용이 두배이상 늘고,바뀌는거같아, 꼬이면,다시 처음부터 만듭니다ㅠ 5강까지 공부했다가,필요한 부분이 있어서 다시 첫강부터 하고있는데, 이젠 공부롤백때문에 다음강으로 넘어가기가 약간 두려워집니다. 만약 필요한 회차의 강의만 독립적으로 복습하고싶다면,가능할까요? 누적되는 내용들이 연결되있어서 지금은 불가능해보이긴 합니다.
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
ConfirmTargetingAndContinue에서 브레이크가 걸립니다. [해결됨]
제목처럼 디버그 모드 실행시여기 check문에 걸리는데요 코드를 비교해 봐도 어디가 문제인지 모르겠습니다..
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
ClassFinder 질문
ClassFinder 사용 중 궁금한 점이 생겼습니다.경로를 지정할 때 클래스일 경우 _C를 마지막에 붙여야 하는 것으로 배웠고 잘 사용하고있었습니다 🙂 다만 갑자기 궁금한 점은 ABGameMode.cpp에선 DefaultPawnClassRef와 PlayerControllerClassRef의 경로엔 _C를 안붙여야 WorldSetting이 제대로 세팅 되는 것을 볼 수 있는데 위 상황 때문에, 어떠한 점을 기준으로, 클래스 레퍼런스 중에서도 경로에 _C를 붙여야할지 혹은 말아야할지 헷갈리게 되었습니다.. ㅠ