본문 바로가기

게임프로그래밍

(151)
[언리얼 프로젝트] 템플릿 애니메이션 설정하기 템플릿 애니메이션에서 단일 애니메이션은 Sequence Player로 블랜드 스페이스 애니메이션은 BlendSpace Player로 재생하면 된다.
[언리얼 프로젝트] ABP에서 캐릭터 속도 구하기. 이벤트 그래프에서 캐릭터의 속도를 구해 애니메이션을 구현하려고 한다.  캐릭터 무브먼트 컴포넌트를 얻는다. 이때 Event Blueprint Init 함수는 오버라이드해서 불러와주어야 한다.   유효성을 확인하고 캐릭터의 속도를 구해주면 된다. 여기서는 1D의 움직임만을 얻을 것이기 때문에 XY의 길이만 구해주었다.
[실습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 함수를 오버라이드 하자.  플..