게임프로그래밍 (141) 썸네일형 리스트형 [언리얼 실습] 20. 무장 해제 애니메이션 적용 목차무장해제 애니메이션 만들기C++에서 재생하기1. 무장해제 애니메이션 만들기 먼저 무장 애니메이션과 무장 해제 애니메이션을 구하자. 그리고 이것들을 애니메이션 몽타주에서 재생할 것이다. 애니메이션을 설정하자. 이제 이 몽타주를 재생하기만 하면 된다.2. C++에서 재생하기UPROPERTY(EditDefaultsOnly, Category = "Montage")UAnimMotage* EquipMontage; 캐릭터 헤더파일에 몽타주를 담을 변수를 선언해주자. 이제 이 몽타주를 재생하면 된다. void AKnight::EKeyPressed(){ AWeapons* OverlappingWeapon = Cast(OverlappingItem); if (OverlappingWeapon) { OverlappingW.. [언리얼 실습] 19. 메타사운드를 활용하여 랜덤사운드 재생하기 메타사운드를 이용하여 랜덤사운드를 재생해보려고 한다. 메타사운드를 만들고 들어간뒤 다시 인풋을 추가하자. 그리고 디테일 창으로 넘어간다. 타입을 WaveAsset으로 변경한 뒤 Is Array를 체크해준다. 이제 배열들에 각각의 효과음을 집어 넣자. 인풋을 끌고 와 셔플을 검색해 노드를 추가한다. 그 뒤 셔플노드를 wave player 노드랑 연결해주자. 이렇게 연결하면 끝이다. 마찬가지로 피치랑 볼륨을 조절해서 단조로운 사운드를 좀 더 입체적으로 만들 수 있다. (위 노드에서 셔플의 밸류랑 웨이브 플레이어의 웨이브 에셋이 연결되어 있지 않은데 이를 연결해야한다.) 애니메이션으로 돌아가 사운드를 재생하기 원하는 곳에서 재생하면 끝이다. [언리얼 실습] 18. 메타사운드를 활용하여 효과음 추가 목차효과음 추가메타사운드 만들기메타사운드 적용하기1. 공격시 효과음을 추가 공격을 할때 효과음을 추가해보려고 한다. 사운드를 구한뒤 이를 사용할 것인데 이때 사운드 파일의 확장자는 wav 파일이여야 언리얼에디터에서 임포트가 가능하다고 한다. 사운드 파일을 구할때 이 점을 주의하도록 하자. 사운드를 임포트해온다. 이제 이 사운드를 그래도 사용해도 되지만 강의에서 메타사운드를 사용하기 때문에 여기서도 메타사운드를 이용해서 효과음을 다루어보려고 한다.2. 메타사운드 사용하기 플러그인에서 메타사운드가 사용중인지 확인한다. 이제 메타사운드를 만들어보자. 콘텐츠 브라우저에서 메타사운드를 만든다. 이제 다음과 같은 창이 뜬다. 이곳에서 사운드를 설정할 것이다. 좌측 멤버 항목에서 인풋을 추가하자. 해당 인풋.. [언리얼 실습] 17. 공격 상태 만들기 목차서론공격 상태 enum 만들기블루프린트에서 비점거 상태로 돌아가기c++에서 비점거 상태로 돌아가기무기가 없을 때 공격방지공격 중 이동방지1. 서론 현재 공격 애니메이션 작동 방식은 연속된 입력을 가하면 계속 애니메이션을 초기화해서 재생한다. 또한 애니메이션 재생 중 이동이 가능한데 이 부분을 막아보려고 한다.2. 공격 상태 enum 만들기 전에 캐릭터의 무기 장착 상태에 따른 enum을 만들었던 것처럼 캐릭터의 액션 상태에 따른 enum을 만들 것이다. 캐릭터타입 헤더파일로 들어가보자 UENUM(BlueprintType)enum class EActionState : uint8{ EAS_Unoccupied UMETA(DisplayName = "Unoccoupied"), EAS_Attacking UMET.. [언리얼 실습] 16. 애니메이션 몽타주로 공격 모션 만들기 목차 공격 몽타주 만들기인풋 액션 만들기C++ 에서 몽타주 재생하기1. 공격 몽타주 만들기 애니메이션 몽타주를 이용하여 공격 모션을 만들어보려고한다. 콘텐츠 브라우저에서 애니메이션 몽타주를 만들자. 애니메이션 몽타주를 누르면 매시를 선택하라고 뜨는데 우리가 쓰고 있는 캐릭터의 매시를 고르면 된다. 몽타주 안으로 들어가자 우측 하단에 있는 애셋 브라우저에서 해당 스켈레톤에서 사용할 수 있는 애니메이션들을 볼 수 있는데 이곳에서 공격 애니메이션을 가져다가 디폴트 그룹으로 가져가면 된다. 이제 이곳에서 섹션을 나눌 것이다 가장 상단바에서 우클릭을 하면 새 섹션을 만들 수 있다. 다음과 같이 섹션을 나누자. 현재 섹션은 나누어져 있지만 애니메이션은 연속적으로 이어진다. 그렇기 때문에 이를 분리할 필요.. [언리얼 실습] 15. 애니메이션 블루프린트 정리하기 목차서론Multiple Animation BlueprintsControl Rig 노드 분리하기1. 서론 애니메이션 블루프린트가 점점 복잡해지고 있다. 이대로 놔두면 나중에 유지보수 하기가 힘들어지고 기능하나를 추가하려 해도 정말 힘들 것이다. 그렇기 때문에 이를 정리할 필요가 있다.2. Multiple Animation Blueprints 애니메이션 블루프린트를 여러개로 쪼개어 이를 관리하면 유지보수가 더 쉬워진다. 새로운 애니메이션 블루프린트를 만들자. 해당 블루프린트에서는 메인 스테이트를 관리할 것이라 메인 스테이트와 관련된 노드들을 복사해서 가져오자. 이렇게 붙여넣을 수 있다. 하지만 한가지 문제는 이렇게 복사해서 가져오면 각종 변수들이 동작을 하지 않는다는 것이다. 그렇기 때문에 변수를 다.. [언리얼 실습] 14. Blend Poses 를 이용하여 상태에 따른 애니메이션 보여주기 목차c++로 만든 상태 가져와서 애니메이션 재생하기1. c++로 만든 상태 가져와서 애니메이션 재생하기 애니메이션 블루프린트로 들어가자. 블랜드 포즈를 이용해서 캐릭터의 상태에 따라 애니메이션을 변경할 것이다. Blend Poses (EcharacterState) 찾아 만들어 준다. 노드가 나오면 우클릭 해서 핀을 추가해주자. 그다음 우리가 만든 열거형을 가져온다. 이제 각각의 상태마다 우리가 원하는 애니메이션을 입력해주면 된다. 캐릭터의 상태에 따라 다른 애니메이션이 나오게 바뀌었다. 걷기 달리기 기타등등 애니메이션도 똑같은 방식으로 적용하면 된다. [언리얼 실습] 13. 무기 장착 여부에 따른 캐릭터의 상태 업데이트 하기 목차상태를 나누는 enum 만들기enum을 정의할 헤더파일 만들기enum 상태 바꾸기1. 상태를 나누는 enum 만들기 캐릭터의 상태에 따라 다른 애니메이션을 적용하기 위해서는 캐릭터의 상태를 담을 변수가 필요하다. C++에서 이를 시행해 보자. UENUM(BlueprintType)enum class ECharacterState : uint8{ ECS_Unequipped UMETA(DisplayName = "Unequipped"), ECS_EquippedOneHandWeapon UMETA(DisplayName = "EquippedOneHandWeapon")}; 위와 같이 만들어 캐릭터의 상태를 나타내는 열거형을 만들 수 있다. 열거형을 살펴보자. 최상단의 UENUM은 언리얼엔진의 리플렉션 시스템에 노출.. [언리얼 실습] 12. E 버튼을 눌러 무기 장착하기 무기 근처에 가면 자동으로 캐릭터에 장착되는 것이 아닌 버튼을 눌러 장착할 수 있게 만들어보자 목차입력키 매핑하기C++에서 키 입력으로 장비 장착하게 하기캐릭터 블루프린트에서 액션 넣어주기1. 입력키 매핑하기 키보드 버튼을 눌러 아이템을 장착하려면 키를 매핑해야 한다. Input Action을 만들어 매핑을 진행해보자. 언리얼 엔진 5.1버전인가 5.2버전 정확히는 기억이 안나는데 어쨌든 그때나온 향상된 입력 기능을 사용할 것이다. 인풋 액션을 만들었으면 여기서 딱히 건들일 것은 없다. 키를 눌렀는지 안눌렀지만 알면 됨으로 Value Type은 그대로 불리언으로 놓아두면 된다. 이제 매핑 컨텍스트에 매핑을 하자 인풋 매핑 컨텍스트를 열고 Mappings의 + 버튼을 눌러 액션을 추가해준다. 아직은.. [언리얼 실습] 11. 캐릭터 소켓에 무기 에셋 붙이기 목차서론C++에서 캐릭터 소켓에 무기 에셋 부착하기1. 서론 무기를 캐릭터에 붙이는 방법은 다음과 같다.무기 클래스에 액터가 오버랩 된다.오버랩 된 액터가 우리가 만든 캐릭터 클래스로 캐스팅 될 수 있는 지 확인한다.캐스팅이 성공하면 플레이어가 무기에 접근한 것이다.무기클래스의 스태틱 매시를 캐릭터의 소켓에 부착한다.2. C++에서 캐릭터 소켓에 무기 에셋 부착하기 C++ 코드를 작성하기 전에 Item.h 파일을 수정을 하였다.protected: virtual void BeginPlay() override; UFUNCTION() virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimiti.. 이전 1 ··· 10 11 12 13 14 15 다음