반응형

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

이번에는 함께 일하는 다른 팀원들에게 에셋을 전달하기 위해서 사용되는 유니티 패키지에 대해서 알아봅시다.

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:11 압축파일 전달

1:15 유니티 패키지

2:45 버전 관리 도구로써는? 글쎄...

3:41 유니티 패키지 사용법

4:59 아웃트로

 

스크립트

인트로

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

이번 영상에서는 유니티에서 에셋을 전달하기 위해서 사용되는 유니티 패키지에 대해서 알아보도록 하겠습니다.

압축파일 전달

유니티에 익숙하지 못한 입문자일 때는 프로젝트나 프로젝트 안에 있는 텍스처, 머티리얼, 프리팹, 스크립트 같은 에셋을 공유하거나 전달하려고 프로젝트 전체를 압축해서 보내거나 전달할 에셋을 선택하여 압축해서 보내는 방법을 주로 사용했었습니다.

저도 유니티를 처음 배웠을 때는 그렇게 많이 했었죠.

하지만 이 방법을 사용하면 굉장히 많은 문제가 발생합니다.

전체 프로젝트를 압축해서 옮기면 프로젝트의 크기에 따라서 압축 파일의 용량이 너무 커져서 옮기기가 어려워 집니다.

물론 프로젝트에 필요한 폴더만 묶어서 압축하면 훨씬 압축파일의 용량이 줄어들지만, 이렇게 옮기면 프로젝트를 받은 사람이 처음 열 때 시간이 많이 걸린다는 단점도 있습니다.

그리고 압축 파일 이름에 버전을 적어둬도 어떤 게 어떤 버전인지 헷갈리는 문제도 발생합니다.

거기에 가장 치명적인 단점으로는 수동으로 파일을 선택할 때는 프리팹이나 씬에 포함된 오브젝트의 참조 관계, 즉 어떤 프로퍼티에 어떤 프리팹이나 텍스처 등의 에셋들이 꽂혀있는지 전부 알 수 없기 때문에 빠지는 파일이 생길 수 있습니다.

그렇게 되면 전달된 에셋들이 제대로 동작하지 않는 문제가 발생하게 됩니다.

유니티 패키지

앞에서 말한 압축 파일로 에셋을 전달하는 방법에서 발생하는 문제를 해결할 수 있는게 바로 유니티 패키지입니다.

먼저 유니티 패키지를 만드는 방법부터 보여드리겠습니다.

유니티 에디터의 프로젝트 뷰에서 유니티 패키지로 익스포트할 에셋을 선택합니다.

그 에셋에 우클릭하고 [Export Package]를 선택합니다.

그러면 Exporting Package 창이 뜨면서 선택한 에셋과 연관된 에셋, 즉 종속성을 가진 에셋들이 함께 자동으로 선택됩니다.

물론 프로젝트 크기가 커지면 이 종속성이 상당히 복잡해서 정말 필요한 에셋 뿐만 아니라 곁다리 수준으로만 엮인 에셋들도 선택되서 쓸데없는 에셋들이 함께 익스포트되는 경우도 있기 때문에 잘 확인하고 꼭 익스포트할 에셋들만 선택해야 합니다.

그리고 창에서 Include dependency 체크를 해제하면 정말 선택한 에셋만 잡히는데 지금 선택한 프리팹의 경우에는 필요한 3D 모델, 애니메이터 컨트롤러 등이 모두 빠지기 때문에 빈 오브젝트만 익스포트됩니다.

그래서 이 Include dependency 옵션은 보통은 정말 필요한 리소스 에셋이나 스크립트 에셋만 빼내야 할 때 체크를 해제해주면 됩니다.

이렇게 익스포트할 에셋을 모두 선택한 다음에는 Export 버튼을 누르고 저장하고자 하는 위치에 이 패키지가 무엇을 담고 있는지 확실하게 알 수 있는 이름으로 저장해주면 됩니다.

그리고나서 이 유니티 패키지를 임포트할 프로젝트를 실행하고 패키지 파일을 더블클릭해주면 패키지 안에 담긴 에셋들을 그 프로젝트에 넣을 수 있게 됩니다.

버전 관리 도구로써는? 글쎄...

이렇게 유니티 패키지를 사용하면 자신이 개발한 내용이나 기능, 에셋 등을 다른 사람에게 공유할 수 있게 됩니다.

하지만 유니티 패키지를 프로젝트의 버전 관리 도구처럼 사용하려고 해서는 안됩니다.

프로젝트의 버전 관리는 개발 내용의 최신화가 아주 중요한데, 패키지를 전달 받은 다른 개발자가 자신의 프로젝트에 적용하는 작업을 까먹고 안할 수도 있고, 전달 과정에서 몇몇 사람들을 빼먹고 전달하는 경우도 있을 수 있어서 프로젝트의 최신화를 공통적으로 유지하기 어렵습니다.

그리고 이 패키지를 임포트하는 작업은 같은 에셋이 존재하는 경우에 수정 사항을 완전히 덮어씌워버리기 때문에 작업 내용이 겹치거나 잘못된 작업이 임포트되었을 때, 되돌릴 방법이 없다는 것도 문제입니다.

그렇기 때문에 유니티 패키지는 프로젝트의 버전 관리를 위한 방법으로는 적절하지 못하며, 프로젝트 버전 관리는 SVN이나 깃을 사용하는 것이 좋습니다.

깃허브를 이용해서 유니티 프로젝트를 관리하는 방법을 소개하는 영상은 영상 링크를 통해서 확인하실 수 있습니다.

유니티 패키지 사용법

그러면 유니티 패키지는 어디에 사용하면 좋은지 궁금하신 분들이 계실 겁니다.

물론 저는 거기에 답변을 드려야겠죠.

유니티 패키지는 필요한 에셋들을 선택해서 각 에셋 사이의 참조나 종속성 연결을 끊기지 않게 가져올 수 있다는 점에 초점을 맞춰야 합니다.

그래서 필요한 에셋들을 다른 프로젝트에서 가져올 수 있는 것입니다.

예를 들어 예전에 만들었던 게임이 있다고 해봅시다.

그리고 그 다음 게임을 만들려고 하는데 예전에 만들었던 게임과 유사한 형태의 인벤토리 시스템을 넣으려고 한다고 가정해봅시다.

이러면 새 프로젝트에서 완전히 새롭게 인벤토리 시스템을 짜는 것보다 이전 프로젝트에 들어있는 인벤토리 에셋들을 유니티 패키지로 익스포트해서 가져오는 편이 훨씬 나을 겁니다.

또 다른 예시로는 새 프로젝트를 만들어두고 여기에는 인벤토리 시스템만을 구현하는 방식으로 아예 특수한 기능만 구현하는 유니티 프로젝트를 만드는 것입니다.

그리고 이 프로젝트에는 이 시스템을 어떻게 사용해야 하는지 알려주는 샘플 씬과 각종 에셋, 그리고 설명서까지 넣어둡니다.

그 다음에 이 인벤토리 시스템이 필요한 프로젝트가 생기면 이 인벤토리만 구현된 프로젝트에서 관련 에셋들을 유니티 패키지로 익스포트해서 인벤토리 시스템이 필요한 프로젝트에 임포트 시키는 거죠.

사실 대부분의 유니티 에셋 스토어에 올라온 에셋들이 이렇게 필요한 기능만 구현된 프로젝트에서 패키지만 익스포트하는 방식과 유사하게 동작합니다.

아웃트로

이번 영상에서는 유니티에서 에셋을 묶어서 전달하는 기능인 유니티 패키지에 대해서 알아보았습니다.

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

반응형
반응형

 

사용 버전 : 2019.4

스크립트

인트로

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

이번 영상에서는 유니티의 인보크에 대해서 알아보도록 하겠습니다.

기본 인보크

우선 인보크란 유니티 엔진에서 모든 유니티 스크립트의 기본 클래스인 MonoBehaviour 클래스에서 제공되는 함수로써 기본적으로 원하는 함수를 일정 시간 후에 호출하거나 일정 시간마다 반복해서 호출할 수 있게 해주는 기능을 제공합니다.

우선 인보크 기능을 테스트해보기 위해서 프로젝트 뷰에서 InvokeTester라는 이름으로 C# 스크립트를 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 CreateCube 함수를 만들고 큐브를 랜덤한 위치에 생성하도록 코드를 작성합니다.

그리고 Start 함수로 가서 Invoke 함수를 호출해줍니다.

이 때 Invoke로 호출될 함수의 이름을 문자열로 넣고 얼마나 시간이 흐른 뒤에 호출될 지를 매개변수로 넣어주면 됩니다.

지금은 3초로 설정하겠습니다.

코드를 저장하고 에디터로 돌아갑니다.

에디터로 돌아온 다음에는 씬에 빈 게임오브젝트를 하나 생성하고 거기에 InvokeTester 컴포넌트를 붙여줍니다.

그 다음 게임을 플레이시켜보면 3초 뒤에 큐브가 스폰되는 모습을 볼 수 있습니다.

이것이 가장 기초적인 인보크 사용 방법입니다.

반복 호출되는 인보크

그 다음 알아볼 것은 반복 호출되는 인보크입니다.

다시 스크립트 에디터로 돌아갑니다.

방금 배운 것처럼 매개변수에 호출할 함수의 이름과 시간만 넣으면 함수가 일정 시간 후에 한 번 호출됩니다.

여기에 Invoke 함수 대신에 InvokeRepeating 함수로 바꾸고 세 번째 매개변수에 1을 넣어줍니다.

이렇게 하면 InvokeRepeating이 호출되고 3초 후에 CreateCube 함수가 호출되며 그 뒤로 1초마다 계속해서 반복 호출됩니다.

코드를 저장하고 에디터로 돌아가서 게임을 실행해보겠습니다.

그러면 3초가 지난 후에 1초마다 계속 새로운 큐브가 생성되는 모습을 볼 수 있습니다.

인보크 멈추기

그 다음에는 동작 중인 인보크를 멈추는 방법을 알아보겠습니다.

다시 스크립트도 돌아갑니다.

인보크를 멈추기 위해서는 CancelInvoke 함수를 사용하면 됩니다.

이 때 매개변수에 아무것도 넣지 않으면 이 게임오브젝트에서 동작하고 있는 모든 인보크들을 멈추게하고 매개변수에 함수 이름을 넣으면 그 함수 이름으로 실행된 인보크들만 멈추게 할 수 있습니다.

그럼 인보크가 멈추는 것을 확인해보기 위해서 코드를 작성하겠습니다.

먼저 CreateCube 함수를 복사해서 큐브 대신 구체를 만들어내는 CreateSphere 함수를 만들어줍니다.

그리고 업데이트 함수에서 키보드 숫자 1을 누르면 CreateCube 함수가 InvokeRepeating 되게 만들어 주고 2를 누르면 CreateSphere 함수가 InvokeRepeating 되게 만들어줍니다.

그리고 숫자 3을 누르면 CreateCube 함수가 CancelInvoke 되고 4를 누르면 CreateSphere 함수가 CancelInvoke 되게 해줍니다.

마지막으로 ESC를 누르면 동작 중인 모든 인보크가 멈추게 만듭니다.

코드를 저장하고 에디터로 돌아가서 게임을 실행합니다.

그리고 1과 2를 누르면 큐브와 구체가 계속해서 생성되는 모습을 볼 수 있습니다.

이 상태에서 3을 누르면 큐브의 생성이 멈추고 4를 누르면 구체의 생성이 멈춥니다.

다시 1과 2를 눌러 큐브와 구체를 생성되게 만든 다음 ESC 키를 누르면 큐브와 구체의 생성이 동시에 멈추는 것을 볼 수 있습니다.

인보크 상태 확인하기

이번에는 인보크가 동작 중인지 확인하는 방법을 알아보겠습니다.

인보크가 동작 중인지 확인하기 위해서는 IsInvoking 함수를 사용하면 됩니다.

이 함수 역시 CancelInvoke 함수와 마찬가지로 매개변수로 함수 이름을 넣으면 그 함수에 대한 인보크가 동작 중인지 확인할 수 있고 매개변수를 사용하지 않으면 아무 인보크나 동작하고 있는지를 체크할 수 있습니다.

이번에는 숫자 5를 누르면 CreateCube 함수에 대한 인보크를 체크하고 6을 누르면 CreateSphere 함수에 대한 인보크를 체크해서 로그를 출력하도록 코드를 작성합니다.

그리고 숫자 7을 누르면 매개변수 없이 인보크를 체크하도록 만듭니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아가서 게임을 실행합니다.

그리고 인보크를 실행하기 전에 5, 6, 7을 순서대로 눌러보면 어떠한 인보크도 동작하고 있지 않음을 로그로 확인할 수 있습니다.

그 다음에 1을 눌러 CreateCube 함수를 인보크로 동작시키고 5, 6, 7을 누르면 CreateCube 인보크 확인 로그와 모든 인보크 확인 로그를 통해서 인보크가 동작하고 있음을 확인할 수 있습니다.

그리고 2를 누르고 CreateSphere 함수까지 인보크로 동작시키고 5, 6, 7을 누르면 모든 인보크가 동작하고 있음을 로그로 확인할 수 있습니다.

이번에는 3을 눌러서 CreateCube 함수의 인보크를 중지시키고 5, 6, 7을 누르면 CreateCube 인보크가 동작하지 않는다는 로그를 볼 수 있습니다.

마지막으로 4를 눌러서 CreateSphere 함수의 인보크를 중지시키고 5, 6, 7을 누르면 모든 인보크가 동작하지 않는것을 로그로 확인할 수 있습니다.

멈추지 않는 인보크

추가로 유니티 엔진에서 게임오브젝트의 Update 함수과 코루틴 같은 기능은 게임오브젝트나 컴포넌트가 비활성화되면 동작을 멈추는 것을 알고 있으실 겁니다.

하지만 인보크 기능은 해당 게임오브젝트나 컴포넌트가 비활성화되어도 동작을 멈추지 않습니다.

인보크를 멈추기 위해서는 반드시 CancelInvoke 함수를 호출하거나 게임오브젝트 자체를 파괴해야 합니다.

하지만 코루틴

이렇게 인보크를 사용하면 원하는 함수를 일정 시간이 지난 후에 호출하거나 원하는 시간 간격으로 호출할 수 있는데 이 기능은 코루틴을 사용해서도 똑같이 구현할 수 있습니다.

그리고 유니티 공식 문서를 보면 성능 향상과 유지보수를 위해서는 코루틴을 사용할 것을 권장하고 있습니다.

우선 성능적인 측면을 보자면 인보크는 함수를 문자열로 된 이름으로 찾아서 사용하고 있습니다.

이렇게 문자열 함수 이름으로 함수를 찾아서 사용하기 위해서는 C#의 리플렉션이라는 기능을 사용하게 되는데 이렇게 문자열 함수 이름으로 리플렉션을 통해서 함수를 동작시키는 과정은 직접 함수를 호출하는 것에 비해서 수 천 배 정도 느리다고 합니다.

물론 컴퓨터의 사양이 많이 상승한 최근에는 유의미한 성능 저하는 당장 일어나지 않겠지만 인보크를 남용하면서 게임을 만들다보면 게임의 사양이 많이 올라갔을 때 최적화를 위해서 인보크를 사용하는 코드를 대부분 갈아엎어야 할 수도 있습니다.

아웃트로

이번 영상에서는 유니티 엔진에서 원하는 함수를 일정 시간이 지난 후에 호출하거나 원하는 시간 간격으로 호출할 수 있게 만들어주는 인보크에 대해서 알아보았습니다.

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

타임라인

0:00 인트로

0:09 기본 인보크

1:12 반복 호출되는 인보크

1:55 인보크 멈추기

3:22 인보크 상태 확인 하기

4:51 멈추지 않는 인보크

5:14 하지만 코루틴

6:06 아웃트로

반응형
반응형

 

유니티에서 애니메이션 클립의 초당 프레임 수를 결정하는 샘플 레이트에 대해서 알아봅시다!

 

사용 엔진 버전 : 2018.4 - 2019.4

 

타임라인

0:00 인트로

0:11 애니메이션 샘플 레이트?

0:55 2018 이전 버전에서 애니메이션 샘플 레이트 변경하기

1:42 2019 이후 버전에서 애니메이션 샘플 레이트 변경하기

2:33 샘플 레이트 다루기

3:51 아웃트로

반응형
반응형

 

Collider 편에서 배운 기능으로 점수 획득 오브젝트에 캐릭터가 닿으면 점수를 얻고, 캐릭터가 맞으면 HP를 깎는 총알을 발사하는 디스펜서 기능을 구현해 봅시다.

반응형
반응형

 

볼트에서 버튼의 On Click 이벤트와 같은 UI의 이벤트를 다루는 방법을 알아봅시다.

 

사용된 유니티 버전 : 2019.4

 

타임라인

0:00 개요

1:06 C# 프로젝트에서의 UI 이벤트 콜백 함수 등록

1:31 볼트로 UI 이벤트 만들기

2:46 볼트 UI 이벤트와 UI 컴포넌트 연결하기

3:24 플로우 머신과 다른 게임오브젝트에 부착된 UI 컴포넌트에 이벤트 연결하기 1

4:01 플로우 머신과 다른 게임오브젝트에 부착된 UI 컴포넌트에 이벤트 연결하기 2

4:30 버튼 이외의 다른 UI 컴포넌트의 이벤트

4:52 마무리

반응형

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

[Unity3D] 볼트 - UI 이벤트 다루기  (0) 2021.04.29
[Unity3D] 볼트 - 스테이트 그래프  (0) 2021.04.27
[Unity3D] 볼트 - 변수  (0) 2021.04.23
[Unity3D] 볼트 - 플로우 그래프  (0) 2021.04.19
[Unity3D] 볼트 - 소개 & 설치  (0) 2021.04.17
반응형

 

비주얼 스크립팅 툴인 볼트에서 여러가지 상태를 가지는 대상의 각 상태와 그 상태에서 실행해야할 기능을 구현할 수 있는 스테이트 그래프에 대해서 알아봅시다!

타임라인

0:00 개요

0:45 스테이트 머신 만들기

1:10 Embed와 Macro

1:52 새 스테이트 매크로 만들기

2:50 스테이트 유닛 만들기 - Flow State

3:26 스테이트 유닛 만들기 - Super State

3:46 스테이트 유닛 만들기 - Any State

4:29 시작 스테이트 설정하기

4:57 트랜지션

7:39 마무리

반응형

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

[Unity3D] 볼트 - UI 이벤트 다루기  (0) 2021.04.29
[Unity3D] 볼트 - 스테이트 그래프  (0) 2021.04.27
[Unity3D] 볼트 - 변수  (0) 2021.04.23
[Unity3D] 볼트 - 플로우 그래프  (0) 2021.04.19
[Unity3D] 볼트 - 소개 & 설치  (0) 2021.04.17
반응형

 

볼트에서 캐릭터의 HP, 이동속도, 공격력과 같은 값을 저장하기 위한 변수를 사용하는 방법을 알아봅시다!

 

타임라인

0:00 개요

0:10 변수란?

1:04 볼트 변수의 종류

1:30 플로우 변수(Flow Variables)

2:47 플로우 변수의 범위 확인

4:16 그래프 변수(Graph Variables)

6:32 오브젝트 변수(Object Variables)

7:29 씬 변수(Scene Variables)

8:10 어플리케이션 변수(Application Variables)

8:26 저장되는 변수(Saved Variables)

9:06 마무리

반응형

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

[Unity3D] 볼트 - UI 이벤트 다루기  (0) 2021.04.29
[Unity3D] 볼트 - 스테이트 그래프  (0) 2021.04.27
[Unity3D] 볼트 - 변수  (0) 2021.04.23
[Unity3D] 볼트 - 플로우 그래프  (0) 2021.04.19
[Unity3D] 볼트 - 소개 & 설치  (0) 2021.04.17
반응형

 

Debug 클래스를 사용하려고 할때 System.Diagnostics 네임스페이스가 계속해서 자동으로 using 선언되는 문제와 Visual Studio에서 유니티 관련 코드가 자동완성이 되지 않는 문제에 대한 해결법을 알아봅시다!

 

타임라인

0:00 개요

0:16 using System.Diagnostics;가 계속 생겨나는 문제

3:11 Visual Studio에서 유니티 관련 자동완성이 되지 않는 문제

반응형

+ Recent posts