본문

뉴스 기사

[기사 제목]

유니티 마스터즈 데이, 내비게이션·VFX·머신러닝까지

조회수 4803 | 루리웹 | 입력 2019.12.04 (08:44:00)
[기사 본문]

국내 게임 업계의 한 축을 담당하는, 유니티 엔진 고수들이 한 자리에 모였다. 유니티 코리아는 3일(화), 자사의 강남 오피스에서 뭇 개발자와 유용한 정보를 공유하는 커뮤니티 오프라인 이벤트 ‘유니티 마스터즈 데이’를 개최했다.


이날 첫 회를 맞은 본 행사는 유니티 코리아 공인 전문가 그룹 ‘유니티 마스터즈’가 엔진 관련 노하우를 나누고자 마련됐다. 유니티 코리아는 지난 2016년부터 유니티 마스터즈 프로그램을 진행해왔으며 금번 4기는 게임 개발과 테크니컬 아트, 미디어 및 엔터테인먼트, 엔지니어링 및 건설, 확장현실, 인공지능 등 여러 산업 분야에 종사하는 전문가 11명이 선정된 바 있다.

 

1.jpg


초급자를 위한 네비게이션 심화


첫 번째 강연은 ‘절대 강좌! 유니티’ 저자로 잘 알려진 이재현 마스터가 ‘초급자를 위한 네비게이션 심화’를 주제로 입을 열었다. 길찾기 기능인 유니티 내비게이션의 기본 기능은 대부분 잘 알고 있지만 확장 내비게이션의 기능에 대해서는 유니티 에디터에 탑재되지 않아 의외로 많은 개발자가 모르기 때문. 따라서 기존 내비게이션의 고급 기능과 확장 내비게이션의 새로운 기능에 대해 소개하고 게임 내 적용 가능한 데모를 시연했다.

 

2.jpg


일반적인 내비게이션 구현 절차는 Navigation Static → NavMeshAgent → Code순이다. 가장 기본적인 기능은 길을 찾는 Path Finding으로, 3D 지오메트리를 미리 분석하여 NavMesh를 생성하고 A*알고리즘을 사용하여 실시간으로 최단거리를 계산해준다. 이동과 회전의 경우 자동 처리하나 전체적으로 기본 설정 시에는 다소 어색한 이동을 보여준다. 이외에도 정적/동적 장애물 회피 기능인 Obstacle과 끊어진 메시를 연결하는 Off Mesh Link도 주로 쓰인다.

 

3.jpg


4.jpg


그렇다면 어떻게 보다 자연스러운 내비게이션을 구현할까? 먼저 NavMeshAgent의 회전 기능을 제한한 후 직접 회전시키면 보다 자연스럽다. agent.updateRotation=false;와 같이 회전 처리를 제한할 수 있다. 이후 에이전트 이동 방향과 회전 각도(Quaternion)을 산출하고 선형보간 함수를 이용하여 부드러운 회전을 연출하는 것이다.

 

5.jpg


6.jpg


또다른 내비게이션의 고급 기능으로 Area Mask가 있다. 이름 그대로 영역(Area)에 여러 속성을 부여할 수 있는 기능으로, 가령 경로별 가중치를 두어 에이전트가 이동할 때 가장 비용이 작은 길로 향하게 수 있다. 또한 이동할 수 있는/이동할 수 없는 영역을 별도 Area로 설정하여 갑자기 길이 차단되었을 때 다른 경로로 유도할 수도 있다. NavMesh Obstacle 컴포넌트의 Carve와 비슷하나 Area Mask로 작업하는 것이 더 가볍다.

 

7.jpg


8.jpg


9.jpg


10.jpg


Priority 역시 내비게이션을 활용할 때 주효한 기능이다. 두 개 이상의 에이전트가 동일한 목적지로 이동하는 Race Condition에서 우선 순위를 설정해주는 것이다. 기본값은 50이며 0~99범위로 숫자가 작을수록 높은 우선 순위를 지닌다. 이를 설정하지 않으면 먼저 한 자리를 놓고 에이전트가 서로 밀어내는 추태가 벌어진다. 주인공과 같이 밀려선 안되는 에이전트는 보다 높은 Priority를 부여해주고, 적이라면 적절한 Stopping Distance로 일정 거리에서 정지하도록 설정하자.

 

11.jpg


12.jpg


이외에 알아 두면 좋은 내비게이션의 중요 속성으로는 updatePosition(목적지까지 위치를 자동으로 동기화), updateRotation(이동 중 자동으로 회전), remainingDistance(목적지까지 남은 거리), velocity(에이전트의 현재 속도), desireVelocity(장애물 회피를 고려한 잠재적 속도), pathPending(목적지까지의 최단거리 계산이 완료됐는지 여부), isPathStale(계산한 경로의 유효성 여부) 등이 있다.

 

13.jpg


다음은 확장 내비게이션이다. 사실 확장 내비게이션은 일종의 가칭으로, 현재는 패키지 매니저에 포함되지 않고 유니티 에디터에서 조그마한 링크를 통해서만 소개되어 있다. 확장 내비게이션이 제공하는 추가 컴포넌트는 NavMeshSurface, NavMeshLink, NavMeshModifier, NavMeshModifierVolume까지 4종으로 모두 기존에 아쉬웠던 기능을 대폭 개량한 것이다.

 

14.jpg


하나씩 보자. NavMeshSurface는 내비게이션 뷰를 오픈하지 않고도 Bake 버튼 하나로 그 자리에서 내비메시를 곧바로 구울 수 있다. 일일이 Navigation Static 플래그를 체크할 필요도 없다. 또한 내비메시를 실시간으로 회전시킬 수 있어 원한다면 수직으로도 이동 가능하다. 만약 여러 내비메시를 동시에 작업하고 싶다면 Include Layers로 묶어 한번에 구울 수도 있다.

 

15.jpg


16.jpg


NavMeshLink는 기존의 OffMeshLink와 유사한 기능으로 에이전트가 수직의 벽으로도 이동하게 해준다. 씬 뷰에서 직접 연결 위치와 폭을 설정하면 된다. NavMeshModifier는 차일드된 여러 객체에 동시적으로 특정 내비메시 속성을 부여하는 기능이다.

 

17.jpg


18.jpg


내비메시를 굽다 보면 하나의 메시에서 에이전트마다 다른 속성을 요할 때가 있다. 어떤 좁은 통로를 만났을 때 날씬한 주인공은 통과하지만 거대한 적은 뒤쫓지 못하는 상황이 그러하다. 이때는 각 에이전트의 크기를 달리 설정하고 각각 NavMeshSurface 컴포넌트를 추가하여 구우면 된다. 구워진 내비메시는 서로 다른 색상으로 표기되므로 이동 가능 여부를 확인하기 쉽다.

 

19.jpg


20.jpg


확장 내비게이션의 가장 획기적인 기능은 Baking API다. 오픈월드처럼 지나치게 넓거나 동적 생성되는 무한 던전 같은 맵은 내비메시 설정이 매우 고단할 수밖에 없는데, Baking API는 실시간으로 내비메시를 생성해준다. 이를 통해 1인 혹은 소규모 개발자라도 보다 큰 규모의 내비게이션 활동이 가능하고 작업 능률을 크게 높일 수 있을 것이다.

 

21.jpg


아티스트를 위한 비주얼 이펙트 그래프

 

두 번째 강연은 마둠파 테크니컬 아트 연구소 대표인 박동민 마스터가 ‘아티스트를 위한 비주얼 이펙트 그래프’를 들고 나왔다. 유니티의 새로운 파티클 시스템인 비주얼 이펙트 그래프는 컴퓨트 셰이더 기반의 막강한 이펙트 제작 도구이나 아티스트가 처음 시작하기에 다소 여려움이 있다. 이에 비주얼 이펙트 그래프(VFX Graph)를 아티스트의 언어로 쉽게 풀이했다.


1.jpg


VFX Graph는 컴퓨트 셰이더 기반의 GPU 파티클 도구로서, GPU가 지닌 강력한 병렬 파워를 이용하여 수백만 개의 파티클을 뿌릴 수 있다. OPENGL ES3.1 이상부터는 모바일에서도 사용 가능하다. 기본 방식으로도 비슷한 연출을 기대할 수는 있지만 VFX Graph는 계산을 넣어 더 많은 파이클을 사용할 수 있는 툴이라는 점에서 차별화된다.

 

2.jpg

 

3.jpg


GPU는 주로 화면에 그리는 것을 담당하는 장치인데, 이 엄청난 병렬 계산 능력을 활용하기 위해선은 셰이더 언어로 접근해야 한다. 이것이 컴퓨트(Compute, 계산) 셰이더다. 고정 파이프라인대로 화면에 그리는 버텍스/픽셀 셰이더를 이용하지 않고, 오로지 GPU의 계산 능력만을 이용하는 것이다. 컴퓨트 셰이더를 이용하려면 커널, 스레드, 그룹이라는 곳에 데이터를 적절하게 넣는 작업이 필요하므로 아티스트에게는 난이도가 높다. 그런데 VFX Graph가 이 모든 작업을 다 알아서 해주므로 아티스트는 노드만 짜면 되는 것이다.

 

4.jpg


그렇다면 기존 툴인 Shuriken과 비교하면 어떨까? 일단 VFX Graph 컴퓨트 셰이더를 활용하기 때문에 다소 무거운 계산도 빠르게 처리할 수 있다. Shuriken에선 부담스럽던 Noise, Light, Collider 모듈 등도 무리없이 돌아간다. 또한 수학 공식을 이용하여 제네레이티브한 움직임을 만들어 낼 수 있는데, 운 예로는 포지션값에 sin() 등을 사용할 수 있다. 이외에도 다양한 속성값을 이용한 계산은 물론 벡터 필드, 포인트 캐시 이용이 가능하고 각종 공간 변환(행렬)도 쓸 수 있다. 전체적으로 변수 제어가 용이하기도 하다.

 

5.jpg


VFX Graph의 기본적인 구성은 네 가지 상/하 블록에 파티클 값을 넣는 것이다. 여기에 좌/우 노드를 추가하여 특정 값이 아닌 계산에 의한 값을 삽입할 수도 있고, 변수를 추가하여 외부에서 제어하는 것도 가능하다. 이때 생성하는 개체를 일반적으로 Emitter라고 하고 생성된 개체를 일반적으로 Particle이라고 칭한다.

 

6.jpg


Emitter에게 필요한 정보는 다음과 같다. 몇 초 동안 Emission을 해야 할지(Duration), 몇 번 반복해야 할지(Loop), 얼마나 자주 생성시킬지(Spawn Rate – Emission), 최대 파티클 수는 얼마일지(Capacity – Max Particles), 몇 초 동안 살아있어야 할지(Lifetime), 어떤 곳에서 파티클을 생성시켜야 할지(Position), 어떤 방향으로 보낼지. 어떤 힘으로 보낼지(Velocity - Speed), 생성될 때 크기는 어떨지(Scale - Size), 회전값은 어떨지(Angle - Rotate), 처음 컬러는 어떨지(Color).

 

7.jpg


Particle에게는 기본적으로 Emitter가 넘겨준 값(attribute)가 전부 들어와 있는 상태다. 따라서 이 값들을 어떻게 변형할지 정해야 한다. 그리고 총 라이프 타임 대비 얼마나 살아왔는지(Age - OverLifeTime), 어떤 힘을 받아 움직일지(Force), 어떤 충돌을 적용할지(Collision), 어디를 향하고 있어야 할지(Orient), 어떻게 렌더링 되어야 할지(Output - Renderer)가 중요하다.

 

8.jpg


이제 다시금 VFX Graph의 네 가지 블록으로 돌아가자. 각 블록은 Spawn, Initialize, Update, Output이며 Emitter가 하는 일이 Spawn, Initialize 그리고 Particle이 하는 일은 Update, Output이다. Spawn은 생성과 관련된 값으로 Emitter’만’ 알면 된다. 반면 Initialize는 여러 속성값으로 Particle’도’ 알아야 한다.

 

9.jpg


10.jpg


네 가지 블록 중 가장 간단한 것은 Spawn이다. Loop와 Delay를 넣을 수 있으며 Event로 시작과 끝도 설정 가능하다. Spawn Rate에 변수를 만들고 Periodic(주기적) Burst 노드를 사용할 수 있다. 또한 Initialize는 여러 속성값을 붙일 수 있고 Bound 설정이 가능하다. Position(Sphere)를 붙여보자.

 

11.jpg

 

12.jpg


다음은 Get과 Set이다. 프로그래밍할 때 주로 쓰이는 단어로 아티스트에게는 생소할 수 있다. 간단하게 Get은 (주로 속성값을)가져오는 것이며 Set은 해당 값을 넣어주는 것이다. Add, Multiply, Blend 노드를 사용하는 이유는 해당 Attribute를 Get하지 않아도 되기 때문이며 Add, Multiply, Blend를 적용하면 노드 이름이 바뀐다. 주로 Initialize에서 Set을 사용하고 Update에서 Initialize에서 Set한 값을 Get으로 가져온다

 

13.jpg


주로 쓰이는 속성값(attribute)으로 한 프레임 전 위치(OldPosition), 현재 위치(Position), 방출하는 힘(Velocity), 방출되는 방향(Direction), 라이프타임 대비 얼마나 진행되었는지(Age), SubUV를 제어할 수 있는 Index 값(TexIndex), 생성된 순서대로 인덱스 값이 주어짐(Particle ID), 로컬 축(axisX,Y,Z), 살아있는지 소멸했는지(Alive), Line의 목표 지점(TargetPosition), 회전각(Angle - Rotation), 회전하려는 힘(Angular Velocity) 등을 알아두자.

 

14.jpg


이때 방출하는 힘(Velocity)가 Vector3임을 아는 것이 매우 중요한데, Vector3가 유니티에서만 사용하는 자료 형태기 때문이다. Float3처럼 float 세 개를 가지고 있으나 이것이 벡터임을 명시한다. 각 3축으로 향하는 값을 알고 있으면 방출하는 방향과 힘을 알 수 있다. 즉 Velocity를 알고 있으면 이전 위치, 다음 위치를 얻을 수 있다. 이전 위치 = Position - (Velocity / FrameRate), 다음 위치 = Position + (Velocity / FrameRate). 운동 방향을 계산할 수 있다는 것은 곧 아티스트의 ‘의도‘대로 움직이게 할 수 있다는 것이다.

 

15.jpg


Update 블록은 문자 그대로 매 프레임 업데이트되는 블록이다. 여기서 Set을 한다면 Initialize값이 의미가 없어진다. Initialize된 어트리뷰트를 Get을 통해 불러올 수 있다. 포지션 값을 받아와 컬러에 적용하거나 안쪽으로 모이는 힘(Force)를 만들고, 커브 샘플링은 물론 터뷸런스도 사용해볼 수 있다. 난류의 강도(Intensity)와 저항(Drag), 파장(Frequency), 거칠게 흩어지는 정도(Roughness), 프랙탈이 공간을 채우는 간격(Lacunarity) 등을 직접 설정할 수 있다. 노이드 노드를 활용하여 효과를 줄 경우 Random Number와 달리 연속성 있는 무작위 값을 출력해준다.

 

16.jpg


17.jpg


18.jpg


19.jpg

 

20.jpg


21.jpg


Output 블록은 기본으로 Quad Output이지만 변경할 수 있다. Lit이 들어간 Output은 빛을 받을 수 있다. Blend가 기본으로 Alpha이기 때문에 Lit으로 변경하려면 Opaque으로 변경한 후 해야 하며 Orient도 매우 중요하다. Shader Graph는 물론이고 Shuriken에서 하던 Over Life를 여기서 사용할 수 있다. 플립북(Sub UV) 역시 마찬가지다.

 

22.jpg


이들 네 가지 상/하 블록에 좌/우 노드를 추가하면 Shuriken에선 할 수 없던 연출이 가능해진다. cos(x)와 sin(y)를 더하면 원운동을 하고 X, Y, Z 값을 각각 다르게 움직이게 하면 위글러가 된다. 계산으로 구한 특정 값을 HSV 중 H에 넣어서 Hue 바리에이션을 만들고 S와 V는 주로 1 근처의 값을 사용하자. Hue는 Fraction과 함께 사용하면 자연스럽게 루핑이 되며, 다채로운 색을 표현하기에 좋다. Particle ID를 Position.X에 연결하고 특정 변수를 넘어가면 Y값에 1을 더하길 반복함으로써 아주 독특한 효과를 내기도 한다.

 

23.jpg

 

24.jpg


25.jpg


좌/우 노드를 통한 응용법 가운데 볼륨 렌더링은 미리 벡터 필드를 구해와야 한다. SDF(Signed Distance Field)와 DGF(Distance Gradient Field) 필요한데 후디니에서 쉽게 생성 가능하다. SDF에서 Signed는 음수와 양수를 모두 표현할 수 있다는 뜻이다. 즉 특정 볼륨의 SDF는 정확하게 동일할 때 0이고 바깥으로 갈수록 양수가, 안쪽으로 갈수록 음수가 증가한다. 특정 볼륨으로부터의 거리를 VectorField화 했다고 이해하면 된다.

 

26.jpg


27.jpg


SDF가 모양이라면 DGF는 방향이다. 방향을 얻는다면 아티스트가 할 수 있는 작업이 매우 많아진다. 업벡터와의 외적을 이용하여 마치 탄젠트처럼 표면을 따라 움직이게 하는 것도 가능하다. DGF는 Update에서 볼륨의 형태 부분에 특정 힘을 가하는 방식으로 Negative가 있으면 안쪽, 없으면 바깥쪽으로 작용한다.


28.jpg


29.jpg


유니티 머신러닝 에이전트


세 번째 강연은 한양대학교 미래자동차공학과 연구원인 민규식 마스터가 ‘유니티 머신러닝 에이전트’에 대해 소개했다. 다양한 AI 프로그램과 앱, 게임 등을 개발할 수 있는 SDK ‘유니티 머신러닝 에이전트’는 물론 머신러닝의 학습 방법 중 하나인 강화 학습에 대해서도 아울러 알아보는 시간을 가졌다.


1.jpg


인공지능(Artificial Intelligence)이란 인간의 학습, 추론, 지각 능력과 자연 언어의 이해 능력 등을 컴퓨터 프로그램으로 실현한 것이다. 머신러닝(Machine Learning)은 인공지능 연구 분야 중 하나로, 인간의 학습 능력과 같은 기능을 컴퓨터에서 실연하고자 하는 기술이다. 여기서 한 발 더 나아간 딥러닝(Deep Learing)은 다층 구조 형태의 신경망을 기반으로 하는 머신러닝의 한 분야로서 다양한 데이터로부터 높은 수준의 추상화 모델을 구축하고자 하는 기법이다.

 

2.jpg


당초 간단한 벽돌 깨기나 플레이하는 수준에 머물던 AI는 점차 발전하여 2016년 ‘구글 딥마인드 챌린지 매치’를 통해 일약 스타덤에 올랐다. 당시 이세돌 九단과 겨룬 알파고는 인간이 바둑을 둔 기보를 기반으로 학습하였지만 이후 기본 규칙만 가지고 AI끼리 대국하며 발전해가는 알파고 제로(AlphaGo Zero)까지 나왔다. 바둑을 제패한 구글 딥마인드는 ‘스타크래프트 2’에서 알파스타(AlpahStar)로 그랜드마스터를 따거나 CASP(단백질 구조 예측 학술대회)에서 알파폴드(AlphaFold)로 첫 출전만에 1등을 차지하기도 했다.

 

3.jpg


4.jpg


5.jpg


6.jpg


현 시점에서도 AI는 이미 여러 마술 같은 결과물을 내고 있다. 사진을 보고 그 상황을 글로 설명하며, 무엇을 보고 그렇게 판단했는지도 표시해준다. 짧은 문장을 줬을 때 이를 기반으로 장황하고 꽤나 설득력 있는 가짜 뉴스를 써내는 알고리즘도 있다. 그냥 조랑말을 얼룩말로 바꾸고 사진을 특정 화풍으로 꾸미거나 조악한 그림을 실사처럼 바꿔 주기도 한다. 실존하지 않는 사람의 얼굴을 아주 그럴듯하게 표현하는가 하면 Face landmarks 데이터를 통해 정지된 사진에서 표정을 만들어낸다. 이를 응용하면 모나리지가 수다 떠는 모습도 감상할 수 있다.

 

7.jpg


8.jpg


9.jpg


10.jpg


그렇다면 유니티는 AI를 위해 어떤 기능을 제공할까? 먼저 2017년 9월 출시된 ML(Machine Learning) Agents를 살펴보자. 머신러닝에서 주로 쓰이는 방법으로 강화 학습(Reinforcement Learning)이 있는데, 보상을 통해 AI가 여러 시행 착오 속에서 최적의 방법을 익히도록 유도하는 것이다. 가령 ‘슈퍼 마리오 브라더스’를 플레이하는 AI를 강화 학습시킨다면 마리오가 에이전트고 금화가 보상이라 할 수 있다.

 

11.jpg


12.jpg


이러한 강화 학습 환경은 ‘아타리’부터 ‘GTA 5’까지 꽤 많은 것들이 무상으로 공개되어 있지만, 이를 공유 받은 작업자가 자신의 프로젝트에 맞춰 수정하기는 매우 어려운 실정이다. 만약 아예 필요한 환경이 존재치 않는다면 문제는 더욱 커진다. 그렇다고 개인 혹은 소규모 조직이 직접 강화 학습을 위한 환경을 구축하기란 여간 어려운 일이 아니고. 바로 여기서 유니티 ML Agents가 활약하는 것이다.

 

13.jpg


14.jpg


ML Agents는 하나의 AI를 학습하는 Single Agent부터 복수의 AI가 투입되는 Multi Agent, 복수의 AI가 나뉘어 경쟁하는 Adversarial Agent, 그리고 특정 인물의 행동을 모방하는 Imitation Learning을 모두 지원한다. Single Agent의 대표적인 예시는 자율주행 AI로, 혼자서 전후좌우 위험 요소와 차량간 거리 등을 고려하며 나아가게 된다. Multi Agent는 술래잡기 AI가 있는데, 흥미롭게도 한 명은 술래를 곧장 쫓고 나머지는 길목을 지키는 경향을 보인다고. 끝으로 Imitation Learning는 특정 행위를 ‘잘’ 수행하기보다 ‘똑같이’ 수행하는데 중점을 두기 때문에 AI가 게임을 못한다면 그건 데이터를 입력한 연구자가 게임을 못하기 때문이다.

 

16.jpg


17.jpg


아직 BETA 단계인 프로그램으로 Unity Simulation도 주목할 만하다. 아직까지 제공되는 기능은 극히 미비하지만 앞으로는 실감나는 강화 학습 환경과 구글 클라우드를 통한 강력한 하드웨어(GPU) 지원, 마찬가지로 클라우드를 통한 여러 환경에서의 동시 학습이 가능해질 전망이다. 즉 다량의 데이터 취득 및 학습이 보다 신속히 이루어질 것이며 시뮬레이션을 통한 하드웨어 테스트도 매우 빨라질 것이다. 이는 게임 최적화에도 적용 가능하다. 향후 ML Agents와 연계도 기대되는 부분이다.


19.jpg


20.jpg

 

21.jpg


김영훈 기자   grazzy@ruliweb.com




관련게임정보 목록

관련 정보

기     종

PC/아이폰/안드로이드/PS4/XBOX ONE

발 매 일

장     르

가     격

제 작 사

기     타



댓글

목록보기

댓글 | 23
1


(4813450)

183.98.***.***

BEST
댓글 이미지 입니다. 이미지를 보려면 여기를 눌러주세요.
19.12.04 09:34
(4086)

211.34.***.***

BEST
회전 속도는 저 8.0f 를 조절 해서 하는거고 클라이언트 성능에 따라 결과값이 다르지 않으려고 Time.delta를 곱한거겠죠 문제 없어보입니다
19.12.04 15:06
(5198119)

175.119.***.***

BEST
무슨 얘기를 하려는지 의도는 알겠는데요. 우선, SmoothDampAngle()가 속도를 고려해서 계산하기 때문에 Slerp()보다 좀 더 정확한 값을 얻는다는 건 인정합니다. 하지만, 알려주신 링크에서는 SmoothDampAngle()를 사용하고 있지는 않기 때문에 님 주장에 대한 근거가 되지 않고요. 게다가, 프레임이 극단적으로 낮아지는 상황에서는 SmoothDampAngle()도 적용되는 인자의 속도(velocity)에 시간(smooth)을 곱해서 계산하기 때문에 각도가 확 바뀌는 문제가 해결되지는 않습니다. 즉, 프레임이 극단적으로 낮아지는 상황에서는 SmoothDampAngle()나 Slerp()나 결과는 비슷하다는 거죠. 그러니까 결과가 어차피 비슷하게 나온다면, 저런 발표회장에서는 발표를 하는 상황에서는 좀 더 직관적이고 인자가 적은 Slerp()로 설명하는게 나은 선택이라고 생각합니다.
19.12.04 16:30
(4781152)

104.236.***.***

BEST
닉값을 못하시는데...
19.12.04 13:36
(467450)

211.104.***.***

BEST
생각보다 꽤 전문적이 내용이 있는 기사네요. 이런 기사를 루리웹에서 보니 생소하기도 하고... 이런 글이 자주 올라왔던가? 덕분에 행사 가지도 못했는데, 좋은 정보 배워가네요.
19.12.04 16:48
(4813450)

183.98.***.***

BEST
댓글 이미지 입니다. 이미지를 보려면 여기를 눌러주세요.
19.12.04 09:34
댓글 이미지 입니다. 이미지를 보려면 여기를 눌러주세요.
유니티 마스터들조차 이런 잘못된 코드를 쓰는군요...ㅎㄷㄷ
19.12.04 10:50
(4842444)

221.149.***.***

가장유게이다운유게이
제가 잘 몰라서 그러는데 어떤게 잘못된 건가요? | 19.12.04 11:06 | | |
몽매
https://docs.unity3d.com/sc__riptReference/Mathf.SmoothDampAngle.html 요걸쓰는게 맞습니다.... 뭐 동작자체는 그럴듯하게 될겁니다만 기획자의 의도를 살릴수없고(회전속도를 2배 빠르게 해주세요 같은거에 대응불가능) 각각 클라이언트에 성능에 따라서 회전결과가 달라집니다. | 19.12.04 11:08 | | |
몽매
다소 극단적인 예를 들자면 성능이 안좋아 8프레임 이하로 나오는 기계에서는 회전자체가 안보일겁니다. | 19.12.04 11:13 | | |
(4781152)

104.236.***.***

BEST
가장유게이다운유게이
닉값을 못하시는데... | 19.12.04 13:36 | | |
(4086)

211.34.***.***

BEST
가장유게이다운유게이
회전 속도는 저 8.0f 를 조절 해서 하는거고 클라이언트 성능에 따라 결과값이 다르지 않으려고 Time.delta를 곱한거겠죠 문제 없어보입니다 | 19.12.04 15:06 | | |
(5198119)

175.119.***.***

가장유게이다운유게이
글쎄요. Slerp()를 쓰던 SmoothDampAngle()를 쓰던 그건 취향 차이죠. 별 문제 없어 보이는데요. 그리고, 회전속도를 높이고 싶으면 Slerp()의 3번째 인자값을 높이면 되는데요. 프레임이 낮다면, 거기에 맞춰서 3번째 인자에 곱하는 상수를 조정하면 되죠. | 19.12.04 15:54 | | |
Sky Knight
취향차이라기엔 저건 정말로 유명한 나쁜코드중에 하나라서요... Slerp(A,B,t) 를 설명하면 A방향과 B방향을 나타내는 쿼터니언값을 t가 0에서 1으로 변할때 A와 B로 변하는 값을 곡면에 따라 보간해주는 함수입니다. t가 0이면 A, 1이면 B를 리턴하는 거죠. 0.5면 A방향과 B방향의 중간값쯤을 리턴하구요. Time.delta 값이 뭐 고정프레임으로 100FPS라고 가정하면 대충 0.01값이 되는데 처음 넣은 값을 A0,라고 가정하고 첫번째 프레임에서 계산을 하면 A1 = Slerp(A0,B,0.08); A1를 말로 풀어서 설명하면 A0방향과 B방향사이의 8%지점입니다. A2는 A1과 B의 8%지점 . . . 이런식으로 방향이 B바향으로 수렴하게 됩니다. 근데 만약에 극단적으로 8FPS이라고하면 Time.deltaTime * 8 = 1 A1 = Slerp(A0,B,1)이 되서 첫번째 프레임에서 A1 = B가 되어버리죠. 뭐, 안에 내용은 차치하고 이미 프레임에따라 결과가 달라졌으니 나쁜코드라는 겁니다. | 19.12.04 16:01 | | |
가장유게이다운유게이
https://answers.unity.com/questions/14288/can-someone-explain-how-using-timedeltatime-as-t-i.html 더 설명하긴 귀찮으니 개발자라면 알아서 구글링해서 더 알아보시길 | 19.12.04 16:04 | | |
(5198119)

175.119.***.***

BEST
가장유게이다운유게이
무슨 얘기를 하려는지 의도는 알겠는데요. 우선, SmoothDampAngle()가 속도를 고려해서 계산하기 때문에 Slerp()보다 좀 더 정확한 값을 얻는다는 건 인정합니다. 하지만, 알려주신 링크에서는 SmoothDampAngle()를 사용하고 있지는 않기 때문에 님 주장에 대한 근거가 되지 않고요. 게다가, 프레임이 극단적으로 낮아지는 상황에서는 SmoothDampAngle()도 적용되는 인자의 속도(velocity)에 시간(smooth)을 곱해서 계산하기 때문에 각도가 확 바뀌는 문제가 해결되지는 않습니다. 즉, 프레임이 극단적으로 낮아지는 상황에서는 SmoothDampAngle()나 Slerp()나 결과는 비슷하다는 거죠. 그러니까 결과가 어차피 비슷하게 나온다면, 저런 발표회장에서는 발표를 하는 상황에서는 좀 더 직관적이고 인자가 적은 Slerp()로 설명하는게 나은 선택이라고 생각합니다. | 19.12.04 16:30 | | |
Sky Knight
아니 요점은 Slerp의 세번쨰 인자값에는 비율값인 0에서1값을 넣어야 되는 상황에서 속도(m/s)나 시간(s)이라는 이상한 값을 넣어서 잘못된 코드라는걸 설명한건데 뭐 이상한 소릴하고 있어요... | 19.12.04 16:56 | | |
(5198119)

175.119.***.***

가장유게이다운유게이
Slerp()에 비율을 넣어야 한다는 걸 모르는 사람이 어디 있습니까? 검색 한번만 해보면 다 아는 내용인데, 그걸 모르고 저러겠습니까? ㅡㅡ;;;;; 다만 저런 발표회장에서는 발표를 할 때는 직관적이고 간단한 함수로 의미를 전달하는 게 중요하다는 거죠. 님은 발표라는 특수성으로 고려 안하시고 비판을 하시는 거 같습니다. | 19.12.04 17:16 | | |
Sky Knight
아니 저게 그러니까 Time.delta값을 곱해서 기계간에 다른 프레임들간에 보정이 되는 코드에요? 틀린 코드를 오피셜 강의에서 내보내는게 안좋다는건데 어이없다는 듯이 말하는게 참;; 차라리 회전 속도값에 거리 차이만큼 보정해서 돌리는 코드면 또 모르겠는데 그렇게 해도 한줄에 더 직관적인 코드가 될텐데 왜 구지 틀린 코드를 쉴드 치는지 모르겠네요; | 19.12.04 17:27 | | |
Sky Knight
이펙트나 뭐 게임로직에 상관없는 상황에서 쓰면 모르겠는데 AI코드에 저걸 쓴다??? 진짜 하..; | 19.12.04 17:28 | | |
(3331572)

123.212.***.***

가장유게이다운유게이
이 부분은 Sky Knight님과 유게이님 두분의 의견 모두 맞다고 봅니다. 전 유게이님쪽 스타일에 가까운 편인데(사소하더라도 디테일이 중요) 강의 하시는 지인분 중에는 Sky님처럼 초급자를 대상으로 할 시 사소한 디테일보다는 비전공 초보자도 이해하기 쉽도록 직관성과 진행을 더 중요시하시는분이 계십니다. 받아들이는 학생 입장에서도 어느 스타일이 좋냐에 케바케가 갈리고요. 말 그대로 케바케 문제이기 때문에 두분 다 맞다고 봅니다. | 19.12.05 16:22 | | |
(711588)

97.65.***.***

Muramasa666
최소한 어떤 문제에 관한 토론 태도 부분에서 유게이분은 글러먹은걸로 보이내요 | 19.12.06 03:57 | | |
(467450)

211.104.***.***

BEST
생각보다 꽤 전문적이 내용이 있는 기사네요. 이런 기사를 루리웹에서 보니 생소하기도 하고... 이런 글이 자주 올라왔던가? 덕분에 행사 가지도 못했는데, 좋은 정보 배워가네요.
19.12.04 16:48
(5020647)

1.11.***.***

전문적인 프로그래밍 코딩 얘기인데
19.12.04 17:06
(379374)

116.40.***.***

마돔파씨 응원합니다!!!
19.12.04 21:30
중요한 내용이다 ㅇㄷ
19.12.05 00:58
(64666)

220.78.***.***

사랑해요 마덤파!! 제일 잘생겼다!!
19.12.05 21:03
(945804)

223.39.***.***

유요한 내용일 듯 하여 와드 박아둡니다
19.12.09 14:32


1


댓글은 로그인 후 이용 가능합니다.


목록보기
BEST 뉴스

PC/온라인
비디오/콘솔
모바일
PC/온라인
비디오/콘솔
모바일
PC/온라인
비디오/콘솔
모바일
BEST 게시글

게임
애니/책
갤러리
커뮤니티
게임
애니/책
갤러리
커뮤니티
게임
애니/책
갤러리
커뮤니티
게임
애니/책
갤러리
커뮤니티
BEST 유저정보
콘솔
PC
모바일
취미


X