목록언리얼 (116)
초보 코린이의 성장 일지

Enemy에 감지 범위에 객체가 들어왔을때 텔레포트를 사용하여 도망칠 수 있도록 구현해 볼 것이다. 1. 각 Task와 EQS에 설정을 해준다. 1. Behavior 전체적인 노드 구조. #include "BehaviorTree/CBTTaskNode_Equip.h" #include "Global.h" #include "Characters/CEnemy_AI.h" #include "Characters/CAIController.h" #include "Components/CStateComponent.h" #include "Components/CStatusComponent.h" #include "Weapons/CEquipment.h" EBTNodeResult::Type UCBTTaskNode_Equip::Exec..

Eenmy가 Player를 감지하게 되면 Bow를 장착하였다. 이제는 감지 범위에 들어왔을시 장착 후 화살을 날릴 수 있도록 구현을 해 볼 것이다. 여기서 하나 중요한점은 Player가 Bow로 화살을 날릴때 조건이 AimMode인 상태에서만 발사할 수 있도록 설계가 되어있다. Enemy도 동일하게 AimMode를 넣어줄 것이다. 1. BP에서 사용할 수 있도록 BlueprintReadOnly로 해준다. 1. SubAction을 BP에서 부를수 있도록 BlueprintCallable로 해준다.2 2. Pressed, Released도 동일하게 만들어준다. 1. C++내에 있는 함수를 불러다가 BP에서 처리를해 줄 것이다. 1. C++에있는 함수를 사용하게 될 것임으로, 부모를 콜해줘야한다. 2. 키가 눌..

Enemy가 공격하려고 할때, Player가 먼저 공격을 했을 경우 Enemy에 공격모드가 사라져버리는게 아닌, Hit후 일정시간이 지나면 바로 Enemy가 공격 행동을 할 수 있도록 구현해볼 것이다. 간격은 Behavior Tree에 Wait로 1초정도로 줄 것이기 때문에 빠르게 공격하게끔 만들어질 것이다. #pragma once #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "Weapons/CWeaponStructures.h" #include "CDoAction.generated.h" UCLASS(Abstract) // 객체화 되면 안되므로 Abstract class U2212_06_API UCDoAction : public..

Enemy가 Sowrd를 뽑는 동작시 Hit가되면 무기가 뽑히지 않는 상태로 끝나버리게 된다. 이걸 예외처리를 따로 해줌으로써 해결해 볼 것이다. #include "Components/CMovementComponent.h" #include "Global.h" #include "AIController.h" #include "GameFramework/Character.h" #include "GameFramework/CharacterMovementComponent.h" void UCMovementComponent::Move() { bCanMove = true; } void UCMovementComponent::Stop() { bCanMove = false; AAIController* controller = O..

Behavior Tree를 통해 Enemy Hitted를 구현해 볼 것이다. #pragma once #include "CoreMinimal.h" #include "BehaviorTree/BTTaskNode.h" #include "CBTTaskNode_Hitted.generated.h" UCLASS() class U2212_06_API UCBTTaskNode_Hitted : public UBTTaskNode { GENERATED_BODY() public: UCBTTaskNode_Hitted(); protected: virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; virt..

AI Enemy들이 Equip에 대한 오류가 발생하였다. 이를 해결해주기 위한 방법이 존재한다. 만약 Sword를 Enemy가 장착한다고 가정하고 이야기해 보겠다. WeaponAsset라는 클래스에 Sowrd에 객체 정보와 생성을 동시에 했다면, WeaponAsset는 이제 정보만을 가지고 있고, WeaponData라는 클래스를 하나 더 만들어줘서 이 곳에서 생성을 하게 만들어 준다. 그리고 Player와 Enemy에서 각자 생성을 하게끔 분리해주면 된다. 또한 생성을 해주는 곳에서 다른 클래스들이 접근을 못하게 막아주고, 생성이 완료되면 Friend로 엮여있는 클래스에만 열어주고 return 시켜서 보내주는 방법으로, 생성을 시켜줄 것이다. 1. WeaponAsset에서 위에 보이는 바와 같이 생성 정..

Enemy가 이제 무기를 뽑도록 만들어 볼 것이다. #pragma once #include "CoreMinimal.h" #include "Components/ActorComponent.h" #include "CWeaponComponent.generated.h" // 무기 타입 UENUM(BlueprintType) enum class EWeaponType : uint8 { Fist, Sword, Hammer, Warp, Around, Bow, Max, }; DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FWeaponTypeChanged, EWeaponType, InPrevType, EWeaponType, InNewType); UCLASS(ClassGroup = (Custo..

이제 Spline을 활용하여 Patrol 기능을 만들어 볼 것이다. 1. Enemy가 타입별 다른 속도로 움직일 수 있도록 하기 위해 Task를 상속받아 클래스를 하나 생성해준다. #pragma once #include "CoreMinimal.h" #include "BehaviorTree/BTTaskNode.h" #include "Components/CMovementComponent.h" #include "CBTTaskNode_Speed.generated.h" UCLASS() class U2212_06_API UCBTTaskNode_Speed : public UBTTaskNode { GENERATED_BODY() private: UPROPERTY(EditAnywhere, Category = "Type")..

Enemy가 Player를 인식할 수 있도록 만들어 볼 것이다. 1. Enemy가 무기를 들고 있도록 만들어 주기 위해 데이터 에셋을 하나 추가해준다. 2. 실행해보면 등록해준 Sword를 장착하고 있는 모습을 볼 수 있다. 1. 우선 비헤이비어 트리를 생성해주고, Wait를 하나 연결해준다. 2. 아무것도 연결이 안되어있으면 동작하는지 모르기 때문에 동작하는지 확인하기 위한 용도. 1. 만들어준 비헤이비어 트리를 선택해준다. #pragma once #include "CoreMinimal.h" #include "Characters/CEnemy.h" #include "CEnemy_AI.generated.h" UCLASS() class U2212_06_API ACEnemy_AI : public ACEnemy..

IK는 어제 코드를 통해 마무리가 되었으며, 이제 ABP에서 처리를 해서 값들을 먹여줘야 한다. 1. 이제 True로 보내줄 링크된 애님 레이어가 하나 필요하다 생성해줄 것이다. 1. 우선은 연결을 해주고, 레이어 안에 작업을 시작해 보겠다. 1. 입력이 들어온 상태에서 IK를 섞어줘야한다. 2. IK를 먹일 왼발 가상의 본으로 시작해서 정해진 기준까지 천천히 계산을 누적해 나간다. 1. 오른발도 동일하게 값을 누적해 나간다. 1. 마지막 허리를 계산해주는데 값이 들어오는것 중에 큰값을 사용했다. 1. 최종 상태. 1. 사용할 애니메이션에 IK값을 적용 시키도록 커브값을 양발에 준 상태이다. 1. 자연스럽게 IK가 적용된 모습을 확인할 수 있다. 2. IK는 이제 끝이났다. 1. AI를 만들어주기 위해 ..