개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 유니티 에디터에 붙여진 버전 넘버링의 의미와 LTS에 대해서 알아봅시다!

 

타임라인

0:00 인트로

0:10 어느 버전의 유니티를?

1:10 유니티 버전과 시맨틱 버전 분류법

3:59 LTS

5:21 아웃트로

 

# 참고자료

유의적 버전 2.0.0-ko2 - https://semver.org/lang/ko/

[인터뷰] 유니티 코리아 "엔진의 핵심 가치 '게임' 놓치지 않겠다” - https://www.inven.co.kr/webzine/news/?news=233326

 

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번 영상에서는 유니티 엔진의 버전과 LTS라는 용어에 대해서 알아보도록 하겠습니다.

어느 버전의 유니티를?

우리는 유니티 엔진을 처음 배울 때 어떤 버전의 유니티를 설치해야 하는지 고민에 빠지게 됩니다.

먼저 유니티 허브에서 유니티 에디터를 설치하려고 해도 2018, 2019, 2020에 2021버전까지 있습니다.

그리고 사전 릴리즈 탭을 보면 2022 버전도 있죠.

거기에 유니티 홈페이지의 다운로드 아카이브에 가보면 각 연도별 버전마다 또 무수히 많은 세부 버전의 설치 파일들이 가득합니다.

그리고 버전 넘버링이 연도로 바뀌기 전의 3, 4, 5버전까지 있죠.

물론 이렇게 과거의 버전들이 제공되는 이유는 이전 버전의 유니티로 만들어진 프로젝트들을 지원하기 위한 것입니다.

오래된 버전의 유니티 엔진으로 만들어진 프로젝트를 정상적으로 열고 작업하기 위해서는 버전에 맞는 엔진을 설치해야 합니다.

하지만 새로운 프로젝트를 만들려는 사람은 가급적이면 최신 버전이며 안정적인 버전의 유니티 엔진을 다운로드 받아야 합니다.

그래야 최신으로 제공되는 기능과 가장 나은 비주얼로 안정적인 게임 개발이 가능하기 때문이죠.

유니티 버전과 시맨틱 버전 분류법

그럼 잠시 유니티 버전 숫자를 보도록 하겠습니다.

유니티의 다운로드 아카이브를 보면 초기에는 3, 4, 5와 같은 숫자를 사용했고 5 버전 후로는 2017과 같이 연도를 메인 버전 넘버로 사용했습니다.

유니티 3 다음에 4가 나오는데 1년, 유니티 4 다음에 5가 나오는데 3년 정도가 걸린 것을 보면 2017년 이후로는 매년 새로운 기능과 성능 향상으로 게임 엔진 계의 대격변을 일으키겠다는 포부가 엿보이는 것을 알 수 있습니다.

실제로도 2017 이후 버전들은 연도 버전이 바뀔 때마다 상당한 수준의 기능과 성능 개선이 있었습니다.

하지만 숫자 넘버에서 연도 넘버로 바뀐 것을 제외하고 보면 이 버전 넘버링에는 한 가지 공통점이 있습니다.

3.5.7 / 4.7.2 / 5.6.7 / 2017.4.40 / 2018.4.36 / 2019.4.34 / 2020.3.25 / 2021.2.7

어떤 공통점인지 알아채셨나요?

네, 맞습니다.

모든 버전 숫자가 3개로 나열되죠.

이런 방식으로 3개의 숫자로 버전을 표시하는 방식을 시맨틱 버전 분류법, 번역하면 유의적 버전 분류법이라고 합니다.

이 3개의 숫자 중에 첫 번째 숫자를 메이저(Major) 버전이라고 하고 이전 버전과 호환이 되지 않게 기능이 바뀌거나 추가되면 변경되는 숫자입니다.

두 번째 숫자는 마이너(Minor) 버전이라고 하고 이전 버전과 호환되면서 새로운 기능이 추가되면 변경되는 숫자입니다.

그리고 세 번째 숫자는 패치(Patch) 버전이라고 하고 이전 버전과 호환되면서 버그를 수정한 것이라면 변경되는 숫자입니다.

최신 버전의 유니티 엔진은 메이저 버전을 연도로 표시합니다.

이 부분은 앞에서 이야기 했듯이 유니티 측에서 매년 새로운 혁신을 이루어 내겠다는 포부로 볼 수 있지만, 약간의 문제는 업데이트 일정이 조금씩 밀리면서 연도 버전과 실제 연도가 일치하지 않는 경우가 현재 발생하고 있습니다.

이 버전 불일치 문제는 유니티 측에서도 인지하고 있고, 업데이트 일정을 조절해서 맞출 예정이라고 합니다.

그리고 두 번째 숫자인 마이너 버전은 유니티 5까지는 일관성이 없었지만 2017~2019까지는 1~4 사이의 숫자를 사용했습니다.

이 마이너 버전 1은 아직 에디터가 안정화되지 않은 베타 버전으로 안정화 단계에 따라서 버전이 올라가고 가장 안정화된 상태에서 장기 지원을 하는 버전에 버전 넘버 4를 붙여줍니다.

그리고 2020 버전이 이후에는 연도와 버전 넘버의 불일치를 되돌리기 위해 1~3까지만 버전 넘버를 사용하여 버전 넘버 3을 장기 지원 버전으로 하도록 변경했습니다.

그리고 마지막 패치 버전은 유니티 에디터에 자잘한 버그를 수정할 때마다 계속해서 올라가도록 되어 있습니다.

이런 버전 분류 방식으로 인해서 게임 개발 중인 유니티 프로젝트의 에디터 버전을 올릴 때는가급적이면 패치 버전과 마이너 버전까지만 올리도록 하고 메이저 버전을 바꿔야 한다면 프로젝트를 반드시 백업한 뒤에 버전을 올려서 문제가 없는지 확인해야 합니다.

LTS

그 다음으로 살펴볼 부분은 LTS입니다.

유니티 허브에서 다른 버전의 에디터를 설치하기 위해서 에디터 설치 버튼을 눌러보면 2020.3, 2019.4, 2018.4 버전 뒤에 LTS 라는 약자가 붙어있습니다.

버전 뒤에 붙어있는 이 LTS는 Long Term Support의 약자로 우리 말로는 장기 지원 버전이라고 합니다.

이런 장기 지원 버전은 연도 버전이 바뀐 이후에도 해당 연도의 LTS 버전이 최초로 릴리스된 날짜로부터 2년간 계속해서 매월 업데이트됩니다.

이런 식으로 장기 지원 버전을 만들어서 계속 업데이트를 해주는 이유는 이미 예전 버전의 에디터로 계속해서 진행해오던 프로젝트가 유니티 에디터의 바뀐 메이저 버전을 따라 무작정 버전을 올리면 어떤 문제가 발생할지 알 수 없기 때문에 이전 버전으로 개발하는 개발자들이 최대한 안정적으로 개발을 이어나갈 수 있게 하기 위해서 입니다.

그리고 유니티 엔진은 끊임없이 업데이트되는데, 버전 넘버링 중에 가장 앞자리인 연도 버전이 바뀔 때마다 유니티는 가장 많은 변화를 겪게 됩니다.

하지만 이 연도 버전이 처음 나온 시점인 1버전이나 2버전에서는 새로운 기능이 대거 들어와서 엔진이 조금 불안정한 상태가 됩니다.

그래서 새로운 연도 넘버링의 엔진은 곧바로 게임 개발에 사용하는 것보다는 새 버전의 엔진에 들어오는 기능을 테스트 해보는 용도로 사용하는 것이 좋습니다.

그리고 정식으로 게임을 개발할 때는 가장 최신의 LTS 버전인 에디터를 설치해서 개발하는 것을 추천합니다.

아웃트로

이번 영상에서는 유니티의 버전 넘버링과 LTS에 대해서 알아보았습니다.

이 강좌는 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 유니티 애니메이션 시스템의 기본이 되는 애니메이션 클립에 대해서 알아보도록 하겠습니다.

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:16 애니메이션 클립

1:05 외부프로그램에서 만든 애니메이션

2:26 유니티 에디터에 만든 애니메이션

6:04 아웃트로

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 유니티 애니메이션 클립에 대해서 알아보도록 하겠습니다.

본격적인 강좌에 들어가기 전에 필요한 리소스들을 영상 하단의 링크에서 다운로드받아서 임포트합니다.

애니메이션 클립

이제 지난 애니메이션 개요 강좌에서 가볍게 이야기 했던 애니메이션 클립에 대한 이야기를 복습하면서 좀 더 자세히 알아보도록 하겠습니다.

지난 강좌에서 이야기 했듯이 애니메이션 클립은 애니메이션의 가장 기본적인 단위이며 오브젝트가 어떻게 움직여야 하는지에 대한 정보들이 포함되어 있는 것입니다.

그리고 이 애니메이션 클립을 만드는 방법으로는 크게 두 가지가 있습니다.

외부에서 만들어서 임포트한 애니메이션

첫 번째 방식은 3ds MAX나 Maya, 블랜더 같은 외부 프로그램으로 애니메이션을 만들어서 임포트하는 방식입니다.

이렇게 외부 프로그램에서 애니메이션을 만들어서 임포트하는 방식은 보통 3D 프로그램으로 만들어진 3D 모델의 애니메이션을 만들고자 할 때 주로 사용합니다.

외부 프로그램에서 전문 툴을 사용해서 만드는 애니메이션이니만큼 유니티의 기능만으로 만드는 애니메이션에 비해서 좀 더 복잡한 애니메이션을 만들 수 있습니다.

임포트된 FBX 파일은 프로젝트 뷰에서 이렇게 박스 모양 아이콘의 에셋으로 보이게 됩니다.

이 FBX 에셋을 선택해보면 인스펙터 뷰에서 Model, Rig, Animation, Materials 탭을 볼 수 있습니다.

이 중에서 Animation 탭을 선택해보면 이 FBX 파일이 가지고 있는 애니메이션에 대한 정보를 볼 수 있습니다.

물론 FBX 파일이 애니메이션을 전혀 포함하고 있지 않다면 이 탭은 활성화되지 않을 겁니다.

여기서 이 애니메이션이 어떤 애니메이션인지 재생해 볼 수 있으며, Loop Time 옵션을 통해 애니메이션이 끝까지 재생된 이 후에 동작을 멈출지 아니면 처음으로 돌아가서 반복 재생할지를 결정할 수 있습니다.

이외에도 애니메이션 이벤트를 추가하는 등의 작업을 할 수도 있습니다.

그리고 3D 팀에서 애니메이션을 넘겨줄 때 애니메이션 동작마다 FBX 파일을 따로 나눠서 주지 않고 한 FBX 파일에 여러 동작을 넣어서 주는 경우가 있습니다.

그럴 때는 여기 Clips에서 [+] 버튼을 눌러서 클립을 추가해주고 해당 애니메이션의 시작 지점과 끝 지점을 나눠주면 됩니다.

그리고 이렇게 나눈 애니메이션의 이름이 헷갈리지 않도록 이름을 설정해줍니다.

이렇게 외부 프로그램에서 만들어서 임포트한 애니메이션은 유니티의 애니메이션 뷰에서 Read Only로 표시되며 보통은 유니티에서 수정하지 못하기 때문에 외부 프로그램에서 다시 수정해서 임포트해야 합니다.

유니티 에디터에서 만든 애니메이션

유니티의 또 다른 애니메이션 클립 방식은 유니티 에디터에서 직접 애니메이션 키를 잡아서 클립을 만드는 것입니다.

유니티 에디터에서 직접 키를 잡아서 애니메이션 클립을 만드는 것은 비교적 간단한 애니메이션이나 UI 애니메이션을 만들고자 할때 사용하는 빈도가 높습니다.

유니티 에디터에서 애니메이션을 만드는 방법은 아주 간단합니다.

먼저 하이어라키 뷰에 우클릭해서 애니메이션을 만들 오브젝트를 하나 생성합니다.

그리고 그 오브젝트를 선택한 상태로 [Ctrl + 6] 단축키를 눌러서 애니메이션 뷰를 열어줍니다.

그러면 아직 애니메이션이 없는 상태이기 때문에 애니메이션 클립과 애니메이터를 만들라는 문구와 함께 Create 버튼이 표시되는 것을 볼 수 있습니다.

여기서 Create 버튼을 누르면 방금 생성한 오브젝트에 대한 애니메이션 클립을 생성할 수 있습니다.

Create 버튼을 누르고 애니메이션 클립을 생성합니다.

그러면 프로젝트 뷰에서 방금 생성한 애니메이션 클립과 이 오브젝트에 대한 애니메이터 컨트롤러가 생성되는 것을 볼 수 있습니다.

애니메이터 컨트롤러는 이 오브젝트가 가진 여러 개의 애니메이션 클립을 관리하고 어떤 상황에 어떤 애니메이션을 재생할 것인지를 결정하는 내용들을 담는 에셋입니다.

이에 대한 자세한 내용은 애니메이터 컨트롤러에 대해서 다루는 강좌에서 이야기하도록하고 지금은 애니메이션 클립에 좀 더 집중해보겠습니다.

애니메이션 클립이 생성된 이후에 애니메이션 뷰를 보면 텅 비어있는 프로퍼티 패널과 애니메이션 타임라인을 볼 수 있습니다.

먼저 애니메이션을 만들기 위해서는 Add Property 버튼을 눌러서 동작을 만들어줄 프로퍼티를 추가해야 합니다.

이 프로퍼티에는 컴포넌트와 관련된 대부분이 추가될 수 있지만 기본적으로는 트랜스폼 컴포넌트에서 크기, 회전, 위치 등을 주로 사용하고, UI인 경우에는 이미지나 색상과 같은 값들을 다룰 수 도 있습니다.

먼저 트랜스폼 컴포넌트에서 Rotation 프로퍼티를 추가해보겠습니다.

그러면 Rotation 프로퍼티가 프로퍼티 목록에 추가되며 타임라인의 0초 지점과 1초 지점에 마름모 꼴의 키가 추가되는 것을 볼 수 있습니다.

이 때 타임라인의 중간을 선택하고 프로퍼티의 값을 변경하면 새로운 키가 추가되는 것을 볼 수 있습니다.

그리고 키를 클릭해서 드래그하면 키의 위치를 옮길 수도 있고 여러 개의 키를 동시에 선택해서 동일 비율로 줄이거나 늘일 수도 있습니다.

이렇게 타임라인에서 키를 옮기면서 값을 입력하는 기본 방식을 Dopesheet라고 하고 애니메이션 뷰 아래 쪽의 버튼에서 다른 방식인 Curves를 선택할 수 있습니다.

Curves 방식에서는 그래프를 보면서 키의 위치를 조절하고 베지어 곡선 각도를 바꾸거나 더블 클릭으로 키를 추가할 수 있습니다.

이 외에도 타임 라인 끝 부분에 [...]으로 표시된 버튼을 눌러서 이 애니메이션이 초당 몇 프레임으로 애니메이션을 재생하게 만들지도 결정할 수 있습니다.

이 애니메이션 프레임 수에 대한 내용은 애니메이션 샘플 레이트 영상에서 확인하실 수 있습니다.

그리고 애니메이션 클립 이름이 적힌 드롭 다운을 클릭하면 이 오브젝트가 가진 애니메이션들을 볼 수 있고 제일 아래의 [Create New Clip] 항목을 선택하면 새로운 애니메이션 클립을 추가할 수 있습니다.

이렇게 유니티에서 만들어진 애니메이션 클립은 프로젝트 뷰에서 이런 아이콘으로 표시됩니다.

이것을 선택해보면 FBX 에셋에 담긴 애니메이션보다는 결정할 수 있는 옵션이 거의 없고 애니메이션의 반복 여부를 설정하는 LoopTime만 있는데 이것은 대부분의 작업을 애니메이션 뷰에서 할 수 있기 때문입니다.

아웃트로

이렇게 외부 프로그램에서 만들어서 임포트하거나 유니티 엔진에서 만든 애니메이션 클립은 애니메이터 컨트롤러를 통해서 하나의 애니메이션 구성을 만드는데 사용하게 됩니다.

이번 영상에서는 유니티 애니메이션 시스템의 기본 구성 요소인 애니메이션 클립에 대해서 알아보았습니다.

이 강좌는 구독자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번 강좌에서는 유니티 엔진에서 시간과 관련된 프로퍼티들을 제공하는 Time 클래스의 주요 프로퍼티에 대해서 알아봅시다. 본 강좌는 이전에 올라온 Time 클래스 관련 강좌를 하나로 묶은 것입니다.

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:11 detaTime

3:03 timeScale

4:37 unscaledDeltaTime

6:10 time

7:27 realtimeSinceStartup

8:53 timeSinceLevelLoad

9:56 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 유니티 엔진에서 시간과 관련된 값들을 제공해주는 Time 클래스의 프로퍼티들에 대해서 알아보겠습니다.

deltaTime

제일 먼저 설명할 프로퍼티는 deltaTime 입니다.

먼저 deltaTime에서 delta는 보통 값의 차이를 의미하는 단어입니다.

시간을 의미하는 Time과 조합해서 생각해보면 deltaTime은 차이가 나는 시간이라는 뜻으로 지난 프레임이 완료되는 데까지 걸린 시간 차이를 의미하며 단위는 초 단위입니다.

한마디로 한 프레임을 진행하는데 걸린 시간이라는 뜻이죠.

그래서 게임을 진행하다가 컴퓨터 사양이나 게임의 최적화 문제로 게임의 프레임이 떨어지는 프레임 드랍 현상이 일어나면 이 deltaTime 값은 한 프레임의 화면을 렌더링하는데 걸리는 시간만큼 커지게 됩니다.

보통 30프레임 기준의 게임에서는 한 프레임당 deltaTime이 0.033정도가 나와야하고 60프레임 기준의 게임에서는 한 프레임당 0.016 정도가 나와야 합니다.

유니티 에디터에서 스크립트를 하나 생성하고 Start 함수에서 Application.targetFrameRate를 30으로 지정한 다음 Update 함수에서 Time.deltaTime을 디버그로 출력시키도록 코드를 작성합니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아가서 아무 게임 오브젝트에나 방금 만든 컴포넌트를 붙이고 게임을 실행해보면 앞에서 말한대로 약 0.033초에 가까운 값이 매 프레임마다 갱신되는 것을 볼 수 있습니다.

그리고 다시 스크립트에서 targetFrameRate를 60으로 변경하고 에디터로 돌아가서 테스트해보면 0.016초에 가깝게 deltaTime 값이 나오는 것을 확인할 수 있습니다.

그럼 이 delta time은 어디에 사용될까요?

그 예시를 보여드리도록 하겠습니다.

먼저 Update 함수에서 W키를 누르면 오브젝트를 이동시키는 코드를 작성해보겠습니다.

이 때 이동 코드에서 캐릭터의 이동 방향과 속도만 이용해서 캐릭터를 이동시키면 문제가 발생하게됩니다.

이 비교 영상처럼 프레임이 10일 때와 60일 때 캐릭터가 다른 속도로 움직이게 되는 겁니다.

이 문제의 원인은 프레임이 10일 때는 1초에 캐릭터를 10번 움직이게 되고, 프레임이 60일 때는 1초에 캐릭터를 60번 움직이기 때문입니다.

좀 더 풀어서 설명해보자면 이 코드에서는 프레임이 10일 때는 1의 속도로 캐릭터를 1초동안 10번 움직이기 때문에 이동한 거리가 10이 되는 것이고, 프레임이 60일 때는 1의 속도로 캐릭터를 1초동안 60번 움직이기 때문에 이동한 거리가 60이 됩니다.

1초 동안 움직인 횟수가 달라서 움직인 거리 역시 달라지는 것이죠.

이것은 컴퓨터의 성능이 오브젝트의 속도에 영향을 미치게 되는 것으로 보통의 게임에서는 발생해서는 안되는 문제입니다.

이 문제를 해결하기 위한 방법이 바로 이 이동 값에 delta time을 곱해주는 겁니다.

이렇게 이동 벡터에 delta time을 곱해주고 나면, 게임이 몇 프레임으로 진행되는지에 전혀 상관없이 오브젝트는 동일한 속도로 움직이게 됩니다.

이런 식으로 이동이나 회전 등 움직임에 있어서 시간의 영향을 받는 기능을 만들 때는 값에 deltaTime을 곱해서 흘러간 프레임 시간만큼만 가중치를 줌으로써 프로세서 속도의 영향에서 자유로워 지게됩니다.

timeScale

그 다음 프로퍼티는 timeScale 입니다.

time scale라는 프로퍼티의 이름을 단순하게 번역해보면 시간의 크기라는 뜻입니다.

이 값을 조절하면 시간이 흐르는 속도를 조절하여 시간이 빠르게 흐르거나 느리게 흐르게 만들 수 있습니다.

C# 스트립트를 하나 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 float 타입으로 timer 변수를 만들어줍니다.

그리고 Update 함수에서 timer 변수에 deltaTime 값을 누적시키며 더하고 그 timer 변수를 이용해서 오브젝트가 Sin 그래프를 따라서 움직이게 만들어 줍니다.

그 아래에는 키보드 화살 키를 눌러서 timeScale를 늘리거나 줄이는 코드를 작성합니다.

그리고 숫자 1을 누르면 timeScale를 1로 만들도록 해줍니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 이동합니다.

에디터로 이동한 다음에는 큐브 오브젝트를 생성하고 방금 만든 컴포넌트를 붙여줍니다.

이제 게임을 플레이시켜 보겠습니다.

게임이 시작되면 큐브가 왕복으로 움직이는 모습을 볼 수 있는데 이때 위쪽 화살표 키를 누르면 time scale이 커지면서 큐브의 움직임이 빨라집니다.

반대로 아래쪽 화살표 키를 누르면 time scale이 작아지면서 큐브의 움직임이 느려집니다.

그러다가 time scale이 0이 되면 움직임이 완전히 멈춥니다.

그리고 숫자 1 키를 누르면 time scale이 1이 되면서 원래의 속도로 움직입니다.

이런 식으로 time scale을 조절해서 슬로우 모션같은 연출을 할 수 있습니다.

unscaledDeltaTime

그 다음 알아볼 프로퍼티는 unscaledDeltaTime입니다.

delta time에 대해서 설명했을 때 이야기한 것처럼 delta time은 게임에서 플레이어의 입력과 게임 처리, 화면 렌더링 등의 작업이 한 번 처리되고 그 결과물이 플레이어의 모니터에 그려지는 한 프레임이 진행되는 시간을 의미합니다.

이 delta time에 unscaled를 붙임으로써 크기가 바뀌지 않은 delta time을 의미하게 됩니다.

time scale의 영향을 받지 않는 delta time인 것이죠.

새 C# 스크립트를 생성하고 앞에서 만든 컴포넌트에서 오브젝트를 이동시키는 코드를 복사해서 Update 함수에 붙여넣어줍니다.

그리고 timer에 더해주는 값을 deltaTime에서 unscaledDeltaTime으로 바꿔줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아갑니다.

그리고 씬에 새로운 3D 오브젝트를 배치하고 거기에 새로 만든 컴포넌트를 붙여줍니다.

그 다음 게임을 플레이시키면 거의 비슷한 속도로 움직이는 두 오브젝트가 보일 겁니다.

이 때 화살표 키를 눌러서 time scale을 조절하면 delta time으로 움직이는 오브젝트의 속도는 time scale의 영향을 받아 느려지거나 빨라지지만, unscaled delta time으로 움직이는 오브젝트의 속도는 전혀 영향을 받지 않고 동일한 속도로 움직이는 것을 볼 수 있습니다.

이런 식으로 어떤 오브젝트의 움직임이 time scale의 영향을 받지 않기를 원할 때는 unscaled delta time을 사용해야 합니다.

time scale과 delta time, unscaled delta time을 적절하게 조합해서 사용하면 특수한 스킬로 적들은 멈춰있거나 느려졌는데 플레이어만 정상적인 속도로 움직이는 기능을 연출할 수 있습니다.

time

그 다음 프로퍼티를 설명하기 전에 씬을 하나 새로 생성합니다.

Time 클래스의 프로퍼티인 time은 게임이 시작된 이후로부터 흐른 시간을 보여주는 프로퍼티입니다.

유니티 에디터에서 새 C# 클래스를 생성하고 스크립트 에디터를 열어줍니다.

비주얼 스튜디오가 열리고 나면 클래스의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 Text 타입으로 측정한 시간을 보여줄 timeText 변수를 선언해줍니다.

그 다음 Update 함수에서는 Time.time 값을 문자열로 만들어서 timeText로 출력하는 코드를 작성합니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아갑니다.

에디터에서는 Hierarchy 뷰에 우클릭해서 [UI > Text] 항목을 선택해서 텍스트 UI를 생성합니다.

그리고 Canvas 게임오브젝트에 방금 만든 컴포넌트를 붙인 뒤 Time Text 프로퍼티에 방금 만든 텍스트 UI를 할당해줍니다.

그 다음 게임을 플레이해보면 게임이 시작된 이후에 흐른 시간이 계속해서 올라가는 모습을 볼 수 있습니다.

realtimeSinceStartup

그 다음에 설명할 프로퍼티는 realtimeSinceStartup입니다.

이 realtimeSinceStartup 역시 time과 같이 게임이 시작된 이후로부터 흐른 시간을 보여주는 프로퍼티입니다.

그럼 이 realtimeSinceStartup 프로퍼티가 time 프로퍼티와 어떤 차이가 있는지 알아보겠습니다.

다시 스크립트로 돌아가서 Time.time을 출력하는 timeText에 realtimeSinceStartup도 함께 출력하도록 코드를 수정합니다.

그리고 키보드 화살표 키로 timeScale을 조절할 수 있는 코드를 작성합니다.

코드를 모두 수정한 다음에는 에디터로 돌아갑니다.

에디터로 돌아온 다음 게임을 플레이해보면 게임이 시작된 이후로 흐른 시간이 Time.time과 Time.realtimeSinceStartup 프로퍼티를 통해서 출력됩니다.

이 때 키보드의 화살표 키를 눌러서 time scale을 조절해보면 Time.time은 time scale 값에 따라 영향을 받지만 realtimeSinceStartup은 전혀 영향을 받지 않는 모습을 볼 수 있습니다.

거기에 추가로 게임을 잠시 일시정지시켰다가 플레이시켜보면 realtimeSinceStartup은 일시정지한 시간이 포함되어 값이 바뀐 것을 확인할 수 있습니다.

이렇게 게임이 시작된 시간 값을 출력하는 기능은 쓸데가 별로 없어보이지만, 게임을 실행한 시간을 기록해서 플레이어에게 업적을 준다던지, 너무 많은 시간동안 게임을 플레이하고 있는 유저가 있다면 경고문을 출력해주는 기능에 사용할 수 있습니다.

timeSinceLevelLoad

그리고 마지막으로 알아볼 프로퍼티는 timeSinceLevelLoad입니다.

이 프로퍼티는 마지막으로 씬이 로드된 이후로 흐른 시간을 의미합니다.

스크립트로 돌아가서 timeText에 timeSinceLevelLoad를 출력하는 코드를 추가합니다.

그리고 스크립트 상단에 UnityEngine.SceneManagement 네임스페이스를 using 선언하고 Update 함수에서 스페이스 키를 누르면 현재 씬을 다시 로드하도록 코드를 작성합니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아갑니다.

에디터에서는 빌드 세팅 창을 열어서 현재 씬을 Scenes In Build 목록에 추가해줍니다.

그 다음에 게임을 플레이해보면 time과 realtimeSinceStartup, 그리고 timeSinceLevelLoad 값이 동시에 상승하는 것을 확인할 수 있습니다.

이 때 스페이스 키를 누르면 현재 씬이 다시 로드되는데 time과 realtimeSinceStartup은 누적된 상태로 계속 증가하지만 timeSinceLevelLoad 값은 초기화되어서 0부터 다시 누적되는 모습을 볼 수 있습니다.

이 프로퍼티를 이용하면 던전 씬에 진입하고 난 이후에 플레이어가 던전을 클리어하는데 걸린 시간을 측정할 수 있습니다.

아웃트로

이번 영상에서는 Time 클래스의 여러 가지 프로퍼티에 대해서 알아보았습니다.

이 강좌는 구독자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

'Unity3D > Programming' 카테고리의 다른 글

[Unity] JSON  (0) 2022.04.05
[Unity] Time.time & Time.realtimeSinceStartup & Time.timeSinceLevelLoad  (0) 2021.12.07
[Unity] timeScale과 unscaledDeltaTime  (0) 2021.11.29
[Unity] Time.deltaTime  (1) 2021.11.22
[Unity] 인보크(Invoke)  (0) 2021.07.12

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 전에 C++로 구현해보았던 마우스 클릭 이동 기능을 블루프린트로 만들어봅시다!

 

사용 엔진 버전 : 4.27

 

타임라인

0:00 인트로

0:11 프로젝트 생성과 리소스 임포트

0:47 맵 세팅

2:27 Player Controller로 마우스 입력 받기

4:50 클릭한 위치로 이동시키기

6:35 캐릭터 구현

9:41 게임 모드 설정과 테스트

10:43 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

지난 강좌에서 C++로 구현했던 마우스 클릭을 이용한 캐릭터 이동 기능을 이번에는 블루프린트로 만들어 보겠습니다.

프로젝트 생성과 리소스 임포트

먼저 언리얼 엔진을 실행하고 새 프로젝트를 생성합니다.

이번에는 블루프린트로 기능을 만들 생각이므로 블루프린트 타입으로 프로젝트를 만듭니다.

프로젝트 생성이 완료된 이후에는 영상 하단의 링크에서 캐릭터 모델링과 애니메이션을 다운로드 받아서 압축을 풀어줍니다.

그리고 언리얼 에디터에서 콘텐츠 브라우저의 소스 패널을 열고 콘텐츠 폴더에 우클릭한 다음 [탐색기에서 표시] 항목을 선택해서 프로젝트의 폴더를 열어줍니다.

그 다음에는 방금 다운로드 받아서 압축 해제된 파일들을 이 폴더 안으로 옮겨줍니다.

맵 세팅

프로젝트 세팅이 끝난 다음에는 캐릭터가 움직일 맵을 구성해봅시다.

맵 세팅 작업에 들어가기 전에 맵에 배치할 기둥이나 벽을 대신할 간단한 박스 메시 하나를 영상 하단의 링크에서 다운로드 받은 뒤 압축을 해제합니다.

그리고 언리얼 에디터로 돌아가서 Props 폴더를 만든 뒤 빈 콘텐츠 브라우저 패널에 우클릭하고 [/Game/Props에 임포트]를 선택해서 다운로드 받은 Box.FBX 파일을 프로젝트에 임포트합니다.

그 다음 레벨을 살펴보면 빈 평면만 보입니다.

여기에 방금 임포트한 박스를 이용해서 캐릭터의 이동을 방해할 수 있게 적절하게 배치해줍니다.

이렇게 저처럼 배치해도 되고 여러분들이 원하는 대로 편하게 배치해도 됩니다.

장애물을 모두 배치한 다음에는 액터 배치 패널의 볼륨 탭에서 내비 메시 바운드 볼륨을 찾아서 레벨의 한가운데에 배치하고 맵의 오브젝트들을 전부 덮도록 만들어줍니다.

이 내비 메시 바운드 볼륨은 볼륨의 영역 안에 있는 오브젝트들을 찾아서 계산한 뒤에 이동 경로를 찾아줄 내비 메시를 만들어내는 역할을 합니다.

내비 메시 바운드 볼륨 설치를 마친 다음 단축키 [P]를 누르면 캐릭터가 이동할 수 있는 범위가 초록색으로 표시됩니다.

이렇게 맵 세팅을 마치면 콘텐츠 브라우저에서 Maps 폴더를 만들고 상단 메뉴 바에서 [파일 > 현재 레벨 저장] 항목을 선택해서 현재 레벨을 Maps 폴더 안에 ClickMoveTestMap이라는 이름으로 저장합니다.

맵을 저장한 뒤에는 프로젝트 세팅 창을 열고 [맵 & 모드]에서 에디터 시작 맵을 방금 저장한 ClickMoveTestMap으로 설정해줍니다.

이렇게 해주면 다음에 프로젝트를 열었을 때, 설정해준 맵이 제일 먼저 열리게 됩니다.

Player Controller로 마우스 입력 받기

이 다음 작업으로는 플레이어 컨트롤러로 클릭 입력을 받아서 컨트롤러가 소유한 폰을 클릭한 위치로 이동시키는 블루프린트를 작성하겠습니다.

코드를 작성하기 전에 프로젝트 세팅 창에서 입력을 선택하고 입력 매핑을 세팅해줍니다.

이번 영상에서는 클릭한 지점으로 캐릭터를 이동시키는 기능만 목표로 하여 만들 생각입니다.

그러므로 LeftClick이라는 이름으로 왼쪽 마우스 버튼만 액션 매핑에 추가해줍니다.

입력 세팅을 마쳤다면, 콘텐츠 브라우저 패널에 Blueprints라는 이름으로 폴더를 만든 뒤, 우클릭하고 블루프린트 클래스 항목을 선택합니다.

그러면 부모 클래스 선택 창이 뜨는데 여기서 PlayController 클래스를 부모 클래스로 선택해줍니다.

블루프린트 클래스의 이름은 BP_ClickMovePlayerController로 해주겠습니다.

클래스가 생성되고 나면, 블루프린트 에셋을 더블 클릭해서 블루프린트 에디터를 열어줍니다.

블루프린트 에디터가 열리고 나면 컴포넌트 패널에서 최상위 오브젝트를 선택하고 디테일 패널에서 [Show Mouse Cursor] 프로퍼티를 찾아야 합니다.

이 강좌에서 우리는 마우스로 캐릭터를 이동시킬 계획이기 때문에 마우스 커서를 보이게 만들기 위해 이 프로퍼티를 true로 변경합니다.

이 다음에는 내 블루프린트 탭의 변수 카테고리에 있는 [+] 버튼을 눌러서 변수를 추가하고 bool타입으로 설정한 다음 이름은 bClickLeftMouse로 정합니다.

이 변수는 왼쪽 마우스 버튼을 누를 때 true가 되고 뗄 떼 false로 값이 바뀌도록 동작하게 만들 예정입니다.

그 다음에는 함수 카테고리의 [+] 버튼을 눌러 InputLeftMouseButtonPressed 함수를 추가하고 이 함수에서는 bClickLeftMouse 변수의 값을 true로 변경하도록 블루프린트를 작성합니다.

그리고 이번에는 InputLeftMouseButtonReleased 함수를 추가하고 bClickLeftMouse의 값을 false로 변경하도록 작성해줍니다.

이 함수들은 입력 매핑과 바인딩 되어서 입력을 받으면 bClickLeftMouse 변수의 값을 바꿔주게 될 겁니다.

그 다음은 이벤트그래프로 이동해서 빈 그래프 영역에 우클릭하고 앞에서 만든 LeftClick 입력에 대한 이벤트를 검색해서 추가해줍니다.

그리고 Pressed 진행 핀에 앞에서 만든 InputLeftMouseButtonPressed 함수를 연결해주고 Released 진행 핀에는 InputLeftMouseButtonReleased 함수를 연결해줍니다.

이제 왼쪽 마우스 버튼을 누를 때 InputLeftMouseButtonPressed 함수가 호출되서 bClickLeftMouse 변수가 true가 되고, 왼쪽 마우스 버튼을 떼면 InputLeftMouseButtonReleased 함수가 호출되서 bClickLeftMouse 변수가 false가 되도록 세팅되었습니다.

클릭한 위치로 이동시키기

이 다음 작업으로는 마우스를 클릭하면 클릭한 위치로 캐릭터를 이동시키는 블루프린트를 작성할 차례입니다.

먼저 함수 카테고리의 [+] 버튼을 눌러서 SetNewDestination 함수를 추가합니다.

이 함수는 새로운 목표 위치를 받아서 컨트롤러가 소유한 폰을 그 위치로 이동시키는 역할을 하도록 만들겠습니다.

이 함수는 매개변수로 목적지로 지정할 위치를 받아야하기 때문에 디테일 패널의 입력 카테고리의 [+] 버튼을 눌러서 입력 매개변수를 만들고 Vector 타입으로 지정한 다음 이름을 NewDestination으로 변경해줍니다.

이 함수에서는 먼저 GetPawn 함수를 이용해서 컨트롤러가 소유하고 있는 폰을 가져오고 폰과 목적지 사이의 거리를 측정해서 그 거리가 120 언리얼 유닛보다 큰 지 검사합니다.

그리고 이 결과값이 true라면 SimpleMoveToLocation 함수를 사용해서 새로운 목적지로 이동하도록 만들어줍니다.

이 SimpleMoveToLocation 함수는 프로그래머가 목적지로 폰을 이동시키기 위한 코드를 일일이 작성하는 대신에 간단한 함수 호출로 그 모든 일을 할 수 있도록 도와줍니다.

그 다음에는 함수 카테고리의 [+] 버튼을 눌러서 MoveToMouseCursor 함수를 추가합니다.

이 함수에서는 PlayerController를 이용해서 찾은 Get Hit Result Under Cursor by Channel 함수로 마우스 커서 아래에 레이 트레이스를 쏴서 그 위치를 SetNewDestination 함수에 전달하는 역할을 합니다.

이제 MoveToMouseCursor 함수를 실시간으로 호출하기 위해서 이벤트그래프로 돌아가서 Tick 이벤트에 bClickLeftMouse 변수의 상태에 따라서 MoveToMouseCursor 함수를 호출하도록 블루프린트를 작성합니다.

컨트롤러 블루프린트 작성이 끝나면 컴파일 버튼을 누르고 블루프린트를 저장해줍니다.

캐릭터 구현

캐릭터가 움직일 맵과 캐릭터를 컨트롤할 플레이어 컨트롤러를 모두 만들었으니 이제 맵 위에서 움직일 캐릭터를 만들 차례입니다.

콘텐츠 브라우저 패널에 우클릭하고 블루프린트 클래스 항목을 선택합니다.

그리고 부모 클래스로는 Character 클래스를 선택하고 클래스의 이름은 BP_ClickMoveCharacter로 정해줍니다.

클래스 생성이 완료되고 나면 블루프린트 에셋을 더블 클릭해서 블루프린트 에디터를 엽니다.

블루프린트 에디터가 열리고 나면 먼저 컴포넌트 패널에서 Capsule Component를 선택하고 캡슐의 높이와 지름을 수정해줍니다. (96 42)

그리고 제일 상위 오브젝트를 선택하고 폰 카테고리에서 Use Controller Rotation Yaw를 false로 설정해서 캐릭터가 카메라의 회전을 따라서 회전하지 않도록 해줍니다.

그 다음에는 Character Movement 컴포넌트를 선택하고 캐릭터 무브먼트(회전 세팅) 카테고리에서 Orient Rotation to Movement를 체크하고 RotationRate를 (0, 0, 640)으로 변경해서 캐릭터를 이동시키기 전에 이동 방향과 현재 캐릭터가 바라보는 방향이 다르면 캐릭터를 이동 방향으로 초당 640도의 회전 속도로 회전시키도록 만들어줍니다.

플레이너 무브먼트 카테고리에서 Constrain To Plane을 true로 변경해서 캐릭터의 이동을 평면으로 제한하고, Snap To Plane At Start를 true로 변경해서 시작할 때 캐릭터의 위치가 평면을 벗어난 상태라면 가까운 평면으로 붙여서 시작되도록 만들어줍니다.

그 다음으로는 컴포넌트 패널에서 Capsule Component를 선택하고 컴포넌트 추가 버튼을 누른 뒤 스프링 암을 검색해서 Capsule Component 아래에 추가해줍니다.

그리고 카메라 세팅 카테고리에서 Inherit Pitch, Inherit Yaw, Inherit Roll을 체크 해제해줍니다.

이 프로퍼티를 해제함으로써 스프링 암의 회전이 루트 컴포넌트와 상위 컴포넌트를 따르지 않고 월드 좌표계의 회전을 따르도록 해줍니다.

그리고 TargetArmLength를 800으로 설정해서 카메라와 캐릭터의 거리를 띄워주고 트랜스폼의 회전 값을 수정해서 스프링 암을 회전시켜 위에서 캐릭터를 내려다보도록 설정합니다.

그리고 Do Collision Test 프로퍼티는 카메라가 벽에 닿으면 충돌 계산을 통해 카메라와 캐릭터의 거리를 좁혀 카메라가 벽을 뚫지 않게 만들어주는 프로퍼티지만, RPG 게임처럼 위에서 내려다보는 시점에는 사용하지 않기 때문에 false로 설정합니다.

그 다음에는 스프링 암 컴포넌트 아래에 카메라 컴포넌트를 생성하고 Use Pawn Control Rotation을 false로 변경해서 카메라의 회전이 폰의 회전에 영향을 주지 않도록 설정합니다.

이제 캐릭터의 모델을 추가할 차례입니다.

컴포넌트 패널에서 Mesh 컴포넌트를 선택합니다.

그리고 디테일 패널의 메시 섹션에서 Skeletal Mesh를 SK_Mannequin으로 설정하고 애니메이션 섹션에서 Anim Class를 ThirdPerson_AnimBP로 설정해줍니다.

이 작업을 끝내고 나서 블루프린트 에디터의 뷰포트 패널을 보면 캐릭터의 메시가 캡슐 콜라이더를 벗어나고 캐릭터의 방향 역시 캡슐 콜라이더에 표시된 화살표와 다른 방향을 바라보고 있는 것을 알 수 있습니다.

위치와 방향을 맞춰주기 위해서 메시 컴포넌트의 위치를 {0, 0, -90}으로 수정하고, 회전을 {0, 0, -90}으로 수정해줍니다.

작업이 끝나면 블루프린트를 컴파일하고 저장한 뒤 블루프린트 에디터를 닫아줍니다.

게임 모드 설정

플레이어 컨트롤러와 캐릭터의 설정이 모두 끝났으니 이제 게임이 우리가 만든 플레이어 컨트롤러와 캐릭터를 사용하도록 만들 차례입니다.

콘텐츠 브라우저 패널에서 우클릭한 뒤 블루프린트 클래스 선택하고 부모 클래스로 GameModeBase를 선택해서 블루프린트 클래스를 생성해줍니다.

게임 모드 블루프린트가 생성되면 더블클릭해서 블루프린트 에디터를 열고 디테일 패널에서 Player Controller Class와 Default Pawn Class를 우리가 만든 것으로 교체해줍니다.

그리고 블루프린트를 컴파일하고 저장한 뒤에 블루프린트 에디터를 닫아줍니다.

그 다음에는 툴바에서 [세팅 > 월드 세팅] 항목을 선택해서 월드 세팅 패널을 엽니다.

월드 세팅에서는 게임 모드 오버라이드를 방금 만든 게임 모드 블루프린트로 변경합니다.

모든 과정을 마친 뒤 플레이 버튼을 눌러서 PIE 모드로 들어가면 캐릭터가 마우스 클릭 지점으로 이동하고, 그 과정에서 적절하게 장애물을 회피하는 모습을 볼 수 있습니다.

아웃트로

이번에는 지난 강좌 중 하나에서 C++로 구현했던 마우스 클릭 이동 방식을 블루프린트로 구현해보았습니다.

이 강좌는 구독자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 유니티 프로젝트를 생성하고, 저장/불러오기하는 방법을 알아보겠습니다!

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:11 프로젝트 생성

2:09 프로젝트 저장

3:33 프로젝트 불러오기

4:25 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 유니티 엔진을 설치한 이후에 프로젝트를 생성하고, 저장/불러오기 하는 방법에 대해서 알아보겠습니다.

프로젝트 생성

먼저 유니티 프로젝트를 생성하는 방법을 알아보겠습니다.

유니티 엔진 설치 강좌를 따라서 유니티 엔진을 설치했다면 유니티 허브를 실행합니다.

유니티 허브의 화면에서 새 프로젝트를 생성하기 위해서는 프로젝트 탭의 파란색 [새 프로젝트] 버튼을 클릭하면 됩니다.

[새 프로젝트] 버튼을 클릭하면 프로젝트 생성 단계로 넘어갈 수 있습니다.

프로젝트 생성 단계에서는 여러 가지를 결정할 수 있는데 먼저 상단의 에디터 버전을 선택하면 지금 만드는 프로젝트의 유니티 버전을 고를 수 있습니다.

여기에는 여러분이 컴퓨터에 설치해둔 모든 버전의 유니티 에디터가 표시되는데, 저는 지금 2020.3 버전만 설치해둔 상태라 이 버전만 보입니다.

유니티 에디터를 설치하면서 이야기 했듯이 보통의 경우에는 최신 버전의 LTS를 선택해주는게 가장 안정적입니다.

그 다음엔 템플릿입니다.

어떤 게임을 만들 것인지에 따라서 선택하면 되는데 가장 기본적인 템플릿은 2D와 3D입니다.

2D 게임을 만들 계획이라면 2D 템플릿을 선택하고, 3D 게임을 만들 계획이라면 3D 템플릿을 선택합니다.

보통은 템플릿 중에서 2D 템플릿과 3D 템플릿처럼 코어라고 표시된 템플릿을 선택해서 사용하면 됩니다.

코어 템플릿에는 2D와 3D 템플릿 이 외에도 VR 템플릿, AR 템플릿, 3D 모바일 템플릿, 2D 모바일 템플릿이 있습니다.

그 외의 템플릿들은 유니티의 기능을 배우거나 확인해보기 위한 샘플이나 학습 템플릿들입니다.

그 다음에는 프로젝트의 이름을 정하면 됩니다.

기본 이름은 My project로 지정되는데 같은 이름이 있다면 뒤에 넘버링이 추가됩니다.

다만 기본 이름을 사용하면 프로젝트가 많이 쌓이게 되었을 때 어떤게 어떤 프로젝트인지 찾기가 어려워지기 때문에 항상 프로젝트의 이름을 알아보기 쉽게 정하는 습관을 만들도록 합시다.

프로젝트 위치는 여러분이 찾기 쉬운 위치나 깃의 로컬 리포지토리가 될 곳을 지정해주면 됩니다.

이제 프로젝트 생성 버튼을 누르면 새로운 프로젝트가 생성됩니다.

프로젝트 저장

새로 만든 프로젝트의 생성이 완료되면 유니티 엔진 에디터가 실행됩니다.

유니티 에디터에서 작업한 것 중에 스크립트, 프리팹, 텍스처, 머티리얼 같은 에셋들은 프로젝트 뷰에서 보이고 게임의 레벨이라고 할 수 있는 씬의 내부에 배치된 오브젝트들은 씬 뷰와 하이어라키 뷰를 통해서 볼 수 있습니다.

프로젝트 뷰에서 에셋에 대한 작업은 대부분 수정 사항들이 곧바로 자동 저장되기 때문에 따로 신경쓸 필요는 거의 없습니다.

하지만 씬에서의 작업은 따로 저장하지 않고 잘못 끄면 작업 내용들이 전부 날아가버리는 문제가 발생할 수 있기 때문에 신경을 써주는 것이 좋습니다.

이렇게 씬에 오브젝트를 추가하거나 변경 사항이 생기면 하이어라키 뷰에서 씬의 이름 옆에 *모양이 표시되며 저장되지 않은 변경 사항이 있음을 알려줍니다.

앞에서도 말했다시피 저장을 제때하지 않으면 작업한 내용을 날리게 될 수 있으니 에디터를 종료하기 직전이나, 작업 내용이 만족스러워서 날아가면 안된다 싶은 생각이 드는 순간에는 항상 [Ctrl + S] 단축키를 눌러서 씬의 변경 사항을 저장해줍니다.

아니면 상단 메뉴 바에서 [File > Save] 항목을 선택해서 저장할 수도 있습니다.

추가로 에디터에서 게임이 플레이되고 있는 도중에는 씬의 변경사항을 저장할 수 없고 플레이 중에 수정한 내용은 플레이가 중단되면 바로 게임이 플레이되기 전으로 초기화 되기 때문에 씬에서 작업을 하기 전에는 게임이 플pre레이 중이 아닌지 잘 확인해야 합니다.

프로젝트 불러오기

그 다음에는 프로젝트를 다시 불러오는 방법을 배우기 위해 우선은 유니티 에디터를 종료하겠습니다.

그리고 다시 유니티 허브를 실행합니다.

프로젝트 목록의 최상단에 방금 전에 만든 프로젝트가 표시되는 것을 볼 수 있습니다.

여기서 원하는 프로젝트를 선택하면 이전에 작업하던 프로젝트를 다시 열어서 작업을 이어나갈 수 있습니다.

보통은 가장 최근에 실행한 프로젝트를 위로 오게 정렬을 하기 때문에 프로젝트를 오래동안 켜지 않으면 아래 쪽에 프로젝트가 내려가 있을 수도 있는데 그럴 때는 아래로 내려가서 프로젝트를 찾거나 검색을 이용해서 찾을 수 있습니다.

다만 가끔은 이 목록에서 프로젝트가 사라지는 경우도 있는데 그럴 때는 열기 버튼을 클릭하고 [열려는 프로젝트 선택] 대화상자에서 프로젝트를 직접 찾아서 선택해주면 됩니다.

아웃트로

이번 영상에서는 새 프로젝트 생성과 프로젝트 저장, 프로젝트를 다시 불러오는 방법에 대해서 알아보았습니다.

이 강좌는 구독자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 Time 클래스의 프로퍼티 중에서 time, realtimeSinceStartup, timeSinceLevelLoad에 대해서 알아보겠습니다.

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:14 Time.time

1:21 Time.realtimeSinceStartup

2:47 Time.timeSinceLevelLoad

3:57 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 Time 클래스의 프로퍼티 중에서 time과 realtimeSinceStartup, 그리고 timeSinceLevelLoad에 대해서 알아보도록 하겠습니다.

Time.time

Time 클래스의 프로퍼티인 time은 게임이 시작된 이후로부터 흐른 시간을 보여주는 프로퍼티입니다.

유니티 에디터에서 새 C# 클래스를 생성하고 스크립트 에디터를 열어줍니다.

비주얼 스튜디오가 열리고 나면 클래스의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 Text 타입으로 측정한 시간을 보여줄 timeText 변수를 선언해줍니다.

그 다음 Update 함수에서는 Time.time 값을 문자열로 만들어서 timeText로 출력하는 코드를 작성합니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아갑니다.

에디터에서는 Hierarchy 뷰에 우클릭해서 [UI > Text] 항목을 선택해서 텍스트 UI를 생성합니다.

그리고 Canvas 게임오브젝트에 방금 만든 컴포넌트를 붙인 뒤 Time Text 프로퍼티에 방금 만든 텍스트 UI를 할당해줍니다.

그 다음 게임을 플레이해보면 게임이 시작된 이후에 흐른 시간이 계속해서 올라가는 모습을 볼 수 있습니다.

Time.realtimeSinceStartup

그 다음에 설명할 프로퍼티는 realtimeSinceStartup입니다.

이 realtimeSinceStartup 역시 time과 같이 게임이 시작된 이후로부터 흐른 시간을 보여주는 프로퍼티입니다.

그럼 이 realtimeSinceStartup 프로퍼티가 time 프로퍼티와 어떤 차이가 있는지 알아보겠습니다.

다시 스크립트로 돌아가서 Time.time을 출력하는 timeText에 realtimeSinceStartup도 함께 출력하도록 코드를 수정합니다.

그리고 키보드 화살표 키로 timeScale을 조절할 수 있는 코드를 작성합니다.

코드를 모두 수정한 다음에는 에디터로 돌아갑니다.

에디터로 돌아온 다음 게임을 플레이해보면 게임이 시작된 이후로 흐른 시간이 Time.time과 Time.realtimeSinceStartup 프로퍼티를 통해서 출력됩니다.

이 때 키보드의 화살표 키를 눌러서 time scale을 조절해보면 Time.time은 time scale 값에 따라 영향을 받지만 realtimeSinceStartup은 전혀 영향을 받지 않는 모습을 볼 수 있습니다.

거기에 추가로 게임을 잠시 일시정지시켰다가 플레이시켜보면 realtimeSinceStartup은 일시정지한 시간이 포함되어 값이 바뀐 것을 확인할 수 있습니다.

이렇게 게임이 시작된 시간 값을 출력하는 기능은 쓸데가 별로 없어보이지만, 게임을 실행한 시간을 기록해서 플레이어에게 업적을 준다던지, 너무 많은 시간동안 게임을 플레이하고 있는 유저가 있다면 경고문을 출력해주는 기능에 사용할 수 있습니다.

Time.timeSinceLevelLoad

그리고 마지막으로 알아볼 프로퍼티는 timeSinceLevelLoad입니다.

이 프로퍼티는 마지막으로 씬이 로드된 이후로 흐른 시간을 의미합니다.

스크립트로 돌아가서 timeText에 timeSinceLevelLoad를 출력하는 코드를 추가합니다.

그리고 스크립트 상단에 UnityEngine.SceneManagement 네임스페이스를 using 선언하고 Update 함수에서 스페이스 키를 누르면 현재 씬을 다시 로드하도록 코드를 작성합니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아갑니다.

에디터에서는 빌드 세팅 창을 열어서 현재 씬을 Scenes In Build 목록에 추가해줍니다.

그 다음에 게임을 플레이해보면 time과 realtimeSinceStartup, 그리고 timeSinceLevelLoad 값이 동시에 상승하는 것을 확인할 수 있습니다.

이 때 스페이스 키를 누르면 현재 씬이 다시 로드되는데 time과 realtimeSinceStartup은 누적된 상태로 계속 증가하지만 timeSinceLevelLoad 값은 초기화되어서 0부터 다시 누적되는 모습을 볼 수 있습니다.

이 프로퍼티를 이용하면 던전 씬에 진입하고 난 이후에 플레이어가 던전을 클리어하는데 걸린 시간을 측정할 수 있습니다.

아웃트로

이번 영상에서는 Time 클래스의 프로퍼티 중에서 time과 realtimeSinceStartup, 그리고 timeSinceLevelLoad에 대해서 알아보았습니다.

이 강좌는 구독자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

'Unity3D > Programming' 카테고리의 다른 글

[Unity] JSON  (0) 2022.04.05
[Unity] Time 클래스 통합본  (0) 2021.12.27
[Unity] timeScale과 unscaledDeltaTime  (0) 2021.11.29
[Unity] Time.deltaTime  (1) 2021.11.22
[Unity] 인보크(Invoke)  (0) 2021.07.12

 

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 Time 클래스의 프로퍼티 중에서 timeScale과 unscaledDeltaTime에 대해서 알아봅시다!

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:10 Time.timeScale

1:40 Time.unscaledDeltaTime

3:14 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 Time 클래스의 프로퍼티인 timeScale과 unscaledDeltaTime에 대해서 알아보겠습니다.

Time.timeScale

time scale라는 프로퍼티의 이름을 단순하게 번역해보면 시간의 크기라는 뜻입니다.

이 값을 조절하면 시간이 흐르는 속도를 조절하여 시간이 빠르게 흐르거나 느리게 흐르게 만들 수 있습니다.

C# 스트립트를 하나 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 float 타입으로 timer 변수를 만들어줍니다.

그리고 Update 함수에서 timer 변수에 deltaTime 값을 누적시키며 더하고 그 timer 변수를 이용해서 오브젝트가 Sin 그래프를 따라서 움직이게 만들어 줍니다.

그 아래에는 키보드 화살 키를 눌러서 timeScale를 늘리거나 줄이는 코드를 작성합니다.

그리고 숫자 1을 누르면 timeScale를 1로 만들도록 해줍니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 이동합니다.

에디터로 이동한 다음에는 큐브 오브젝트를 생성하고 방금 만든 컴포넌트를 붙여줍니다.

이제 게임을 플레이시켜 보겠습니다.

게임이 시작되면 큐브가 왕복으로 움직이는 모습을 볼 수 있는데 이때 위쪽 화살표 키를 누르면 time scale이 커지면서 큐브의 움직임이 빨라집니다.

반대로 아래쪽 화살표 키를 누르면 time scale이 작아지면서 큐브의 움직임이 느려집니다.

그러다가 time scale이 0이 되면 움직임이 완전히 멈춥니다.

그리고 숫자 1 키를 누르면 time scale이 1이 되면서 원래의 속도로 움직입니다.

이런 식으로 time scale을 조절해서 슬로우 모션같은 연출을 할 수 있습니다.

Time.unscaledDeltaTime

그 다음 알아볼 프로퍼티는 unscaledDeltaTime입니다.

delta time에 대해서 설명했을 때 이야기한 것처럼 delta time은 게임에서 플레이어의 입력과 게임 처리, 화면 렌더링 등의 작업이 한 번 처리되고 그 결과물이 플레이어의 모니터에 그려지는 한 프레임이 진행되는 시간을 의미합니다.

이 delta time에 unscaled를 붙임으로써 크기가 바뀌지 않은 delta time을 의미하게 됩니다.

time scale의 영향을 받지 않는 delta time인 것이죠.

새 C# 스크립트를 생성하고 앞에서 만든 컴포넌트에서 오브젝트를 이동시키는 코드를 복사해서 Update 함수에 붙여넣어줍니다.

그리고 timer에 더해주는 값을 deltaTime에서 unscaledDeltaTime으로 바꿔줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아갑니다.

그리고 씬에 새로운 3D 오브젝트를 배치하고 거기에 새로 만든 컴포넌트를 붙여줍니다.

그 다음 게임을 플레이시키면 거의 비슷한 속도로 움직이는 두 오브젝트가 보일 겁니다.

이 때 화살표 키를 눌러서 time scale을 조절하면 delta time으로 움직이는 오브젝트의 속도는 time scale의 영향을 받아 느려지거나 빨라지지만, unscaled delta time으로 움직이는 오브젝트의 속도는 전혀 영향을 받지 않고 동일한 속도로 움직이는 것을 볼 수 있습니다.

이런 식으로 어떤 오브젝트의 움직임이 time scale의 영향을 받지 않기를 원할 때는 unscaled delta time을 사용해야 합니다.

time scale과 delta time, unscaled delta time을 적절하게 조합해서 사용하면 특수한 스킬로 적들은 멈춰있거나 느려졌는데 플레이어만 정상적인 속도로 움직이는 기능을 연출할 수 있습니다.

아웃트로

이번 영상에서는 Time 클래스의 time scale과 unscaled delta time 프로퍼티에 대해서 알아보았습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 유니티 Time 클래스의 deltaTime 프로퍼티에 대해서 알아봅시다.

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:09 Time.deltaTime

2:58 아웃트로

 

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번 강좌에서는 Time 클래스의 delta Time 프로퍼티에 대해서 알아봅시다.

deltaTime

먼저 deltaTime에서 delta는 보통 값의 차이를 의미하는 단어입니다.

시간을 의미하는 Time과 조합해서 생각해보면 deltaTime은 차이가 나는 시간이라는 뜻으로 지난 프레임이 완료되는 데까지 걸린 시간 차이를 의미하며 단위는 초 단위입니다.

한마디로 한 프레임을 진행하는데 걸린 시간이라는 뜻이죠.

그래서 게임을 진행하다가 컴퓨터 사양이나 게임의 최적화 문제로 게임의 프레임이 떨어지는 프레임 드랍 현상이 일어나면 이 deltaTime 값은 한 프레임의 화면을 렌더링하는데 걸리는 시간만큼 커지게 됩니다.

보통 30프레임 기준의 게임에서는 한 프레임당 deltaTime이 0.033정도가 나와야하고 60프레임 기준의 게임에서는 한 프레임당 0.016 정도가 나와야 합니다.

유니티 에디터에서 스크립트를 하나 생성하고 Start 함수에서 Application.targetFrameRate를 30으로 지정한 다음 Update 함수에서 Time.deltaTime을 디버그로 출력시키도록 코드를 작성합니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아가서 아무 게임 오브젝트에나 방금 만든 컴포넌트를 붙이고 게임을 실행해보면 앞에서 말한대로 약 0.033초에 가까운 값이 매 프레임마다 갱신되는 것을 볼 수 있습니다.

그리고 다시 스크립트에서 targetFrameRate를 60으로 변경하고 에디터로 돌아가서 테스트해보면 0.016초에 가깝게 deltaTime 값이 나오는 것을 확인할 수 있습니다.

그럼 이 delta time은 어디에 사용될까요?

그 예시를 보여드리도록 하겠습니다.

먼저 Update 함수에서 W키를 누르면 오브젝트를 이동시키는 코드를 작성해보겠습니다.

이 때 이동 코드에서 캐릭터의 이동 방향과 속도만 이용해서 캐릭터를 이동시키면 문제가 발생하게됩니다.

이 비교 영상처럼 프레임이 10일 때와 60일 때 캐릭터가 다른 속도로 움직이게 되는 겁니다.

이 문제의 원인은 프레임이 10일 때는 1초에 캐릭터를 10번 움직이게 되고, 프레임이 60일 때는 1초에 캐릭터를 60번 움직이기 때문입니다.

좀 더 풀어서 설명해보자면 이 코드에서는 프레임이 10일 때는 1의 속도로 캐릭터를 1초동안 10번 움직이기 때문에 이동한 거리가 10이 되는 것이고, 프레임이 60일 때는 1의 속도로 캐릭터를 1초동안 60번 움직이기 때문에 이동한 거리가 60이 됩니다.

1초 동안 움직인 횟수가 달라서 움직인 거리 역시 달라지는 것이죠.

이것은 컴퓨터의 성능이 오브젝트의 속도에 영향을 미치게 되는 것으로 보통의 게임에서는 발생해서는 안되는 문제입니다.

이 문제를 해결하기 위한 방법이 바로 이 이동 값에 delta time을 곱해주는 겁니다.

이렇게 이동 벡터에 delta time을 곱해주고 나면, 게임이 몇 프레임으로 진행되는지에 전혀 상관없이 오브젝트는 동일한 속도로 움직이게 됩니다.

이런 식으로 이동이나 회전 등 움직임에 있어서 시간의 영향을 받는 기능을 만들 때는 값에 deltaTime을 곱해서 흘러간 프레임 시간만큼만 가중치를 줌으로써 프로세서 속도의 영향에서 자유로워 지게됩니다.

아웃트로

이번 영상에서는 유니티 Time 클래스의 deltaTime에 대해서 알아보았습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

+ Recent posts