일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 랜덤 맵 생성
- 리디렉션 크래쉬
- ai 주춤거림
- splinemeshcomponent scale
- unreal engine
- ue4 Crash
- 13iew
- Random Map Generator
- unreal ai lag
- ai 뚝뚝 끊김
- 리디렉터 크래쉬
- deltaTime
- Ai
- register component
- Unreal Engine Error
- unity
- staticmesh mobility
- Unreal Engine 5
- UnrealEngine
- UE4
- redirector crash
- ai jitter
- unreal engine redirection crash
- LittleNightMare
- UE
- redirection crash
- 언리얼
- ue4 error
- Unreal Engine 4
- UE5
- Today
- Total
목록전체 글 (64)
Class GameDev* SheepAdult

AI 가 움직일 경우 TargetPos가 업데이트되면서 이동 시 뚝뚝 끊기는 문제가 발생한다. 이럴 경우 CharacterMovement 컴포넌트의 "Use Acceleration for Paths"를 체크하면 해결된다.

애셋의 이름을 변경하거나 삭제하고 나면 엔진 내부의 레퍼런스를 알맞게 수정하기 위해 해당 기능을 사용하는 경우가 생긴다.이후 엔진을 켜보면 특정 폴더나 애셋에 들어가면 크래쉬 나는 경우가 생기는데, 이는 PreInitializeComponent 같은 애셋이 로드될 때 실행되는 함수에서 null 체크가 제대로 되어 있지 않은 경우 생긴다. 만약 리디렉션 후 크래쉬가 나는 경우에는 오브젝트의 생명주기를 잘 확인한 후 에디터의 뷰어에 영향을 미치는 함수에서 null체크를 확인해 보자

SplineMeshComponent의 크기를 직접적으로 설정하게 되면 StaticMesh가 의도한 위치에 생성되지 않는다. SetStartScale과 SetEndScale을 각각 설정해 줘야 의도한 대로 생성된다.잘못된 예)USplineMeshComponent* SplineMeshComp = NewObject(OwnerCharacter, USplineMeshComponent::StaticClass());SplineMeshComp->SetWorldScale3D(FVector(3));SplineMeshComp->RegisterComponent(); 옳은 예)USplineMeshComponent* SplineMeshComp = NewObject(OwnerCharacter, USplineMeshComponent..
투척 무기 예상 경로를 그려주는 기능을 구현하면서 SplineMeshComponent를 사용할 일이 생겼다. SplineMeshComponent를 런타임에 생성해 줬기 때문에 NewObject 후 RegisterComponent를 호출한 후 여러 세팅을 해줬다. 하지만 무엇이 문제인지 SplineMeshComponent에 등록한 StaticMesh의 Mobility가 Static 하다는 에러를 뱉었다. 20분 정도 삽질한 결과, 해당 컴포넌트의 모든 세팅을 마친 후 RegisterComponent를 해줘야 하는 문제였다. 해당 함수 구현부를 보고 싶어 ActorComponent.cpp의 해당 함수를 보려 했지만 볼 수 없게 되어 있어서 로직은 확인하지 못했다.. 아래처럼 하면 안되고USplineMeshC..

언리얼 엔진을 통한 멀티 플레이 RPG 게임을 만들던 도중 스킬 시스템이 생각보다 복잡했다. 스킬 각각 다른 이벤트를 통해 발동되는 건 물론 애니메이션 중간에 스킬이 생성될 수도 있고 키를 누른 직후 즉각 생성될 수도 있다. 차징, 홀딩, 캐스팅 등 타입을 가지고 있을 수 있으며 타겟팅을 통해 발동될 수도 있고 타겟팅 없이 주변에 대미지를 줄 수도 있었다. 이렇게 복잡한 시스템을 어떻게 구현할까 고민하다가 커맨드 패턴을 사용하기로 했다. Why 커맨드 패턴프로그래머로서 리그 오브 레전드(이하 롤)의 사일러스라는 캐릭터가 가장 눈길을 끈다. 왜냐하면 상대방의 스킬을 가져와 그대로 사용할 수 있기 때문이다. 이 말은 스킬은 각각 캐릭터와 독립된 객체로 존재해야하며 자신의 스킬 시스템에 set 하기만 하면 스..

검색해도 정보가 없어 작성하게 되었다.TextBlock에 SetColorAndOpacity() 함수가 있는데 인자를 FSlateColor로 받는다. 하지만 해당 구조체는 Color를 set할 수 가 없어 엔진 코드를 들여다보니 아래와 같이 오버로딩된 생성자가 있었다.위를 참고하여 아래와 같이 생성자를 통해 색상을 넘겨주면 된다.void UDamageIndicatorWidget::SetDamageIndicatorTextColor(FLinearColor ColorToSet){ DamageIndicatorText->SetColorAndOpacity(FSlateColor(ColorToSet));} * 만약 위와 같이 해도 색상이 변하지 않는다면 WidgetAnimation을 통해 색상을 고정하지 않는지 확인해볼..

AI를 서버를 통해 움직일 때 목표 위치까지 움직인 후 어떤 동작을 정의할 때 사용하는 Enum 이 있다. AI를 움직일 때 사용하는 MoveToLocation() 함수의 반환 값인 EPathFollowingRequestResult이다. 참고로 header는 아래와 같다. #include "Navigation/PathFollowingComponent.h"엔진의 헤더 파일에는 아래와 같이 정의 되어 있다.보통 언리얼 엔진 파일들에는 주석이 적혀 있는데 주석이 없다. 자료가 많진 않지만 긁어모은 정보는 아래와 같다.Failed: 경로 탐색이 실패할 경우.AlreadyAtGoal: AI가 이미 목표 지점에 도착했을 경우.RequestSuccessful: 경로 탐색이 성공적으로 시작된 경우. 즉, 움직이기 시작..

탑다운 방식 멀티플레이 RPG 개발 중, 움직임 동기화 관련 작업에서 문제가 생겼다. 로스트 아크나 리그 오브 레전드와 같이 오른쪽 마우스로 맵을 클릭하면 그 자리로 캐릭터가 이동하는 방식이었는데, 움직이던 중 다시 오른쪽 마우스 클릭하면 캐릭터가 그 자리에 멈추지 않고 계속 움직이던 문제였다. 그 이유는 서버와 클라이언트 사이의 RTT(Round Trip Time) 때문이었다. 문제가 발생했을 당시 클라이언트는 서버에 캐릭터의 위치에서 클릭한 위치로의 벡터를 함께 보냈다. 하지만 이미 서버로부터 패킷을 다시 받았을 때는 캐릭터의 위치가 변했을 수 있기 때문에 약간의 차이가 벌어져 목표 위치로 도달할 수 없는 문제였다. 그래서 목표 지점의 위치만 패킷에 담아 보낸 후 서버로부터 수신했을 때의 캐릭터 위치..

커스텀 서버를 붙여 멀티 플레이 게임을 개발하고 있던 도중 문제가 있었다. 스킬이 스폰되어 호출하는 BeginPlay()에서 collision ovelap을 바인딩하고 충돌처리가 되면 서버로 Attack과 관련된 패킷을 전달하는데, 스폰해주는 클래스에서 호출하는 스킬 세팅 함수가 스폰된 액터에 적용되기도 전에 액터 정보가 담긴 충돌처리 패킷을 보내면서 Null 정보를 보내는 문제가 발생했다. 이를 해결하기 위해서는 스킬의 충돌처리를 세팅해 준 후 진행해야 했기에 액터를 생성하고 정보를 세팅한 후 월드에 스폰하는 방식을 사용해야 했다. 마침 언리얼에는 Deferred Spawn기능이 있었다. 함수의 모양은 아래와 같다.AActor* SkillActor = UGameplayStatics::BeginDefer..

Interface 함수를 구현한 후 호출했을 때 아래와 같은 에러가 발생했다.{cpp폴더이름}.gen.cpp 파일에서 발생하는 중단점으로 조사식으로 알아보려고 해도 최적화로 인해 디버깅도 쉽지 않은 상황이었다. 그러다 해당 Interface 함수가 구현이 안되면 발생하는 에러인 것을 알게 되었다. 분명 구현은 했는데, Actor가 아닌 Component에서 구현했기 때문에 헷갈려서 이 문제로 꼬박 이틀을 투자했다..// 이렇게 되어 있던걸IInterface_Damagable* Target = Cast(HitResult.GetActor()->GetComponentByClass(UStatComponentBase::StaticClass()));...// actor가 아닌 component에서 구현해놨기 때문에..