반응형

 

사용 버전 : 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 아웃트로

반응형
반응형

 

유니티 2020 버전 이전에서 제네릭 인수를 사용하는 유니티 이벤트의 복잡한 직렬화 방식이 유니티 2020버전에서 변경되었습니다. 이부분에 대해서 알아봅시다.

 

타임라인

0:00 2020 이전 버전의 유니티 이벤트 Generic Serialization

1:11 유니티 2020에서 바뀐 유니티 이벤트 Generic Serialization

반응형
반응형

 

유니티 이벤트와 유니티 액션을 사용을 사용하는 방법을 알아봅시다.

 

타임라인

0:00 유니티 이벤트와 유니티 액션 개요

1:15 유니티 이벤트의 예시(버튼 UI 컴포넌트)

1:49 유니티 이벤트를 사용해서 스크립트에서 원하는 이벤트 구현하기

2:48 유니티 이벤트에 콜백 함수를 등록할 클래스 만들기

3:32 이벤트 기능 테스트

3:48 스크립트에서 콜백 함수 등록하기

4:51 유니티 이벤트에 매개변수 지정하기

5:24 유니티 이벤트의 매개변수 지정하기의 단점과 해결방법

5:50 유니티 액션

반응형
반응형

 

게임에서 사용되는 FPS(Frame Per Second)란 무엇인지 알아보고, 유니티 엔진에서 FPS를 측정하는 방법과 게임의 목표 FPS를 설정하는 방법을 알아봅시다.

 

타임라인

0:03 FPS 개요

3:29 에디터에서 게임 뷰의 FPS 보기

4:11 FPS 출력 기능 구현하기

5:44 FPS 출력 기능 테스트

6:31 게임의 목표 프레임 설정하기

반응형
반응형

 

2D 게임에서 배경의 속도가 다르게 움직이면서 원근감 효과를 주는 기술인 패럴랙스 스크롤링을 구현하는 방법을 알아봅시다.

 

타임라인

0:41 어?

0:49 깃허브 터진 화면

1:05 리소스 임포트

1:11 스프라이트 배치

1:28 원근감 효과 코드 작성

반응형
반응형

 

게임 중간에 로딩 화면 없이 연속적으로 씬을 불러오는 스트리밍 레벨 기능을 구현하는 방법을 알아봅시다!

 

캐릭터 조작 기능이 들어있는 패키지 : https://github.com/wwer20001/wer-prog...

씬 모양을 미리 만들어둔 패키지 : https://github.com/wwer20001/wer-prog...

 

타임라인

0:03 스트리밍 레벨 기능 개요

0:40 리소스 임포트와 필요한 오브젝트 가져오기

1:28 씬 구조 살펴보기

2:32 스트리밍 씬 로드 트리거 만들기

3:02 스트리밍 씬 로드 기능 구현하기

4:30 트리거 세팅과 테스트

4:55 지나간 씬 언로드 기능 구현하기

6:09 지나간 씬이 언로드되고 캐릭터가 사라지는 문제 해결하기

7:05 다음 씬으로 완전히 넘어갔을 때 화면이 어두워지는 문제 해결하기

7:25 지나온 씬으로 다시 돌아가기 테스트

7:28 지나온 씬으로 돌아갈 때 캐릭터가 2개가 되는 문제 해결하기

8:01 스트리밍 레벨 기능 사용시 고려 사항1

8:38 스트리밍 레벨 기능 사용시 고려 사항2

반응형
반응형

 

유니티 엔진에서 차나 탈 것에 타고 내리는 기능을 만들어 봅시다!

 

차 모델 및 애니메이션 : https://github.com/wwer20001/wer-prog...

박스맨 모델 및 애니메이션 : https://github.com/wwer20001/wer-prog...

 

타임라인

0:22 리소스 임포트

0:33 비히클 시스템 설계

5:22 설계대로 클래스 생성

7:17 캐릭터 조작 기능 구현

9:36 차량 조작 기능 구현

12:00 차에 타기 기능 구현

14:56 차에서 내리기 기능 구현

반응형
반응형

 

마우스 입력 처리를 응용해서

1. 캐릭터가 마우스 위치를 쳐다보게 하는 기능

2. 클릭으로 투사체 발사 기능

3. 휠으로 줌 인/줌 아웃하는 기능

을 구현하는 방법을 알아봅시다.

 

응용 이전에 마우스 입력 처리에 대한 기본 방법은 링크를 통해서 배우실 수 있습니다.

반응형

+ Recent posts