Tip!
- F7 : 컴파일 단축키
- 에디터 개인설정 / 컴파일 검색 / 콘텐츠 에디터 - 블루프린트 에디터 칸에 컴파일 시 저장 : On Success Only 또는 Always
C++ this = Unreal self
C++ null = Unreal none
우선 BP_Character의 블루프린트로 들어가서 Capsule Component에 맞게 Mesh의 중점 위치를 맞춰준다.
Charater 움직이기
BP_Character를 레벨에 올려서 설정했던 위치가 잘 맞게 나오는지 확인해본다.
이제 움직이기 위해서 편집 / 프로젝트 세팅 - 엔진 - 입력 부분을 먼저 본다.
- 액션 매핑 : 누르면 눌렀다 때면 땠다 이런 것.(KeyDown/UP)
- 축 매핑 : 지속적으로 눌렀다.(KeyPress)
여기서 이동할 때 WASD키를 쭉 눌러야 하니 축 매핑으로 해야한다.
앞뒤로 움직일 축매핑 하나 추가한다. 앞뒤로 움직이는 것은 X축으로 움직인다.
이름은 MoveFB(Move ForwardBackWord)로 설정해주고, MoveFB에서 키를 추가해준다.
원하는 키를 검색하지 않아도 키 값 버튼을 누르고 원하는 키입력 시 자동으로 키지정이 된다.
그리고 각각 방향에 따라 Scale값을 넣어준다. 앞 : W(scale : 1.0) / 뒤 : S(scale : -1.0)
마찬가지로 좌우로 움직일 축매핑도 하나 추가해준다. 좌우로 움직이는 것은 Y축으로 움직인다.
이름은 MoveLR(Move LeftRight)로 설정해주고 키 설정을 해준다.
그리고 각각 방향에 맞춰 Scale값을 수정해준다. D(scale : 1.0) / A(scale : -1.0)
이제 BP_Character 이벤트그래프에서 방금 만든 축 매핑 이벤트 노드를 추가해줄 수 있다.
우리가 만든 입력 축이 제대로 된 값으로 잘 되어있는지 확인하기 위해서 Print String노드를 연결해주고 실행한다.
그리고 플레이의 기준을 BP_Character로 바꿔주기 위해서 BP_Character의 클래스 디폴트에서
Pawn / Auto Possess Player : Player0으로 바꿔준다.
이후에 실행하면 W 입력 시 1.0, S 입력 시 -1.0이 정상적으로 출력되는 것을 볼 수 있다.
이제 진짜로 움직이기 위해서 입력 축 노드와 Add Movement Input 노드를 서로 연결해준다.
Axis Value - Scale Value 끼리 연결해준 뒤, MoveFB는 X축을 기준으로 움직이기 때문에 X : 1.0 으로 설정해주고,
MoveLR은 Y축을 기준으로 움직이기 때문에 Y : 1.0으로 설정해준다.
이후에 컴파일하고 실행해보면 앞뒤좌우(WSAD)로 잘 움직이는 것을 볼 수 있을 것이다.
Character 자식 클래스(Player) 만들기
이제까지 만들었던 BP_Character를 가지고 자식 클래스 Player와 Enemy를 만들어줄 것이다.
우선 자손 블루프린트 클래스 생성을 통해 BP_Player클래스를 만들어준다.
BP_Player 블루프린트로 들어가서 BP_Character 이벤트그래프에서 만들었던 MoveFB/MoveLR/Add Movement Input
노드들을 잘라서 BP_Player 이벤트그래프에 옮겨준다.
그리고 BP_Character 블루프린트의 클래스 세팅에 들어가서 클래스 옵션의 고급 표시를 눌러준 뒤,
Generate Abstract Class 체크로 클래스를 추상화 시켜준다.
이렇게 하면, 부모클래스의 BP_Character를 레벨에 올릴 수 없게 바뀌게 된다.
BP_Character의 추상화를 하는 이유는 Player와 Enemy를 위한 부모 클래스의 역할일 뿐이기 때문이다.
그리고 아까 바꿔놨던 BP_Character 의 Auto Possess Player는 다시 Disabled로 초기화해준다.
이러면 BP_Character를 상속하고 있는 BP_Player의 Auto Possess Player도 Disabled로 바뀌게 되는데 다시 Player0으로 바꿔주어야 한다.
- 클래스 세팅 : 클래스 자체의 세팅
- 클래스 디폴트 : 클래스 내의 변수를 세팅
- Generate Abstract Class : 추상클래스
BP_Player를 레벨에 올려놓고 이동하면 잘 움직이는 것을 볼 수 있다. 하지만 캐릭터를 볼 수는 없는데, F8을 누르면
Character 시점에서 벗어나서 자유롭게 볼 수 있다.
시작했을 때 BP_Player의 내부에 카메라가 위치한 것을 볼 수 있다.
그런데 캐릭터의 몸 속에 카메라가 위치해있지만 바깥이 보인다.
이는 렌더링 파이프라인 중에 RS 단계에서 진행되는 Backface Culling 때문이다.
(밑에서 추가 설명하겠다)
하지만 팔이나 다리 쪽을 보면 내부까지 렌더링 되어있는 것을 볼 수 있는데(관절 부분), 이는 내부가 아닌 앞면으로
감싸져 있기 때문에 내부가 보이는 것이다.
Camera 추가하기
이제 플레이어 내부에 카메라가 위치한 것을 바꾸기 위해서 BP_Player 블루프린트에서 Camera를 컴포넌트 추가해준다.
추가해준 카메라는 뷰포트에서 캐릭터의 뒤쪽에 위치하도록 위치를 조금 조정해준다.
이제 마우스에 따라서 시야가 움직이도록 해줄 것이다.
편집 - 프로젝트 세팅 / 엔진 / 입력에서 축 매핑을 추가해준다. 마우스 또한 지속적으로 입력되기 때문이다.
이제 앞서 추가한 축 매핑을 BP_Player의 이벤트그래프에서 추가해준다.
여기서 Yaw Pitch Roll에 대한 움직임 연결해줄 것이다.(YawPitchRoll은 원래 항공용어이다)
Yaw가 Z축, Pitch가 Y축, Roll이 X축 회전임을 기억하자.
LookLR은 시야가 좌우로 움직이기 때문에 Z축 회전. 즉, Yaw이므로 Add Controller Yaw Input노드를 연결해준다.
LookUD은 시야가 위아래로 움직이기 때문에 Y축 회전. 즉, Pitch이므로 Add Controller Pitch Input노드를 연결해준다.
마지막으로 Camera 디테일에서 Use Pawn Control Rotation을 체크해준다.
하지만 실행하면 카메라 좌우의 움직임은 되지만 위아래가 좀 어색한 것을 볼 수있다.
마우스를 위로 올리면 위를 보고 아래로 내리면 아래로 봐야하지만, 회전에 대해서는 다르다.
따라서 LookUD 마우스Y의 Scale : -1.0으로 바꿔주면 생각한대로 시점이 움직이는 것을 볼 수 있다.
렌더링 파이프라인
- IA(Input Assembler) : 투입된 정보 처리
input layout : 정점 형식
primitive topology : 연결 방식
vertex buffer : 실제 정보
index buffer : 연결 순서
- VS(Vertex Shader Stage) : 공간 변환. 각 정점에 대해서 GPU에서 사용되는 사용자 정의 함수
Shader란? GPU에서 수행되는 사용자 정의 함수
- RS(Rasterizer Stage) : 픽셀화 시킴
캐릭터 뒷면의 Render가 날아가는 위치는 이 곳에서 날아간다.
~izer : ~화 시키다. 즉 레스터화 시키다
이미지의 출력 방식 : Raster / Vecter
- Rater(jpg, gif, png) : 모니터의 출력 방식.
- Vecter(svg) : 점과 점 사이의 내용을 수식으로 표현. 관계로써 저장. 확대 축소하여도 변하지 않음. 인쇄 등
픽셀화 시키는 비용이 많이 든다. 때문에 안 나올 내용은 픽셀화 시키지 않는 방법으로 최적화한다.
이는 두가지의 방법이 있다.
- Clipping : 화면 밖의 보이지 않는 것들은 픽셀화시키지 않음
- Backface Culling : 사용자가 보지 못하는 뒷면을 픽셀화 시키지 않음
NDC(Normalized Device Coordinate)
이를 통해 픽셀화가 되지 않는 부분은 보이지 않는다.
위의 캐릭터 내부에서 안쪽 면이 보이지 않는 이유(Backface Culling)이기도 하다.
- PS(Pixel Shader Stage) : 픽셀의 색상 결정
- OM(Output Merger)