목록프로그래밍/UnrealEngine4 (9)
有希
Git에서 다른 사람의 코드를 분석하던 도중 Tick이 아닌 TickActor를 활용하는 것을 보았다. Unreal Engine4 4.27 documentation을 참고한 결과, TickActor함수는 해당 Actor의 Tick함수를 1프레임당 1번 호출해준다. 차이는 TickActor()가 Tick()을 호출해주는 것인데, 흐름 제어?에 쓰일것 같지만 그 외에 정확한 차이는 잘 모르겠다.
포폴 작업 도중 잘 되던 인공지능의 MoveTo 함수가 작동하지 않는 일이 발생했다. 3일을 삽질하다가 알아내어 기록한다. (수십 번을 NavMesh 깔았다 삭제했다 반복...) Level에 NavMesh를 깔아두었다면 RecastNavMesh 비슷한 이름의(4.26.2 ver에서는 이 이름) 것이 나는 깔지도 않았는데 자동 생성되었을 것이다. NavMesh만이 아니라 이 녀석도 지워야 한다. 싹 다 지우고, 다시 NavMesh를 깔면 된다. 이 녀석도 부모 클래스를 다시 깔았을 때의 오류 같은데... 쓰면 쓸수록 열받는 엔진이 있다? When I'm using the MoveTo Task of BehaviorTree, Suddenly It is not even working. Below is the h..
포폴을 만들다가 이런 일이 있었다. 카메라 락온 시스템을 위해서 SpringArmComponent를 상속받은 녀석으로 새로만들어주고, 내 Character의 코드에서 USpringArm* 을 새로운 녀석으로 교체해주고 .cpp코드에서 새로운 녀석을 활용하는 코드를 작성하였다. 하지만, 새로운 녀석을 작성하는 부분에서 100%확률로 메모리 액세스 위반 크래쉬가 나는 것이 확인됐다. 그렇다면 가끔 엔진이 튕기는 버그가 아닌 내 코드가 잘못됐다는 의미이고, 어딘가 잘못됐다는 의미이다. 하지만, UE_LOG와 디버그 모드를 활용해봐도 nullptr이 아님을 확인했다 -_-... 정리하자면, C++을 상속받은 Blueprint 클래스에서 nullptr에러가 발생한다. 이 버그 때문에 며칠을 소모했는데, 해결방법은..
1. SoftLock 카메라 플레이어나 Lock 타겟의 움직임에 따라 설정값 이상으로 거리나 각이 멀어지면 자동으로 다른 물체를 찾아서 lock을 한다. 락을 걸지 않았다면 가장 가까운 녀석을 걸고, 건 상태에서 다른 target으로의 lock이동은 다음과 같이 한다. 근처 물체들의 배열을 들고 있어야 한다. 1. 나 -> 현재 Target의 DirVector1 2. 배열을 순회하며 나 -> 배열의 item 으로의 DirVector2 을 외적하고 Z값을 확인한다. 이렇게 하면 한바퀴 돌아서 a x b, b x a 되는 상황을 막을 수 있다. (확실치 않음...) 이후 결과값들을 또다른 배열에 저장하고 1번에서 구한 벡터와의 외적값을 비교해가며 가장 큰 값을 고른다.(각도가 좁을수로 dot 값이 크기 때문..
특정 상황 하에서 변수를 계속 체크해야 하는 상황이 있었는데, while문으로 체크하는 코드를 넣었더니 그대로 게임이 뻗어버렸다. 아마도 while때문에 다른 코드들이 실행되지 못해서 그런듯. Tick에 넣든가 하자.
컴퓨터를 포맷하고, 프로젝트 파일을 백업하고 다시 옮기는 과정에서 이와 관련해서 오류를 겪었다. 나의 경우에는 상위 폴더에 한글 경로가 섞여 있어서 그랬다! 아무튼, UE엔진에서 파일을 여는 경로에 영어만을 쓰도록 만들어주자....
UE 4.26.2를 깔고 Visual Studio 2022 버전을 설치했었는데, 4.26.2 버전에서는 2019버전만을 인식했다. 버전을 맞추어 주도록 하자 ㅠㅠ +) Visual Studio를 설치시에는 C++를 이용한 게임개발을 선택해서 같이 설치해야 한다.
Delegate를 등록하는 함수. Delegate1 이라는 delegate가 있고, 여기에 class라는 객체의 함수 func1을 붙이려면 Delegate1.AddUObject(class, &class명::func1) 으로 delegate를 등록한다. 이렇게하면 Delegate1이 Broadcast하면 class객체의 func1함수가 실행된다.
가장 흔한 예시로, USpringArmComponent* SpringArm = CreateDefaultSubobject(TEXT("SPRINGARM")); 와 같이 사용한다. 나는 저 함수를 헷갈려서 SPRINGARM이라는 이름의 USpringArmComponent 객체를 찾아서 SpringArm에 넣어주는 줄 알았다. 그게 아니라, 안의 USpringArmComponent클래스를 TEXT("string")안의 string이름을 가진 인스턴스를 만든뒤, 반환하는 녀석이다 -_-