Actor를 상속받는 Gun CPP를 생성한다.
이를 상속받는 BP_Rigle을 생성한다.
GunCPP에는 BP에 필요한 Component를 담았다.
Root와 SkeletalMesh이다.
Root는 굳이 필요없을 것 같다. (버전이 5라서 기본 Root가 존재)
그리고 SkeletalMesh로 설정하는 이유는,
총이 SkeletalMesh이기 때문이다.
(기본적으로 StaticMesh일텐데 특이한 케이스)
게임 실행시에 Rifle을 Character에 부착하려고 한다.
Character의 BeginPlay이다.
GunClass를 UPROPERTY지정하여 BP에서 설정가능하도록 한다. TSubclassOf
Gun은 굳이 미리 변수로 지정하지 않아도 되지만,
AGun을 상속받도록 진행하였다.
(Character에서 GunClass만 바꾸면, 다른 총을 생성할 수 있다)
(다른 GunClass는 CPP Gun을 상속받는 다른 BP를 만들면 되겠다)
BP에서 GunClass를 직접 지정한다.
위의 내용대로 진행하면, 총이 생긴다.
부착하지 않았기 때문에 이상한 곳에 생긴다.
이전 Untitled프로젝트에서 아이템상자를 먹을 시,
무기가 부착되게 하는 코드이다.매개변수 양이 다르다. 스폰할 위치와 방향을 정하는 것이다.
[지나가도 되는 내용]
위의 코드는 LiveCoding시 에러가 발생할 수 있다.
그 이유는 Character CPP에는 Gun.h가 추가되어있는데
LiveCoding시에 빌드하지 않은 경우에는,
헤더 자체에서는 AGun이 뭔지 존재를 모르기 때문이다.
헤더가 아니라 위처럼 클래스를 하나 추가해준다면,
바로 해결된다.
(사실 헤더를 추가해야한다.
하지만 헤더에는 불필요한 기능들도 존재해서 위처럼 설정하면 효율적으로 해결된다고 함)
현재 Character의 SkeletalMesh는
Weapon_r이라는 이상한 Bone이 존재하고,
해당 뼈를 숨긴다.
뼈를 숨기는 가장 쉬운 방법은 CPP로 숨기는 것이라고 한다.
코드를 작성하여 숨긴다.
Socket을 새로 생성하고, 부착한다.
여기서 SetOwner라는 코드가 있는데,
한 번 설정해놓으면, 나중에 해당 Actor의 Owner를
간단히 GetOwner로 쉽게 불러올 수 있게 된다.
손에 역시 딱 맞지 않는다.
게임실행후, F8을 눌러 유체이탈을 한 뒤,
총의 위치를 조절한다. 현재 Location은 000이다.
Character에 부착된 상대위치기 때문.
따라서 알맞게 그대로 조정한 후, 해당 Location값을 복사한다.
(X=-0.773414,Y=-12.962576,Z=-1.202387)
그리곤 Rifle BP에 해당 Location을 붙여넣는다.
정상적으로 생성된 모습
보통 FPS게임에서의 사격방식은 여러방식으로 구현한다.
1. RayTracing을 하여 일자의 직선 사격을 진행한다.
총과 적 사이의 시야가 명확하고, 방해물이 없는게 특징.
총알의 물리를 계산할 필요가 없어 가장 쉬운 방식이다.
2. Projectile을 사용하는 방식
투사체, 총알을 사용하는 방식이고, 로켓런쳐와 같이 총알이 보여야하는 경우,
많이 사용되는 방식이다. 물리의 계산이 필요.
이번 프로젝트에서는 1번 방식으로만 구현하지만,
언제든지 코드만 추가하면 2번으로 확장가능하도록 구현한다고 한다.
Gun에 실제 총기의 발사함수를 넣었고,
Character에는 Shoot함수로 해당 Gun멤버함수를 호출하도록 하였다.
Character의 입력과 Shoot함수를 바인딩하였다.
로그가 정상적으로 뜨는 모습.
컨트롤러의 입력도 추가했기 때문에, 패드로도 동작한다.
폴더에 위처럼 이펙트 에셋이 존재한다.
총구의 앞에 부착해본다.
Rifle SkeletalMesh에는 총구에 이미 소켓이 만들어져있다.
이제야 왜 SkeletalMesh로 총을 만들었을까 어느정도 이해가 간다.
(StaticMesh라도 Socket을 추가하기만 하면 된다)
#include "Kismet/GameplayStatics.h"
UGameplayStatics::SpawnEmitterAttached(MuzzleFlash, Mesh, TEXT("MuzzleFlashSocket"));
위의 방식을 통해, Effect를 발생시킬 수 있는 Emitter를 소환한다.
위치는 Rifle의 소켓.
MuzzleFlash는 EditAnywhere인 변수로 만들어, BP에서 설정한다.
불꽃놀이처럼 계속 터진다.
이펙트의 문제라고 한다.
해당 이펙트가 멈추는 것 없이 계속 진행된다고 함.
그래서 단발성인 이펙트를 사용하였고,
클릭마다 발사된다.