카테고리 보관물: 미분류

CentOS minimal을 virtualBox에 설치하기

게임서버가 aws lambda의 python을 사용하고 있어서 관련 환경을 맞춰주려고 virtualbox에 centos 7을 설치해봤습니다.

아래의 링크에서 minimal버전을 다운로드 받습니다. minimal을 다운로드 받으면 terminal만 보이는 최소한의 버전이 설치됩니다.

그런데 다운로드 받는 경로에 따라서 yum repository의 주소가 달라지는것 같아요. Kaist링크 것을 다운로드 받는걸 추천합니다.

https://www.centos.org/download/

VirtualBox에서 새로 만들기를 눌러서 이름에 CentOS 7이라고 적어줍니다. 이렇게 하니까 기본적으로 어느정도 설정을 알아서 해줍니다.

적당히 다음다음 눌러서 다운로드 받은 ISO 파일을 설정해서 Install CentOS 7 메뉴를 선택해 줍니다.

 

설치가 끝나면 다음 명령을 실행해 주니 알아서 repository 갱신까지 하는 것 같아요.

sudo yum update

sudo yum upgrade

 

neovim에 YouCompleteMe 설치하기

우선 Vundle을 설치합니다.

mkdir -p ~/.config/nvim/bundle
git clone https://github.com/VundleVim/Vundle.vim.git ~/.config/nvim/bundle/Vundle.vim

Neovim은 pip를 사용하여 설치해 줍니다.

pip install neovim

~/.config/nvim/init.vim 파일을 생성하여 아래와 같이 내용을 작성합니다.

set nocompatible
filetype off

set rtp+=~/.config/nvim/bundle/Vundle.vim
call vundle#begin('~/.config/nvim/bundle')

Plugin 'VundleVim/Vundle.vim'
Plugin 'Valloric/YouCompleteMe'

call vundle#end()

nvim을 재시작 후 :Plugininstall 명령을 입력해줍니다.

설치가 종료되면 다시 nvim을 재시작할 때 오류가 발생하지 않으면 되는데 아마 다음과 같은 오류가 발생할 수도 있습니다.

YouCompleteMe unavailable: requires Vim compiled with Python 2.x support

이 경우에는 다음과 같이 neovim을 upgrade 해 주면 실행이 됩니다.

sudo pip2 install --upgrade neovim

 

[Photoshop] 이미지를 쪼개서 png로 저장하는 스크립트

현재 제작중인 '마왕의 책'에서 배경을 커다락 블럭으로 만들어서 조합해서 사용하고 있습니다.

그러다보니 배경을 패턴에 맞춰서 그린 후 그것을 일정 간격으로 잘라서 저장해야 합니다.

그런데 매번 PSD 파일에서 일정 간격을 Crop해서 저장하는 과정이 너무나도 번거롭기 때문에 자동화 해보기로 했습니다.

Photoshop에는 photoshop script를 이용한 자동화가 가능합니다.
이 스크립트로는 아주 많은 기능을 구현할 수 있습니다.

기본적으로 이번에 작성한 스크립트는 아래와 같이 단순합니다.

function main() {
    if( app.documents.length == 0 ) {
        alert("This script requires that there are open document to run.");
    } else {
        var outputFolder = Folder.selectDialog ("Select a folder for the output files");
        if( outputFolder == null ) {
            alert("You have to select output folder.");
            return;
        }
        var cropWidth = parseInt(prompt("Input crop width", "100", "Input width"));
        
        var docOriginName = app.activeDocument.name + "";
        var docWidth = app.activeDocument.width.value;
        for(var offset = 0 ; offset < docWidth ;  offset += cropWidth ) {
            var docOrigin = app.documents.getByName (docOriginName);
            app.activeDocument = docOrigin;
            $.writeln (docOrigin.name);
            //$.sleep(1000);
            var doc = docOrigin.duplicate();
            var width = cropWidth;
            if( docWidth - offset < cropWidth )
                width = docWidth - offset;
            var bound = [offset, 0, offset + width, docOrigin.height.value];
            doc.crop(bound);
            var pngOptions = new PNGSaveOptions();
            pngOptions.compression = 0
            pngOptions.interlaced = false
            doc.saveAs( File( outputFolder + "/" + docOrigin.name + "_split" + offset / cropWidth + ".png"), pngOptions, false);
            doc.close();
        }
    }
}

main();

내부 코드를 단계별로 나눠서 설명하겠습니다.
스크립트 레퍼런스는 아래 링크에 있습니다.
http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/cs6/Photoshop-CS6-JavaScript-Ref.pdf

 

app.documents
이 부분은 현재 Photoshop에 열려있는 이미지들을 말합니다.
app.documents.length == 0 으로 체크하는 것은 열려 있는 파일이 하나도 없는 경우를 말합니다.
쪼개려는 이미지가 있어야 스크립트가 실행가능하기 때문에 현재 열려있는 이미지가 있는지 확인해 줍니다.

alert("Hello world!!");
이 함수는 Photoshop에서 메시지 박스를 출력합니다.

 

Folder.selectDialog("message");
이 함수는 폴더선택창을 열어줍니다.
쪼갠 이미지를 저장하기 위한 폴더를 선택합니다.

prompt("message", "default value", "title");
이 함수는 값을 입력받기 위한 입력박스를 열어줍니다.
입력받는 문자열값을 숫자로 처리하기 위해서 parseInt 함수를 사용합니다.

app.activeDocument
이 속성은 현재 활성화된 이미지를 말합니다.
쪼개려는 이미지 윈도우를 활성화 시킨 상태에서 실행하면 됩니다.
app.activeDocument.name은 이미지의 이름을 말합니다.
아래 이미지에서 화살표로 표시된 부분에 '농장컨셉이미지.jpg' 가 이름입니다.

document는 직역하면 문서지만 Photoshop에서는 이미지를 말합니다.
document.width, document.height는 이미지의 크기이며 타입은 UnitValue입니다.

UnitValue는 여러가지 단위를 표현하기 위한 객체입니다.
var length = new UnitValue(100, "px"); //100 pixels
new UnitValue(100, "in"); // 100 inches

위와 같이 다양한 길이 단위를 표현할 수 있습니다.
기본적으로는 pixel단위를 사용하는 듯 합니다.

document.duplicate(["name"], [true/false]);
이 함수는 document 이미지를 복제해서 새로운 이미지를 만듧니다.
이때 별도로 두번째 파라메터를 정하지 않으면 모든 layer가 합쳐진 이미지가 생성됩니다.

document.crop( bounds, [rotation], [width], [height]);
이 함수는 말 그대로 이미지를 crop해줍니다.
var bounds = [left x, left y, right x, right y];
document.crop(bounds);
이렇게 호출해 주면 해당 영역만 남기고 이미지를 잘라냅니다.

PNGSaveOptions는 PNG로 저장하기 위한 저장옵션을 설정합니다.

doc.saveAs는 말 그대로 이미지를 저장하기위한 함수이고
doc.close()는 열린 이미지를 닫습니다.

이런 단순한 코드로 귀찮은 작업을 줄일 수 있습니다.

최대절전모드가 보이지 않고 최대절전모드에서 아무것도 안 건들였는데 다시 켜질 때

컴퓨터를 끄기엔 지금 하던 작업이 수많은 웹페이지와 오피스 등 많은 윈도우들을 다시 켜야해서 작업중인 상태 그대로 껐다가 다시 켜고 싶을 때 '최대 절전 모드'를 사용합니다. 그런데 윈도우10을 쓰다보면 '절전 모드' 만 있고 '최대 절전 모드'는  보이지 않을 수 있습니다.

그럴 때는 다음과 같이 설정하면 됩니다.

위의 스크린샷에서 보이는 절차대로 설정을 하면 시작메뉴에서 '최대절전모드'를 선택할 수 있게 됩니다.

이제 '최대 절전 모드' 상태에서 PC가 멋대로 켜지는 현상을 수정하려면 다음과 같이 해야합니다.

우선 명령창을 열어서 다음의 커맨드를 입력해 봅니다.

Realtec PCIe GBE Family Controller 라는게 보입니다.
저건 네트워크 드라이브 입니다. 요녀석 때문에 '최대 절전 모드' 상태에서 네트워크 신호를 감지하고 자기멋대로 다시 켜지는 겁니다.

아래의 순서대로 네트워크에 의해서 다시 켜지지 않도록 수정해 줍니다.

[일기] 사무실 구하기

법인은 말 그대로 '법적으로 존재하는 사람' 같은 의미입니다. 예를 들면 가상의 '홍길동' 이라는 이름의 사람을 하나 태어나게 해서 이 사람이 회사를 굴리는 개념인듯 합니다. 그래서 법인을 설립할 때는 법인 명의의 사무실이 필요합니다.
그런데 법인 명의가 있으려면 법인을 설립해야하고, 법인을 설립하는 과정에 사무실 주소가 들어가야하니 순서가 좀 애매합니다. 보통은 개인명의로 계약한 사무실을 법인 명의로 재계약을 진행하는 방식인듯 합니다. 법인을 설립할 때 대충 집주소를 입력해 놓고 나중에 법인 주소를 옮기면 되겠다고 생각하면 법인 등록비 (13만원) + 법인 주소 이전으로 인한 재등록비(13만원) 이 두번깨집니다. 재계약은 계약서만 다시 적으면 되니까 주인은 좀 귀찮겠지만 돈은 적게 깨질거 같네요. 잘 판단해야 합니다.
법인의 주소와 실제 사무실의 임대차계약서 상의 주소가 다르면 법인 사업자 등록을 할 수 없습니다. 법인은 뭐든 대충하다간 벌금이 나올 수 있으니 꼼꼼하게 진행해야 합니다.

사무실 임대할 때 전세로 사무실을 내놓은 곳은 거의 없습니다. 월세는 월세 + 관리비 + 부가가치세(월세의 10%)로 계산됩니다. 따라서 월세가 30이고 관리비가 5만원이면 30(월세) + 5(관리비) + 3(부가가치세)해서 38만원이 됩니다. 경우에 따라서 관리비를 물어보지 않고 계약했다간 관리비만 25만원인 건물도 있으니 주의해야 합니다.

최대한 저렴한 사무실을 구하려고 월세 30만원을 기준으로 돌아다녀본 결과...

20160428_170943[1]

이런 오래되고 기괴한 사무실들이 마구마구 튀어나왔습니다. 이건 뭐 결혼정보회사가 빠진 자리라는데... 이런 사무실에서 결혼정보를 얻는 사람이 존재하는지 의심스럽습니다.

그리고 일반 임대 사업자로서 월세에 대한 세금 계산서를 뗄 수 있는 사무실은 비싼 사무실들이 대부분이었습니다. 일주일을 돌아다닌 결과 급하게 사무실을 비우게된 마케팅 회사의 사무실을 찾을 수 있었습니다.

20160429_112014[1]

마케팅 회사라 그런지 임대한 사무실 임에도 불구하고 인테리어에 많은 비용을 쏟아 밖에서 봤을 때는 오래된 건물이고 월세도 27만원에 관리비도 없어서 그냥 보고 나오자는 마음으로 들어갔다가 부동산 아저씨도 깜짝 놀란 사무실을 찾았습니다.

사무실을 찾을 때는 최대한 많은 사무실을 들러서 살펴보고 계약하는게 좋습니다.

법인 설립하기

법인을 설립해 보았습니다.

그 과정을 정리해 봅니다.

  1. http://www.startbiz.go.kr 에 접속합니다.

  2. 온라인법인설립에 마우스를 올리면 '메인페이지 이동' 링크가 등장하니 눌러줍니다.
  3. 아래와 같은 팝업이 뜹니다. 팝업 차단되어 있으면 허용해 줍니다.

    여기에서 준비하라고 하는거는 다 준비하고나서 본격적인 과정이 시작됩니다.준비가 안되어 있으면 어차피 진행이 안됩니다.

  4. 법인 인감 도장, 스캐너, 사무실은 반드시 준비해 두세요. 사무실 주소를 대충 입력해 두고 나중에 수정하려면 돈이 듭니다. ㅠㅠ 반드시 사무실 먼저 구하세요.
    사무실 구하기 참조
  5. 회원가입하고 공인인증서로 로그인합니다.
    은행에서 사용하는 공인인증서로 됩니다.

  6. '사전 상호 검색' 버튼을 눌러서 법인을 설립하려는 지역에 동일한 상호를 사용하는 법인이 있는지 확인합니다.
    같은 지역에는 동일한 상호의 법인을 설립할 수 없습니다.
  7. 법인 설립 시작 버튼을 눌러줍시다.

  8. 법인의 종류와 특징이 잘 정리된 웹페이지를 볼 수 있습니다.
    자신이 설립하고자 하는 법인의 종류와 특징을 잘 고려하여 선택합니다.
    일반적으로 소규모 모바일 창업자는 '유한 책임 회사'를 선택하면 됩니다.합자회사, 합명회사 같은 것은 사기칠 때, 사기 당할 때 딱 좋아보입니다.
  9. 상단에 초록색 버튼들 중에서 '유한책임회사'를 클릭해 줍니다.

    잘 읽어보고 확인 눌러줍니다.

  10. 아래와 같은 화면이 등장합니다. 필요한 항목을 채워넣어 줍니다.

  11. 회사명에는 '유한책임회사' 라는 단어가 포함되어야 합니다.

  12. 나머지 항목들을 다 채워넣어고 저장 버튼 눌러줍니다. 여기까지가 1/3 정도 됩니다.
  13. 이제 각종 신청서들을 작성해 줘야 합니다.

  14. 정관은 기본적으로 내용이 잘 들어가 있습니다. 법인 설립 시 특별히 추가해야할 내용이 있을 때 수정해 줍니다.
  15. 법인등록면허세 에는 등록세 감면 옵션이 있습니다. 구청에 전화해서 법인세 감면에 대해서 문의해 보면 됩니다.
  16. 대표업무집행자 인감 신고서에서는 법인명이 들어간 인감도장과 스캐너가 사용됩니다.
  17. '유한책임회사'는 대표업무진행자와 업무진행자 두사람이 필요하고 인증서로 전자 서명을 해야하니까 일괄전자서명을 하려면 두사람의 인증서가 필요합니다.
    아니면 대표가 각 서식에서 전자 서명 버튼을 눌러서 서명해 주고, 업무진행자도 이 사이트에 가입하여 전자서명을 하나하나 해주면 됩니다.
  18. 이제 법인 설립 "시작" 하기 버튼을 눌러줍니다.
    설립하기가 아니라 "시작" 하기라는 것을 명심해야 합니다.
    이제 시작일 뿐...
  19. 이제 법인 설립과정 중에 직접 처리해 줘야 하는 과정이 발생하면 '법인설립진행업무' 메뉴를 눌렀을 때 법인이 보입니다.
    아무것도 안해도 되면 아무것도 안나옵니다.

  20. 하루정도 기다리면 "법인 등록/면허세" 내라는 항목이 뜹니다. Wetax에 접속해서 내면 됩니다.
  21. 또 잠시 기다리면 법원 등기소에 가입이 안되어 있다는 항목이 뜹니다.

  22. '제출' 버튼을 클릭하면 인터넷 등기소로 연결됩니다.
    연결이 안되더라도 '인터넷 등기소'로 접속하여 회원가입을 해 줍니다.

  23. 이제 '법인등기' 메뉴에서 '전자신청' 버튼을 눌러줍니다.

  24. 이런 메시지가 뜨는데 그냥 확인 누르고 넘어가 줍니다.

  25. 법인 등기 온라인 사용자 등록을 해 줍니다.

  26. 사용자 등록이 끝난 후 다시 온라인 법인 설립 사이트에서 '제출' 버튼을 클릭하면 다음 단계로 넘어갑니다.
  27. 조금 지나면 설립 수수료 납부를 하라고 합니다. 한 15분은 지나야 뜹니다.

  28. 가서 납부 버튼을 눌러서 납부 해 줍니다.
    처음에 이런 메시지 화면이 떠도 그냥 확인 누르고 들어가서 납부하면 됩니다.

  29. 이제 기다리면 창업지원센터에서 법인 등록 완료 전화가 옵니다.
    굳이 전화를 하는 이유는 사업자 등록을 오프라인으로 진행할 것인지 온라인으로 진행할 것인지를 확인합니다.
    오프라인으로 진행할 경우에는 처리 속도가 빠르고 온라인의 경우에는 3일정도 처리 시간이 소요된다고 합니다.
    저는 오프라인으로 처리하기로 하였으므로 법인 설립에 대한 설명은 여기에서 마칩니다.

진행과정 중에 뭔가 좀 애매하다 싶으면 바로 웹사이트 하단에 안내전화를 걸어서 문의를 합니다. 서울 아가씨의 사근사근한 안내가 기다리고 있습니다.

[Unity3D][AWS] Unity3D에서 AWS Cognito로 계정 인증하고 AWS Lambda 함수 호출하기

게임을 만들다보니 점점 욕심도 생기고 덩치가 커지면서 '서버'가 필요하게 되었습니다. 예전부터 그냥 C++로 서버 하나 뚝딱 만들면 되겠지... 라고 생각하고 있었는데, 클라우드 서버에서 처리량에 따라 서버의 개수 조절이라던가 여러가지 설정해 줘야 하는 부분들을 생각하니 머리가 아파졌습니다.

그래서 AWS의 Lambda를 이용하여 Serverless Mobile Game 시스템을 구축해보자는 생각으로 AWS를 조금씩 도입하기 시작했습니다.

그 첫번째 단계가 바로 Cognito를 이용한 계정의 인증입니다.
Cognito란 AWS에서 제공하는 계정 인증방식입니다. 기본적으로 Device 정보와 이것저것 조합하여 각 Device별로 고유한 ID를 생성하여 사용자를 인증하고 인증 정보를 토대로 AWS의 기능에 접근하기 위한 접근 권한을 얻어내기 위한 기능입니다. Cognito에서 권한을 얻으면 AWS SDK for Unity를 통해 S3, DynamoDB, Lambda, Notification 등 각종 서비스에 접근할 수 있게 됩니다.

Cognito의 권한은 '비인증 사용자'와 '인증 사용자'로 구분하여 서로 다른 권한을 부여할 수 있습니다. '비인증 사용자'는 말 그대로 어떠한 인증없이 그냥 접속한 Guest 유저를 말합니다. '인증 사용자'란 Facebook, google, twitter, Amazon, OpenID 등을 통해 인증을 받은 유저를 말합니다. Cognito에서 해당 인증 정보에서 뭔가 데이터를 얻어오진 않고 오직 인증을 하는데만 사용한다고 합니다.

이제 Unity에서 사용하기 위한 방법을 순서대로 따라가 보겠습니다.

첫번째 순서는 회원가입입니다. 가입 절차는 생략합니다. 일단 가입하면 무료로 1년간 AWS Free-tier 관련 기능들을 사용할 수 있습니다. 성능이 좀 좋다 싶으면 무료 사용 기간에도 돈을 내야하는 옵션이 있으니 테스트 할 때 무작정 좋은 옵션 선택하지말고 주의해야 합니다.

AWS Console에 접속을 했으면 'Region'을 선택해야 합니다. 최근 Seoul 리전이 생겨서 그걸 사용해 보려고 했으나 Seoul 리전에서는 Cognito 기능을 제공하지 않아서 그나마 가까운 Tokyo 리전을 선택했습니다.

Cognito를 설정해야하니 메뉴중 Cognito를 찾아서 클릭해 줍니다.

이미 만들어둔 Identity가 있어서 화면이 좀 다를 수 있겠으나 Create new Identity pool 버튼이 있을겁니다. 그걸 클릭해 줍니다.

이제 본격적으로 Identity Pool을 생성합니다. 계정의 인증 정보들이 잔뜩 담길 곳이라서 Pool 이라고 하나봅니다. Identity Pool Name 은 적당히 앱의 이름을 적어줍니다.

Unauthenticated Identities 옵션은 앞서 말했던 '비인증 사용자'를 허용할 것인지에 대한 옵션입니다. 체크를 해주면 인증하지 않은 사용자에게도 unique identifier를 생성해 줍니다. 게임 같은 경우에는 guest 입장이 안되면 피쳐드에 지장이 생겼던거 같으니 일단 저는 체크를 해줬습니다.

이제 문제는 Authentication providers에 대한 설정입니다.  위 스크린샷에 나와 있는것 처럼 각종 인증 제공자들에 대한 설정입니다. Facebook developer console, Google Developer Console을 통해서 API 접근을 위한 App ID를 얻어올 수 있습니다.

일단 Google 로그인을 위해 Google+ 의 Client ID를 얻어오는 방법을 알아보겠습니다.

이번에도 가입 절차를 생략하고 Google Developer Console에 접속합니다. 화면 상단에 '프로젝트 선택' -> '프로젝트 생성...' 을 클릭해 줍니다.

프로젝트 이름에 앱 이름을 입력해 줍니다.
그리고 약관에 동의를 하고 만들기를 클릭해 줍니다.

몇 초만 기다리면 프로젝트가 생성됩니다.
이제 내가 만든앱이 구글에 로그인을 하기위한 기본적인 준비가 되었습니다. 이제 로그인을 위한 API에 접근하기 위한 준비를 해야합니다. 붉은 사각형으로 표시된 "API 사용 설정 및 관리" 버튼을 클릭해 줍니다.

Android에서 사용할 클라이언트ID를 만들어 봅니다.
앞서 적은 글에서 Keystore의 SHA-1 finger print를 얻어서 적어줍니다.
패키지 이름은 Unity -> Player Setting -> Other Settings -> Bundle Identifier에 설정한 것을 기록해 줍니다.

이제 OAuth 2.0 클라이언트 ID가 발급되었습니다.  붉은 사각형 영역에 있는 클라이언트 ID를 복사해 줍니다.

이제 인증 사용자와 비인증 사용자 각각을 위한 권한을 설정해 줘야 합니다. 권한 설정은 AWS IAM을 이용하여 설정할 수 있습니다. 기본적으로 Create a new IAM Role이 설정되어 있고 해당 Identity Pool 이름이 붙어 있는 Role이 생성되게 되어 있습니다. 기본 생성되는 권한은 동일하게 인증을 얻는 것이고 '인증 사용자'에게는 Cognito Sync 기능을 사용할 수 있는 권한이 부여됩니다.

이제 Cognito를 사용하여 인증을 진행할 수 있는 준비가 되었습니다.
Unity에서 AWS SDK for Unity를 통해서 인증을 얻어와 봅시다.

http://docs.aws.amazon.com/mobile/sdkforunity/developerguide/

위의  링크에서 AWS SDK for Unity를 다운로드 하고 적당한 곳에 압축을 풀어줍니다.

압축을 풀어보면 unitypackages가 포함되어 있습니다. AWS에서 사용할 기능들에 맞춰서 필요한 package를 로드하면 됩니다. 일단 Lambda를 사용할 예정이므로 Lambda Package를 로드해 줍니다.

열기를 한 후 모든 파일을 import 해 줍니다.

AWSSDK/src/GameObjects/AWSPrefab을 Scene에 올려줍니다. 이 Prefab에 포함된 Unity Initializer 컴포넌트가 AWS SDK를 초기화 해주는 역할을 합니다. 이거 포함하지 않으면 기능이 제대로 동작하지 않습니다.

_credential = new CognitoAWSCredentials(
                    "identity Pool ID", // Identity Pool ID
                    RegionEndpoint.APNortheast1 // Region
                );

이제 타이밍상 적절한 곳에 위와같은 코드를 추가하여 CognitoAWSCredentials를 생성해 주기만하면 인증을 사용하기 위한 준비가 마무리 되었습니다. 그냥 이상태로 사용하면 비인증 사용자로 인증 권한을 받아옵니다.

    IAmazonLambda _lambda;
    IAmazonLambda LambdaClient
    {
        get
        {
            if (_lambda == null) {
                _lambda = new AmazonLambdaClient(Credential, RegionEndpoint.APNortheast1);
            }
            return _lambda;
        }
    }

    public void Invoke(string func, string eventText) {
        LambdaClient.InvokeAsync(new Amazon.Lambda.Model.InvokeRequest() {
            FunctionName = func,
            Payload = eventText
        },
        (response) => {
            if (response.Exception == null) {
                Debug.Log(Encoding.ASCII.GetString(response.Response.Payload.ToArray()));
            }
            else {
                Debug.Log(response.Exception);
            }
        });
    }

이제 람다를 사용하기 위해서 위의 코드처럼 AmazonLambdaClient를 생성합니다. 이때 아까 생성한 credential 정보를 인자로 넘겨줍니다.

이렇게 생성한 IAmazonLambda 인터페이스를 통해서 InvokeAsync로 람다 함수를 호출할 수 있습니다. 이제 호출을 위한 람다 함수를 만들어 줘야 합니다.

다시 AWS Console로 돌아갑니다.

이번에는 콘솔 메뉴에서 Lambda를 선택해 줍니다.

간단한 테스트용 함수를 만들거라서 Blueprint 중에 hello world를 선택했습니다. 언어로는 Java, Node.js, Python을 사용할 수 있는데 저는 Python을 선택했습니다. 편하신 언어로 선택하면 됩니다. 각 언어에서 제공하는 라이브러리들도 활용할 수 있습니다.

FunctionName은 호출에 사용될 함수의 이름입니다. 해당 함수명으로 호출하면 이 Python 파일이 실행되고 lambda_handler 함수가 호출됩니다. 테스트만 할꺼라서 함수명도 HelloWorld라고 간단히 지어주고 특별한 코드의 수정없이 Next를 클릭하여 함수를 생성해 줍니다.

이제 스크립트의 적절한 곳에서 아까 만들어둔 Invoke함수를 호출해 줍니다. 저는 Singleton 객체로 만들어두어서 이런식으로 호출했습니다.

AWSManager.instance.Invoke("HelloWorld", "{\"key1\":\"kwon\", \"key2\":\"sang\",\"key3\":\"goo\"}");

이제 Unity에서 게임을 실행하여 정상적으로 동작하는지 확인해봅시다. 아마 이상한 exception들이 나오면서 안될겁니다. 이유는 Identity pool을 생성할 때 자동으로 만들어진 IAM의 권한에 Lambda를 실행하기 위한 권할 설정이 되어 있지 않기 때문일겁니다. 다시 AWS Console로 가서 IAM을 찾아서 클릭해 줍니다.

붉게  사각형으로 표시한 "lambda:*" 를 권한에 추가하면 해당 권한을 얻은 사용자는 AWS의 모든 Lambda를 호출할 수 있는 권한을 얻게 됩니다. 나중에 적절한 수준의 권한으로 조절할 필요가 있겠네요.

이제 Unity에서 인증을 하고 Lambda 호출까지 수행할 수 있게 되었습니다.

[Unity3D] Keystore의 fingerprint 확인하기

keystore 파일은 안드로이드에 배포할 때 사용하는 인증서 파일입니다.

Unity의 Player Setting -> Publish Settings 에서 Create New Keystore를 선택하여 생성할 수 있습니다.

보통은 디버그용 기본 Keystore를 사용하기 때문에 디버깅을 하는데는 큰 문제가 없습니다. 하지만 앱스토어에 등록할 때는 이게 큰 문제가 될 수 있습니다.

정식으로 만든 Keystore로 앱스토어에 등록을 하는데 이 Keystore가 유실되면 APK가 등록이 안됩니다. ㄷㄷㄷ

그리고 Keystore에서 SHA1 fingerprint를 사용해야할 일이 있는데 그때는 JDK에 포함된 keytool을 사용하면 됩니다.

keytool -v -list -keystore <keystorefile>

[Unity3D] EditorGUI.Vector3Field의 형태를 EditorGUILayout.Vector3Field 와 똑같이 바꾸기

Unity의 Custom Editor에서 정말 많이 사용하는 함수 중 하나가 EditorGUILayout.Vector3Field입니다.

문제는 EditorGUILayout.Vector3Field는 한줄로 이렇게 나오는데,

EditorGUI.Vector3Field는 두줄로 이렇게 나옵니다.

그래서 EditorGUI.Vector3Field도 EditorGUILayout.Vector3Field 모양으로 쓸 수는 없나 싶어서 검색해보니 이런게 있었습니다.

http://docs.unity3d.com/ScriptReference/EditorGUIUtility-wideMode.html