블루프린트
오브젝트
Spawn
데이터 유형
Booleans and Branches
Pure Functions
멤버 함수
왼쪽 노드는 '게임이 시작하면' 을 의미
가운데 노드는 화면에 String을 출력하는 기능의 노드
오른쪽 노드는 또다른 String 출력 노드
Ctrl + Shift + S 로 전체 저장
오브젝트 디테일
창 > 필터 리스트에서 피직스
선택 > 피직스와 관련된 액터의 프로퍼티들이 보임
오브젝트와 기능 매핑이라고 할 수 있음
주소로 오브젝트 데이터 가져오기
점프를 구현하기 위해 위로 움직이는 힘(Force, 포스)를 적용할 것인데, 여기서 적용하고자 하는 것은 포스가 아니고 임펄스이다.
피직스에서 포스와 임펄스는 다르다. 포스는 정해진 시간에 걸쳐 발생하는 반면, 임펄스는 즉각적이다.
위로 점프하려면 Z축 방향으로 임펄스를 줘야 한다.
Add Impulse 노드의 Vel Change를 체크하면 질량을 무시하고 작성한 값의 속력을 적용한다.
Abventurer
는 모험가 클래스로 기본 데이터와 일부 기능이 있다.Adventurer 1
과 같이 이 클래스의 인스턴스를 만들 수 있다. 예를 들어 모험가1이 Bob이라고 하면 Bob은 모험가 클래스의 고유한 데이터 사본을 갖고 있다.- Bob이 실제 오브젝트이며 클래스는 오브젝트를 만드는 원본이다.
- Experience 데이터가 200인 모험가 인스턴스 2를 만들 수도 있다.
Spawn Actor from Class
노드 사용Space Bar
노드의 Pressed 핀과 Spawn Actor from Class
노드 연결해서 스페이스 바 누르면 발사체가 생성되도록 만들기 + 임펄스 추가컴퓨터 메모리의 특정한 이진법 데이터를 나타내는 한 방법
이 데이터로 무엇을 할 수 있는지 제한하는 방법
데이터의 "shape" 라고 생각할 수 있음
Pawn은 게임 월드 속에서 플레이어의 물리적 묘사
F8
을 길게 눌러 폰에서 유체이탈(?)해서 구경 가능 (Default Pawn)
Get Player Pawn
노드와 Get Actor Location
노드로 위치 가져올 수 있음
플레이어의 위치를 얻어냈던 것과 마찬가지로 Get Actor Rotation
을 사용해서 BP_Projectile에 방향값을 줘봐도 플레이할때 플레이어가 회전하는 방향값이 적용되지 않음
Default pawn과 카메라의 방향값이 같지 않기 때문!
Get Control Rotation
으로 카메라(시점)의 방향 얻을 수 있음
발사체 자체의 방향이 바뀌긴 하지만 원하던 의도가 아님
수학적으로 벡터는 3D 공간에서의 방향과 크기
컴퓨터적으로 벡터는 3개의 부동소수점 값 X, Y, Z
앞 방향으로의 벡터
카메라 방향대로 회전한 후의 발사체의 전방을 가리키는 벡터
Get Actor Forward Vector
와 Multiply
노드 사용
발사체의 방향의 전방 벡터와 충격값을 곱하여 Impulse로 적용시키면 된다!
콘텐츠 드로어 단축키 Ctrl + Space
파일 탭 > 새 레벨 > 빈 레벨 > 생성하기
(강의에서는 Basic 레벨 골랐지만 나에게는 Basic 레벨이 없었다...
기본 환경 세팅하기 : 창 탭 > 환경 라이트 믹서 > 모두 다 켜기
-> 핑크 네모 모두 클릭
그럼 레벨에 조명이 생긴다!
프로젝트에 빠르게 추가 > 액터 배치 패널 > 지오메트리 > 박스
이름 바꾸기 F2
브러시 세팅
에서 크기를 각각 36m, 29m, 9.6m로 설정브러시 타입
을 Subtractive로 변경그럼 Walls 공간에서 Walls Subtract 공간을 뺀 방이 생김!
Ctrl + S
로 레벨 저장 (이름 'Main'으로 저장했다)
세팅 > 프로젝트 세팅 > 맵 & 모드 > 에디터 시작 맵, 게임 기본 맵을 Main으로 변경
지오메트리 브러시 이용해서 Substractive 타입으로 창문 생성
Alt + 마우스 이동
: 복제하며 이동 가능
(이전 레벨에서의 블루프린트 모두 복사해서 새 레벨에 붙여넣기)
DirectionalLight
의 방향을 조절해서 태양광으로 인한 그림자를 제어해서 원하는 공간의 분위기를 조성할 수 있음
콘텐츠 드로어 필터링 - 머티리얼
원하는 머티리얼 골라서 드래그하면 지오메트리 브러시 표면으로 설정됨
저는 바닥과 천장에 잔디를 깔아보았습니다...ㅎㅅㅎ
액터에 하나 이상의 정적 메시 컴포넌트(StaticMeshComponent)를 가질 수 있음
하나의 컴포넌트는 액터의 루트가 될 것이고 다른 것들은 자식이 됨
선반 다리에 선반 판을 합치기 위해 선반 다리의 정적 메시 컴포넌트에 드래그 해줌
-> 판이 다리의 자식이 됨
배럴을 쌓아 올리고 각각의 physics를 활성화 시킨 뒤 플레이하면 배럴들이 튀어오름
뷰 모드 > 플레이어 콜리전
충돌할때 적용되는 mesh가 이렇게 울퉁불퉁하게 생겼기 때문
1. 컨텐츠 드로어에서 배럴 더블 클릭
2. 뷰 모드 '플레이어 콜리전'
3. 콜리전 제거
4. 10면체 Z 단순화 콜리전 추가
5. 배럴의 블루프린트 클래스를 만들어서 마음껏 사용하기~!
정수 타입의 ammo 변수, default 값 20 설정
ctrl + 드래그
: Get
Alt + 드래그
: Set
발사체 발사 후 ammo 변수가 1씩 줄어드는 블루프린트
배고프냐?
만약 배고프면 -> 음식을 꺼내 먹는다.
배고프지 않으면 -> 게임을 계속 플레이한다.
Branch
노드를 보면
ammo 변수가 0보다 클때만 발사체를 발사,
ammo가 0 이하면 "Out of Ammo!" 출력
지저분한 블루프린트 노드들을 정리하는 방법들이 있음.
주석으로 묶기
발사체를 생성하고 발사하는 노드를 묶어 C 키
클릭 시 노드를 묶어주는 코멘트(주석) 작성 가능
엄청 좋은 방법은 아님 함수라는 더 좋은 방법이 있기 때문 ~.~
함수 사용하면 재사용도 편해니까 굿
함수로 묶기
한 함수로 묶을 노드들 드래그
> 우클릭
> 함수로 접기
클릭
기능을 함수로 추출한 비포-애프터 비교
before | after |
---|---|
게임의 흐름 이해가 훨씬 쉽다.
만든 함수들
- Print Welcome Messages
- Decreasing Ammo
- Print Ammo
게임의 기능 이해도 훨씬 잘 되도록 정리됨
이렇게 따로 문서나 주석 없이 이해되는 코드를 self documenting code
라고 함
내 블루프린트 > 함수 추가
: 새로운 함수 만들 수 있음
디테일 창 > 입력 '+'아이콘 or 출력 '+'아이콘
: 함수의 input과 output을 추가할 수 있음
브랜치의 조건 부분을 함수로 변경해볼 것임 -> Ammo가 있는지 확인하는 함수!
이벤트그래프 | Has Ammo 함수 내부 |
---|---|
위에서 만든 'Has Ammo' 함수에 실행 핀이 생긴 것은 좀 이상함 -> 순수 함수로 만들면 좋음
함수 디테일 > 퓨어 활성화
: 실행 핀 없는 퓨어 함수 만들어짐
암묵적으로 모든 멤버 함수는 현재 타켓이나 현재 인스턴스라는 파라미터 갖고 있음.
Spawn Projectile 함수 내에 임펄스 추가하는 노드들을 묶어 BP_Projectile
의 멤버 함수로 넣었음.
각 발사체의 레퍼런스는 self
노드로 얻을 수 있음.
Projectile의 멤버 함수 Launch 내부 | Spawn Projectile 함수 속 Launch 함수 |
---|---|
현재 Ammo가 0 이하면 "Out of Ammo!"를 출력하고 더 이상 게임이 진행되지 않음
*그걸 다시 함수로 변경