오늘은 일찍 눈이 떠진김에 본 캠프부터 하는것 처럼 9시부터 공부를 시작했다.
C++을 사용하지않고 개발을 하는 방법이 있는데 블루프린트이다.
복잡한 기능을 구현하거나 최적화가 힘들다는 큰 단점이 있지만
간단한 작업이나 행동트리를 제작하기에는 매우 간편한 도구이다.

print string 노드를 만들어서 연결 후 안녕하세요 라는 string을 넣었다.
이렇게되면 에디터에서 플레이 시 좌측 상단에 안녕하세요가 출력된다.
해당 블루프린트 추가 후
LandscapeStreamingProxy_D7T4VF4LBP34PHV9XOEVM5TIG_1_4_7_0 of /Memory/UEDPIE_0_1CC36TCQFZOQFLDYP3B86JS10 points to a LandscapeActor that is not currently loaded. This will lose the property upon save.
라는 오류가 발생했는데 이 오류는 상단메뉴 > 빌드 > 모든 레벨 빌드 후 다시 플레이하면 해결된다.

블루프린트 좌측에서 변수 > + 버튼을 통해 변수를 생성 후
이벤트 그래프에 드래그앤드랍 시 우측과 같이 getter와 setter를 선택할 수 있다.

SET 이라고 되어있는게 Setter고 그 위 Var1이라고 적혀있는게 getter다.

Print String에 setter를 통해 입력한 값을 출력하고 싶은데 내가 만든 변수는 Int 타입이기 때문에 형변환을 해줘야한다.
이렇게 형변환을 해주고 PrintString에 연결해주면 된다.

0번 > 1번 > 2번 ... 연속 실행을 위한 노드
이렇게 되면 순서대로 5, 안녕하세요, NewFunction()이 실행된다.

순서대로
1. var1 = 0 으로 set
2. condition = true
3. while 반복문 시작
4. branch 분기 만나면 condition 체크
5. var1 < 3 인가? true/false
6. true 일 경우 var1++ 후 PrintString 반복중 출력
7. false일 경우 PrintString 끝 출력
(이렇게 보니 BP가 너무 쓸데없이 복잡하다는 생각이 들기는 한다.. 마치 스크래치를 처음 했을 때의 기분)




고작 가위바위보 만드는데 이렇게 많은 노드가 필요하다.
더욱이 C++을 열심히 해야겠다고 다짐하게 되는 계기였다.

이름은 ABP_Character로 애니메이션 블루프린트를 생성하고 더블클릭해서 편집한다.

그럼 위와같이 우측 에셋브라우저에서 사용 가능한 애니메이션 목록이 보이는데
A로 시작하는 애니메이션은 단일 모션이고
BS는 Blend Space라고 애니메이션을 합쳐놓은 것이다.
우리는 이 BS를 만들어서 적용할 것이다.

Anim 폴더를 만들고 그 안에서 우클릭 > 애니메이션 > 블렌드 스페이스를 선택해서 모델은 계속 사용중인 주황색 로봇으로 선택, 이름은 BS_WalkToRun으로 만든 후 더블클릭해서 편집한다.

그러면 또 이렇게 새로운 창이 나오는데 좌측부터 살펴보면

이렇게 다양한 옵션들이 있다. 하단에 더 있지만 크기상 일부만 캡쳐했다.

중간에는 이전에 봤던 A로 시작하는 단일 애니메이션을 드래그앤드랍해서 BS를 만들 수 있게 되어있다.
우측은 마찬가지로 에셋 브라우저가 있다.

이제 중간 공간에서 BS를 만들어볼건데 그 전에 우리는 걷다가 뛰는 모션을 만들 것이라
좌측 패널에서 가로축은 그리드만 2로 바꿔주고 세로축만 사용할 것이다. 세로축의 최대 값을 500으로 하고 이름을 Speed로 해주겠다.
좌측에 축의 이름이 Speed이고 최대 0~500의 값이 선택 가능해졌다.

그 후 500 최대값에는 A_Bot_Run, 0에는 A_BOT_Idle을 넣었다.
속도가 0 일때는 idle 즉 가만있다가 Speed가 점점 높아질 수록 Run의 모션이 빨라지게 설정되었다.
이렇게 되면 속도가 낮을때는 걷기처럼 모션이 나오고 속도가 최대치에 가까워질수록 뛰는 모션으로 보일 것이다.
이제 BS는 다 만들었고 이걸 ABP에 적용한다.

ABP에서 변수에 Speed를 만들고 자료형은 Float로 해준다.

Try Get Pawn Owner는 Pawn 인스턴스의 주소 즉 레퍼런스를 반환한다.
그리고 Get Velocity로 Pawn의 속도를 가져와서 우리는 점프같은 동작을 만드는게 아니라 x,y값을 Vector로 만든다.
Vector는 방향성을 띄고있는 속도이다.
스칼라 값은 힘의 크기만을 말하고 벡터는 방향도 함께 가지고 있다.
이후 새로 만든 벡터의 길이를 구한다.
벡터의 length가 스칼라 값이다.
그리고 변수 Speed의 setter에 스칼라 값을 넣어준다.
마지막으로 오류를 방지하기 위해 isValid를 추가해 연결된 pawn이 정상작동 중인지 체크하고 마무리한다.


그리고 ABP_Character의 AnimGraph에서 변수 Speed 값을 드래그앤드랍으로 생성한 BS_WalkToRun의 스피드값에 연결하고 애니메이션을 연결한다.
마지막으로 BP_Character의 디테일 패널에서 애니메이션 > 애님 클래스에 만든 ABP_Character를 연결하면 끝이다!

스테이트 머신이란
상태 + 기계 의 결합어
상태는 시스템이 어떤 조건에 놓여있는지
기계는 이벤트에 따라 내부적으로 작동하거나 변환이 일어나는 장치
정해진 여러 상태 중 하나에 있으면서 특정 입력이나 사건에 의해 다른 상태로 전이된다.

ABP로 돌아와서 우클릭 > state machine 검색 후 애니메이션 스테이트 머신을 추가하고 더블클릭해서 편집한다.

우클릭 > 엔트리 포인트 1개와
상태 5개, 스테이트 에일리어스 1개를 생성한다.

각 상태를 결합하면 위와 같은 화살표 형태를 볼 수 있다.
이후 각 상태를 클릭해 설정해준다.


생성된 상태에 따라 해당 애니메이션이 동작하기 위해 지금 해당 상태(Idle인지 Run인지)가 true인지 확인하기 위한 설정을 해준다.


속도가 0보다 크면 Idle->Run
반대로 속도가 0보다 작거나 같다면 Run->Idle
자이제 점프 애니메이션을 적용해보겠다.


체공중인지 확인하기 위해 IsInAir 변수를 boolean 값으로 추가해준다.
Get Movement Component를 추가한다.
해당 컴포넌트는 isFalling 이라는 값을 가지고있는데 이것으로 공중에 체공중인지 true/false로 체크가 가능하다.

스테이트 에일리어스의 디테일 패널에서 idle, run을 선택해준다.
이제 Jump, Fall, Land에 애니메이션을 추가하고 각 스테이트를 연결하자.


Jump > Fall 과 Land > Idle은 규칙을 따로 설정하지 않고 디테일 패널에서 스테이트 시퀀스 플레이어에 따른 자동 규칙을 활성해주면 된다.
Jump > Fall이나 Land > Idle로 갈 때의 애니메이션 변화는 반드시 변하고 한가지 밖에 없기 때문에 직접 규칙을 설정할 필요가 없다.

Fall이 끝나고 Land일 때는 IsInAir가 false여야 하기 떄문에 NOT 논리연산자를 넣어주자.
이렇게 애니메이션 적용이 완료됐다.
오늘 배운 개념 요약
// 에셋 이동과 서드파티 모델의 프로젝트 임포트
구현 과정 요약 (스크린샷 + 간단 설명)
적용한 외부 에셋이 보이는 씬 스크린샷 1장

어떤 플랫폼에서 어떤 에셋을 사용했는지 간단히 서술 (예: Quixel / Broken Bench / ID: 215332)
Fab / Scrapopolis

폴더 구조에 대한 설명 필수 포함
Contents/Myassets