
구조는 이렇게 돼있다.ParentWidget ㄴ CanvasPanel ㄴButtonPanel ㄴChildWidget ChildWidget에서 ParentWidget를 참조하고 싶었음. 방법은auto Widget = Cast(GetOuter()->GetOuter()); GetOuter를 2번 불러주면 된다 참고자료 : https://forums.unrealengine.com/t/get-parent-userwidget-of-widget/476221 24.06.17 추가WidgetTree를 사용하자.

아............................................. 하얀 원의 중심은 Cube의 중심과 일치한다. 원래 하고 싶었던 것은 큐브의 바닥 위치를 알아내는 것이다. 해당 위치를 구하려면 큐브의 중심위치에서 큐브 크기의 반 만큼 아래로 이동해주면 된다. = 하얀 원의 중심 - 큐브 크기 / 2 그렇다면 큐브의 위치와 크기는 어떻게 구하는가? Cube 컴포넌트의 Bounds값을 가져오면 된다. Origin : 큐브 컴포넌트의 World Location Box Extent : 큐브 컴포넌트의 크기 Vector 그렇다면 Origin - (Box Extent.Z / 2)을 해주면 되겠지? 블루프린트는 위에 말한 논리의 흐름대로 짰다. 사진에서 볼 수 있다시피 X,Y,Z 전체에서 50을 ..

기본 스태틱 메시를 레벨에 배치하였을때는 경고가 뜨지 않는데 스태틱 메시로 만든 Geometry Collection (Chaos Destruction)을 레벨에 배치하면 버텍스가 너무 많다고 경고가 떴다. 정확한 해결 방법인지는 모르겠으나 일단 방법을 찾았다. 보면 버텍스가 50만개로 상당히 많은 것을 볼 수 있다. 우선 디테일 패널에서 Reduction setting에 들어가 트라이앵글을 낮춰준다. 10으로 낮춰주고 변경내용 적용을 누르면 버텍스와 트라이앵글이 1/10으로 줄어든 것을 볼 수 있다. 이대로 바로 지오메트리 컬렉션을 만드는 것이 아니라 버텍스를 줄인 스태틱 메시를 익스포트 후 바로 임포트 해주면 버텍스가 그대로고 위에서 낮췄던 퍼센트 트라이앵글도 100인 것을 알 수 있다. 이제 해당 스..

Chaos Destruction에 대한 간단한 튜토리얼을 작성하고 제가 겪은 버그에 대해 공유하려고 합니다. 틀린 점이 있다면 댓글로 가르침을 전수해주세요 디스트럭션 퀵스타트 언리얼 엔진 디스트럭션 시스템 퀵스타트 가이드 docs.unrealengine.com 한글로 된 튜토리얼도 있어서 먼저 보고 오면 더 수월할 것 같습니다. 사용법 1. 부서짐 효과를 주고 싶은 메시를 레벨에 불러온다. 2. 프랙쳐모드로 들어간다. (Shift + 6) 3. 생성탭의 신규를 눌러 Geometry Collection을 생성해주자 생성을 하면 아래 사진처럼 바뀌는데 이제 물체를 원하는 모양 or 랜덤으로 조각낼 수 있는 준비가 된 것이다. 이제 프랙쳐 탭에서 원하는 것을 선택하면 되는데 일반적으로 사용하는 균등(Unifo..
ItemSpawner.hUPROPERTY(EditDefaultsOnly)TSubClassOf Item; 과 같이 선언해주고 블루프린트에서 AItemClass를 매핑시켜준 다음 해당 클래스의 멤버 변수를 사용하고 싶었다. 내 생각에는 AItemClass를 담고 있으니까 매핑 후 Item에 그냥 접근해서 사용하면 될 줄 알았는데 문제가 발생했다.만약 AItemClass에 있는 public 변수인 ItemName을 받아오고 싶다면 ItemSpawner.cppBeginPlay(){ FString = Item->ItemName; -> 아예 접근이 안됨} 처럼은 접근이 아예 안됐다. 그래서 AItemClass로 캐스팅을 해서 사용을 해보려고 했는데 ItemSpawner.cppBeginPlay(){ FString =..
Test.cpp UFUNCTION(Server, Unreliable) void ServerEquipButton(); 처럼 RPC를 선언하고 Test.cpp void ServerEquipButton_Implementation() { if(CombatComponent) { CombatComponent->EquipWeapon(OverlappingWeapon); } } void Equip() { if(CombatComponent) { // 서버에서 동작했다면 바로 Equip을 실행하고 if(HasAuthority()) { CombatComponent->EquipWeapon(OverlappingWeapon); } // 클라이언트라면 RPC를 사용해 서버에게 알려준다. else { ServerEquipButton_..