Unreal Engine & C++ Tutorial - 1st Person Shooter Game
https://www.youtube.com/watch?v=4HoJIgyclZ4
Actor클래스를 상속받는 발사체 액터를 만든다.
아래의 변수, 함수를 선언한다.
CPP파일엔 다음의 헤더를 추가한다.
굳이 .h파일에 추가하지 않는 이유가 뭘지는 궁금하다.
다 처음보는 것들이다.
일단 Actor인데, Sphere를 뜬금없이 설정한다.
Collision이라고 이름은 지었지만, Collision을 특정하는 코드는 없다.
일단 루프컴포넌트가 되었다.
ProjectileMovement를 초기화 하였다.
그리고 InitialLifeSpan이라는 기능도 모를 Actor클래스 멤버변수를 3.0으로 할당하였다.
일단 변수이름 그대로 생명주기인듯하다.
아직 아래 구문이 정확히 뭘 뜻하는지 이해가 되지 않는다.
OnComponentBeginOverlap
플레이어가 트리거에 들어가는 것과 같이 무언가가 이 구성 요소와 겹치기 시작할 때 호출되는 이벤트
AddDynamic
다이내믹 멀티캐스트 델리게이트에서 AddDynamic() 호출을 위한 헬퍼 매크로.
무슨말인지 모르겠다. 하지만 그냥 영어의 숙어처럼
Hit을 감지하는데 묶여서 쓰이는 녀석들이다.
해당 Class를 상속받는
BP_FPSProjectile을 생성한다.
아래 2개의 사진은 전자부터 Root코드를 적었을 때,
안적었을 때인데 뭐가 다른지 잘 모르겠다.
선이 하나 그어있는데 그 의미가 뭘까 그냥 둘이 별개라는 의미?
그리고 그냥 Sphere 오브젝트를 생성하면 다음과 같은데,
어떻게 CPP코드로는 Collision 속성으로 생성이 된걸까?
TEXT에 Collision을 붙이면 되나?
BP에 다음과 같이 static Mesh를 직접 추가하고,
에셋을 직접 입혔다.
이런 작업들은 BP에서 수행한다고 한다.
그리고 scale을 조정하였다.
끝내긴 했는데 이해가 되지 않는 것들이 있다.
1. CollisionSphere라는 변수는 직접 이름지은 것이고, USphereComponent로 제작된 단순 구체가 아닌가?
C++에서는 애초에 delegate를 지원하지 않는다.
- Delegate관련 궁금증 해결글
https://velog.io/write?id=1582ec09-a8f5-4117-aa57-3b7a191ec805
UAnimInstance
- 애니메이션을 만들기 위해 사용되는 데이터, 명령어 세트를 담아둘 수 있는 클래스
UWorld
- World를 담아둘 수 있는 클래스
그리고 CPP에 다음의 구문을 추가한다.
왜 헤더에 include를 안하지?
GamePlay카테고리에 다음과 같이 추가가되는 것을 볼 수 있다.
GunOffset도 직접 만든 변수였다
그리고 각각 예제파일들로 적절히 할당해준다.
선언했던 World와 AnimInstance변수에 해당 값들을 담는다.
OnFire에 해당 코드를 추가한다.
Projectile의 Spawn을 위해서 Rotation과 Location을 설정하는 것이다.
게임 컨트롤러의 Rotation의 값을 그대로 사용한다.
ShootLocation이 문제인데,
왜 nullptr일 것을 가정하고 코드를 짤까? Rotation처럼 그냥 넣으면 안되나?
해당 구문에 따라 값이 존재하면, ShootLocation이라는 총구부분의 Location을 가져오고,
그렇지 않다면, 캐릭터 액터의 Location을 가져오게 된다.
GetControlLocation은 존재하지 않는다.
거기에 GunOffset의 회전값을 추가로 더한다.
그냥 FVector이기 때문에 회전을 따로 추가해줘야하나?
FActorSpawnParameter는 구조체이다.
스폰할 위치가 다른 물체와 충돌시, 충돌하지 않는 가장 근접한 위치에서 스폰된다.
그리고 해당 구문을 추가한다.
param은 단지 충돌관련 rule을 추가하는 느낌이다.
없어도 총알의 spawn이 문제없이 된다
그리고 실행하면 총이 나가야 한다
분명 코드는 같게 썼는데, 총이 나가지 않는다.
Screen이라는 Message가 뜨는 것을 보아, OnFire는 실행된다고 볼 수 있겠다.
AdjustIfPossibleButDontSpawnIfColliding 이게 문제처럼 보였다.
액터는 근처의 충돌하지 않는 위치(모양 구성 요소 기반)를 찾으려고 시도하지만 찾지 못하면 스폰되지 않습니다.
해당 설정을 AlwaysSpawn으로 바꿔보았다.
그래도 생성되지 않았다.
SpawnActor부분을 본다. 해당 Param의 생성자는 없다.
그냥 구조체의 설정을 Adjust뭐시기로 했을 뿐이다.
해결
Character의 설정에서 Projectile을 Category로 만들어두고,
따로 설정하지 않았기 때문에 생긴 문제
잘 나간다.
의문이 들었는데, 그냥 spawn만 시키는데 왜 날아갈까?
AnimInstance - Animation을 시킬 객체
FireAnimation - 사용자가 직접 지정해두어야 할 Animation
미리 설정해둔 에셋이 코드에 맞게 실행된다.
소리와 애니메이션이 제대로 실행된다.
예제 애니메이션은 팔의 반동효과를 준다
AddDynamic
https://jhtop0419.tistory.com/36꼼꼼히 보면 정말 유익할 사이트
https://kyoun.tistory.com/142꼼꼼히 보면 정말 유익할 사이트 2
https://darkcatgame.tistory.com/66Delegate관련 궁금증 해결글
https://velog.io/write?id=1582ec09-a8f5-4117-aa57-3b7a191ec805UAnimInstance
https://bbagwang.com/unreal-engine/ue4-%EC%97%90%EC%84%9C%EC%9D%98-anim-instance/Map, Level and World
https://forums.unrealengine.com/t/map-level-and-world-whats-the-difference/324279FActorSpawnParameters / SpawnCollisionHandlingOverride
https://nellfamily.tistory.com/11