-
플레이어 생성의 다음 단계는
-
동작을 제어하는 스크립트 작성입니다
-
플레이어를 선택하고 [Player Movement]라는
-
새 스크립트를 추가합니다
-
스크립트를 정리합니다
-
여느 때처럼 공개 변수부터 시작합니다
-
플레이어가 고함 소리를 저장할
-
오디오 클립이 필요합니다
-
이 변수를 [shoutingClip]이라고 하겠습니다
-
[Lerp] 함수를 이용해 플레이어의
-
방향을 변경합니다
-
따라서 부드러운 동작을
위한 값이 필요합니다
-
플레이어 애니메이터의
속도 매개변수를 설정할 때
-
댐핑을 적용합니다
-
댐핑 시간을 공개 부동 변수로 저장합니다
-
또한 레퍼런스를 저장할 비공개 변수 2개도
-
필요합니다
하나는 애니메이터 컴포넌트를
-
위한 변수이며
-
다른 하나는 해시 IDs
스크립트 레퍼런스입니다
-
이제 [Awake] 함수를 이용해
-
이 레퍼런스들을 할당할 수 있습니다
-
이와 함께 [Awake] 함수를 이용해
-
애니메이터 컨트롤러의 샤우팅
-
레이어 가중치를 설정할 것입니다
-
레이어 가중치는 레이어의 효율성이므로
-
1의 값으로 설정하면 이 레이어의
-
애니메이션은 그 아래의 기본 레이어 등과
-
같은 모든 레이어에 완전히
-
우선할 가능성이 있습니다
-
아바타 마스크를 사용하고 있고
-
대부분의 시간 동안 [Shouting] 레이어가
-
빈 상태일 것이므로, 이 레이어 가중치를
-
1로 설정해 기본 레이어 애니메이션에
-
영향을 주지 않을 수도 있습니다
-
이 함수는 2개의 독립변수를 취합니다
-
첫 번째는 정수, 즉 레이어의 지수인데
-
가령 기본 레이어는 0,
-
[Shouting] 레이어는 1입니다
-
그리고 두 번째 독립변수는 앞서
-
살펴본 대로 효율성, 즉 1의 값입니다
-
플레이어는 물리 오브젝트이므로
-
우리는 고정 업데이트 함수에서 플레이어의
-
동작을 처리할 것입니다
지금 추가합니다
-
우선 사용자로부터 확보하는 입력을
-
캐시 하겠습니다
-
이런 식으로 입력 함수를 다시
-
호출할 필요 없이 필요할 때
-
이용할 수 있습니다
-
입력을 확보했으므로 그러한 정보를
-
이용해 동작을 관리할
함수를 작성합니다
-
이름을 [MovementManagement]로 하는데요
-
이 함수는 방금 캐시한
-
입력 변수의 매개변수를
-
취해야 합니다
-
여기에서 할 수 있는 첫 번째 작업은
-
이 함수에서 독립변수로 취하고 있는
-
[Sneaking] 변수를 이용해
-
[Sneaking] 애니메이터를
설정하는 것입니다
-
[Hash IDs] 스크립트 레퍼런스를 이용해
-
설정할 매개변수를 결정할 수 있습니다
-
플레이어에게 적용될 동작 방식은
-
축 입력에 따라 플레이어의 방향이
-
결정되는 방식입니다
-
플레이어는 그러한 방향에 따라
-
앞으로 달리는데요, 우수한 컨트롤
-
반응성을 위해 플레이어가
-
부드럽고 신속하게 회전을 변경할 수
-
있도록 할 것입니다
-
이를 위해 우선 방향 입력이 있는지
-
결정해야 합니다
-
플레이어가 방향 입력이 정의한 방향으로
-
회전할 수 있도록 이를 처리할
-
함수를 작성할 것입니다
-
목표 회전을 결정하려면
-
이 함수에는 수평 및 수직 변수가
-
필요합니다
-
우리가 플레이어가 향하길 원하는
-
새 방향을 벡터로 가정한다면
-
그러한 방향은
-
수평 입력의 X 방향의 양과
-
수직 입력의 Z 방향의 양으로
-
표시할 수 있습니다
-
따라서 수평과 수직이 모두 1이라면
-
즉 윗쪽과 오른쪽 방향 키를 누르고 있다면
-
플레이어는 양의 X 및 Z 방향을
-
향합니다
-
이 의도한 방향을 vector3로
-
저장하겠습니다
-
플레이어의 회전을 조정할 수 있도록
-
이제 이 벡터를 사원수로
-
변환해야 합니다
-
사원수란 회전을 저장하는 방식입니다
-
사원수은 다소 고급
주제이지만 회전을 캐릭터에
-
다시 할당하는 데 필요합니다
-
Unity는 이런 과정을 단순화한
-
[LookRotation]이라는 내장 함수를
-
지원합니다
-
[LookRotation]은 사원수 클래스의
-
정적 함수입니다
이것은 독립변수 2개를 취합니다
-
하나는 사원수로 변환하려는
-
방향을 나타내고
-
나머지 하나는 윗쪽 방향을 나타내는
-
벡터입니다
-
플레이어가 방향을 바꿀
때 부드럽게 회전할 수
-
있도록 할 것입니다
이를 위해 [Lerp]를 이용해
-
목표 회전 방향에서 현재 회전과
-
근소한 차이가 나는 새로운 회전을
-
획득할 것입니다
-
현재의 [rigidbody.rotation]을
출발 방향으로
-
키 입력의 [targetRotation]을
-
부드럽게 나아가려는 방향으로
-
이용할 것이며, 방향 전환을
-
부드럽게 해주는 변수가 이 과정의
-
소요 시간을 제어합니다
-
그런 다음 [rigidbody.MoveRotation]을
-
이용해 rigidbody의 회전을
-
이 새 회전으로 설정합니다
-
회전 함수 작성을 마쳤으므로
-
동작 관리 함수로 되돌아가 함수를
-
호출할 수 있습니다
-
이 if 문 내에 있는 동안 입력 수신 사실을
-
알고 있으므로 플레이어가
-
움직이고 있다는 것을 파악할 수 있습니다
-
그러므로 애니메이터의 속도 매개변수를
-
설정할 수 있습니다
블렌드 트리가 결정한
-
애니메이션 속도에 따라 속도 매개변수를
-
5.5로 설정합니다
-
설정에 따라 댐핑을 매개변수에
-
적용할 것입니다
그러면 반응성을
-
유지하면서 전환이 부드럽게
-
이루어집니다
-
하지만 입력을 수신하지 않고 있다면
-
속도를 0으로 설정하려고 합니다
-
동작 관리 함수 작성을 완료했으므로
-
고정 업데이트 함수에서 호출할 수 있습니다
-
플레이어의 오디오
즉, 발자국과 고함 소리를
-
아직 추가하지 않았습니다
-
이를 위해 오디오 관리
함수를 작성하겠습니다
-
[Locomotion] 상태일 때 발자국 오디오
-
클립이 재생되도록 하면 됩니다
-
따라서 우선 플레이어가 현재
-
[Locomotion] 상태인지 확인해야 합니다
-
적절한 상태가 [HashIDs]
스크립트에 저장되어
-
있으므로, 이름 해시를 사용할 수 있습니다
-
여기에서 0의 값으로
[GetCurrentAnimatorStateInfo]를
-
이용해 기본 레이어의 상태를
-
참조하고 있습니다
-
또한 클립이 재생되고 있지 않은
-
경우에만 재생을 원합니다
-
하지만 [Locomotion] 상태가 아닌
-
경우에는 끝난 후 재생되게
-
할 것이므로 이 지점에서
-
멈추겠습니다
-
플레이어의 발자국 소리를
관리하는 오디오 소스
-
컴포넌트를 이용하고 있으므로
-
샤우팅 관리를 위해
[PlayClipAtPoint] 함수를
-
이용할 것입니다
오디오 소스가 발자국 소리를
-
재생할 것이고, 우리는 그것을
-
발자국 소리로 대체하는 것을
원하지 않기 때문입니다
-
샤우팅 클립의 재생 조건은
-
[Shout]가 [True]인 경우입니다
-
[PlayClipAtPoint]는 독립변수 2개
-
즉, 오디오 클립과 위치를
위한 vector3를 취합니다
-
이것은 특정 위치의 세계에서
-
새 오브젝트를 생성하고 그곳에서
-
사운드를 재생합니다
그런 다음 이 오브젝트는
-
장면에서 더 이상 남지 않도록 소멸합니다
-
이제 오디오 관리 함수가 완성되었습니다
-
하지만 이 함수를 호출하려면
-
업데이트 함수에 두어야 합니다
-
우리는 이 함수를 고정 업데이트 함수
-
아래의 스크립트에 두겠습니다
-
여기에 업데이트를 할 필요는 없지만
-
스크립트를 읽을 때 흐름을 이해하는 것이
-
쉬워집니다
업데이트 함수의 위치는
-
어디라도 상관 없으며
순전히 선호의 문제입니다
-
수행하려는 첫 작업은 [Attract] 버튼의
-
입력을 캐시 하는 것입니다
-
그 다음은 애니메이터 컨트롤러에 대한
-
매개변수로서 이 입력의 구문을 분석해
-
플레이어가 정확한
애니메이션을 수행하도록 합니다
-
마지막으로 [Shout Bool]의 구문을
-
오디오 관리 함수로 분석해
-
샤우트 재생을 유발하는
-
입력이 되도록 하는 것입니다
-
이제 스크립트를 저장하고
에디터로 돌아갑니다
-
플레이어의 테스트 준비가 끝났습니다
-
하지만 그 전에 한 번 더 스크립트 폴더를
-
정리하겠습니다
-
[Scripts] 폴더에 [Player]라는
새 하위 폴더를 추가합니다
-
프로젝트 패널의 [Scripts] 폴더를
-
선택해 [Create] -
-
[Folder]로 갑니다
-
이 폴더를 [Player]라고 합니다
에셋 폴더를 선택한 후
-
[PlayerMovement]에서
-
이 [Player] 폴더로 드래그합니다
-
이제 반드시 장면과 프로젝트를 저장합니다
-
그러면 플레이어 테스트 준비가 완료됩니다
-
씬 뷰에서 플레이어로부터
-
약간 줌아웃하고 보기를 회전시켜
-
나중에 설치할 카메라의 위치와 비슷한
-
느낌이 들게 합니다
-
테스트 전에 [Shouting] 오디오 클립을
-
[PlayerMovement]
스크립트에 할당해야 합니다
-
따라서 다시 계층에서 플레이어 캐릭터인
-
[char_ethan]을 선택합니다
-
[PlayerMovement] 스크립트는
[Shouting] 클립 옆에
-
[None Audio] 클립이
있음을 알 수 있습니다
-
따라서 [Audio] 폴더에서
-
[PlayerAttractAttention]을 이 변수로
-
드래그합니다
-
이제 테스트를 재생합니다
인터페이스 상단의
-
재생을 누릅니다
-
장면 패널에서 캐릭터를 관찰하면서
-
조종할 수 있습니다
-
키보드의 화살표 키나 W, A, S 및 D를
-
이용합니다
-
왼쪽 Shift 키를 이용해 스니크할 수 있으며
-
X를 누르면 소리를 지를 수 있습니다
-
테스트를 재생하면서 스니킹 애니메이션이
-
다소 느리다는 것을 알 수 있습니다
-
하지만 매우 간단하게 조절할 수 있습니다
-
재생 버튼을 눌러 테스트를 중단하고
-
[Animator] 창으로 돌아갑니다
-
[Base Layer]에서 [Sneak]
상태를 선택합니다
-
인스펙터에서 [Speed]를
-
1.7 등의 더 큰 숫자로 설정합니다
-
이제 다시 재생을 누르고
변경 사항을 확인합니다
-
이동하면서 Shift를 누르면
-
스니킹이 약간 빨라집니다
-
시간을 두고서 게임 개선을 위한 테스트를
-
하면서 이런 조정 작업을
-
수행할 수 있습니다
-
다음 단원에서는
플레이어의 체력을 관리하는
-
스크립트를 작성해 보겠습니다.