< Return to Video

Stealth game tutorial - 405 - Enemy Animation - Unity Official Tutorials

  • 0:00 - 0:02
    이 단원에서는 적의 움직임을
  • 0:02 - 0:05
    제어하는 코드를 작성해 보겠습니다
  • 0:05 - 0:07
    적은 애니메이터로 움직이며
  • 0:07 - 0:09
    앞서 제공한 애니메이션 클립의
  • 0:09 - 0:13
    루트 모션에서 동작을 취합니다
  • 0:14 - 0:16
    애니메이터 매개변수는
    애니메이터가 재생하는
  • 0:16 - 0:18
    애니메이션 상태와 그에 따른
  • 0:18 - 0:20
    적의 동작 방식을 제어합니다
  • 0:21 - 0:23
    [Nav Mesh Agent]의 속도를 이용해
  • 0:23 - 0:25
    이 매개변수를 설정할 것이며
  • 0:25 - 0:27
    코드로 값을 조정해 특정 동작을
  • 0:27 - 0:29
    교정해 보겠습니다
  • 0:30 - 0:32
    내브 메쉬를 이용하면 시스템은 에이전트에
  • 0:32 - 0:35
    원하는 속도를 지원합니다
  • 0:35 - 0:37
    이것은 에이전트가 이동하는 실제 속도가
  • 0:37 - 0:40
    아니라, 방향 전환 속도입니다
  • 0:41 - 0:43
    우리의 적과 같은 내브 메쉬 에이전트는
  • 0:43 - 0:45
    여기 붉은 선으로 표시된, 목적지로 향하는
  • 0:45 - 0:47
    중간 경로를 가집니다
  • 0:48 - 0:50
    에이전트는 중간 지점으로 이동하면서
  • 0:50 - 0:53
    중간 지점으로 얼굴을 돌리며,
    검은색 화살표로
  • 0:53 - 0:56
    표시된 에이전트의 속도가
    녹색 화살표로 표시된
  • 0:56 - 0:58
    원하는 속도로 향하고 있다고
  • 0:58 - 1:00
    우리는 말합니다
  • 1:00 - 1:02
    이 원하는 속도는 적의 애니메이터
  • 1:02 - 1:04
    매개변수인 [Speed] 및 [Angular Speed]로
  • 1:04 - 1:08
    전송할 값의 토대입니다
  • 1:09 - 1:11
    우선 이 매개변수를 제어하는 스크립트를
  • 1:11 - 1:13
    작성해 보겠습니다
  • 1:13 - 1:15
    로봇 가드에 [EnemyAnimation]이라는
  • 1:15 - 1:17
    새 스크립트를 추가합니다
  • 1:17 - 1:19
    [char_robotGuard]를 선택한 후
  • 1:19 - 1:22
    [Add Component] - [New Script]를
  • 1:22 - 1:24
    선택하고 [EnemyAnimation]이라고 합니다
  • 1:24 - 1:28
    편집을 위해 스크립트를
    실행하고 준비합니다
  • 1:29 - 1:31
    우선 필요한 클래스 변수를 살펴봅시다
  • 1:31 - 1:34
    필요한 공개 변수는 1개인데
  • 1:34 - 1:36
    부동 변수이며,
    이 변수를 [deadZone]이라고
  • 1:36 - 1:37
    하겠습니다
  • 1:37 - 1:40
    입력 용어인 데드존과 유사한 [deadzone]은
  • 1:40 - 1:43
    무시해야 하는 값의 범위입니다
  • 1:43 - 1:45
    적이 길 찾기를 하는 경우
  • 1:45 - 1:47
    적의 전방과 원하는 속도의 차이가
  • 1:47 - 1:50
    매우 적다면, 적이 방향 전환을
  • 1:50 - 1:52
    시도하지 않도록 합니다
  • 1:52 - 1:54
    [deadzone]을 이용해 이를 정의합니다
  • 1:55 - 1:57
    이렇게 하지 않으면
  • 1:57 - 1:59
    예제처럼 적이 오버스티어링하면서
  • 1:59 - 2:01
    똑바로 중간 지점을 향해
  • 2:01 - 2:03
    걸어가지 못합니다
  • 2:14 - 2:16
    6개의 비공개 변수가 필요합니다
  • 2:16 - 2:17
    그 첫 번째는 플레이어의 전환
  • 2:17 - 2:19
    관련 레퍼런스입니다
  • 2:19 - 2:21
    이를 이용해 플레이어가
    보일 때 적이 플레이어를
  • 2:21 - 2:24
    향하는 방향을 설정합니다
  • 2:26 - 2:28
    그 다음은 플레이어가 보이느냐 아니냐에
  • 2:28 - 2:30
    따라 애니메이션을 변경할 수 있도록
  • 2:30 - 2:32
    [EnemySight] 스크립트 레퍼런스가
  • 2:32 - 2:34
    필요합니다
  • 2:35 - 2:37
    그리고 적의 이동을 안내할
  • 2:37 - 2:41
    [nav mesh Agent] 컴포넌트
    레퍼런스가 필요합니다
  • 2:41 - 2:43
    그 다음에는 애니메이터
    컴포넌트 레퍼런스가
  • 2:43 - 2:45
    필요하고, 매개변수 참조 지원을 위해
  • 2:45 - 2:47
    [HashIDs] 스크립트 레퍼런스가
  • 2:47 - 2:49
    필요합니다
  • 2:51 - 2:53
    마지막은 지난 단원에서 작성한
  • 2:53 - 2:56
    헬퍼 클래스의 인스턴스인
  • 2:56 - 2:58
    [AnimatorSetup]입니다
  • 2:59 - 3:01
    그 다음에는 [Awake] 함수를 이용해
  • 3:01 - 3:03
    이 매개변수들을 설정할 것입니다
  • 3:25 - 3:27
    레퍼런스 할당 외에도
  • 3:27 - 3:29
    다양한 액션 수행을 위해 [Awake] 함수가
  • 3:29 - 3:31
    필요할 것입니다
  • 3:31 - 3:33
    우선 적의 회전을 내브 메쉬 에이전트가
  • 3:33 - 3:35
    아니라 애니메이터로 설정하는지
  • 3:35 - 3:37
    확인해야 합니다
  • 3:37 - 3:40
    이렇게 하면 코너를 돌
    때 미끄러지는 현상을
  • 3:40 - 3:42
    줄일 수 있습니다
  • 3:42 - 3:44
    또한 앞 단원의 헬퍼 함수
  • 3:44 - 3:46
    인스턴스를 생성하고
  • 3:46 - 3:48
    이와 함께 그 생성자를
  • 3:48 - 3:50
    호출할 것입니다
  • 3:50 - 3:52
    이미 레퍼런스를 확보하고 있는
  • 3:52 - 3:54
    애니메이터 컴포넌트와
    [HashIDs] 스크립트를
  • 3:54 - 3:56
    분석할 수 있습니다
  • 3:56 - 3:58
    우리는 여러 애니메이터 레이어의 가중치를
  • 3:58 - 4:00
    설정해야 합니다
  • 4:00 - 4:03
    이 [Weight] 값은 애니메이터에서 레이어의
  • 4:03 - 4:05
    애니메이션 밸런스를 조정합니다
  • 4:05 - 4:07
    [Shooting]과 [Gun] 레이어에
  • 4:07 - 4:10
    1의 가중치를 부여할 것입니다
  • 4:10 - 4:12
    따라서 이 두 레이어는 기본 레이어 등
  • 4:12 - 4:14
    아래에 있는 레이어보다 우선 적용됩니다
  • 4:14 - 4:16
    이는 애니메이션이 순전히 이 레이어들을
  • 4:16 - 4:18
    토대로 함을 뜻합니다
  • 4:18 - 4:20
    하지만 [Shooting]과 [Gun] 레이어에
  • 4:20 - 4:22
    마스크를 사용하고 있으므로
    이 레이어들을
  • 4:22 - 4:24
    우선 적용할 수 있는 유일한 신체 부위는
  • 4:24 - 4:27
    각각 상체와 오른손입니다
  • 4:27 - 4:30
    따라서 [Set Layer Weight] 함수와
  • 4:30 - 4:32
    레이어의 정수를 사용합니다
  • 4:32 - 4:34
    가령 기본 레이어를 0으로 참조해야 한다면
  • 4:34 - 4:37
    [Shooting]과 [Gun]을 참조하고 있으므로
  • 4:37 - 4:40
    1을 이용해 [Shooting]을, 2를 이용해
  • 4:40 - 4:42
    [Gun]을 표시할 것이며
  • 4:42 - 4:44
    2개 모두를 [1f]로 설정합니다
  • 4:45 - 4:48
    [Awake] 함수에서 수행해야
    하는 마지막 작업은
  • 4:48 - 4:50
    [deadZone] 변수를 '각도'에서 '라디안'으로
  • 4:50 - 4:52
    변환하는 것입니다
  • 4:52 - 4:54
    앞서 작성한 애니메이터
    컨트롤러가 라디안으로
  • 4:54 - 4:57
    매개변수를 측정하기 때문이죠
  • 4:57 - 4:59
    다행히 [Mathf] 클래스는 이용할 수 있는
  • 4:59 - 5:02
    상수 [deg2rad]가 있습니다
  • 5:02 - 5:04
    상수는 변수와 비슷하지만
  • 5:04 - 5:07
    일단 설정하면 변경할 수 없습니다
  • 5:07 - 5:09
    '각도'의 숫자를 라디안으로 변환하려면
  • 5:09 - 5:13
    이 상수로 곱하기만 하면 됩니다
  • 5:13 - 5:15
    이 스크립트의 대부분은
    내브 메쉬 에이전트를
  • 5:15 - 5:18
    기반으로 애니메이션을 설정합니다
  • 5:18 - 5:20
    이를 위해 [Update]
    함수에서 호출할 수 있는
  • 5:20 - 5:22
    함수를 생성할 것입니다
  • 5:22 - 5:24
    이 함수를 [NavAnimSetup]으로
    부르기로 합니다
  • 5:24 - 5:27
    이 함수에서 수행할 첫 작업은
  • 5:27 - 5:29
    헬퍼 클래스의 [Setup] 함수에 대해
  • 5:29 - 5:31
    분석할 [Speed] 및 [Angle] 매개변수를 위한
  • 5:31 - 5:33
    부동 변수 2개를 생성하는 것입니다
  • 5:36 - 5:39
    이제 플레이어가 보이는지 결정해야 합니다
  • 5:41 - 5:43
    플레이어가 보이면 적이 멈추도록
  • 5:43 - 5:45
    해야 하므로, [Speed] 매개변수를
  • 5:45 - 5:47
    0으로 설정합니다
  • 5:49 - 5:51
    이제 적이 향해야 하는 방향과 실제로
  • 5:51 - 5:53
    향하고 있는 방향 사이의 각도를
  • 5:53 - 5:55
    파악합니다
  • 5:55 - 5:58
    왼쪽은 -, 오른쪽은 + 입니다
  • 5:59 - 6:01
    이 작업을 수행하려면 또 다른
  • 6:01 - 6:03
    함수를 생성해야 합니다
  • 6:03 - 6:05
    이 함수는 [float]을 반환해야 하며
  • 6:05 - 6:08
    매개변수로 [vector3] 3개가 필요합니다
  • 6:08 - 6:10
    다시 말해 [fromVector]
  • 6:10 - 6:12
    [toVector], 그리고 방향을
  • 6:12 - 6:14
    결정하는 또 다른 벡터가 필요하죠
  • 6:14 - 6:17
    이 함수를 [FindAngle]이라고
  • 6:17 - 6:19
    하겠습니다
  • 6:21 - 6:23
    여기에 분석하려는 [toVector]는
  • 6:23 - 6:27
    내브 메쉬 에이전트의 원하는 속도입니다
  • 6:27 - 6:29
    이것은 종종 0이 됩니다
  • 6:29 - 6:31
    그러면 오류가 발생할 수 있으므로
  • 6:31 - 6:33
    이를 확인할 수 있는
    방법을 삽입해야 합니다
  • 6:33 - 6:35
    원하는 속도가 0이라면
  • 6:35 - 6:37
    방향이 0이 되길 원합니다
  • 6:37 - 6:39
    그렇다면 함수에서 간단히 0을
  • 6:39 - 6:42
    반환하면 되고, 그렇지 않다면
  • 6:42 - 6:44
    코드의 나머지 부분으로
  • 6:44 - 6:46
    계속 진행합니다
  • 6:46 - 6:48
    다음 단계는 각도의 절대값을
  • 6:48 - 6:50
    구하는 것입니다
  • 6:50 - 6:51
    [vector3.angle] 함수를 이용해
  • 6:51 - 6:54
    간단하게 구할 수 있습니다
  • 6:55 - 6:57
    그리고 이 각도가 전방의
  • 6:57 - 6:59
    왼쪽 또는 오른쪽이냐를
  • 6:59 - 7:02
    결정합니다 이를 위해
  • 7:02 - 7:04
    두 벡터의 벡터곱을 구해
  • 7:04 - 7:07
    법선 벡터의 합을 확인합니다
  • 7:07 - 7:10
    벡터곱에 왼손 법칙을 적용해
  • 7:10 - 7:12
    [toVector]가 [fromVector]의
    오른쪽이라면
  • 7:12 - 7:14
    법선이 윗쪽을 향할 것임을
  • 7:14 - 7:15
    알 수 있습니다
  • 7:15 - 7:18
    이 부분을 복습하려면, 아래 링크의
  • 7:18 - 7:20
    Vector Maths 단원을 참조하십시오
  • 7:33 - 7:35
    이제 이 [Normal]과 우리가 분석한
  • 7:35 - 7:38
    [Up] 벡터의 곱을 구할 수 있습니다
  • 7:38 - 7:40
    [Normal]과 [Up] 벡터가
    같은 방향을 가리키면
  • 7:40 - 7:42
    합력은 0보다 클 것이므로
  • 7:42 - 7:44
    우리가 구한 곱의 부호로
  • 7:44 - 7:47
    이미 계산한 각도를
  • 7:47 - 7:50
    곱하면 됩니다
  • 7:50 - 7:52
    그러면 원하는 속도가 [Forward] 벡터의
  • 7:52 - 7:55
    왼쪽 또는 오른쪽인지 파악할 수 있습니다
  • 7:56 - 7:59
    이 각도를 라디안으로 구해야
    한다는 점에 유의합니다
  • 7:59 - 8:01
    따라서 앞서 이용한
  • 8:01 - 8:04
    [Deg2Rad] 상수를 곱해야 합니다
  • 8:04 - 8:07
    마지막으로 각도를 반환할 수 있습니다
  • 8:08 - 8:10
    각도를 구하는 함수가 있으므로
  • 8:10 - 8:12
    [NavAnim setup] 함수에서 그것을
  • 8:12 - 8:14
    사용할 수 있습니다
  • 8:14 - 8:17
    [fromVector]는 적의 [forward] 벡터
  • 8:17 - 8:19
    [toVector]는 적에서 플레이어까지의
  • 8:19 - 8:21
    벡터인데, 우리는 적의 [upVector]를
  • 8:21 - 8:25
    [up] 벡터로 이용할 것입니다
  • 8:26 - 8:28
    이제 플레이어가 보이지 않는
  • 8:28 - 8:30
    경우를 해결해야 합니다
  • 8:31 - 8:33
    플레이어가 보이지 않으면
  • 8:33 - 8:35
    속도가 내브 메쉬 에이전트의 원하는
  • 8:35 - 8:38
    속도를 바탕으로 정해지도록 합니다
  • 8:38 - 8:40
    이를 위해 프로젝션을 사용해
  • 8:40 - 8:42
    원하는 속도 벡터를 적의
  • 8:42 - 8:46
    전방 벡터로 투사합니다
  • 8:46 - 8:49
    프로젝션을 통해 벡터 2개를 취할 수 있고
  • 8:49 - 8:51
    다른 벡터의 방향에 있는 첫 번째
  • 8:51 - 8:54
    벡터의 양을 확인할 수 있습니다
  • 8:54 - 8:56
    프로젝션은 첫 번째 벡터의 끝에서
  • 8:56 - 8:58
    두 번째 벡터로 선을 그리면
  • 8:58 - 9:01
    구할 수 있습니다
  • 9:01 - 9:03
    이 선이 두 번째 벡터의 방향과
  • 9:03 - 9:05
    직각을 이루도록
  • 9:05 - 9:06
    그려야 합니다
  • 9:07 - 9:09
    이 선의 교점은 프로젝션 벡터의
  • 9:09 - 9:12
    끝을 정의합니다
  • 9:12 - 9:14
    내브 메쉬 에이전트의 원하는 속도를
  • 9:14 - 9:18
    적의 전방 벡터에 투사하고 있으므로
  • 9:18 - 9:20
    원하는 속도와 같은 방향으로
  • 9:20 - 9:23
    적이 향하지 않는다면 합 벡터는
  • 9:23 - 9:25
    작을 것입니다
  • 9:25 - 9:27
    속도 변수를 프로젝션 벡터의
  • 9:27 - 9:30
    크기로 설정할 것입니다
  • 9:30 - 9:32
    이 프로젝션을 사용하지 않으면
  • 9:32 - 9:34
    적은 빠른 속도로 엉뚱한 방향으로
  • 9:34 - 9:36
    향할 것이므로, 정확한 방향으로 향하려고
  • 9:36 - 9:40
    커다란 아치를 그리면서 뛸 것입니다
  • 9:41 - 9:43
    다음은 각도를 구할 차례입니다
  • 9:43 - 9:46
    여기에서도 [findAngle]
    함수를 사용하겠지만
  • 9:46 - 9:48
    이번에는 [toVector]가 내브 메쉬
  • 9:48 - 9:51
    에이전트의 원하는 속도입니다
  • 9:53 - 9:55
    댐핑을 이용해 애니메이터
    매개변수를 설정하고
  • 9:55 - 9:57
    있으므로, 방향을 전환할 때
  • 9:57 - 9:59
    정확한 방향을 향하자마자 방향 전환을
  • 9:59 - 10:01
    멈추지는 않을 것이며, 미세하게 계속
  • 10:01 - 10:04
    방향 전환을 시도할 것입니다
  • 10:04 - 10:07
    그런 다음 보정을 위해 되돌아가야 합니다
  • 10:07 - 10:09
    그러면 코너를 돌면서 뱀과 유사한
  • 10:09 - 10:11
    움직임을 보여줍니다
  • 10:11 - 10:13
    이런 움직임을 방지하려면 함수에
  • 10:13 - 10:15
    체크를 삽입합니다
  • 10:15 - 10:17
    이 체크는 각도가 작은지, 즉 [deadZone]
  • 10:17 - 10:21
    변수보다 작은지 확인합니다
  • 10:22 - 10:25
    만약 그렇다면
    적이 향하는 방향 설정을 위해
  • 10:25 - 10:27
    애니메이터 컨트롤러를 사용하지 않습니다
  • 10:27 - 10:30
    이를 위해 각도를 0으로 설정하고
  • 10:30 - 10:32
    적의 트랜스폼이 그 위치에서 원하는
  • 10:32 - 10:35
    속도를 바라보도록 설정합니다
  • 10:39 - 10:41
    속도와 각도를 계산했으므로
  • 10:41 - 10:43
    헬퍼 클래스 애니메이터 설정의
  • 10:43 - 10:45
    [Setup] 함수로 분석할 수
  • 10:45 - 10:47
    있습니다
  • 10:47 - 10:49
    그리고 댐핑을 적용하고 애니메이터
  • 10:49 - 10:52
    컨트롤러로 분석하면 됩니다
  • 10:53 - 10:56
    [NavAnimSetup] 함수를 완성했으므로
  • 10:56 - 10:59
    [Update] 함수에서 호출하면 됩니다
  • 11:02 - 11:04
    이미 작성한 함수 위에 이 함수를
  • 11:04 - 11:06
    삽입하는 동안 이 작업은 불필요하다는
  • 11:06 - 11:08
    점에 유의합니다
  • 11:08 - 11:10
    스크립트에 대해 매끄러운
    구조를 유지하려고
  • 11:10 - 11:12
    이 작업을 수행합니다
  • 11:13 - 11:15
    우선 클래스 변수가 오고
  • 11:15 - 11:17
    [Awake] 함수를 호출한 다음
  • 11:17 - 11:20
    모든 프레임에서 [Update]
    함수를 호출합니다
  • 11:22 - 11:24
    그러면 [NavAnimSetup] 함수와 [FindAngle]
  • 11:24 - 11:27
    함수가 차례로 호출됩니다
  • 11:29 - 11:31
    이 스크립트와 관련해
    마지막으로 수행할 작업은
  • 11:31 - 11:34
    적의 루트 모션에
    효과를 부여하는 것입니다
  • 11:34 - 11:36
    일반적으로 루트 모션을 적용할 수도 있고
  • 11:36 - 11:39
    애니메이터 컴포넌트에
    포함시키지 않을 수도 있습니다
  • 11:39 - 11:41
    하지만 모든 프레임에서 [Update] 후
  • 11:41 - 11:45
    호출되는 [OnAnimatorMove]
    함수를 사용한다면
  • 11:45 - 11:47
    수동으로 루트 모션에
    효과를 부여할 수 있습니다
  • 11:48 - 11:51
    이 함수에서 제어해야 하는 것은 두 가지
  • 11:51 - 11:54
    즉, 적의 속도와 적의 회전 속도입니다
  • 11:54 - 11:56
    속도를 제어하려면 내브 메쉬 에이전트의
  • 11:56 - 12:00
    속도를 델타 타임으로 나눈 애니메이션의
  • 12:00 - 12:02
    델타 위치로 설정해야 합니다
  • 12:03 - 12:06
    이는 프레임당 위치 변화입니다
  • 12:07 - 12:09
    회전의 경우, 이미 내브 메쉬 에이전트를
  • 12:09 - 12:12
    설정했으므로 이것이
    회전을 제어하지는 않습니다
  • 12:12 - 12:14
    따라서 애니메이션의 루트 회전을 직접
  • 12:14 - 12:18
    이용해 회전 효과를 부여할 수 있습니다
  • 12:20 - 12:22
    이로써 스크립트가 완성되었습니다
  • 12:22 - 12:24
    스크립트가 완성되었으므로
  • 12:24 - 12:27
    저장한 후 에디터로 돌아갑니다
  • 12:29 - 12:31
    반드시 [Enemy] 폴더에 스크립트를
  • 12:31 - 12:33
    정리하도록 합니다
  • 12:33 - 12:36
    [Scripts] 폴더를 확장하고
  • 12:36 - 12:39
    에셋의 루트에서
    [Enemy] 폴더로 끌어다 놓습니다
  • 12:40 - 12:43
    이제 씬을 저장하고 프로젝트도 저장합니다
  • 12:47 - 12:49
    다음 단원에서는 적이 플레이어를 쏘는
  • 12:49 - 12:51
    스크립트를 작성해 보겠습니다
Title:
Stealth game tutorial - 405 - Enemy Animation - Unity Official Tutorials
Description:

more » « less
Duration:
12:52

Korean subtitles

Revisions