2014년 8월 15일 금요일

[ Unity ] 파일 관련 함수 사용 후 에셋 갱신하기

데스크탑 플랫폼이 아닌 타 플랫폼의 개발을 진행하여도 대부분의 테스트는 데스크탑에서 진행하는 경우가 많습니다.

그런데 파일을 생성, 삭제, 수정 하는 작업을 하였을 때 에셋에 바로바로 적용이 되지 않는 경우가 있습니다.

지금 까지는 파일 관련 작업이 이루어 지고나면 Ctrl + R을 사용해서 직접 갱신을 하고 있었는데 찾아보니 목록을 바로 갱신시켜주는 함수가 있었네요.

파일 관련 함수 사용 후 위 함수를 호출하면 목록에 바로 반영이 됩니다.

2014년 7월 12일 토요일

[ Unity ] Android Admob 붙이기

Unity 프로젝트에 Admob 광고를 붙여보겠습니다.

이 글은 Google Mobile Ads Unity Plugin v2.1을 기준으로 작성되었습니다.


1. 패키지 다운로드
 아래 링크를 통하여 최신 라이브러리를 다운받습니다.
 다운로드


2. 패키지 Import
 다운로드 받은 패키지를 클릭하여 유니티 프로젝트에 추가해 줍니다.


3. 라이브러리 추가
 광고를 실행시키려면 구글 라이브러리가 필요합니다.
 안드로이드가 설치 된 폴더의 sdk\extras\google\google_play_services\libproject 경로로 이동하면, google-play-services_lib 폴더가 존재하는데 이 폴더를 import된 폴더의 Plugins/Android안에 복사해 줍니다.



4. 애드몹 광고 생성
 애드몹 사이트로 이동해 앱을 생성하시면 광고 단위 ID가 생성 됩니다.
 해당 ID를 기록해두세요.


5. 새로운 스크립트 생성 및 AndroidManifest 수정
 아래 스크립트에 4번에서 작성한 광고 ID를 입력해 줍니다.
 유니티에서 GameObject를 만들어 새로 생성한 스크립트를 컴포넌트로 추가해줍니다.

AndroidManifest에서 com.example.sampleapp으로 되어있는 패키지명을 자신의 프로젝트 패키지명으로 변경 해줍니다.


6. 해당 Plugin 기준으로 안드로이드 버전 3.2 이상부터 사용이 가능합니다.
프로젝트 세팅에서 빌드 버전을 3.2 이상으로 변경해주세요.


빌드 후 실행을하면 잠시 후 배너가 출력됩니다.


2014년 5월 20일 화요일

[ Android ] SQLite 사용 방법

이번 튜토리얼에서는 SQLite를 사용하는 방법을 알아보도록 하겠습니다.

SQLite는 사용 가능한 자료형은 아래와 같이 5가지만 지원 합니다.

1. NULL
2. INTEGER : 1, 2, 3, 4, 6, 8 bytes의 정수 값
3. REAL : 8bytes의 부동 소수점 값
4. TEXT : UTF-8, UTF-16BE, UTF-16LE 인코딩의 문자열
5. BLOB : 입력 된 그대로 저장

그럼 이제부터 SQLite 사용 방법에 대하여 하나씩 알아보도록 하겠습니다.

1. SQLiteOpenHelper를 상속받은 기본 구조
 DBManager라는 새로운 클래스를 생성하고 SQLite를 사용하기 위해서 SQLiteOpenHelper를 상속 받았습니다. 그리고 아래와 같이 필수로 작성되어야 하는 함수가 존재합니다.

 DBManager() 함수는 생성자로 DB 이름과 버전을 넘겨 받습니다.

 onCreate() 함수는 생성자에서 넘겨받은 이름과 버전의 데이터베이스가 존재하지 않을때 한번 호출 됩니다. 그렇기 때문에 새로운 데이터베이스를 생성할때 사용하기에 알맞습니다.

 onUpgrade() 함수는 데이터베이스가 존재하지만 버전이 다르면 호출 됩니다. 데이터베이스를 변경하고 싶을때 버전을 올려주고 새로운 작업을 해주면 됩니다.


2. 데이터베이스 생성
 새로운 데이터베이스를 생성하고 제대로 생성이 되었는지 확인해 보겠습니다. 단말기를 사용해서 확인을 하려면 루팅을 해야하고 에뮬레이터를 사용하면 명령프롬프트를 사용해서 확인을 할 수 있습니다. 여기서는 두 방법을 사용하지 않고 DB를 검색하여 데이터가 제대로 들어 갔는지 확인해보겠습니다.

먼저 DB가 존재하지 않을때 아래와 같은 FOOD_LIST 테이블을 생성하도록 하겠습니다.

 FOOD_LIST 라는 테이블에 정수형, 기본 키 그리고 자동으로 값이 증가하는 _id 컬럼과, Text형식의 name 컬럼, 정수형 price 컬럼으로 구성 되도록 만들었습니다.


3. 삽입, 삭제, 갱신, 선택
 Xml에 코드를 작성하여 버튼과 에디트 텍스트를 만들고 삽입, 삭제, 갱신, 선택을 해보도록 하겠습니다.

main.xml

 기본 생성 된 main.xml에 테이블에 입력시킬 name과 price를 입력받는 EditText 두개, 쿼리 실행 후 테이블 안의 내용을 출력 할 TextView하나 그리고 삽입, 삭제, 갱신, 선택을 실행 할 Button 4개로 구성하였습니다.


MainActivity.java

 main.xml에서 선언해 주었던 위젯들을 연결하고 각 버튼을 누를때 DBManager로 쿼리를 요청하도록 되어있습니다.
 마지막 select 쿼리는 DBManager에 테이블의 모든 요소를 가져오도록 만들었습니다.


DBManager.java

 가장 핵심적인 부분이라고 할 수 있겠습니다.
 소스를 보시면 insert(), update(), delete() 함수의 내용이 똑같이 생겼는데요. 원래는 DBManager 이 소스에서 쿼리를 작성하려고 했는데 MainActivity.java에 작성을 하다보니 함수의 내용이 똑같아져 버렸습니다. 이쪽에다가 쿼리를 작성해 주는게 더 좋겠죠.

getReadableDatabase() : 읽기 가능, 사용 후 close()로 종료
getWritableDatabase() : 읽기, 쓰기 가능, 사용 후 close()로 종료

PrintData()함수를 보시면 삽입, 삭제, 갱신 쿼리를 요청 할 때는 execSQL() 함수를 사용 하지만 선택을 할 때는 rawQuery() 함수를 사용 하여야 합니다. select 쿼리는 결과값을 받아야 하기 때문에요.
 Cursor로 결과값을 받아서 moveToNext() 함수로 null이 나올때 까지 하나씩 이동해가면서 결과값에 접근합니다.
 값을 가져올때는 테이블을 생성할 때 속성 순서대로 0 부터 생성 된 속성까지 얻어 올 수 있습니다.


Select
 - select * from 테이블명;
    테이블의 모든 속성과 값을 가져온다.

 - select 속성, 속성... from 테이블명;
    테이블에 선택한 속성의 값만 가져온다.

Insert
 - insert into 테이블명 values(속성, 속성...);
   테이블에 입력한 속성값으로 추가 한다. (속성의 순서가 일치해야 함)

Delete
 - delete from 테이블명 where 조건, 조건...;
   테이블에 조건이 일치하는 값을 삭제한다.

Update
 - update 테이블명 set 값, 값... where 조건, 조건...;
   테이블에 조건에 일치하는 속성의 값을 입력한 값으로 변경한다.

쿼리문에 조건은 콤마(,) 사용 시 여러 조건을 가질 수 있습니다.

기본적인 SQLite 사용방법 튜토리얼은 여기까지 입니다.

위 소스에는 예외처리가 안되어있습니다.






2014년 5월 13일 화요일

[ Unity ] NGUI 버튼 이벤트 동적 할당

이번에는 NGUI를 사용 할 때 자주 사용하는 UIButton 컴포넌트에 이벤트를 동적으로 추가시키는 방법을 알아보겠습니다.

대부분은 인스펙터 화면에서 이벤트를 연결해주지만 프리팹을 사용하게 되면 이벤트가 해제 된 상태로 생성이 됩니다. 그래서 동적으로 추가해야 할 일이 생기게 됩니다.

인스펙터 화면에서 m_BtnTest에 UIButton 컴포넌트를 연결시켜 주었다고 가정 합니다.

EventDelegate를 생성할때는 콜백 함수가 정의되어 있는 컴포넌트와 콜백 함수명을 입력해 주어야 합니다. 만약 ButtonTutorial이 아닌 다른 스크립트 상에 존재하는 함수를 호출하고 싶다면 해당 GameObject의 컴포넌트를 추가시켜주면 됩니다.

MakeParameter 함수는 파라메타를 여러개 추가시켜 줄 때를 대비해서 만들어 보았습니다. EventDelegate.Paramter를 생성하고 전달하고자 하는 값과, 해당 값의 타입을 입력해주면 됩니다. 여기서 Object는 UnityEngine.Object 입니다. System.object를 넣으면 작동하지 않습니다. 때문에 아직 int, string 같은 값을 어떻게 전달해야 되는지는 잘 모르겠네요.

마지막으로 파라메타를 추가시켜주었다면 이벤트를 등록해야 합니다. 이벤트를 추가 할 버튼의 onClick값과 생성 된 EventDelegate를 넣어주면 동적으로 할당하는 작업이 완료 됩니다.

씬을 실행하고 버튼을 클릭해보면 ButtonTutorial 스크립트 안에 존재하는 onBtnEvent함수가 정상적으로 호출 되는 것을 보실 수 있습니다. 만약 파라메타를 전달하고 싶지 않다면 중간에 이벤트 파라메타를 연결하지 않고 콜백 함수의 파라메타도 삭제해 주시면 됩니다.

System.object 변수를 UnityEngine.Object로 변환하는 방법을 찾으면 추가 포스팅 하도록 하겠습니다.



[ 2014. 05. 22 추가 ]

 NGUI, UIButton 이벤트를 스크립트로 작성시 GameObject가 아닌 다른 타입의 변수를 전달하는 방법을 추가로 알아냈습니다.

 기본 적으로는 추가 하기전 내용과 동일 합니다. 다만 파라메타 지정 시 컴포넌트와 필드명을 입력해주면 int, float, vector 등등 GameObject가 아닌 타입의 변수를 파라메타로 지정 할 수 있습니다.


2014년 5월 11일 일요일

[ Android ] ListView 사용 방법 및 커스텀

이번 튜토리얼은 ListView의 기본적인 사용 방법과 커스텀 방법에 대해 알아보겠습니다.

1. xml 수정하기
 ListView가 보여질 레이아웃의 xml에 ListView 위젯을 추가 합니다.


2. ListView 및 Adapter 설정
 어댑터를 생성하고 xml에 추가한 Listview에 어댑터를 연결하여 ListView가 동작 되도록 해보겠습니다.


여기 까지는 기본적인 리스트 뷰 사용방법 입니다.

이제 커스텀 하는 방법을 알아보도록 하겠습니다.



3. ListView에 출력 될 레이아웃 만들기
 원하는 모양의 아이템을 출력하기 위해서 새로운 xml파일을 생성하여 출력 될 모양을 만들어야 합니다.

여기서는 텍스트와 버튼이 출력 되도록 만들어 보겠습니다.

custom_item.xml 파일


4. 커스텀 어댑터 생성
 CustomAdapter 클래스를 생성하고 BaseAdapter 클래스를 상속 받습니다.
문자열을 보관 하기 위해 ArrayList<String> 를 사용하며, String 대신에 직접 만든 클래스를 추가하면 더욱 많은 정보를 가진 커스텀 아이템을 제작 할 수 있습니다.


5. ListView 및 Adapter 설정
 위 2번에서 했던 작업 입니다. 2번 소스와 비교해 보시면 어댑터 부분이 변경 된 것을 확인 하실 수 있습니다.

여기 까지 제작 하고 실행을 하면 각종 이벤트가 정상 작동 하는 것을 확인 하실 수 있습니다.

하지만, 어댑터에 아이템을 더 추가하여 스크롤이 되게 만들면 아이템 위치가 변경되 출력 되는게 보이실 겁니다.


6. Holder를 추가하여 데이터 변형 방지
 새로운 클래스를 하나 생성하여 getView()에서 홀더를 사용하면 스크롤 시 데이터가 변경 되는 것과 findViewById()를 사용을 줄여 향상 된 속도를 얻을 수 있습니다.

변경 된 부분의 소스는 아래와 같습니다.

 CustomHolder 라는 클래스가 하나 추가 되었으며 이 클래스는 아이템이 갖고 있는 요소를 저장 할 수 있도록 TextView와 Button을 갖고 있습니다.
그리고 getView() 함수에서는 convertView가 null 일 때 holder를 생성하여 holder에 TextView와 Button을 넣고 해당 View의 Tag로 지정을 합니다. 만약 convertView가 null이 아니라면 Tag를 가져와 저장해 놓았던 TextView와 Button을 빼내 나머지 처리를 하게 됩니다.

이상으로 ListView 사용 방법과 커스텀에 대한 튜토리얼을 마치도록 하겠습니다.



2014년 5월 7일 수요일

[ Android ] Fixed Tabs + Swipe 앱 만들기

이번 튜토리얼에서는 Fixed Tabs Swipe 앱을 만들어 보겠습니다.

Fixed Tabs + Swipe는 좌측과 같은 레이아웃 인데요.

상단의 메뉴를 터치하거나 화면을 터치하여 옆으로 드래그 해주면

설정 되어있는 액티비티로 전환이 됩니다.


































1. 프로젝트 생성하기

먼저 안드로이드 프로젝트를 새로 만들어 줍니다.


프로젝트 생성 시 주의할 부분이 있는데요. Fixed Tabs + Swipe 프로젝트를 생성하기 위해서는  Minimum Required SDK의 버전이 최소 11로 설정 되어야 합니다. 설정을 완료 하셨으면 아래 화면이 나올때 까지 Next를 눌러 줍니다.


위 화면에서 Navigation Type을 Fixed Tabs + Swipe로 선택하고 Finish를 누르시면 기본적인 프로젝트가 생성됩니다.


2. SectionPagerAdapter 클래스 보기
프로젝트가 이미 완성되어서 그대로 사용하셔도 상관없습니다.

SectionPagerAdapter 클래스를 보면 getItem() 함수에서 position을 받아 더미 클래스를 생성하고 TextView에 position 번호를 입력해 주고 있습니다.
position은 0부터 getCount()에서 받아오는 이전 값까지 나타냅니다.
getPageTitle() 함수도 position을 받아와 해당 Fragment 메뉴에 라벨을 입력하게 됩니다.


3. 새로운 클래스와 레이아웃 만들기
더미 클래스와 레이아웃을 대체할 새로운 클래스와 레이아웃을 만들어 보겠습니다.

Fragment_Menu1 이라는 클래스를 생성하고 Fragment를 상속 받았습니다.
그리고 onCreateView() 함수를 오버라이드 하였습니다.

해당 Fragment에서 보여질 레이아웃 xml 파일을 만들겠습니다.

TextView를 하나 추가하고 'fragment main 1'이라는 문구를 출력하게 하였습니다.

두 파일을 만들었으니 생성한 클래스에서 레이아웃 파일을 연결해 보겠습니다.

Fragment_Menu1 클래스의 onCreateView() 함수에서 방금 생성한 fragment_main_1.xml 레이아웃을 연결하였습니다.

동일한 방법으로 클래스 이름과 레이아웃 이름, 그리고 레이아웃에서의 텍스트 내용을 숫자만 증가시켜 4개를 만들었습니다.




4. 메인 액티비티의 SectionPagerAdapter 수정

마지막으로 MainActivity에 존재하는 SectionPagerAdapter를 수정하겠습니다.
getItem()함수에는 position에 따라 3번에서 만들어준 클래스를 리턴해 주겠습니다.
getCount()는 총 4개의 메뉴를 생성 할 것이므로 기존 3의 값에서 4로 변경하였습니다.
getPageTitle()에서는 values -> styles.xml파일을 수정하여 텍스트를 하나 추가시켰습니다.

이제 빌드 후 실행을 시켜보면 완성 된 모습을 보실 수 있습니다.

다음 튜토리얼에서는 이번 튜토리얼에 이어서 ListView를 추가해 보도록 하겠습니다.


2014년 5월 4일 일요일

블로그 스팟에 SyntaxHighlighter 적용하기 - 2

블로그 스팟에 SyntaxHighlighter를 적용하고 코드를 입력해 보았더니 한가지 문제가 생겼습니다.

코드에 공백을 스페이스가 아닌 탭을 사용했다면 공백 한칸으로 처리 되어 출력이 됩니다.

개인적으로 코드를 짤때 탭을 이용하는지라 해당 소스를 그대로 올리면 가독성이 문제가 생겨서 이리저리 방법을 찾아보았지만

해결 방법을 찾지 못하였습니다.

그래서 결국 C#을 이용해 탭을 공백으로 변경해주는 간단한 프로그램을 하나 만들어 소스의 탭을 공백으로 변경시켜 올리기로 했습니다.

일단 블로그 스팟에 탭을 사용한 코드를 그대로 올리면 어떻게 되는지 먼저 보시죠.

- GUIText[]와 m_Label사이에 탭 1번 사용
- m_Label과 주석 사이에 탭 3번 사용
- float과 m_During 사이에 탭 2번
- m_During과 주석 사이에 탭 1번 사용

중간중간 탭을 사용하였지만 탭 수만큼 공백이 생기면서 정리가 안됩니다.

탭을 스페이스를 이용한 공백으로 변경해서 올려보겠습니다.

이제 가독성이 좋아졌습니다.


탭을 공백으로 변경해주는 프로그램을 만들어 보겠습니다.

먼저, 탭의 원리를 알아보겠습니다.

위 숫자들의 빈 공간은 탭을 사용해 공간을 확보한 부분입니다.

어느 위치에서 탭을 하더라도 지정 된 크기(여기서는 4칸)의 가장 가까운 곳으로 이동하게 됩니다.

1. 폼 제작

폼에 사용 된 위젯은 TextBox 2개와 Button 1개 입니다.
textBoxBefore : 좌측 TextBox
textBoxAfter    : 우측 TextBox



2. 코드 입력


3. 사용
좌측에 탭이 사용 된 코드를 넣고 버튼을 누르면 우측에 스페이스로 변경 된 코드가 출력 됩니다.


HTML을 이용하면 효과적인 방법이 있을것 같은데요 아시는분은 가르쳐주세요 ㅠㅠ

2014년 5월 2일 금요일

[ Unity ] 롤링되는 숫자 만들기

글 제목을 어떤 것으로 해야 될지 어렵네요...

이번 Unity3D 튜토리얼 에서는 일정 시간 동안 숫자가 롤링되며 원하는 값으로 변하는 것을 만들어 보겠습니다.

예를 들면 '0 이란 숫자에서 100 이라는 숫자로 변하는데 5초의 시간이 걸렸으면 좋겠다.' 한다면 1초당 20씩 증가하게 될 테고 0.1초당 2씩 증가하게 되겠습니다.

글로 설명하는 것 보다는 눈으로 확인하는 것이 더 좋을듯한데 차후에 샘플을 제작하여 올려보겠습니다.

그럼, 소스 코드 공개로 시작하겠습니다.

주석을 보시면 어떻게 동작되는지 어느정도 감이 오실겁니다.

코드에 대한 설명을 조금하자면...

Unity 하이라이키 탭에서 GameObject를 생성하시고 해당 소스를 컴포넌트로 추가하면 GUIText와 float 타입의 시간을 입력 할 수 있는 칸이 인스펙터상에서 출력이 됩니다.
원하는 라벨만큼 GUIText와 연결을 해주시고 숫자가 롤링 될 시간을 입력하시면 됩니다.
float[] m_fValue의 경우에는 현재 값을 저장하는 용도로 인스펙터에는 출력되지 않습니다.
NGUI를 사용하신다면 GUIText를 UILabel로 변경해 주시기만하면 사용이 가능합니다.



초기화 부분 입니다. 인스펙터에서 연결한 라벨만큼 저장공간을 생성하는 단순한 부분입니다.


값을 초기화 하는 부분으로 외부 스크립트에서 접근이 가능하도록 public으로 선언되어 있습니다.
_pos의 경우에는 라벨 index번호와 일치하게 전달이 되어야 합니다.
해당 함수로 값을 입력시 롤링이 되지 않고 값이 바로 적용 됩니다.


외부 스크립트에서 롤링 시키며 값을 변경할 라벨 index와 값을 전달받아 해당 값을 저장 및 코루틴을 실행하여 롤링을 시작시킵니다.


가장 핵심적인 코루틴 입니다.
현재 값, 최종 값, 이동 할 거리등을 알아내어 입력 된 시간(m_During)동안 롤링을 시키면서 값을 자연스럽게 변화시킵니다.


위 코루틴에서 시작 값, 최종 값, 이동할 거리를 전달받아 각종 예외처리를 거처 이동시킨 값을 리턴하는 부분입니다.



원본 소스에는 시간으로 이동시키는 코드 이외에 프레임을 기준으로 이동시키는 코드가 있었지만 정리가 제대로 되지 않은 관계로 시간으로 동작하는 부분만을 공개합니다.

동작 테스트는 여러번 해보았지만 잘못되거나 비효율적인 부분이 있을 수 있습니다.
그런 부분이 보이시면 말씀부탁드리겠습니다!

2014년 4월 29일 화요일

블로그 스팟에 SyntaxHighlighter 적용하기


소스 코드를 보기 좋게 하기위해 SyntaxHighlighter를 설치해 보겠습니다.


1. 구글 블로그 템플릿 수정


템플릿 -> HTML 편집 버튼을 눌러 코드를 수정하겠습니다.

와 head 와 head 사이에 위와 같이 script를 추가해 줍니다.

타 블로그의 경우에는 Syntax Highlighter을 적용하기 위해서 파일을 업로드 해야 하지만

구글 블로그의 경우에는 파일 업로드가 제한적이기 때문에 링크로 대체하였습니다.

저는 제가 사용 할 것 같은 brush 파일과 테마 파일만 링크로 연결했습니다.


그리고 body 부분을 찾아 아래 코드를 입력해 줍니다.

위 코드는 textarea를 사용해서 코드를 입력하기 위한 방법입니다.

코드를 입력할 때는 pre 태그와 textarea 태그를 사용 할 수 있는데요.

pre 태그를 사용 할 경우 꺽쇠( <, > ) 사용 시 코드가 깨지는 현상이 발생합니다.


3. 코드 입력 방법 알아보기

마지막으로 포스팅을 할 때 textarea 태그를 사용해서 코드를 입력하는 방법을 알아보겠습니다.

글쓰기 모드에서 좌측 상단의 HTML 버튼을 누르면 HTML편집창으로 변환됩니다.

여기에 아래와 같은 방법으로 코드를 입력 시킬 수 있습니다.

태그가 중복으로 사용이 안되 꺽쇠를 하나씩 빼고 적었습니다. ㅠㅠ

사용 가능한 언어는 아래 이미지를 참고 하시면 됩니다.


Post List