본문 바로가기

게임프로그래밍/실습2

(68)
[실습2] MVVM 바인딩을 위한 FieldNotify 생성하기 변수를 선언한다. 이때 원하는 타입이나 변수명은 원하는 것으로 하면 될 것이다.UPROPERTY(EditAnywhere, BlueprintReadWrite, FieldNotify, Setter, Getter)FString 변수명;  그 다음 UPROPERTY 매크로를 사용해야하는데 이때 Access 권한을 전부 주는 것이 중요하다. 이제 여기서는 Getter와 Setter 모두 설정한다고 하였으니 함수를 구현하면 된다.Getter는 간단하다. FString Get변수명()const { return 변수명; } 그냥 반환만 하면 되는데 이때 중요한 점은 함수 이름을 Get(변수명)으로 해야 된다는 것이다. Setter도 마찬가지이다. void Set변수명(FString In변수명); 매개변수는 굳이 저렇게..
[언리얼] 액터배열에서 가장 가까운 순서대로 액터 정렬하기 액터 배열과 정렬된 액터를 저장할 배열을 받은 뒤 이를 수정하는 함수를 구현해보려고 한다. 함수를 선언하자UFUNCTION(BlueprintCallable)static void GetClosestTargets(int32 MaxTargets, const TArray& Actors, TArray& OutClosestTargets, const FVector& Origin); 매개변수는 차례대로 최대 타겟 수, 비정렬된 액터 배열, 액터를 정렬 후 저장할 배열, 기준 위치이다. 이 함수에서의 핵심은 언리얼에서 자체적으로 제공해 주는 Algo 라이브러리를 이용할 것이라는 점이다. 물론 자체적으로 정렬 알고리즘을 만들어도 되겠지만 엔진에서 제공해주는 알고리즘은 일반적으로 가장 최적화된 알고리즘이기 때문에  따로 구..
[실습2] 발사체 스프레드 코드 발사체의 개수를 구한다.  const int32 NumProjectile = FMath::Min(MaxNumProjectiles, GetAbilityLevel()); 전방 백터를 구하고 이를 스프레드 할 각도/2 만큼 회전시켜 준다. const FVector Forward = Rotation.Vector();const FVector LeftOfSpread = Forward.RotateAngleAxis(-ProjectileSpread / 2.f, FVector::UpVector); 이제 이 왼쪽 스프레드에 발사체가 다 들어갈 만큼 조금씩 오른쪽으로 회전시켜 주면 될 것이다. 그 각도 먼저 구하자. 각도를 구하기 전 발사체의 갯수가 2개 이상인지 확인한다.if (NumProjectile > 1)const f..
[실습2] 64. GAS 쿨다운 적용하기 1. 쿨다운 설정하기 SetByCaller를 이용하여 쿨다운을 적용할 것이다. 우리가 사용할 게임플레이 어빌리티 클래스에 들어가 쿨다운을 설정해주자.UPROPERTY(BlueprintReadOnly, EditAnywhere, Category="Cooldown")FScalableFloat CooldownDuration;UPROPERTY(BlueprintReadOnly, EditAnywhere, Category="Cooldown")FGameplayTagContainer CooldownTags;UPROPERTY(Transient)FGameplayTagContainer TempCooldownTags; 그리고 이제 함수 하나를 오버라이드 한다. 해당 함수는 쿨다운 태그의 집합을 리턴해준다.virtual FGame..
[실습2] 63. 게임플레이어빌리티시스템 Cost 적용하기 1. 비용을 발생시킬 GE 클래스 만들기 능력을 사용할때 비용(마나)이 발생하게 만들 것이다. 그러기 위해서는 이 비용을 정의할 게임플레이 이펙트가 필요하다.  클래스를 생성했으면 아래처럼 만들면 된다. 현재는 값을 하드코딩 했지만 커브테이블을 이용하거나 커스텀 계산 클래스 등을 이용해서 더욱 정교하게 조작할 수 있을 것이다. 이제 이를 적용해야할 것이다.2. 코스트 게임플레이 이펙트 적용하기 게임플레이 어빌리티 클래스로 들어가 GE를 적용해주면 된다. 이제 이것을 어떻게 실행시킬까? 이것은 굉장히 간단하다.  이벤트를 시작할때 커밋 어빌리티 노드를 적용해주면 된다. 커밋 실행이 실패하면 절대 다음 노드로 진행하지 않는다.  마나가 줄어든 것을 볼 수 있다. 다음에는 쿨다운을 적용하도록 해보자
[실습2] 62. 일정 범위 안에 있는 액터 배열에 담기 1. 서론 일정 범위 안에 있는 액터의 정보가 필요할 수 있다. 오버랩을 이용하여 실시간으로 확인하는 방법도 있지만 굳이 실시간으로 알 필요없이 특정 시점에만 어떤 액터가 있는지 알아야 한다면 쿼리를 이용하면 된다.2. 함수 선언 static void GetLivePlayersWithinRadius(const UObject* WorldContextObject, TArray& OutOverlappingActors, const TArray& ActorsToIgnore, float Radius, const FVector& Origin); 매개변수를 살펴보자.const UObject* WorldContextObject 스태틱 함수이기에 필요한 월드 컨텍스트 오브젝트이다. TArray& OutOverlapping..
[실습2] 61. 에너미에 환경 쿼리 적용하기 1. 환경쿼리 설정하기 행동트리로 들어가자. 노드를 끌면  Run EQSQuery가 보인다.  환경 쿼리를 설정하자. 이제 블랙보드 키를 설정할 수 있는데 점수가 가장 높은 것으로 설정된다. 백터 키를 만들었고 이를 설정하였다.  이제 Move To 노드를 추가하고 해당 위치로 옮기면 된다.
[실습2] 60. 환경 쿼리 1. Environment Query 환경 쿼리를 만들어 더 정교한 에너미의 행동을 만들어볼 것이다.   EQS의 경우 그냥은 테스트 하기가 힘든데 그렇기에 이를 위한 테스트 폰이 존재한다. 이를 만들어보자. 해당 폰을 살펴보면 쿼리를 설정할 수 있는 부분이 보인다. 이제 환경 쿼리를 설정해보자. 환경쿼리는 제너레이터를 통해 값을 계산할 수 있다.  제너레이터를 생성하면 테스트를 추가할 수 있는데 여기서 트레이스를 추가해보려고 한다. 트레이스는 목표에서 특정 목적지까지 가시성 채널을 추적하여 점수 매기는 방식이다.  컨텍스트를 통해 그러한 목표를 설정할 수 있다.  블루프린트 기반의 클래스를 생성하자.  플레이어 액터를 추적할 것이기 때문에 Provide Actors Set 함수를 오버라이드 하자.  플..
[실습2] 59. 행동트리 테스크 만들기 1. Behavior Tree Task 행동트리에 데코레이터를 추가하여 조건을 만들었지만 정작 그 조건에 따라 어떤 행동을 할지는 정의하지 않았다. 이제 이를 구현하려고 한다.  BT테스크 블루프린트 베이스 클래스를 생성하자. 이제 함수를 오버라이드 할것이다. 이 테스크에서 중요한 점은 반드시 끝내야 한다는 것이다. 그렇지 않으면 영원히 이 테스크 안에 머무르게 된다. 아래의 노드를 추가하여 작업을 끝낼 수 있다.  이제 이를 저장하고 행동트리에 추가하자. 실제 구현은 나중에 할 것이다. 행동트리에서 노드를 추가할때 생성한 테스크가 존재하는 것을 볼 수 있다.  이렇게 해서 테스크를 추가하는데 성공하였다.
[실습2] 58. 행동 트리 데코레이터 1. 데코레이터 행동트리에서 데코레이터는 일종의 조건문 같은 것이라고 보면 된다. 이러한 데코레이터를 통해 에너미가 이동을 해야할지 아니면 공격을 해야할지 아니면 또 다른 행동을 해야할지 등을 지정할 수 있다.2. 데코레이터 설정하기 이제 데코레이터를 설정해보자. 블랙보드 키를 통해 조건을 확인할 것이다. 디테일 패널에서 키를 선택하거나 다양한 작업들을 할 수 있다.  이제 블랙보드 키를 우리가 원하는 오브젝트로 바꾸자.  이렇게 하면 해당 키가 존재할때만 다음 노드가 실행된다. 이번에는 다른 설정을 하려고 한다. 에너미가 공격 받을 때 동작을 멈춰보려고 한다. 불리언 타입의 블랙보드 키를 추가하도록 하자.  이제 이 값을 초기화 해야하는데 이는 C++에서 진행할 것이다.3. C++에서 블랙보드 키 초기..