2016년 9월 30일 금요일

아두니티 PlayMaker Add-on

아두니티는 PlayMaker를 완벽하게 지원합니다.
PlayMaker는 C# 프로그래밍을 배우기 어려워하는 사람들에게 인기가 많은 Visual 프로그래밍 도구입니다.
아두니티는 전문 기술이 없는 메이커를 주 사용자로 보고있기 때문에 PlayMaker를 이용해서 아두니티를 제어하는 것을 지원하고 있습니다.
PlayMaker에서 아두니티를 제어하려면 먼저 아두니티 PlayMaker Add-on을 설치해야 합니다.
PlayMaker Add-on 설치 메뉴

아두니티 PlayMaker Add-on을 설치하려면 반드시 PlayMaker가 이미 Import되어야 합니다. 만약, 갖고있지 않은 분들은 먼저 에셋 스토어에서 PlayMaker를 구매해야 합니다.
PlayMaker Add-on이 추가되는 모습

PlayMaker Add-on이 설치되고 나면 다음과 같은 것이 생기게 됩니다.
  • 에셋 폴더에 PlayMaker가 생긴다.
  • PlayMaker 관련 기능을 추가할 수 있는 메뉴가 생긴다.
  • PlayMaker Action Browser에 ARDUnity 카테고리가 생긴다.
ARDUnity Asset 폴더에 PlayMaker가 생긴다.

PlayMaker 관련 기능을 추가할 수 있다.

PlayMaker Action에 ARDUnity 카테고리가 생긴다.

이렇게 된다면 아두니티에서 PlayMaker를 사용할 수 있는 준비가 끝납니다.
만약, PlayMaker가 없는 상태에서 PlayMaker Add-on을 설치했다면 에러가 발생하게 되는데, 이를 해결하려면 ARDUnity/PlayMaker 폴더를 삭제하면 됩니다.

PlayMaker Action은 FSM Logic내에서 기능을 수행하기 위해 사용합니다. 만약, FSM Logic내에서 아두니티를 제어하려면 ARDUnity Action을 사용하면 됩니다.

PlayMaker에서 Event는 Transition을 발생시키기 위해 사용합니다.
PlayMaker Action이 출력을 위해 사용된다면 Event는 입력을 위해 사용된다고 생각할 수 있습니다.
그렇다면 아두이노 보드에서 일어나는 일을 PlayMaker Event로 받기 위해서는 어떻게 해야 할까요?
PlayMaker Editor에서 Event를 만들수는 있지만, Event를 발생시킬 수는 없습니다. 이 말은 PlayMaker Event를 발생시킬 수 있는 무언가가 필요하다는 뜻입니다.

아두니티에서 일어나는 일을 PlayMaker에 알려줄 수 있는 Event를 발생시키는 컴포넌트가 바로 Proxy입니다. Proxy란 말은 어떤 것을 감시하여 알려준다는 의미를 갖고 있습니다.
ARDUnity Proxy 추가 메뉴

각 Proxy들은 감시 대상이 필요한데, 모든 대상이 아닌 특정 대상만 감시하게 됩니다.
예를 들어 DigitalInputProxy는 DigitalInput의 이름을 가진 ARDUnity 컴포넌트를 감시한다는 것입니다.
아두이노 회로에서 버튼이 눌리면 PlayMaker Event가 발생하는 예제를 직접 만들면서 Proxy 사용법을 알려드리겠습니다.
먼저, 버튼 제어에 사용되는 DigitalInput을 찾아 GameObject를 선택합니다. 이때 Proxy 추가 메뉴를 보면 DigitalInputProxy가 활성화된 것을 볼 수 있습니다.
Proxy를 추가하려면 먼저 감시할 대상이 추가되어 있어야 한다.

DigitalInputProxy를 추가하면 Inspector Window에 컴포넌트가 추가된 것을 볼 수 있습니다.
Proxy가 추가된 모습

만약, Proxy의 감시 대상이 없어진다면 에러가 표시되고 더 이상 Proxy역할을 할 수 없게 됩니다.
Proxy는 감시 대상이 없다면 에러가 출력된다.

Proxy의 역할을 대상을 감시하고 PlayMaker Event를 발생시키는 만큼 EventTarget 설정이 필요합니다. EventTarget이란 발생시킬 Event를 갖고 있는 PlayMaker FSM을 의미합니다.
만약, EventTarget이 지정되지 않는다면 Proxy는 Scene내의 모든 FSM에서 Event를 발생시키게 됩니다.
특정 FSM에서만 Event를 발생시키려면 해당되는 FSM이 포함된 GameObject를 지정해야 합니다.
Proxy에서 EventTarget을 지정할 수 있다.

먼저, FSM이 포함된 GameObject가 선택되었다면 그 GameObject에 속해있는 FSM 리스트 중에서 다시 선택할 수 있습니다.
"Included All FSM"의 의미는 선택한 GameObject내에 있는 모든 FSM에서 Event가 발생한다는 뜻입니다.

EventTarget이 설정되었다면, 다음으로는 Event 이름을 정해야 합니다.
각 Proxy에는 발생시킬 수 있는 Event가 이미 정해져있으며 기본 이름 값을 가지고 있습니다. 같은 Proxy를 여러 개 사용하는 경우 Event 이름이 중복될 수 있으므로 Event 이름을 바꿀 수 있습니다.
Proxy에 있는 Event 이름은 설정한 EventTarget에 그대로 전달됩니다.
하지만, 정작 Event를 받는 FSM은 그 이름을 알지 못하기 때문에 반드시 Proxy에 있는 Event 이름을 추가해줘야 합니다.
Proxy의 Event이름과 FSM의 Event이름은 같아야 한다.
 
이렇게 Event가 추가되면 Transition을 사용할 수 있도록 메뉴가 생기게 됩니다.
추가한 Event가 Transition에 메뉴로 나타난다.

이로써 FSM에 Proxy가 사용하는 Event에 반응할 수 있는 Transition이 만들어집니다.
이렇게되면 아두이노 버튼이 눌리면 -> DigitalInput의 값이 변경되고 -> DigitalInputProxy가 이를 감지하여 Event를 FSM에 보내고 -> FSM에서는 발생한 Event를 사용하는 Transition이 일어나서 반응하게 되는 것입니다.
하드웨어 반응에 따른 동작을 쉽게 구현할 수 있다.

향후, 실제 예제를 통해 아두니티에서 PlayMaker를 활용하는 방법을 보여드리도록 하겠습니다.


유니티 안드로이드 빌드

이번 포스트에서는 유니티에서 안드로이드 앱을 빌드하는 과정을 자세히 다루겠습니다.
유니티에서 안드로이드 앱을 만들고 싶다면 제일 먼저 해야 할일은 Android Studio를 설치하는 것입니다.
(구글 Android Studio 다운로드 바로가기)
Android Studio는 안드로이드 앱을 개발하는 도구이다.

Android Studio를 설치하다보면 Java SDK를 설치해야 한다는 안내가 나옵니다. 반드시 필요한 것이니 설치하기 바랍니다.
Java SDK를 설치하기 위해 오라클 사이트로 가면 당황스럽게 되는데, 그 이유는 Java SDK라는 말이 안보이기때문에 뭘 설치해야 할 지 막막해집니다.
Java SE 혹은 JDK라고 부르는 것이 그것이니 자신의 OS에 맞는 것을 선택하여 최신 버전을 설치하시면 됩니다.
Android Studio를 설치하기 위해서는 Java SDK 설치가 필요하다.

여기서 잠깐 SDK라는 것에 대해서 설명하겠습니다. SDK는 Software Development Kit의 약자로 쉽게 말해서 소프트웨어를 보다 쉽게 만들 수 있게 만들어주는 프로그램 재료입니다.
안드로이드는 Java를 기반으로 만들었기 때문에 Java SDK가 필요한 것이며 안드로이드 앱을 만들기 위해서는 Android SDK가 필요한데, Android Studio에 포함되어 있습니다.

Android Studio와 Java SDK 설치가 완료되었다면 유니티에게 이것을 알려줘야 합니다.
유니티 메뉴에서 Preference를 선택하고, External Tool 탭을 선택하면 이것을 설정할 수 있습니다.
SDK는 Android SDK 경로를 의미한다.
JDK는 Java SDK 경로를 의미한다.

JDK 경로 설정은 자동으로 잡히기 때문에 문제가 없지만, Android SDK 경로는 찾을 수가 없어서 당황할 것입니다.
Android SDK 경로를 알기 위해서는 Android Studio를 실행하고 SDK Manager를 선택해야 합니다.
Android Studio 시작화면에서 Configure를 선택한다.

SDK Manager 메뉴를 찾을 수 있다.

SDK Manager를 실행하면 SDK 경로를 알 수 있으니 이것을 Copy하여 유니티에서 설정하면 됩니다.
SDK Manager에서 SDK Path를 찾을 수 있다.

여기까지 했다면, 유니티에서 안드로이드 앱을 만들기 위한 준비는 끝난 것입니다.
이제 실제로 안드로이드 앱을 만드는 과정을 설명하겠습니다.
우선, 유니티 Build Setting 메뉴를 이용해서 현재 플랫폼을 안드로이드로 변경합니다.
현재 플랫폼을 안드로이드로 변경합니다.

Build 버튼을 누르기 전에 몇 가지 설정해야 할 것이 있으므로 Player Settings를 선택하고 Inspector 윈도우에 나타난 메뉴를 봅니다.
Player Setting에서 안드로이드 앱을 위한 설정을 해야 한다.

스마트 폰의 화면 방향 설정
안드로이드 앱이 어떤 화면에서 실행할 지 결정해야 합니다. 유니티는 화면 자동 회전을 지원합니다.
  • Portrait: 세로 방향 보기
  • Landscape: 가로 방향 보기


앱의 고유 식별자 설정
안드로이드 앱에는 앱을 구별할 수 있도록 고유한 식별자가 있습니다. 여러분의 앱도 이것이 필요하므로 설정해야 합니다.
안드로이드 앱의 고유 식별자 정보

Bundle Identifier가 그것이며 이것을 설정하기 위해서는 반드시 다음 규칙을 지켜야 합니다.
  • com.[회사명].[프로그램 명]
  • 예를 들어 ABC회사의 CDE 프로그램이라면 com.ABC.CDE라 쓰면 됩니다.
  • 대소문자를 구분하며 제일 앞의 com.은 절대로 변경하면 안됩니다.
Bundle Version은 버전을 표기하기 위함이고 Bundle Version Code는 향후 앱 업그레이드를 위한 것이니 현재는 모두 1.0과 1로 설정하면 됩니다.

Android SDK 버전
여러분은 안드로이드 아이스크림, 젤리빈 등의 명칭을 들어본 적이 있을 것입니다. 이것은 안드로이드 버전을 의미하며 특이하게도 안드로이드는 주요 버전을 알파벳으로 표기하고 각 알파벳으로 시작하는 명사로 이름을 붙였습니다.
안드로이드는 버전별로 알파벳을 붙인다.

안드로이드 앱을 만들기 위해서는 이 앱이 실행하기 위한 버전을 명시해줘야 합니다. 안드로이드 각 버전은 하위 호환성을 가지기때문에 최소 버전만 설정하면 상위 버전에서는 호환이 됩니다.
유니티에서는 Minimum API Level이란 이름으로 실행할 수 있는 최소 버전을 설정하게 됩니다.
하지만, 여러분이 주의해야 할 점은 Android Studio에도 앱이 실행할 안드로이드 버전의 SDK가 반드시 있어야 한다는 것입니다.
즉, 안드로이드 4.0을 최소 버전으로 한다면 Android Studio에는 SDK 4.0부터 최신 버전까지 설치되어 있어야 한다는 것입니다.
이것을 확인하려면 다시 Android Studio를 실행하고 SDK Manager를 실행해야 합니다.
SDK Manager에서 SDK를 버전 별로 설치할 수 있다.

만든 앱을 실행할 기기에서 안드로이드 버전을 확인하여 적절한 SDK 버전을 확보해야 합니다.
핸드폰에서 안드로이드 버전을 확인할 수 있다.

위에서 언급한 설정을 모두 마쳤다면 이제 앱을 만들 수 있습니다.
유니티 Build Setting에서 Build 버튼을 누르면 만들어진 앱 설치 파일(APK 파일)을 저장할 경로를 선택하게 되고 유니티는 설치 파일을 만들기 시작합니다.
(Build 결과물 저장 시 절대로 Assets 폴더 안에 만들 지 않아야 합니다.)
빌드가 성공적으로 수행된다면 APK파일이 만들어집니다. APK파일은 안드로이드 앱 설치 파일로써 안드로이드 기기에 이 파일을 옮겨서 실행하면 앱이 설치되게 됩니다.
확장자가 apk인 파일은 안드로이드 앱 설치 파일이다.

핸드폰에 APK파일을 옮기는 방법은 여러가지가 있겠지만, 가장 일반적인 것은 데이터 케이블을 연결하여 파일을 복사하는 것입니다.
APK파일을 옮기기 위해 PC와 연결한다.

현재는 테스트이기 때문에 이와 같은 방법으로 안드로이드 기기에 APK파일을 옮기지만, 향후 구글 Play Store에 올린다면 온라인을 통해 설치할 수 있습니다.
구글 플레이 스토어

스마트 폰으로 옮긴 APK파일은 스마트 폰의 파일 탐색기를 통해 찾을 수 있으며, 실행하면 앱이 설치됩니다.
옮긴 APK파일은 안드로이드에서 탐색기를 통해 찾을 수 있다.

APK파일을 실행하면 아마 대부분은 출처를 알 수 없는 앱이라는 경고가 나올 것입니다. 안드로이드는 보안을 이유로 APK파일을 수동으로 설치하는 것을 막아놓았습니다. 따라서, 여러분은 테스트를 위해 이 옵션을 꺼 놓아야 합니다.
APK 수동 설치시 경고 메시지가 출력된다.

문제 없이 설치되었다면 유니티 마크의 앱 아이콘을 확인할 수 있고, 이것을 실행하면 여러분이 Build Setting에서 포함시킨 Scene이 나타납니다.
(앱 아이콘은 Player Setting에서 바꿀 수 있습니다.)
Unity 시작 화면과 함께 만든 앱이 실행됩니다.

아두니티용 안드로이드 앱은 블루투스 통신을 사용해야 하므로 몇 가지 설정해야 할 것이 있으며 이것에 대해 나중에 다루겠습니다.



2016년 9월 19일 월요일

유니티 UI

유니티 UI는 GUI(Graphic User Interface)를 만들기 위한 특별한 기능입니다.

GUI란 사용자가 App을 조작하기 위한 메뉴를 의미합니다. 원래 UI(User Interface)는 전자 장치를 조작하기 위한 다양한 기능에서 출발했습니다.
하드웨어 UI의 예

GUI란 말은 원래 컴퓨터를 일반인들도 쉽게 다룰 수 있도록 만들기 위해 노력한 스티브 잡스가 고안한 개념입니다. 하드웨어 UI를 화면에 그래픽으로 표현함으로써 컴퓨터를 마치 기존의 전자 장치처럼 쓸 수 있도록 만드는 것이 GUI의 목표였습니다.
GUI의 디자인은 하드웨어 UI와 유사하다.

GUI는 점차 하드웨어로는 표현할 수 없는 다양한 조작 방식을 보여주며 독자적으로 발전되어 왔습니다.
GUI는 점차 발전되고 있습니다.

이제 소프트웨어 개발에 있어서 사용자 조작을 위한 GUI는 빠질 수 없는 개념이기에 유니티에서도 GUI 개발을 위한 기능을 제공하며 이것을 유니티 UI 혹은 UGUI라 부릅니다.

유니티에서 UI를 만들기 위해서는 Canvas라 부르는 특별한 컴포넌트를 사용해야 합니다. Canvas는 UI가 보여질 화면을 뜻하며, 이곳에 다양한 GUI 요소를 올려놓음으로써 디자인 할 수 있습니다.
유니티 UI 디자인 모습

UI는 2D이므로 Scene에서 2D 모드로 설정하고 편집하는 것이 좋습니다.
Canvas는 다음과 같은 기능을 지원합니다.

오버레이(Overlay) 방식 지원
GUI는 사용자를 위한 조작 메뉴이므로 항상 제일 앞에 놓여져야 합니다. 오버레이는 UI가 다른 어떤 것보다도 우선적으로 위에 놓여지게 하는 방식을 의미합니다.
GUI는 언제든 조작이 가능하도록 앞에 있어야 한다.

다양한 화면 크기에 대응
소프트웨어가 보이는 화면은 기기마다 다릅니다. 그 화면의 크기는 해상도가 될 수도 있고, 실제 디스플레이 장치의 크기가 될 수도 있습니다.
기기마다 화면의 크기는 다르다.

이 기능은 하나의 GUI 디자인으로 여러 기기의 화면에 대응하여 사용자에게 항상 같은 UI를 보여주는데 유리합니다.

3D GUI
유니티는 3D 디자인 도구이므로 당연히 GUI도 3D로 보여주는 것이 가능합니다.
3D GUI는 2가지 방식을 생각할 수 있는데, 첫번째는 회전에 의해 비스듬하게 보여지는 것입니다.
이제 GUI는 평면이 아닌 3D 공간으로 표현된다.

다음 방식으로는 3D 물체에 부착되어 사용자가 공간속에서 GUI를 보게되는 것입니다.
사용자가 공간을 돌아다니며 GUI를 조작할 수 있다.


유니티 UI에서 기본으로 제공하는 GUI요소는 다음과 같습니다.

Label
라벨은 텍스트를 표현하는 기본적인 GUI 중 하나입니다.

텍스트의 다양한 효과를 위해 폰트 지정, 글자 크기, 글자 색, 볼드/이탤릭 체 등의 기능을 지원하고 배치와 관련된 왼쪽/가운데/오른쪽 정렬 등도 가능합니다.

Image
GUI에서 아이콘과 같은 이미지를 보여주는 것은 기본적인 기능입니다.
PNG포맷 이미지를 이용해서 투명 배경을 사용하면 매우 깔끔하게 이미지를 보여줄 수 있습니다. 이미지에 색상을 입힐 수 있기 때문에 흑백 이미지를 사용한다면 하나의 이미지로 여러 이미지 효과를 줄 수 있습니다.
이미지를 이용하면 GUI를 멋있게 표현할 수 있다.

Button
버튼은 사용자가 조작할 수 있는 기본적인 GUI중 하나입니다.
이것은 Label과 Image를 조합하여 사용하기 때문에 이미지를 바꾸거나 폰트를 이용해서 다양한 디자인을 표현할 수 있습니다.
GUI 버튼의 예

Toggle
토글은 On/Off 상태를 전환할 수 있는 GUI입니다.
토글방식 GUI의 예

Slider
슬라이더는 값의 크기를 조절하는데 많이 사용되는 GUI입니다. 오디오 볼륨을 조절할 때 슬라이더 GUI가 주로 사용됩니다.
슬라이더 방식 GUI

슬라이더 GUI는 조금만 응용하면 다양한 모양으로 표현할 수 있습니다.
슬라이더 GUI는 다이얼 형태로 표현할 수 있다.

Dropdown
드롭다운 GUI는 옵션을 설정할 때 많이 사용합니다. 적은 공간에 여러 정보를 표현할 수 있다는 장점이 있습니다.
드롭다운 GUI

이 외에도 다양한 GUI 요소를 유니티 UI를 이용해서 표현할 수 있습니다. 다만, 기본으로 제공하는 것이 아니기에 조합을 통해 응용하거나 에셋 스토어에서 만들어놓은 것을 사용하면 더 훌륭한 디자인의 GUI를 표현할 수 있습니다.
대부분 멋있는 UI는 기본 GUI를 응용한 것입니다.


마지막으로 유니티 UI에서 제공하는 유용한 기능을 소개하겠습니다. 그것은 바로 유니티 이벤트(Unity Event)입니다.
GUI는 사용자와 상호작용해야 하므로 사용자 조작에 대한 반응을 구현해야 합니다. 문제는 이런 GUI 상호작용을 위해 프로그래밍을 해야 하기에 초보자들은 어려울 수 밖에 없습니다.
유니티는 GUI 상호작용 구현에 어려움을 겪는 초보자들을 위해 유니티 이벤트 기능을 만들었습니다.
유니티 이벤트는 Inspector Window에서 볼 수 있으며 유니티 UI관련 컴포넌트가 유니티 이벤트를 가지고 있습니다.
유니티 이벤트 메뉴

유니티 이벤트를 사용하면 해당 GUI에서 발생하는 이벤트에서 지정한 기능을 수행할 수 있습니다. 이 과정은 코딩없이 Inspector Window에 컴포넌트를 드래그하고 실행할 기능을 고르는 것으로 쉽게 해결할 수 있습니다.
유니티 이벤트를 적절히 사용하면 디자인한 GUI가 사용자와 상호작용하는 결과물을 얻을 수 있습니다.