전체 글 403

[UE4] Enemy AI -2 : 랜덤 순찰, 근접 추적 (서비스, Task(Speed, Patrol))

Enemy가 순찰하다가, 플레이어를 발견하면 추적을 시작하고, 일정 거리 안으로 들어오면 공격을 수행하는 Enemy AI를 만들어보았다. 이때, 순찰은 랜덤한 위치로의 순찰 경로를 가지고, 해당 경로를 따라 움직이도록 구현하였다. 📚 Class 생성 먼저, BT_Melee(근접)이라는 비헤이비어 트리와, AI Controller, Enemy AI 블루프린트를 각각 생성해주었다. 비헤이비어 트리에서는 서비스라는 기능을 사용할 수 있는데, 서비스는 무언가 값을 제공하기 위해 사용된다. 블루프린트 클래스에 BTService_BlueprintBase를 상속받아 서비스 클래스를 생성해주었다. 🚩 Service Class 서비스는 Composites 노드에도 붙을 수 있고, Task에도 붙을 수 있는데 어디에 붙는..

[UE4] Enemy AI -1 : 감지기능 (AIController, AIPerception, 디버그모드, On Possess, 내비게이션 메시, Task)

AIController와 비헤이비어 트리, 블랙보드를 이용한 Enemy AI 기능을 하나씩 구현해보았다. 가장 먼저 언리얼의 막강한 기능인 "감지" 기능을 구현해보았다. 🔦 감지 기능 AIController를 상속받아 생성한 블루프린트 클래스에서, AIPerception 컴포넌트를 추가한 뒤, 디테일 패널의 AI Perception 값들을 수정하면 감지 기능을 구현할 수 있다. AI Damage sense config - AI가 데미지를 받는 순간 데미지를 준 객체를 감지하기 시작한다. - Apply Damage로 데미지 주면 사용 가능하다. AI Hearing config - 소리가 들리면 감지하기 시작한다. - 이때 소리는 mp3, wav 파일같은 사운드를 듣는것이 아니라 Make Noise 함수를 ..

[UE4] AIController, Behavior Tree, 블랙보드(Blackboard)

Behavior Tree를 이용하여 몬스터 AI를 구현하는 방법에 대해 공부해보았다. 👤 AIController 몬스터 AI를 구현할 때 컨트롤러라는게 필요하다. 명령의 주체는 캐릭터가 아니라 컨트롤러이다. 언리얼에서는 빙의라는 표현을 사용하여 게임 플레이 시 자동으로 플레이어에게 빙의되어 플레이어를 움직이거나 입력받는다. Player Controller를 생각하면, 플레이어를 움직이다가 말을 타면, 말이 움직이게 된다. 그럼 말이 Controller에 빙의된 것이다. 반대로, 말에서 내리면 다시 플레이어가 Controller에 빙의되는것이다. 이후 Controller가 키보드 입력이나 네트워크 입력등을 받아서 Controller가 빙의한 캐릭터에게 전달하여 제어하는 것이다. AI도 마찬가지고, AI C..

[C++] RTTI, dynamic_cast, typeid

RTTI (Runtime Type Identification, 실행 시간 데이터형 정보) - RTTI의 목적은 프로그램이 실행 도중에 객체의 데이터형을 결정하는 표준 방법을 제공하는 것이다. - RTTI는 가상 함수들을 가지고 있는 클래스들에 대해서만 사용할 수 있다. - dynamic_cast, typeid, type_info 의 총 3가지 연산자는 RTTI를 지원하는 요소를 갖는다. dynamic_cast - 가장 많이 사용되는 RTTI의 요소로써, 포인터가 지시하는 객체형이 무엇인지 알려주지 않고, 대신 그 객체의 주소를 특정형의 포인터에 안전하게 대입할 수 있는지를 알려준다. - 사용예제: Superb* pm = dynamic_cast (pg); typeid - typeid 연산자를 사용하면 두 ..

📚책읽기 2023.02.21

[BattleProject] Player 패링 시스템

https://youtu.be/m_Wk4c_Q2N0 작업일지 진행중인 작업 (문제점) - 잔버그 수리 진행 예정 작업 진행 완료 작업 1. 일정 반경 내 플레이어 들어오면 타겟 설정 및 추격 - 추격의 시작과 끝에 따라 Enemy 무기 장착/해제 2. 일정 반경 내 플레이어 들어오면 콤보 공격 - 콤보 공격 중 범위 밖으로 나갈 시 공격 중단 - Enemy 공격 중 플레이어 공격 시 애니메이션 초기화 상태 수정 + 콤보 이어서 공격 - 플레이어와 Enemy의 체력 감소 (데미지) 및 죽음 구현 3. Enemy 그룹 전투 - Enemy 간 공격/죽음 기능 구현 - Enemy 그룹화 - 같은 그룹이면 타겟에서 제외 - 같은 그룹간 공격 시 데미지 입지 않도록 구현 - 공격중인 타겟이 죽었을 때 추적 범위 내..

[UE4] Parkour 기능 -3 (Slide, Short/Normal/Wall)

🏃‍♀️ 파쿠르 Type별 체크하기 : Slide Do Parkour 함수에서 Climb 파쿠르가 아니라면 다음으로는 Slide 모드가 가능한지를 검사한다. 슬라이드를 실행할때는 캐릭터의 발 앞에 붙어있는 Floor Arrow에 충돌되는 장애물이 있는지 검사해야 한다. 발 앞에 무언가가 있다면 슬라이딩이 불가능하기 때문에, 충돌되는 장애물이 없는 경우 Slide Mode 설정을 시작한다. Slide 모드도 Climb와 마찬가지로 일정 거리 안에 위치하는 경우에만 파크루를 실행할 수 있도록 조건문을 수행해주었다. Slide Mode는 캐릭터가 슬라이드할 수 있는 장애물 아래의 공간을 Box Trace로 검사하였다. 캐릭터 발 앞에 위치하는 Floor Arrow를 장애물의 Extent 값인 높이만큼 위로 올..

[UE4] Parkour 기능 -2 (Climb, Set Movement Mode, 루트 모션)

Parkour 기능을 구현하기 위해 이전 게시글에서 파쿠르가 가능한지 판별하는 검증절차 코드들을 작성하였다. 이제는 파쿠르가 가능한 상황일 때, 다양한 종류의 파쿠르를 실행하도록 실질적인 플레이부분을 구현할 것이다. 🔎 Parkour Data 만들기 파쿠르 데이터를 만들기 위해, 파쿠르의 종류를 먼저 생성해주었다. 파쿠르는 총 7가지의 열거형 변수를 만들어 구현하였다. 파쿠르의 종류로는 Climb, Slide, Short, Normal, Wall이 있고 Fall은 캐릭터가 높은곳에서 아래로 떨어졌을 때 구르기를 위한 Type이다. Max는 파쿠르 상태가 아닌 경우(Idle 일때) 설정할 Type으로 생성하였다. 만들어진 Parkour 열거형을 기반으로 실행될 몽타주와, 파쿠르 실행 가능한 최소/최대 거리..

[C++] 클래스 템플릿, 데이터형 매개변수, 접근방식, 템플릿 특수화, 부부적인 특수화

클래스 템플릿 - typedef를 사용하여 클래스에 접근하면 데이터형을 변경할 때마다 헤더 파일을 수정해야 하고, typedef로는 동시에 두가지 데이터형을 나타낼 수 없으므로 템플릿을 사용하여 접근하는 것이 좋다. - 템플릿은 매개변수화되는 데이터형을 제공하여, 클래스나 함수에 데이터형 이름을 매개변수로 넘겨줄 수 있다. - template - 키워드 template은 컴파일러에게 템플릿을 정의하고 있다는 것을 알린다. 데이터형 매개변수 - 템플릿에서 사용되는 Type 과 같은 포괄적인 데이터형 식별자를 데이터형 매개변수라고 한다. - 데이터형 매개변수는 변수와 같은 역할을 하지만, 거기에는 수치(numeric value)를 대입하지 않고 데이터형을 대입한다. 접근방식 - 생성자 접근 방식은 new와 ..

📚책읽기 2023.02.16

[C++] C++ 코드의 재활용, has-a 관계, explicit/const, private 상속, 컨테인먼트, protected 상속, using, 다중상속, 가상 기초 클래스

C++ 코드의 재활용 1. public 상속을 이용한다. 2. 다른 클래스에 속하는 객체를 클래스 멤버로 사용하기 (컨테인먼트, 컴포지션, 레이어링) 3. private 상속이나 protected 상속을 사용하기 has - a 관계 - 새로운 클래스가 다른 클래스의 객체를 포함하는 관계 - 컨테인먼트, private 상속, protected 상속은 일반적으로 has-a 관계를 나타낸다. - has-a 관계인 컨테인먼트에서는 기초클래스로부터 상속받을 때 인터페이스 없이 구현만을 획득한다. 인터페이스를 획득하는 것은 is-a 관계(public상속)의 역할이다. 실수를 줄이는 C++ 제한 - explicit : 하나의 매개변수를 사용하는 생성자들이 암시적 변환 기능을 정지시킨다. ex) 프로그래머가 실수로 d..

📚책읽기 2023.02.16

[DX] Constant Buffer, Buffer DESC (Usage)

📚 Constant Buffer World를 초기화할 때 Shader->AsMatrix("World")->SetMatrix(~); 와 같이 쉐이더에 World를 설정하면 쉐이더에서는 matrix World와 flaot4 color 등이 전역변수로 들어가게 된다. 그럼 자동으로 cbuffer라는 곳에 저장이 되는데, 여기서 문제점이 발생한다. 프로그래머가 world를 수정하고 싶어서 AsMatrix와 같은 방식으로 접근하려 하면 cbuffer에 함께 들어있는 color값도 함께 바뀌고, 반대로 color만 수정하고 싶은데 world도 자동으로 바뀐다. 따라서 위처럼 초기화하여 설정하는 것이 많으면 많을수록 전역변수가 늘어나고 cbuffer 변수가 늘어나서 프로그램 속도가 느려진다. 이를 해결하기 위해 cb..

🎨DirectX 2023.02.16

[UE4] Parkour 기능 -1 (파쿠르가 가능한지 검증, Trace Channels)

🏃‍♂️ Parkour 플레이어가 자유롭게 높은 담벽을 넘고, 슬라이드하고, 벽을 짚고 기어올라가는 등의 파쿠르 동작을 구현해보았다. 파쿠르 동작을 구현하는데 가장 중요한 요소는 파쿠르가 가능한 상태인지를 검증하는 "검증 절차"를 거쳐야 한다는 점이다. 1. 파쿠르 검증 절차를 위해 LineTrace를 수행할 Arrow 생성 가장먼저, 파쿠르가 가능한 상태인지를 검증하기 위해, 플레이어에 Arrow들을 생성해주었다. Ceil : 플레이어의 머리 위를 검사 Center : 플레이어의 중심 앞을 검사 Left, Right : 플레이어의 왼쪽 오른쪽을 검사 Floor : 플레이어의 발 앞을 검사 Land : 땅의 위치를 검사 만들어진 Arrow에 "Arrows"라는 이름의 Tag를 생성한 뒤, 태그를 불러와 ..

[DX] 배경 CubeMap출력 (CubeSky), FrontCounterClockWise, DepthStencilState

🌏 배경으로 CubeMap 출력하기 게임하면서 맵이 아무리커도 하늘이 안보인적은 없다. 맵을 넘어서서 지면이 사라져도 하늘은 항상 그려졌는데 그 이유는 CubeMap을 그린 구(Sphere)의 위치가 카메라의 위치와 같기 때문이다. 이때 구가 존재하면 밖에서 표면을 바라봤을 때 시계방향으로 구를 바라봤는데, 구의 안에서 구를 바라본다고하면 반시계방향이 된다. 따라서 래스터라이저를 통해 시계방향으로 그리던 순서를 반시계방향으로 그리도록 수정해줘야 한다. 이러한 설정은 쉐이더의 RasterizerState 값을 FrontCounterClockWise_True 로 초기화하여 사용할 수 있다. 래스터라이저를 수정하여 Cube Sky를 배경으로 출력하고 나면, 기존에 출력해놨던 오브젝트들이 배경화면에 가려져 하나..

🎨DirectX 2023.02.15
728x90