본문 바로가기

전체 글

(166)
[언리얼 실습] 35. 필드 시스템 액터 목차Field System Actors1. Field System Actors 이번에는 매시를 단순히 떨어뜨리는 것이 아닌 다른 방식으로 부셔보려고 한다. 필드시스템으로 부시는 것을 볼 것인데 추후에는 공격시 무기에서 이것과 방식으로 액터를 부실 것이다.  필드시스템 액터를 기반으로 블루프린트 클래스를 만들어보자.  그러면 이렇게 필드시스템 컴포넌트를 가지고 있는 클래스가 만들어진다. 필드시스템 컴포넌트는 게임물리학에 영향을 끼칠 수 있는 필드를 생성할 수 있는 컴포넌트라고 한다.  필드 시스템 컴포넌트를 가지고 와 컴포넌트와 Add Transient Field 함수를 연결하자. 연결 되었으면 Enable Field 에 체크를 하고 피직스 타입을 External Strain으로 바꾼다. 이렇게만 한다고 ..
[언리얼 실습] 34. 부실 수 있는 오브젝트 만들기 목차파괴 가능한 매시1. 파괴 가능한 매시 이번에는 공격시 파괴가 되는 오브젝트를 만들어보려고 한다.  언리얼 에디터 상단에 모드를 보면 Fracture 모드가 있는 것을 볼 수 있다.  프랙쳐 모드를 키면 이렇게 다양한 도구들이 뜨는 것을 볼 수 있다. 매시를 프랙쳐하기 위해서는 먼저 프랙쳐할 매시를 선택해야 한다.  이 항아리 매시를 파괴해보려고 한다.  스태틱 매시를 선택한 상태로 좌측 상단을 보면 New 아이콘이 있는데 이것을 통해 새로운 지오메트리 콜렉션을 만들 수 있다.  지오메트리 콜렉션을 만들어보자. 이름은 알아보기 쉽게 바꾸는 편이 좋다.  매시가 지오메트리 콜렉션으로 바뀌면서 겉모습도 변하는 것을 볼 수 있다. 이제 이것을 쪼갤 수 있다.  좌측의 도구를 보면 다양한 방식으로 프랙쳐를 ..
[언리얼 실습] 33. 무기 궤적 남기기 목차공격 애니메이션 재생속도 높이기무기에 trail 추가하기트레일을 그릴 소켓 만들기1. 공격 애니메이션 재생속도 높이기 공격을 할때 무기에 궤적을 추가해 조금 더 그럴듯해보이는 효과를 줄것이다. 그전에 현재 공격속도가 너무 느려 애니메이션의 재생속도를 조절해 공격속도를 높여보려고 한다.  캐릭터의 공격 몽타주에 들어간 다음 플레이 레이트를 높여 애니메이션의 재생 속도를 높일 것이다.  재생속도를 바꾸면 이렇게 노티파이들이 엉망이 된다. 이것을 다시 재배치하고 마치도록 하자.2. 무기에 trail 추가하기 이제 공격할때 무기에 궤적을 추가해보자. 무기의 궤적 또한 노티파이에서 추가할 수 있다.   트랙을 추가하고 그곳에서 우클릭을 하여 노티파이 스테이트에서 Trail을 추가할 수 있다.  궤적을 추가할 ..
[언리얼 실습] 32. 히트시 파티클 생성하기 목차Cascade와 NiagaraCascade 시스템의 Particle 생성하기1. Cascade와 Niagara 언리얼 엔진 비주얼 이펙트에는 Cascade와 Niagara 방식이 있다.CascadeNiagara고전적 시스템새로운 시스템다양한 에셋들이 존재Cascade 보다 상대적으로 적은 에셋 사용자 친화적UGameplayStatics 라이브러리를 이용 - Spawn Cascade EmittersUNiagaraFuncionLibrary를 이용 - Spawn Niagara Systems 비주얼 효과를 직접 만들 필요까지는 없지만 이것들을 어떻게 사용하고 생성해야 할지는 알아야 할 필요가 있다. 먼저 Cascade 시스템을 생성하는 방법에 대해 알아보자.2. Cascade 시스템의 Particle 생성하..
[언리얼 실습] 31. C++에서 히트시 메타사운드 재생하기 목차메타사운드를 담을 변수 선언하기 HitSound 재생하기거리에 따른 감쇠 적용하기1. 메타사운드를 담을 변수 선언하기 Hit시 메타사운드를 재생하기 위해서 가장 먼저 메타사운드를 담을 변수를 설정해야한다.USoundBase 타입은 사운드큐, 메타사운드 둘 모두의 베이스 타입이다. private: UPROPERTY(EditAnywhere, Category = "Sound") USoundBase* HitSound; 히트 사운드의 경우 디폴트 클래스에서도 설정하지만 인스턴스마다 다르게 설정하게 될 수도 있기 때문에 EditAnywhere 속성을 주었다. 이제 이것을 재생하기만 하면 된다.2. HitSound 재생하기 에너미 클래스에는 타격시 반응을 구현하는 GetHit() 함수가 존재한다. 이곳에서 사운드..
[언리얼 실습] 30. 1회 공격 당 1히트만 하기 목차공격 한번에 히트 한번1. 공격 한번에 히트 한번 현재 히트 이벤트가 중복으로 발생한다. 공격을 했을때 한번 휘두르면 한번만 맞는게 대부분의 게임에서 정석일 것이다. 그렇기에 그것을 구현하려고 한다. // 무기.cppvoid AWeapons::OnBoxOverlap(//생략{// 중략 if (HitResult.GetActor()) { IHitInterface* HitInterace = Cast(HitResult.GetActor()); if (HitInterace) { HitInterace->GetHit(HitResult.ImpactPoint); } }} 현재 무기 클래스의 오버랩 함수를 보면 hitresult에서 액..
[언리얼 실습] 29. 백터의 외적을 통해 Hit 방향 알아내기 목차외적이란?외적을 통해 히트 방향 알아내기c++에서 적용하기1. 외적이란? 백터의 외적은 3차원 공간에서 백터와 백터끼리 곱한 것으로 크기만 있는 내적과 달리 크기와 방향 모두 존재한다. 그리고 이 방향은 오른손 법칙을 통해 알아낼 수 있다. 전자기학에서도 이 오른손 법칙이 쓰이는데 재밌는 점은 백터의 외적 자체가 자기장 속 전하가 받는 힘의 크기와 방향을 구할 때도 쓰인다고 하니 본질적으로는 둘이 같은 것이라고 볼 수도 있을 것 같다. (출처) 외적은 크기와 방향 모두 구할 수 있지만 현재 알고 싶은 것은 방향이기 때문에 오른손 법칙이 주요하게 쓰일 것이다.2. 외적을 통해 히트 방향 알아내기 백터의 내적은 그 특징상 양수의 값만 나오고 그렇기 때문에 이것만으로는 히트의 방향을 정확히 알 수가 없다...
[언리얼 실습] 28. 백터의 내적을 통해 Hit 방향 알아내기 목차내적이란?내적을 통해 방향 알아내기C++로 구현하기1. 내적이란내적에 대해 수학백과사전에서는 다음과 같이 설명되어 있다.내적은 벡터공간에서 한 쌍의 벡터마다 스칼라를 대응시키는 연산이다.평면이나 공간에서는 두 벡터 사이의 각이라는 직관적인 개념을 생각할 수 있다. 일반적인 벡터공간에서도 두 벡터 사이의 각을 정의하고 두 벡터가 수직으로 교차한다는 것이 무슨 뜻인지 정의하는 데에 내적을 사용한다. 또한 내적은 길이를 정하는 데에도 사용할 수 있다. 내적을 흔히 중간에 점을 찍어 나타내기 때문에 'dot product'라고도 한다.[네이버 지식백과] 내적 (수학백과, 2015.5) 이 내적을 통해 피격을 당할 경우 피격된 방향을 알 수 있다.2. 내적을 통해 방향 알아내기 에너미가 있으면 이 에너미가 바..
[언리얼 실습] 27. 인터페이스 사용하기 목차인터페이스 상속받기상속받은 인터페이스 함수 정의하기1. 인터페이스 상속받기 에너미 클래스에서 히트 인터페이스를 상속받아 이를 구현해보려고 한다.class PRACTICE_API AEnemy : public ACharacter 에너미 클래스는 보는 것과 같이 ACharcter 클래스를 상속받고 있다. 여기에 추가로 인터페이스를 상속받아 보자. #include "Interface/HitInterface.h" 상속을 받기 위해서는 당연히 헤더파일을 가져와야 하고 class PRACTICE_API AEnemy : public ACharacter, public IHitInterface 상속은 단순히 쉼표를 쓰고 원래 상속을 받던 방식으로 상속을 받으면 된다. 히트인터페이스를 상속 받았고 그 안에는 GetHit..
[언리얼 실습] 26. 에너미 클래스 만들기 목차C++ 에너미 클래스 만들기블루프린트 에너미 클래스 만들기 에너미 클래스를 생성하고 이를 정의해보자. 에너미 클래스에 제일 먼저 구현할 것은 Hit 반응이다. Hit를 하기 위해서는 콜리전 세팅이 필요한데 현재 무기의 박스 컴포넌트는 Pawn타입을 무시하고 있으며 박스트레이싱의 경우 가시성 채널을 차단하고 있으므로 이러한 부분들을 수정해주어야 한다.   #include "Components/SkeletalMeshComponent.h" // 스켈레톤 매시를 사용하기 위해 필요한 헤더파일AEnemy::AEnemy(){ PrimaryActorTick.bCanEverTick = true; // 콜리전 설정을 Pawn에서 WorldDynamic으로 바꾼다. GetMesh()->SetCollisionObject..