전체 글 35

AI Patrol 을 해보자

AI용 BT의 재사용성을 생각하면 여러 NPC를 위한 하나의 BT이기 때문에 현재 움직일 Pawn의 정보를 가져오는것이다.APawn* ControllingPawn = OwnerComp.GetAIOwner()->GetPawn(); UNavigationSystemV1::GetNavigationSystem(UWorld*) 이 원래 더 먼저 쓰였지만 언리얼 4이후에 나오게 된 UNavigationSystemV1::GetCurrent(UWorld*)이방식이 더 권장됨, 앞의 방식은 Deprecated 가능성 있다고 함, 내부를 보게 되면 GetWorld()->GetNavigationSystem() 방식을 사용하고 있는데 이건 오래된 방식이라고 한다.

카테고리 없음 2025.05.17

이득우의 언리얼 프로그래밍 7 - 컨테이너

동적가변배열, 내부는 해시테이언리얼 구조체언리얼 오브젝트가 아니기에 네이밍을 할때 F를 붙인다. 리플렉션을 원하는 멤버변수는 똑같이 UPROPERTY를 붙이면 된다.구조체 안에서 언리얼 오브젝트를 사용하려면 반드시 UPROPERTY를 붙여야만 메모리관리가 자동으로 된다. 구조체를 컨테이너로 관리할때엔 필요에 의해서 UPROPERTY를 붙이면 되는 반면에,언리얼 오브젝트를 컨테이너로 관리할시에는 필수로 UPROPERTY를 붙여야한다. TMap과 TSet의 내부구조는 거의 같다고 할 수 있다.

언리얼 2025.04.23

이득우의 언리얼 프로그래밍 6 - 델리게이트

객체지향에서 강한 결합이란, 서로 의존성을 가지는 경우를 의미한다. 필요로 하는 새로운 클래스를 만들때 왜 필요한지에 대해서 한 번 더 생각 해보자.Card 클래스를 만들었던 이유는 결국엔 자격의 확인이 필요하기 때문이다. 그렇다면 Card 대신에 ICheck인터페이스를 활용하는것은 어떤가?"인증"이라는 것에 더 초점을 뒀기때문에, Card가 아닌, 지문이나 핸드폰 번호로 확인하더라도 의존성이 낮아져서 유지보수가 더 좋아지게 된다. 하지만 이렇게 매번 인터페이스 화하는게 번거로울수도 있는가보다(나는 아직 경험하지는 못함)그래서 함수를 오브젝트처럼 관리하면 어떨까? 하는 아이디어가 나오게 되었고, 이게 가능은 했지만 정의와 사용과정이 복잡하고 느렸다. 이 때문에 c++이후에 나온 언어인 c#에서는 dele..

언리얼 2025.04.21

이득우의 언리얼 프로그래밍 5 - 컴포지션

먼저, 상속이란 Is-A 관계이고, 컴포지션은 서로 다른 객체에서 한 객체가 다른객체를 Has-A 하고 있는 형태다.하나의 클래스가 다른 클래스를 멤버 변수로 가질때, 우리는 그동안 아래와 같이 했다.그런데 언리얼에서는 정해진 형태가 있다. 컴포지션의 Has-A 관계에서 "내가 소유한" 오브젝트는 Subobject 다."나를 소유한" 상위 오브젝트는 Outter라고 한다.저렇게 생성시에 FName을 적어줘야하는데, 이게 일반 String이 아니고 FName이라고 명시적으로 알려주기 위해서 NAME_을 앞에 붙여주는 것이 좋다고 한다. 그러고나서 Person이 소유한 카드를 불러오는 방법이다. 카드 enum class는 바로 아래와 같다. 내가 만든 Getter를 이용했다. 그런데 따로 메타 데이터를 설..

언리얼 2025.04.21

이득우의 언리얼 프로그래밍 4 - 인터페이스

인터페이스의 정의부터 알아보자.인터페이스는 객체가 반드시 구현해야 하는 것을 지정할때 활용한다.예를 들어 언리얼에서는 Actor(월드에 배치되는 모든 오브젝트)를 상속받은 Pawn(움직이는 오브젝트)이반드시 INavAgentInterface를 구현하도록 되어있다. 그래서 저번 글에서 만들었던 Person 을 상속받아 만든 Student, Teacher가 있는 상황에서 Staff(교직원)을 추가해보자.Staff는 수업에 참여해서는 안되고, Student와 Teacher는 반드시 수업에 참여해야하는 점을 구분하여 인터페이스를 만들어보자. cpp나 헤더 파일을 그대로 복붙해서, 가져와서 사용하는 방법에 대해서는 파트1의 7강 7분 정도에 설명되어있다. 인터페이스의 이름은 ILessonInterface, 가상..

언리얼 2025.04.17

이득우의 언리얼 프로그래밍 3 - 언리얼 오브젝트

핵심을 바로 얘기해보자면, 게임 프로그래밍은 소비자의 입장이 우선이기에 안정성과 성능 중에서 성능을 더 우선한다.그래서 저수준의 언어로 컴퓨터의 하드웨어에 접근이 가능한 c++언어가 주로 사용되는 것이다. 언리얼 엔진은 성능을 중시할수있는 c++언어를 쓰면서, 안정성도 챙길수 있도록 틀을 만들었기 때문에언리얼 엔진이 설계한 새로운 시스템의 단위인 언리얼 오브젝트의 사용법을 우리가 배워야한다. 언리얼은 c++기반이긴 해서 일반 c++오브젝트는 F접두사를 사용하고, 언리얼용 오브젝트는 접두사 U를 사용한다.다음은 언리얼이 재정의한 FString 사용법의 일부다.Tip.언리얼에서 한글 출력시 File → Save ---.cpp As → Save 옆을 누르면 Save with Encoding 에서 이미 있는데 ..

언리얼 2025.04.17

[TPT] 적의 시야 설정

적이 플레이어를 감지하는 방법을 정하는 것만으로도 여러가지를 생각해볼수있다. 1. 적의 시야를 기준으로 저해상도의 렌더타겟을 찍기.-> 1-1. 그 뷰를 샘플링하여 일정량 이상 플레이어일때 탐지되도록 하기 -> 1-2. 깊이버퍼를 적용하여, 화면상에서 플레이어가 차지하는 비율이 같아도, 가까이 있다면 가중치가 더 적용되는 형식. 2. 적의 원뿔형태의 시야에서 최대한 골고루 퍼져있는 레이를 정해진 개수만큼 쏴서 탐지하기. (일부만 보이더라도 감지할수도, 아닐수도 있음. 3. 플레이어의 몸의 일정부분에 탐지가능한 메쉬를 설정해두고, 그것이 레이로 감지될때 탐지된것으로 하기. 보이는것도 가중치를 우리가 설정할수있다. 예를들어 머리의 메쉬는 가중치가 10, 손은 1 이렇게.이제 이걸 좀 더 세부적으로 파악해보..

프로젝트 2025.04.15

[TPT] 기획 요구 분석

적 AI분석적의 상태 단계 (5페이지) (아군에게 적용된 적의 상태는 플레이어에게도 동일하게 반영됨 (6페이지))기본상태 : 정해진 자리에 고정되어있다. /or/ 정해진 동선을 움직인다. /or/ 정해진 동선들 중 하나를 따라 움직인다.정해진 동선에 장애물이 생기게 되면 어떻게 처리 할것인가? 의심상태 : 적의 시야 범위가 넓어진다. + 소음 감지 범위가 넓어진다. + 동선이 변경된다.(동선이 변경됨과 자극이 감지된 장소로 이동하는 것에는 어떤 차이가 있는지?)제안 1) WayPoint 기반일시 : 감지정도가 만족했기에 행동이 달라지는 것인데, 플레이어가 있는 곳이 아닌, 사전에 지정된 포인트를 순찰시작하는게 맞는가?적마다 맵의 웨이포인트가 미리 다 정해져있게 하는건가?제안 2) Zone 기반일시 : 수..

프로젝트 2025.04.15

[D2D 게임만들기 7] - 애니메이션(후순위라고 생각)

캐릭터의 이동을 할 수 있고, 상호작용이 가능하다면 그것으로 이미 충분한 게임의 형태를 갖추고 있다.하지만... 포기할수가 없었다.. 내가 습작으로 하려는 BubbleBobble에 필요한 이미지를 다운로드 받으면, 보통 하나하나의 이미지가 아니라,이런식으로 이미지가 함께 뭉쳐져서 있는걸 다운받게 된다.위의 이미지는 내가 그 중에서도 나름 하나의 행동에 필요한 애니메이션으로 단락을 잘라내고, 배경색을 투명하게 바꾼 상태다. 일단 이미지를 불러오자.전에 만들었던 Resource를 상속받아서 이미지 리소스용 Texture 클래스를 만들어준다.Load함수 부분만 신경써서 비트맵 로드를 정의해준다. 이 Texture는 뭐든지 이미지이기만 하면 Load할수있는 능력이 있지만, 지금 내가 필요한것은 위의 이미지를 하..

D2D와 게임엔진 2025.04.10