검색결과 리스트
programmer에 해당되는 글 80건
- 2012/03/28 Unity3D,X-Code... 이젠.. 포팅이당.
- 2012/03/28 Facebook Mobile Hack- Seoul 참가후기 (2)
- 2011/12/20 HTML5 쉬울까요? 어려울까요?
- 2011/10/26 [링크]iOS5에 내장된 Twitter.framework 사용하기
- 2011/10/20 CentOS 에 Apache , Php , Mysql 를 세팅 해봤습니다.
- 2011/10/11 CI 상에서 프로시저를 사용하려다가 오류가 발생할 경우...
- 2011/08/23 MonoBehaviour 오버라이딩 가능 함수 레퍼런스 총 정리..랄까?? (1)
- 2011/08/23 Unity3D iOS Porting Tips
- 2011/07/14 JQuery를 사용하면서.. 여러가지 팁들이 등장하고 있네요
- 2011/07/06 Box2D 물리엔진 알어?? 그럼 Html5 랑 연동해서 게임 만들어 봐
글
http://unity3d.com/unity/download/
Unity3D 에서 이번에 mobile 용 iOS,android 에 대한 기간 한정 무료 배포(를 해서...
기쁜 마음에 세팅을 완료하고 진행을 하던중에 무수히 많은 에러들로 인해 곤혹을 치뤘습니다.
1. MAX OSX Lion 을 버전업 했습니다.
2. XCode 4.31을 설치 했습니다.
3.Unity3.5 를 설치하고... iOS
이것저것 검색해보니 Unity3.5 이번 버전에서... XCode4.31에 제대로 호환이 안된다구.. XCode4.3 으로 설치해서 하면 잘된다고함.
http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wo/5.1.17.2.1.3.3.1.0.1.1.0.3.1.3.3.1
이곳에서 XCode를 다운 받으시면 됩니다.
설정
트랙백
댓글
글
이번 Facebook Mobile Hack- Seoul 에서 참가하고 난 후기를 기재 하겠습니다.
우선 교육 장소는 63빌딩 컨벤션 홀 3~4층에서 진행되었습니다.(4층은 식당 ㅎㅎ)
미리 교육 자료를 전달해 줬기 때문에 가볍게 훑어 보고 갔고, 교육 내용에 대해서 간단하게 정리 해보도록 하겠습니다.
*omgpop 이라는 업체(미국? 이던가?) 이 Facebook Hack 에 참가해서 상을 받았다고 하더군요...
그 이후 이 업체는 Zinga에 1억$에 인수되었다고 하면서... 점점 Hack 대회의 위상을 높이더군요 ㅎㅎ
1. 101 Crash Course (특강)
==> Social 과 "공유"에 대한 내용이였습니다.
facebook이 photo 를 중심으로 서비스를 시작하였는데, 기존 큰 서비스 업체가 많음에도, 성공할수 있었던 부분은
사람을 중심으로 하는 서비스, 사람의 얼굴에 각각의 tagging 을 하는 것으로 폭발적인 인기를 누릴수 있었다....
2. Intro
--> 전반적인 소개(Discovery ,Distribution , Fragmentation ,Monetization )... 기본적인 용어 설명부터 인증과 요청등에 대한
내용과, Graph API,Timeline,notification,Application Tile, news feed,Bookmark 등등 ...blabla
3. Social Mobile Apps - Distribution and Design (배포와 설계)
--> 모바일 시장의 성장에 기존 Web시장에 대비 2배 이상의 속도로 커지고 있다라는 개론 부터
js api 를 이용하여 실제 로그인 부터 사용자 정보 호출등의 시연이 있었습니다.
(Tip : News Feed 보다 Open Grahp를 먼저 쓰기를 권장하더군요)
즐거운 점심 시간... 35분 밖에 없었지만.. 부페!!! 우왕~ㅎㅎㅎ
4. Android & iOS를 위한 Facebook 플랫폼(NativeApps )
--> Single Sign On(SSO) 과 Deep Linking에 대한 기능을 강조하였습니다. ( Facebook App Setting)
iOS에 대한 간단한 시연이 있었지요...
여기서 주의해야할 ..
*Single Sing On 은 간단히 ID/PW 혹은 회원가입에 대한거 귀찮다... Facebook session를 통해서 한번에 해결하겠다..
** Deep linking : 이 되면, Application에 있는 Scene으로 다이렉트로 이동하는 링크 (iOS만 제공)
*** Shallow Linking : Deep linking과 비교 할수 있는데, Application 으로만 이용하는 기능
**** URL Scheme Suffix : ios든 android 든 Web, mobile web 이든지 간에 하나의 AppID를 사용해야라고 하고 있습니다.그렇게 될경우에 iOS는 보통 유료 와 무료 로 구분해서 제작을 하는데.. 동일 AppID 사용시 구분이 힘들어 집니다. 다시 Deep Linking을 사용한다고 했을 경우 일반적으로 SSO연동이후 되돌아 갈곳을 잃어버리는 사항이 되는것을 방지하기 위해서 만든 개념입니다.
5. The Open Graph - Distribution and engagement for every platform
--> 사람들이 무엇을 하는가에 대해 설명하는 것, 움직일때(모바일 할때), 다양한 액션을 구현하는 방법에 대해서 설명하는 세션이였습니다. 이 Open Graph는 모바일에 가장 적합한 기술이라고 합니다..
Open Graph 런칭시에 TimeLine도 동시에 런칭 했고.. 이에 따른 액션에 대한 통합형 Panel이 등장했다고 합니다.
* Tip
1) Open Graph를 만들어라..
2) 사용자들은 어떤 환경에서든 Apps를 사용하고 싶어 한다. 이에 AppID는 공통으로 사용해야함
3) FriendShip 이 중요하다.
** 5 Steps to using Open Graph (오픈 그래프 사용을 위한 5단계)
1) Model your data (데이터 모델링) : Action과 Object를 정의함,Object를 서비스할 수 있도록 준비함
2) Markup and expose your objects to the Web (서비스 페이지 작성과 공개) : Permission과 Authentication
3) Publish Actions (액션 퍼블리싱) : Graph Explorer를 통해 Action을 퍼블리싱함
4) 타임라인 노출을 위한 Aggregations 설정 : Graph Explorer를 통해 Action을 가져옴
5) Read Actions (오픈 그래프 데이터 가져오기) : 모바일 웹 환경에서 Action을 퍼블리싱 함
6. Responsive Design Essentials For Mobile Web Apps (반응형 디자인) & PhoneGap
--> 어떤 해상도든지.. 어떤 환경에서든지... 그에 맞는 UI를 제공하는 방법에 대한 설명이 Responsive Design 이였고,
PhoneGap은 html5,js,css 로 제작을 하면, iOS 든 android 로 쉽게 포팅할수 있는 툴 , 가장 많은 스마트폰 플렛폼을 지원하는 하이브리드 앱 개발용 크로스 플랫폼으로 보시면 됩니다.
7. Q&A Time
8. HACK
맥주를 가져다가 마시라고 하더군요.. 와웅 좋아라~ ㅎㅎㅎ
인터넷 환경이 굉장히 안좋아서, 대부분 테더링을 이용해서 진행 하였습니다.
(인터넷 강국이 무색하게시리;;;; 2시간 가까이 인터넷 스탑!!)
9. 발표 및 시상..
다양한 작품이 나왔지만.. 4시간여 시간동안, 추가적으로 인터넷이 안되는 상황에서 대단한것을 기대할수 없었던것 같습니다.
하지만, 대부분 미리 준비를 해 온 작품으로 행사를 꾸려주셔서...
(저녁 뷔페... 점심에 너무 많이 먹어서... 저녁은 가볍게(?) 이긴 하지만... 많이 남겼다는;;)
이렇게 정리를 했습니다. 해당 교육 자료는 아래 링크에서 받아가시길 바랍니다.
http://dl.dropbox.com/u/65450480/Seoul_Hack_2012_Presentations.zip암튼 10시 30분정도 되어서 나왔습니다.. 나올때... T-shirt를 주더군요.. 감사합니다..
다음번 Hack 때는 미리 준비를 해서 참가해보고 싶습니다... (상품이 갤럭시 노트 였는데.. 솔직히 욕심이 안나던데;;)
Facebook 직원들은 글로벌이더군요... 정작 미국사람처럼 보이는 사람은 몇사람 안되구.. Asia 투어라서 그런가?
이상입니다.
설정
트랙백
댓글
글
오홋... 저때가...지금까지도 인기있는 크리스마스 노래가 출시될 때이군..
왜.. 요즘은 저런 노래가 안나올까?
암튼 이글의 본론은 위의 짤방이 아니구..
HTML5 를 말로만 많이 들어보셨겠지만, 직접 체험 해보거나 공부를 해보신 경험이 없으신 분들을 위해서
아래 자료를 정리해 드립니다.
천천히.. 잘 따라 해보시길 바랍니다.
HTML5의 변화를 주목하도록 제작된 네 파트로 된 시리즈입니다.
Part 1 시작하기
새 태그와 페이지 구성으로 시작하고, 웹 페이지 설계에 대한 높은 수준의 정보, 양식의 작성, API의 사용과 가치 및 Canvas가 제공하는 창의적인 기회를 제시합니다.
http://www.ibm.com/developerworks/kr/library/wa-html5fundamentals/
Part 2: 입력 구성하기
HTML5 양식 제어의 개념을 소개하고 JavaScript 및 CSS3의 역할에 대해 다룹니다.
http://www.ibm.com/developerworks/kr/library/wa-html5fundamentals2/
Part 3: HTML5 API의 기능
함수를 시연하는 예제 페이지를 사용하여 HTML5 API를 소개합니다.
http://www.ibm.com/developerworks/kr/library/wa-html5fundamentals3/
Part 4: 마지막 마무리
HTML5 Canvas 요소를 소개합니다
http://www.ibm.com/developerworks/kr/library/wa-html5fundamentals4/
설정
트랙백
댓글
글
iOS5가 업데이트 되면서... 다양한 기능들이 추가 되었다...
내가 알기로는 대략 200 여 가지 기능이 추가 된것으로 알고 있지롱...
iPhone 4GS 가 나와서 .. 5G를 기대한 전세계인들에 혹독한.. 평을 받고, 주식이 떨어지는
우여곡절.. 결국 스티븐 잡스가 떠나고... 마지막 유작이라는 평을 받으며.. 인기 급상승 중인...
암튼 요즘 삼성과의 특허분쟁으로 전세계가 떠들석 하구...
seri 라는 앱도 인기 폭발(국내에는 내년 3월에 한국어 인식되는것이 나온다고 하던데 모르겠다..)
다른 내용은 아니고 오늘은 iOS5 에서 트위터를 본격적으로 지원하는 내용의 링크를 걸어 본다.
우선 사내 개발중인 프로젝트상에서는 트위터 보단 페이스북 지원이 더 필요한 건 사실이지만;;;
곧 .. 나오지 않을까? 글쎄....
iOS5에 내장된 Twitter.framework 사용하기
설정
트랙백
댓글
글
(캬~~~ 귀여운 팬더들.. 팬더.. 살아있는거냐... 인형이냐.... ?? )
사내 프로젝트 용으로 리눅스 서버를 받게 되었습니다.
이런저런 우여곡절 끝에 세팅을 완료하고 나서 기록을 정리하고자 합니다.
최종 목적은 SSH 접속, FTP 접속, Apache , Php , Mysql 의 세팅 이후 Web Page 구현이 목표 입니다.
1) 서버를 접속해보자...
처음 서버 IP 와 root 및 비번을 받았습니다.
접속을 하려고 하니.. 방화벽이 막혀서.. 안되더군요...
해당 업체에 방화벽등록신청서를 제출해야 합니다.
ssh,ftp,web 을 사용하기 위해 포트 와 저희가 사용하는 IP 대역대를 기재해서 제출!!!
*outbound 세팅을 해야만 yum 을 통해 세팅을 쉽게 이뤄지는뎅... deny 상태라서...
직접 설치하는 방향으로 진행하게 되었습니다.
리눅스 서버에 대한 접근은 이제 무조건 ssh 를 사용한다고 보면 됩니다.
프리버전의 ssh 프로그램이 검색하면 많이 나오니.. 잘 골라 잡아보시길 바랍니다.
Inbound 정책은 외부에서 웹서비스시스템 내부로 들어오는 패킷을 허가/제한 하는 정책
Outbound정책은 웹서빗시스템 내부에서 외부로 나가는 패킷에 대해 허가/제한 하는 정책
**ssh(Secure Shell) 란 원격 터미널에 안전하게 엑세스하기 위한 유닉스 기반의 명령 인터페이스 및 프로토콜인데,
서버 제어를 하기 위해서 사용되는 보안 로그인 쉘이죠. 보내지는 패킷을 암호화 하여, Telnet,ftp,pop 에 비해 안정적이죠.
- 클라이언트 - 서버 연결의 양단은 전자 서명을 사용하여 인증되며, 패스워드는 암호화 보호됨.
- SSH는 쌍방의 접속과 인증을 위해 RSA 공개키 암호화 기법을 사용한다.
(암호화 알고리즘에는 Blowfish,DES 및 IDEA 등이 포함되며, 기본 알고리즘은 IDEA 이다.)
ssh를 설치하고 나서 접근 시도 ..... 부여받은 root ,비번을 입력하니... 접속 성공!!! 두둥...
골때리는 상황이 많이 생겼습니다.
ftp도 접근이 안되어서 이것 저것 알아보던 중에.. (참고로 ftp는 vsftpd 를 사용하더군요..)
SeLinux 는 ftp 데몬이 홈 디렉토리 (/) 외부에 있는 파일을 기록하지 못하게 하는 것 때문에... 접근 제한의 문제가 있었습니다. @.@;;
암튼 해결하고 난후에 root 계정으로 접근 불가하여, 계정을 새로 만들어서 등록을 하였습니다.
useradd canimals
passwd canimals
비밀번호 입력 > xxxxxxx
비밀번호 입력 확인 > xxxxxxx
위와 같이 진행을 하게 되면 새롭게 해당 계정 생성 및 접근 권한이 제한된 폴더가 구성이 됩니다.
cf) 계정 삭제는 deluser canimals 입니다.
혹시 FTP를 다시 시작,종료, 자동시작등을 할 일이 있을지 모르는 일이라서 이것저것 설정을 만지던 도중..
참고가 될까 하여.. 몇가지 명령어를 정리합니다.
vftp는 기본적으로 익명ftp로 동작하며 유저 ftp를 구동하기 위해서는 conf파일을 수정해야 한다
http://urein.blog.me/110038902476 --> 참고하세요 (시간이 나면 다른것도 더 검색해보시구요..)
FTP 서비스 시작/종료/재시작 : service vsftpd [start/stop/restart]
부팅시 자동 시작 : chkconfig vsftpd on
FTP의 자체 방화벽 설정은 iptables 를 편집하시면 되구, 기본 conf 파일설정은 vsftpd.conf 를 하시면 됩니다.
ls -al: 리스트 , pwd: 절대 경로 ,cd : 이동, mv : 이동 , cp : 복사 , rm : 삭제 , mkdir: 폴더 생성 , rmdir 폴더 삭제
이정도만 우선 숙지해두는 것이 좋다.. 아 그리고 tab 키를 활용하면 경로를 다 입력안하도록 도와 준네요
** vi 와 vim 편집기
기본으로 입력 모드는 i 키, ESC 키 , : 키 요 3가지를 잘 사용해야 합니다.
그리고 저장하고 나가기(:wq), 저장하지 않고 나가기 (:q . :q!)
명령어가 넘 많아요 T.T 천천히 숙지해보아용...
http://blog.naver.com/powerhw?Redirect=Log&logNo=80122469526 --> 참고하세요
필요한 파일들을 미리 일일 다운로드 받아 놓고, ftp로 옮긴다음 우선 apm 이라는 폴더를 만들었습니다.
ftp로 받아온 파일을 한꺼번에 복사!!!
mkdir apm
cd apm
==> cp * /apm/
cmake-2.8.6.tar.gz
httpd-2.2.21.tar.gz
mcrypt-2.6.8.tar.gz
mysql-5.5.16.tar.gz
php-5.3.8.tar.gz
사실 위와 같은 삽질을 하기 전에 wget 를 사용하게 되면 보다 쉽게 다운로드 할수 있습니다.
하지만 저는 방화벽으로 인해, wget 조차 사용할수가 없었습니다. T.T
ex) wget ftp://ftp.sqyclub.com/pub/mysql/Downloads/MySQL-5.5/mysql-5.5.14.tar.gz
2) Mysql 설치
순서가 Mysql 부터 설치 하는 것이 좋다구 합니다.
이유가 아마도 phpAdmin 설정때문인듯 싶기도 하여..
MYSQL 5.5 이전버전은 configure 를 이용해서 설치하였다고 한다. (configure 설치는 이후 자연스럽게 알게 됩니다.)
5.5버전부터는 CMAKE 를 이용해서 MYSQL를 설치 할수있기 때문에 먼저 CMAKE를 설치하도록 한다
2-1) CMAKE 를 설치
tar xvf cmake-2.8.6.tar.gz
cd cmake-2.8.6
./bootstrap
이 다음에 항상 따르는 설치 파일 생성 과 파일 설치를 합니다. (컴파일 하는 거죠...)
make && make install
cmake를 설치하면 /usr/local/bin 에 위치한다 cmake 명령어로 설치 확인!
2-2) mysql 만의 전용 계정 설정
설치 후 mysqld_safe의 실행으로 mysqld 라는 데몬이 실행되고 이 mysqld 라는 데몬은 아래 생성한 mysql 이라는 사용자 소유로 실행된다.
useradd -g 옵션은 생성하는 계정의 소속그룹을 정해주는 것이고,
-M 옵션은 불필요한 홈 디렉토리를 만들지 않는 것이다.
groupadd -g 400 mysql
useradd -u400 -g400 -d /usr/local/mysql -s /bin/false mysql
2-3) 실제로 Mysql 설치
tar xvf mysql-5.5.16.tar.gz
cd mysql-5.5.13
cmake . -LH -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DMYSQL_DATADIR=/usr/local/mysql/data
또 다음에 항상 따르는 설치 파일 생성 과 파일 설치를 합니다. (컴파일 하는 거죠...)
make && make install
그럼 /usr/local/mysql 에 mysql 는 설치가 되고, /usr/local/mysql/data 에 데이터가 쌓이게 되는 것이란 말씀..
2-4) DB생성
chown -R mysql:mysql /usr/local/mysql
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
chown -R mysql.mysql /usr/local/mysql/data
cp support-files/my-huge.cnf /etc/my.cnf
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
chown root.root /etc/init.d/mysqld
chkconfig --add mysqld
chmod 711 /usr/local/mysql
chmod 700 /usr/local/mysql/data
chmod 751 /usr/local/mysql/bin
chmod 750 /usr/local/mysql/bin/*
chmod 755 /usr/local/mysql/bin/mysql
chmod 755 /usr/local/mysql/bin/mysqldump
그리고 나서 시작을 하는데...
service mysqld start
** 시작이 안되거나 오류가 발생할 경우에는... T.T
(사실 난 /etc/my.cnf 파일이 문제였다... 그래서 지워 버리고 나서.. 했더니 잘 되더라..
위에 있는 대로 다시 해보고 안될 경우에만..
rm /etc/my.cnf
하고 나서 다시 시작하면 잘 될것 이야...
cd /usr/local/mysql/bin
./mysqladmin -u root -p password 비밀번호
./mysql -u root -p mysql
**http://hoonim.tistory.com/69 ==> 여기서 많은 정보를 얻었습니다
**http://system.neulwon.com/xe/?mid=linux_mysql&page=1&document_srl=2341
*** kill -9 pid : 프로세스 죽이기 명령어
3) Apache 설치
가볍게 압축파일을 풀어 보시구요...
tar xvfz httpd-2.2.21.tar.gz
cd httpd-2.2.21
./configure --prefix=/usr/local/apache --enable-module=so --enable-module=rewrite --enable-module=headers --enable-ssl
make
make install
3-1) 자동 실행 설정
아파치 실행 스크립트 apachectl 를 복사
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
*chkconfig 를 통해 자동 실행을 등록해야 하는데...
chkconfig 명령어를 사용하면 등록되지 않는다고 한다. 스크립트 파일에 아래 내용으 ㄹ추가 하란다...
vi /etc/init.d/httpd
#chkconfig: 2345 90 90
#description: init file for Apache server deamon
#processname: /usr/local/apache/bin/apachectl
#config: /usr/local/apache/conf/httpd.conf
#pidfile: /usr/local/apache/logs/httpd.pid
chkconfig --add httpd
chkconfig --list | grep httpd
3-2) 실행 환경 설정
편집
vi /usr/local/apache/conf/httpd.conf
user nobody
group nobody
servername localhost
실행
/etc/init.d/httpd start
그리고 나서 ps -ef | grep httpd 로 확인 함 해주고...
웹페이지로 해당 아이피 접속 하면.. 두둥...
홈 디렉토리를 변경하기 위해서 추가적으로 두가지를 설정을 바꿀 예정입니다.
a) httpd.conf 의 내에 홈디렉토리 경로 변경 한 뒤에..
- 폴더 내에 권한 설정 변경 : Allow from all
- 디렉토리 리스트 노출을 막기 위해서는 폴더 옵션에 indexes 를 없애줘야 합니다.
b) 디렉터리 퍼미션(Directory Permission)
- chmod 711 /home/폴더명
위와 같이 해주면 잘 보입니다.....
4) Php 설치 입니다.
tar -zxf php-5.3.8.tar.gz
cd php-5.3.8
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/apache/conf --disable-debug --enable-safe-mode --enable-sockets --enable-mod-charset --enable-calendar --enable-sysvsem=yes --enable-sysvshm=yes --enable-ftp --enable-magic-quotes --enable-gd-native-ttf --enable-inline-optimization --enable-bcmath --with-zlib --with-jpeg-dir=/usr --with-png-dir=/usr/lib --with-freetype-dir=/usr --with-libxml-dir=/usr --enable-exif --with-gd --with-ttf --with-gettext --enable-sigchild --enable-mbstring
make
make test
make install
4-1) apache 연동
cp php.ini-production /usr/local/apache/conf/php.ini
vi /usr/local/apache/conf/httpd.conf
아래에 3개만 추가 하면 되고, php5_module 은 자동으로 삽입되어 진다.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<?php phpinfo(); ?> 요걸 test 페이지에 입력해서 출력이 되면.. 오케이 세팅끝!!!
********* 세팅 후기 ***********
mysql 세팅은 거의 10번은 진행한것 같다....
쉘 스크립트 사용으로 화면 캡쳐 따윈 없어서 편하넹... 근데 제대로 잘 돌아 가는지 @.@
모니터링 체크, 프로세스 체크, blablabla..... 점차 확인하고 알아가야 할것 들이 많은데... windows 서버에 10년 가까이 익숙해진 나에게 유닉스 ... 요건 뭔가?
설정
트랙백
댓글
글
(짤방: 우왕~~ 닌자거북이당!!! ㅎㅎㅎ)
CI 상에서 프로시저를 사용하려고 하니... 오류가 발생했다... T.T
이런 젠장젠장... 방법을 찾았다.. 역시 구글링~!!!!
mysqli 를 설치하라는 방법도 있었고... 등등.. 여러 방법이 있었지만
난 간단한게 좋아요!!!
http://us2.php.net/mysqli
/system/database/drivers/mysql/mysql_driver.php 파일상에서 아래 함수로 변경을 하면 처리가 되었다.
function db_connect()
{
if ($this->port != '')
{
$this->hostname .= ':'.$this->port;
}
define("CLIENT_MULTI_RESULTS",131072);//Enable/disable multi-results
define("CLIENT_MULTI_STATEMENTS",65536);//Enable/disable multi-statement support
return @mysql_connect($this->hostname, $this->username, $this->password, TRUE,CLIENT_MULTI_STATEMENTS);
}
그리고 config/database.php 에 아래 부분을 FALSE 로 변경하면 끝!!!
$db['default']['pconnect'] = FALSE; 이거 찾느라 고생한 기념으로 올려 놓는다.
설정
트랙백
댓글
글
11년동안 구글이 얻는 것들 Google: 11 Years of Acquisitions (Infographic)
1. MonoBehaviour
모든 스크립트가 상속받는 기본 클래스입니다.
(Javascript 는 무조건 MonoBehaviour 를 상속받고 C#, Boo 의 경우 명시적으로 상속받아야 합니다.
C#, Boo 에서 단순 데이터 보관용 클래스, 전역으로 동작하는 매니저 클래스같은 건 상속받지 않고 쓸 수 있습니다.)
MonoBehaviour 는 Behaviour 클래스를 상속받고 Behaviour 는 Component 를 상속받습니다.
즉 MonoBehaviour 를 상속받은 클래스는 게임 오브젝트에 component 로 붙일 수 있다는 뜻입니다.(붙일 수 있다는 건 모두 알고 계시죠? ㅎㅎ)
Behaviour 클래스는 enable/disable 가능합니다.
때문에 MonoBehaviour 도 역시 켜고 끌 수 있습니다.
(스크립트를 Inspector 에 붙이면 앞에 체크박스가 나오죠? 그겁니다.)
레퍼런스를 보면 MonoBehaviour, Behaviour, script 라는 명칭을 혼재해서 쓰는데 혼란을 줄 수 있으니, 앞으로 모두 '스크립트'로 통칭하도록 하겠습니다.
2. 앞에 On 이 붙지 않는 함수
1) Update
Update 함수는 스크립트가 켜져 있을 때(enabled 상태일 때) 매 프레임마다 호출됩니다.
Update 함수는 스크립트에서 가장 빈번하게 사용되는 함수입니다.
지나간 시간을 알고 싶으면, Time.deltaTime 을 사용하면 됩니다.
이 함수는 스크립트가 켜져 있을 때만 불립니다.
2) LateUpdate
LateUpdate 함수는 스크립트가 켜져 있을 때 매 프레임마다 호출됩니다.
LateUpdate 함수는 모든 Update 함수가 호출된 후 호출됩니다.
이것은 스크립트의 실행 순서를 정하는 것에 도움이 됩니다.
예를 들어 따라다니는 카메라는 언제나 LateUpdate 를 구현해야 하는데, 그 이유는 이 카메라가 따라가는 오브젝트들은
Update 함수 안에서 움직일 가능성이 있기 때문입니다. 이 함수는 스크립트가 켜져 있을 때만 불립니다.
3) FixedUpdate
FixedUpdate 함수는 스크립트가 켜져 있을 때 매 프레임마다 호출됩니다.
FixedUpdate 함수는 Rigidbody 를 다룰 때 Update 대신에 사용됩니다.
예를 들어 rigidbody에 일정한 힘을 가할 때, FixedUpdate를 구현하여 매 fixed frame 마다 힘을 가해주어야 합니다.
※ FixedUpdate 는 매 프레임마다 호출되지만 한 프레임에 여러번 호출될 수도 있습니다. ??
더보기
// 즉 이 예는 등가속 운동입니다. (Vector3.down 하면 중력을 받는 것과 동일하다는 뜻입니다.)
function FixedUpdate()
{
rigidbody.AddForce(Vector3.up);
}
4) Awake
Awake 함수는 스크립트 객체가 로딩될 때 호출됩니다.
Awake 함수는 게임이 시작하기 전에 변수나 게임 상태를 초기화하기 위해 사용합니다.
Awake 함수는 스크립트 객체의 라이프타임 동안 단 한번만 호출됩니다.
Awake 함수는 모든 오브젝트가 초기화된 후 호출되기 때문에, 다른 오브젝트에 메시지를 날리거나 GameObject.FindWithTag 같은 함수를 안전하게 사용할 수 있습니다.
이런 이유로 Awake 함수에서 스크립트를 레퍼런싱한 후, Start 함수에서 필요한 정보를 넘겨받거나 넘겨줄 수 있습니다.
Awake 함수는 언제나 Start 함수 전에 호출됩니다. 이것은 스크립트의 초기화 순서를 정할 수 있게 합니다.
Awake 함수는 coroutine 으로 동작할 수 없습니다.
5) Start
Start 함수는 Update 함수가 처음 호출될 때 Update 함수 직전에 호출됩니다.
Start 함수는 스크립트가 동작하는 라이프타임 동안 단 한번만 호출됩니다.
Awake 함수와의 차이는 Start 함수는 스크립트가 켜져있을 때만 호출된다는 것입니다.
이것은 정말로 필요할 때까지 초기화 코드 실행을 연기시킬 수 있습니다.
Awake 함수는 언제나 Start 함수가 호출되기 전에 호출됩니다. 이것은 스크립트의 초기화 순서를 정할 수 있게 합니다.
Start 함수는 모든 스크립트 객체의 Awake 함수가 호출된 후에 호출됩니다.
6) Reset
기본값으로 리셋합니다.
Reset 함수는 유저가 Inspector의 context menu 에서 Reset 버튼을 눌렀을 때나, 게임 오브젝트에 스크립트를 처음 붙였을 때 호출됩니다. 이 함수는 에디터 모드에서만 호출됩니다.
Reset은 Inspector에 초기 값을 설정할 때 가장 자주 사용하는 함수입니다.
7 ) Awake, Start, Update, LateUpdate 순서도
'A, B, C 라는 게임 오브젝트가 있고, A, B 에 스크립트가 하나씩 붙어있습니다. B는 스크립트가 비활성화 되어 있습니다.'
라는 상황을 가정하겠습니다.
1. 게임이 로딩되면 우선 A, B, C 모든 게임 오브젝트가 초기화 됩니다.
2. 이후 A, B 에 붙어있는 스크립트의 Awake 함수가 호출됩니다.
(이 상황에서도 이미 A, B, C 게임 오브젝트와 구성 컴포넌트는 모두 메모리에 들어있는 상태이므로 null 체크
이런 거 없이 안심하고 데이터 전달 등을 할 수 있습니다.)
3. 이후 A 의 Update 함수가 호출되려고 합니다. B 는 스크립트가 비활성화 상태이기 때문에 동작하지 않습니다.
4. A 의 Update 함수가 호출되려고 하는데, 이번이 첫번째 호출이네요! 우선 Start 가 호출됩니다.
5. A 의 Start 가 호출되었으니 Update 가 호출됩니다. 앞으로 매 프레임마다 호출되겠네요.
6. A 의 LateUpdate 도 호출됩니다. 역시 앞으로 매 프레임마다 호출됩니다.
- 여기서 B의 스크립트를 활성화시켰습니다.
7. B 의 Update 함수도 호출되기 시작합니다. 제일 처음 Update 호출될 때 역시 Start 가 우선 한 번 호출됩니다.
8. A, B 의 Update 함수가 모두 호출된 후 A, B 의 LateUpdate 가 호출됩니다.
- 여기서 C에 스크립트 컴포넌트를 붙였습니다.
9. C 에 스크립트가 붙자 C의 Awake 가 호출됩니다.
10. A, B, C 의 Update 차례. C의 경우 처음 Update 호출이라서 그전에 Start 함수가 우선 호출됩니다.
11. A, B, C 의 LateUpdate 차례. A, B, C 의 모든 Update가 끝나면 호출되기 시작합니다.
3. On~ 계열 함수
1) OnMouse~ 함수군
마우스와 GUIElement, Collider 사이의 인터랙션에 관련한 함수 집합입니다.
게임 오브젝트가 Ignore Raycast 레이어에 속해있으면 호출되지 않습니다. (내부적으로 Raycast 를 하는 듯.)
이 함수들은 co-routine 으로 사용할 수 있습니다. (yield 사용 가능.)
이 이벤트는 GUIElement, Collider 에 붙어있는 모든 스크립트에 전달됩니다.
OnMouseEnter - 마우스가 처음 오브젝트 위로 올라왔을 때 호출.
OnMouseOver - 마우스가 오브젝트 위에 있을 경우 매 프레임마다 호출.
OnMouseExit - 마우스가 처음 오브젝트 밖으로 나갔을 때 호출.
OnMouseDown - 오브젝트 위에서 마우스 버튼을 눌렀을 때 호출.
OnMouseUp - 오브젝트 위에서 마우스 버튼을 땠을 때 호출. 눌렀을 때의 오브젝트와 같은 오브젝트일 때만 호출됨.
OnMouseDrag - 오브젝트 위에서 마우스 버튼을 누른 상태로 있을 때 매 프레임마다 호출.
여기서 Drag 는 일반적으로 생각하는 드래그가 아니라 그냥 꾸욱 누르고 있는 상태를 나타냅니다.
(물론 그 상태로 마우스를 움직이면 드래그지만..)
그리고 오브젝트 위에 마우스를 올려놓고 누르고 있으면 Over와 Drag 가 매 프레임마다 호출됩니다.
Drag 호출된다고 Over 호출 안된다거나 하는 거 없습니다. *ㅅ*
스크립트가 enable / disable 과 상관없이 호출됩니다.
즉 Inspector 에서 체크박스를 해제해도 스크립트가 붙어있다면 무조건 호출됩니다.
앞으로 '스크립트가 켜져있을 때만 호출된다.' 는 말이 없으면 기본적으로 비활성화 상태에서도 호출된다고 생각하세요.
2) OnTrigger~(other : Collider), OnCollision~(collisionInfo : Collision) 함수
OnTrigger~, OnCollision~ 은 모두 충돌 관련 함수입니다.
충돌이 일어나려면 두 오브젝트 모두 Collider 를 가져야 하고 둘 중 하나는 Rigidbody 를 가져야 합니다.
그리고 Rigidbody 를 가진 쪽이 움직여서 서로 만날 경우만 이벤트가 일어납니다. 물론 둘 다 움직이고 있어도 됩니다.
(그러니까 Rigidbody 를 가진 녀석은 가만히 있는데 그냥 Collider 가 아무리 와서 들이박아도 아무런 일도 생기지 않는다는 겁니다. ==> 중요한것입니다.)
Trigger 는 Inspector 창에서 Collider 의 Is Trigger 속성이 켜져있을 때 발생합니다.
Trigger 가 켜져있을 때는 Collision 관련 함수는 호출되지 않습니다.
Trigger 가 켜져있을 때는 두 오브젝트 사이에 물리 계산이 이루어지지 않습니다.
그래서 Trigger 는 단순한 '영역' 으로 이해하는 것이 좋습니다.
Collision 은 두 오브젝트 중 적어도 하나가 Inspector 창에서 Rigidbody 의 Is Kinematic 속성이 꺼져있을 때 발생합니다.
(Is Kinematic 이 켜져있으면 이 오브젝트는 내부 물리연산을 하지 않기 때문에 부딪쳐도 그냥 뚫고 지나갑니다.)
두 오브젝트 모두 Kinematic 속성이 켜져있으면 어느 쪽이 움직여서 겹치더라도 물리 연산이 이루어지지 않기 때문에
충돌 함수가 호출되지 않습니다.
Trigger 는 함수의 파라메터로 Collider 변수가 들어옵니다. 이것은 자신과 접촉한 오브젝트의 Collider 입니다.
Collision 은 함수의 파라메터로 Collision 변수가 들어옵니다. 이것은 접촉에 대한 여러가지 정보를 담고 있는 클래스입니다.
relativeVelocity - 두 오브젝트의 상대 속도입니다. 충격량이라는 느낌일까요? (읽기 전용)
rigidbody - 자신과 접촉한 Rigidbody 입니다.
만약 상대가 Rigidbody 가 없는 Collider 라면 이 값은 null 입니다. (읽기 전용)
collider - 자신과 접촉한 Collider 입니다. (읽기 전용)
transform - 자신과 접촉한 오브젝트의 Transform 정보입니다. (읽기 전용)
gameObject - 자신과 접촉한 오브젝트입니다. (읽기 전용)
contacts - 물리 엔진에서 연산한 접촉 포인트 정보입니다. ContactPoint 의 배열입니다.
두 종류 모두 ~Enter, ~Stay, ~Exit 함수를 제공합니다.
Enter 는 접촉을 시작했을 때 호출,
Stay 는 접촉 중일 때 매 프레임마다 호출,
Exit 는 접촉이 끝났을 때 호출됩니다.
두 함수군 모두 yield 사용 가능합니다.
* Mesh Collider 관련해 추가 설명
기본 도형으로 이루어진 Collider 이외에 실제 모델같은 Mesh Collider 를 붙일 수도 있습니다. (알고 계시겠죠? ㅎ)
그런데 기본적으로 Mesh Collider 는 다른 Mesh Collider 와 충돌 계산이 이루어지지 않습니다.
아마 계산이 오래 걸리기 때문에 막아놓은 것으로 보입니다. 기본 도형은 대체로 방정식 몇번 풀면 체크 끝나지만, Mesh 는... 모든 폴리곤을 순회하면서 체크해야 하니까요.
그래도 하고 싶은 사람을 위해 준비된 Inspector 창의 Mesh Collider 의 Convex 속성을 켜면 다른 Mesh Collider 와 충돌 계산을 합니다. 단, Convex 속성을 켜기 위해서는 Mesh Collider 의 폴리곤 개수가 255개를 넘으면 안됩니다.
이런 제한이 있습니다~ 간단한 게임이나 계산 파워가 부족한 iphone 게임을 만들 때는 굳이 Mesh Collider 쓸 필요는 없을 것 같습니다.
3) OnControllerColliderHit(hit:ControllerColliderHit)
CharacterController 가 Move 함수로 이동하는 도중 다른 Collider 와 충돌했을 때 호출됩니다.
(CharacterController 가 붙어있는 gameObject 를 Translate 로 움직여서 충돌할 때는 호출되지 않습니다.
무조건 CharacterController 의 Move 함수로 움직일 때만 호출됩니다.)
CharacterController 는 이전 충돌 함수 때처럼 따로 Rigidbody, Collider 가 필요없습니다.
4) OnJointBreak(breakForce:float)
게임 오브젝트에 붙어있는 조인트가 끊어질 때 호출됩니다.
조인트에 설정된 breakForce 보다 높은 힘이 가해지면 조인트는 끊어집니다.
조인트가 끊어질 때 주어진 힘이 파라메터로 들어옵니다.
조인트가 끊어지고 OnJointBreak 가 호출된 후 조인트는 자동적으로 게임 오브젝트에서 지워집니다.
5) OnParticleCollision(other:GameObject)
파티클이 Collider 와 충돌했을 때 호출됩니다.
WorldParticleCollider 와 충돌한 Collider 에 붙어있는 모든 스크립트에 호출됩니다.
Inspector 창에서 WorldParticleCollider 의 sendCollisionMessage 속성을 켜야지 호출됩니다.
(즉, 기본적으로 WorldParticleCollider 가 붙어있어야 합니다.)
Collider 는 따로 Rigidbody 일 필요 없습니다. yield 사용 가능합니다.
6) OnBecameVisible / OnBecameInvisible
renderer 가 어떤 카메라에 보이기 시작할 때, 보이지 않기 시작할 때 호출됩니다.
레퍼런스 설명은 위와 같은데, '어떤' 카메라라는 것은 여러대의 카메라가 있을 때 그 중 하나라도 보이기 시작하면 Visible, 모두 보이지 않을 때 Invisible 이라는 것이며, 단, 카메라가 있어도 비활성화 상태이거나 화면에 보이지 않을 경우 (즉 View Port Rect 의 width, height 가 0일 때) 는 '어떤' 카메라에 포함되지 않습니다.
오브젝트의 renderer 컴포넌트를 꺼도 마찬가지로 Invisible 입니다.
그러니까 단순히 말해서 어쨌든 화면에 보이기만 하면 Visible, 안보이면 Invisible 입니다.
renderer 에 붙어있는 모든 스크립트에 호출됩니다.
화면에 보일 때만 스크립트가 처리되도록 할 때 유용합니다.
yield 사용 가능합니다.
function OnBecameVisible ()
{
enabled = true;
}
function OnBecameInvisible()
{
enabled = false;
}
주의점이 있습니다. 툴에서 작업할 때 Scene View 에도 동일하게 동작합니다.
Game View 에서 안보여도 Scene View 에서 보이고 있는 상태라면 Invisible 호출이 안됩니다.
7) OnLevelWasLoaded(level:int)
새로운 레벨(scene)이 로딩되었을 때 호출됩니다.
level 파라메터는 로딩된 레벨의 인덱스를 나타냅니다.
메뉴 File - Build Settings... 에서 레벨과 인덱스를 설정할 수 있습니다.
yield 사용 가능합니다.
레퍼런스에는 적혀있지 않지만 해당 장면의 모든 스크립트에서 호출되는 것 같습니다.
8) OnEnable/OnDisable
스크립트가 켜지거나 꺼졌을 때 호출됩니다.
추가로 OnDisable 의 경우 스크립트가 붙은 게임 오브젝트가 제거될 때도 호출되므로 파괴자로 사용할 수 있습니다.
툴에서 플래이 모드 중에 스크립트를 편집할 경우, 편집이 끝난 후 스크립트가 다시 로딩되면서 OnDisable, OnEnable 이 순차적으로 호출됩니다.
참고로 툴에서 플래이 중 스크립트를 고쳤을 때 고쳐진 스크립트의 Awake, Start 는 호출되지 않습니다.
그리고 OnEnable 은 Awake 함수 바로 다음에 호출됩니다. (켜져있을 경우)
9) OnGUI
GUI 를 그리거나 이벤트를 처리하기 위해 호출됩니다.
이벤트 처리도 맡고있기 때문에 한 프레임에 여러번 호출될 수 있습니다. (한 이벤트에 한 번) 스크립트가 꺼져있으면 호출되지 않습니다.
OnGUI 함수 안에서 Event.current 를 사용하면 현재 처리하고 있는 이벤트 내용을 알 수 있습니다.
이 때 사용되는 Event 클래스의 내용은 다음과 같습니다.
type - 이벤트의 타입. (http://unity3d.com/support/documentation/scriptReference/EventType.html)
mousePosition - 마우스 위치. (Vector2)
delta - 지난번 처리한 이벤트와 현재 마우스 위치의 차이. (Vector2)
button - 어떤 마우스 버튼이 눌려졌는지. (int) (0:왼쪽, 1:오른쪽, 2:가운데)
clickCount - 마우스 클릭 횟수. (int)
character - 키보드로 입력한 문자. (char)
commandName - 단축키로 입력된 명령. (string) ("Copy", "Cut", "Paste", "Delete"... 툴에서만 호출.)
keyCode - 키보드로 입력한 가공되지 않은 키코드.(http://unity3d.com/support/documentation/scriptReference/KeyCode.html)
shift - 쉬프트 눌려져 있는지.
control - 컨트롤 눌려져 있는지.
alt - 알트 눌려져 있는지.
command - Command(맥)/Windows(윈도우) 키 눌려져 있는지.
capsLock - CapsLock 켜져있는지.
numeric - 키패드 입력인지.
functionKey - 펑션키 입력인지.
isKey - 키보드 이벤트인지.
isMouse - 마우스 이벤트인지.
Event 클래스의 기타 함수는 영역이 애매해서 따로 설명하지 않습니다. (http://unity3d.com/support/documentation/scriptReference/Event.html)
10) OnApplicationPause(pause:bool)
플레이어가 정지/재개될 때 모든 스크립트에서 호출됩니다. yield 사용 가능합니다.
11) OnApplicationQuit
어플리케이션이 종료되기 직전에 모든 스크립트에서 호출됩니다.
12) OnDrawGizmos
게임 오브젝트에 기즈모를 추가합니다.
이 기즈모는 선택할 때 사용할 수 있고 언제나 그려집니다.
13) OnDrawGizmosSelected
게임 오브젝트가 선택되었을 때 기즈모를 그리고 싶을 때 구현합니다. 이 기즈모는 선택에 사용할 수 없습니다.
Gizmos 클래스는 http://unity3d.com/support/documentation/scriptReference/Gizmos.html 에서 사용법을 확인할 수 있습니다.
혹 기즈모가 뭔지 모르시는 분은..
툴의 Scene 뷰에 빛이나 카메라의 위치를 볼 수 있게 해 주는 아이콘이 기즈모입니다.
눈에 보이지 않지만 위치 설정이 필요할 때, 중요한 오브젝트를 보기 좋게 표현하기 위해.. 기타 여러가지 이유로 사용할 수 있습니다. 실제 어플리케이션에는 표시되지 않지만 툴로 작업할 때 여러모로 편하게 해 줍니다.
공동 작업할 때 자주 사용하면 좋을 거라 생각합니다.
4. 렌더링에 관련한 고급 기능
1) OnPreCull
카메라에서 장면을 컬링하기 전에 호출됩니다. 여기서 컬링이란 프러스텀 컬링입니다. (후면 컬링 아님)
카메라에 붙어있는 스크립트에만 호출됩니다.
카메라의 속성을 바꾸고 싶을 때, 이 함수 안에서 하면 좋습니다.
이 함수가 호출된 후 실제 프러스텀 컬링을 하고 각 오브젝트가 화면에 그려질지 그려지지 않을지 정해집니다.
2) OnPreRender
카메라가 장면을 렌더링하기 전에 호출됩니다.
카메라에 붙어있는 스크립트에만 호출됩니다.
yield 사용 가능합니다.
3) OnPostRender
카메라가 장면을 렌더링한 후 호출됩니다.
카메라에 붙어있는 스크립트에만 호출됩니다.
yield 사용 가능합니다.
이 함수는 해당 카메라가 모든 오브젝트를 렌더링한 후 호출됩니다.
만약 '모든' 카메라와 GUI가 렌더링된 후 무언가를 하고 싶으면 WaitForEndOfFrame coroutine 을 사용하면 됩니다.
4) OnWillRenderObject()
해당 오브젝트를 렌더링하는 카메라마다 한 번 호출됩니다.
(세 대의 카메라가 하나의 오브젝트를 보고 있으면 그 오브젝트에 붙어있는 스크립트에서 세 번 불린다는 뜻.)
(툴에서 작업할 때는 Scene View 카메라도 들어갑니다.)
이 함수는 렌더링하기 전, 컬링 중에 호출됩니다.
Camera.current 를 사용하면 현재 어떤 카메라가 렌더링할 것인지 알 수 있습니다.
5) OnRenderObject(queueIndex:int)
오브젝트가 렌더링될 때 호출됩니다. queueIndex 는 해당 오브젝트를 렌더링할 때 사용하는 렌더 큐의 값입니다.
RenderBeforeQueues 속성으로 특정한 렌더링 큐에서 동작하도록 설정할 수 있습니다.
이 함수도 OnWillRenderObject 함수처럼 각 카메라가 그릴 때마다 한 번 호출됩니다.
6) OnRenderImage(source:RenderTexture, destination:RenderTexture)
모든 렌더링이 끝난 후 호출됩니다. 카메라에 붙어있는 모든 스크립트에서 호출됩니다.
포스트 프로세스 효과를 줄 때 사용합니다. (Pro 전용)
source 는 렌더링이 끝난 화면이며 destination 텍스쳐에 결과물을 그려주면 됩니다.
카메라에 여러 이미지 필터가 붙어있을 경우 순차적으로 진행됩니다.
게임의 경우 때깔내는데 가장 중요한 포스트 프로세싱 부분이 Pro 전용으로 빠져있습니다.
(그러고 보니 free 에서 렌더 타겟이 사용 불가였으니 당연히 이것도 사용이 불가능하겠네요.)
여기 있는 함수들은 제가 사용해 본 적이 없고, 지금 당장 특별히 어떻게 쓰면 좋을지 잘 모르는 관계로 특별한 부연 설명 없이 레퍼런스를 옮겨적기만 했습니다.
참고로 3.0 부터 이쪽 함수들은 스크립트가 꺼져있으면 동작하지 않는다고 합니다.
5. 네트워킹 관련 함수
점점 써 본적이 없는 함수만 나와서 정말 난감하네요;;;
1) OnPlayerConnected(player:NetworkPlayer)
새 유저가 성공적으로 접속했을 경우 서버에서 호출됩니다.
2) OnServerInitialized
Network.InitializeServer 를 호출한 후 완료되었을 때 서버에서 호출됩니다.
3) OnConnectedToServer
서버에 성공적으로 접속했을 경우 클라이언트에서 호출됩니다.
4) OnPlayerDisconnected(player:NetworkPlayer)
유저의 접속이 끊겼을 경우 서버에서 호출됩니다.
5) OnDisconnectedFromServer(mode:NetworkDisconnection)
서버와 접속이 끊기거나 접속을 종료했을 때 클라이언트에서 호출됩니다.
6) OnFailedToConnect(error:NetworkConnectionError)
접속 시도가 실패했을 때 클라이언트에서 호출됩니다.
7) OnFailedToConnectToMasterServer(error:NetworkConnectionError)
서버나 클라이언트에서 마스터 서버로의 접속에 문제가 있을 경우 호출됩니다.
8) OnMasterServerEvent(msEvent:MasterServerEvent)
서버나 클라이언트로 마스터 서버에서 보낸 이벤트를 받았을 때 호출됩니다.
9) OnNetworkInstantiate(info:NetworkMessageInfo)
Network.Instantiate 함수로 네트워크를 통해 게임 오브젝트가 생성되었을 때 해당 오브젝트에서 호출됩니다.
네트워크 상에서 새 게임 오브젝트가 생성되었을 때 다른 사람이 생성했는지 내가 생성했는지에 따라 오브젝트에 특별한
처리를 할 때 유용합니다.
10) OnSerializeNetworkView(stream:BitStream, info:NetworkMessageInfo)
네트워크 상에서 전달되는 변수들(variables in a script watched by a network view)의 동기화 처리를 커스터마이징할
때 사용합니다..
이 함수는 직렬화된 값 (즉 BitStream으로 바뀐 정보)을 전달할 것인지 받을 것인지에 대해서 자동으로 판단합니다.
(이 오브젝트를 소유권에 따라서 처리됩니다. 소유자는 보내고 나머지는 받고.)
사실 저같은 경우 tcp, udp 연결이 필요한 게임을 만드는 게 아니라 그냥 WWW 클래스만으로도 충분합니다..
설정
트랙백
댓글
글
사진에 나온건 the Apple mothership ... 애플에서 만드는 사옥이라고 알고 있습니다. 우주선이 따로 없네요
Gallery : http://www.engadget.com/photos/the-apple-mothership/
암튼 각설하시구... 아래 내용은 좀.. 필요할듯 싶어서.. 긁어왔습니다.
원문 출처 : http://roperacket.tumblr.com/post/2544450508/unity-ios-porting
번역본 출처 : http://unity3dkorea.com/bbs/board.php?bo_table=m03_9&wr_id=148
This presentation was given in the 2010 Gaming Unconference, 31 Dec 2010. I hope you find it useful.
December 31, 2010 at 1:51pm 에 작성한 글이니까.. 거의 1년이 다 되어 가지만.. 도움이 될것으로 생각되어 정리 해놓습니다.
The following is an incomplete, unsorted bullet list of tips I picked up while porting my Unity3D game ‘Rope Racket’ to iOS (iPhone/iPad).
I will try to keep this list updated as needed, so check back soon
아래의 글은 유니티3D로 만들었던 제 게임 'Rope Racket'을 iOS(iPhone/iPad)로 이식하면서 얻은 팁들에 대해 대략적으로 정리해놓은, 미완성된 리스트입니다.
아래 리스트를 필요하면 그때그때 업데이트할 예정이니, 종종 들러서 확인해보시기 바랍니다.
Physics(물리)
Unity3D uses the highly optimized PhysX physics engine. Normally all operations involving physics should be taken care of automatically by the engine. Here are some points to consider:
■Colliders – remove unneeded colliders and combine colliders into one. E.g. an enemy object can typically use one collider.
■Overlapping colliders can produce as many as 3 solving iterations per each frame so pay special attention when forcing position on an object with a collider.
■Use simpler colliders – sphere is simpler than cube, which is simpler than mesh collider.
■Joints chain reaction – a movement on one end of the joint always yields movement on the other end. Using several interconnected joints can produce a chain reaction of consequent movements, and should be used with care.
유니티3D는 매우 잘 최적화된 PhysX 물리엔진을 사용합니다.
일반적으로 물리에 관련된 모든 기능들은 이 엔진에 의해 자동적으로 처리됩니다.
하지만 iOS에 적용할 경우 고려해 볼 만한 점이 좀 있습니다 :
•충돌자Colliders : 불필요한 충돌자들을 없애고, 하나로 묶으세요. Ex) 적 오브젝트는 한개의 충돌자만 쓰게끔
•겹쳐진 충돌자들Overlapping colliders은 매 프레임당 (많으면)3번까지의 반복 처리를 유발할 수 있으므로, 충돌자가 붙은 오브젝트의 위치를 강제로 배치할 경우 특별히 유념하시기 바랍니다.
(씬 에디터 상에서의 수동 배치나, transform값 수정에 의한 배치 등 직접 position값을 주는 경우를 말함 - 역주)
•좀 더 간단한 형태의 충돌자를 사용 : 메쉬mesh 충돌자보다는 입방체cube, 입방체 보다 구체sphere 충돌자가 더 간단합니다.
•조인트Joints의 연쇄 반응에 주의 : 조인트 사용시, 한쪽 끝의 움직임은 항상 반대쪽 끝까지의 연쇄적인 움직임을 유발합니다. 서로 연결된 몇개의 조인트를 사용하게 되면 필연적으로 연쇄 반응하는 움직임을 양산하므로, 사용에 주의하시기 바랍니다.
General Optimization (일반 최적화)
Code optimization can significantly improve performance. In most cases, inefficient programming is the main blame for unoptimized performance.
■Some operations do not need to be called with every frame. E.g. button states, check distances, AI decisions etc. Most actions can be called 10 times per sec without anyone noticing.
■Get functions are a neat concept but can be expensive. Declaring a variable as public is crude, but is faster when external access is needed.
■transform is also a get function. Cache it in a variable when used repetitively.
■To avoid cpu spikes call garbage collector at scheduled intervals with System.GC.Collect();
■Precalculate arithmetic tables where possible, or at least cache values when they don’t change (sin/cos/atan/sqrt).
코드 최적화는 성능을 두드러지게 향상시킬 수 있습니다.
대부분의 경우, 최적화가 안돼서 성능이 떨어지는 주된 원인은 프로그래밍이 (애초에) 부적절하게된 점에서 발생합니다.
■몇가지 작업들은 굳이 매 프레임마다 돌릴 필요가 없는 경우가 있습니다.
Ex) 버튼의 상태 체크, 거리 체크, AI 전략 판단 등등 이런 동작들 대부분은 초당 10번 정도만 하게끔 바꿔도 아무도 모를 겁니다.
■Get...()류의 함수들은 개념적으로는 좋습니다만, 성능적으로 (처리 비용이) 비쌀 경우가 있습니다.
public 변수 정의로 값을 빼놓는 방법은 지저분해보이긴 합니다만, 외부에서 값을 억세스할 경우 더 빠릅니다.
■transform도 알고 보면 Get...()류의 함수를 쓰고 있습니다. 반복해서 사용할 경우 변수값에다 따로 빼놓으세요.
■종종 CPU 사용량이 비정상적으로 튀는(CPU spikes) 현상을 방지하려면, System.GC.Collect()를 사용, 적절히 정해진 간격으로 가비지 컬렉터를 호출하세요.
■sin/cos/atan/sqrt등의 수학 함수는 가능한 한 미리 계산된 테이블값을 사용하거나, 최소한 자주 변하지 않는 값들을 찾아 변수에 담아놓고 불러다 사용하세요.
Graphics (그래픽)
iOS GPU is very different from your PC’s. Some well known caveats:
■Triangle count – I’ve read a lot about some hard limits like 7k but my experience shows that it doesn’t change that much in comparison to other factors. Try to keep below 10k per scene if possible.
■Memory optimization – change the target maximum texture size per iOS to the smallest possible size without losing details. I found the 256x256 or less is quite sufficient for most objects. You can also change it per each target platform so it looks detailed on PC, and saves on memory on iOS.
■Complex and multi-pass shaders are slow on iPhone’s GPU. Toon and cutout shading are examples of shaders that should be avoided if possible.
■Lighting is very expensive. In general, every light is another drawing pass for all affected objects. Use one bright directional light. Use other lights, especially spot and point, with caution. Note that additional lights have two wrongs – they take an additional draw pass per each lit item, and initial light-on calculation takes a few milliseconds of stalled application.
■Changing vertex position, normals or tangents is expensive and should not be done repetitively. Changing UV (pixel position within texture) is fast, however.
■OnGUI is called every frame, plus every event. Furthermore, it does not share materials between subsequent calls to texture or text, even when the same resource is used (e.g. 2 calls for text and its shadow). Avoid if you can.
iOS에서 사용되는 GPU는 PC에서 사용되는 것과는 많이 다릅니다.
잘 알려진 제약 사항들 몇 가지를 살펴보자면 :
■ 폴리곤 수
7,000개가 HW 한계라던지(3GS 기준인 듯 - 역주) 같은 글들을 많이 읽어봤습니다만,
경험적으로는 폴리곤 수가 다른 요인에 비해 특별히 더 중요한 영향을 끼친다고 생각되진 않습니다.
한 씬에서 10,000개 이하로 유지하기 위해 가능한 한 노력해보세요.
■ 메모리 최적화
iOS 플랫폼에서 사용할 최대 텍스쳐 사이즈값Maximum Texture Size for iOS지정을, 디테일을 잃어버리지 않는 한도에서 최대한 줄여보시기 바랍니다.
(해당 Texture의 Inspector 메뉴 하단에서, 각 빌드 플랫폼별로 Override for... 체크박스를 켜고 최대 텍스쳐 사이즈 및 포맷 지정 가능. 자세한 사항은 http://unity3d.com/support/documentation/Manual/Textures.html 위 링크에서 Per-Platform Overrides 항목 및 플랫폼별 사용 가능한 텍스쳐 포맷 설명을 참조 - 역주)
제 경우는 대부분의 오브젝트에서 최대 256x256, 또는 그 이하로도 충분했었습니다.또한 이것을 각각의 대상 플랫폼별로도 지정하실 수가 있는데 (위의 역주 참고)PC에선 디테일하게, iOS에선 메모리 사용을 줄이는 식으로 지정할 수도 있습니다.
■iPhone의 GPU상에서 복잡하고 여러번의 패스multi-pass를 거쳐야 하는 셰이더를 쓰면 느려집니다. 예를 들어 Toon 계열 셰이더라든지, Transparent/Cutout 계열 셰이더는 가능한 한 사용을 피해야 합니다.
■라이팅은 (처리 비용이) 매우 비쌉니다. 일반적으로 조명이 추가될때마다 (영향받는 모든 오브젝트들에 대한) 그리기 패스drawing pass 또한 추가가 됩니다.밝은 지향성 조명directional light 하나만 사용하세요.
다른 조명, 특히 점point 광원이나 스포트라이트를 사용할 땐 주의하시기 바랍니다.조명을 추가하는 데엔 두 가지 문제점이 있음을 기억하세요 -그 조명을 받는 모든 물체에 대해 렌더링 작업이 늘어난다는 점과,그 조명이 켜지는 시점에서 조명 초기화를 위해 몇밀리초를 더 잡아먹게 된다는 점.
■정점vertex의 위치/노말/탄젠트 값을 바꾸는 것은 (처리 비용이) 비싸며, 반복적으로 해선 안됩니다.반면, UV(텍스쳐 내에서의 픽셀 위치) 값을 바꾸는 것은 빠릅니다.
■OnGUI()는 매 프레임마다, 추가적으로 매 이벤트마다 호출됩니다. 게다가, 연속되는 OnGUI() 내에서 같은 리소스, 매터리얼을 반복 사용하더라도
이를 공유해서 최적화해준다던가 하지 않습니다.(예를 들어, 텍스트와 그 그림자를 그리면 그대로 2번의 그리기 호출2 calls이 발생) 그러니 가능한 한 사용을 피하세요.
Draw Calls(그리기 호출)
A Draw Call is one or more objects, sharing a single material on a single camera, in a single shader pass, being placed on screen.
My experience proves that the most important element to optimize is to reduce the number of draw calls, even in high-end mobile device such as iPad. Apparently the pipeline between the CPU and GPU is not as efficient as in non-mobile devices.
■Make sure Dynamic Batching is checked.
■When checked, the engine groups all objects by their shared material, up to a maximum number of vertices per batch. Make sure that member sharedMaterial is used instead of material, whenever applicable.
■Furthermore, all batched objects must share queue pass. Each camera has multiple drawing passes. If a few materials share the same pass, there is no guarantee that all objects using the same material will be batched. Therefore you can help Unity by placing a material in a particular pass by changing its pass order.
For example, shader directive Tags {“Queue” = “Transparent-1” }
will make sure that this shader is drawn right after Transparent pass. So setting Transparent-1 separates this new material from normal Transparent shaded materials, and batches all objects using this material into one pass.
Note: This trick also helps when trying to sort depths and fix Z issues.
■Most importantly: Use one material (one texture) for as many objects as you can. For example, use an icon atlas and change UV position according to the desired image.
■Alternative solution: load a font and export its texture. Place all your images on the exported font texture instead of the original letters. Then, use Text Mesh and change the letters to display the proper icon.
그리기 호출Draw Call 은 (카메라를 통해 한 프레임의 화면을 만들어내는 동안) 하나의 셰이더 패스, 하나의 매터리얼로 오브젝트를 한 번 그리는 작업의 단위를 말합니다.
(같은 셰이더/같은 매터리얼을 갖는 여러 개의 오브젝트라도 한번의 draw call 작업에서 그릴 수 있음 - 역주)
iPad같은 하이엔드급 모바일 장치에서조차, 이 그리기 호출Draw Call 수를 줄이는 일이
제 경험상 최적화에서 가장 중요한 요소라고 생각이 됩니다. 확실히 모바일 장비는 비-모바일 장비non-mobile devices에 비해 CPU와 GPU간의 파이프라인이 그리 효율적이지가 않습니다.
■동적 배칭Dynamic Batching 기능이 켜져있는가 확인하세요 (File 메뉴 > Build Settings... 메뉴 > Player Settings 버튼 >
Inspector창에서 Other Settings 항목 > Rendering 항목 밑에 Dynamic Batching 체크박스 선택.
자세한 설명은 http://unity3d.com/support/documentation/Manual/iphone-DrawCall-Batching.html 위 링크에서 Dynamic Batching 부분을 참조 - 역주)
■이것이 켜져있으면, 게임 엔진은 모든 오브젝트를 공유된 매터리얼 단위로 묶습니다.
이 경우, (스크립트에서 건드릴 땐) material 멤버 대신 sharedMaterial 멤버를 사용하도록 해야 합니다.
■나아가, 배치 처리될 모든 오브젝트all batched object는 같은 셰이더 큐 패스queue pass를 공유해야 합니다.
각각의 카메라는 여러 개의 그리기 패스drawing pass를 가지고 있습니다. 몇몇 매터리얼이 같은 그리기 패스를 공유하고 있다 하더라도, 같은 매터리얼을 사용하는 모든 오브젝트가 한번에 배치 처리된다는 보장은 없습니다.
그러므로, 매터리얼의 셰이더 패스 순서pass order를 직접 지정해줌으로써 그 매터리얼이 특정 그리기 패스 안에서 동작하도록 강제할 수 있습니다.
예를 들자면, 셰이더 명령어 Tags {"Queue" = "Transparent-1" } 을 사용하면 해당 셰이더가 Transparent pass 직후(*주1*)에 동작하도록 강제할 수 있습니다. 이렇게 Transparent-1로 셋팅하게 되면, 이 새로운 매터리얼은 기존의 Transparent 셰이더와 분리되며,
이 새로운 셰이더를 사용하는 모든 오브젝트를 묶어 한 패스 안에서 배치batch 처리하게 됩니다. 주 : 이 방법은 깊이값 소팅이나 Z값 관련 문제를 해결하는데도 도움이 됩니다.
(이 항목의 내용은 제가 셰이더를 공부 안해서 제대로 번역이 되었는지 확신이 없네요 - 역주)
■가장 중요한 사항: 가능한 한 많은 오브젝트를 한 매터리얼(한 장의 텍스쳐)로 묶어야 합니다.예를 들어, 한장의 아이콘 맵icon atlas을 만들고 필요한 상황에 따라 UV위치값을 바꿔가며 쓰는 방법이 있습니다.
■대안책: 폰트를 하나 읽어들이고 이 텍스쳐를 export합니다. 찍고싶은 이미지를 조각내서 이 export된 폰트 텍스쳐 위치에 갖다 붙입니다.
그리고, Text Mesh를 사용해서 이것들을 가져다 적절한 아이콘으로 사용합니다.
More Tips
Here are some handy non-optimization tips:
■Instead of OnGUI or GUITexture, display all GUI in a new camera.
◦Create a new camera for GUI: isometric, ignores all other layers, Depth 1 (to draw after main camera) and Don’t Clear.
◦Use Text Mesh and Mesh Renderer to draw text. Make sure that the GameObject is set to the GUI camera layer. This is a very fast and versatile to use dynamic, localized text in Unity. Text can be changed, rotated, scaled and a user-defined material can be used instead of standard font.
◦Similarly, logos and images can be displayed on boxes. The triangle cost is minimal and on this isometric camera, the side walls are culled.
When transparent image is used, either use a shader with Culling On so the back wall is removed, or place the box very close to the camera so the front wall is behind the camera and only the back wall is shown.
■White border around textures is caused when a zero-alpha color partly bleeds into a visible pixel. In this case, the RGB part of that supposedly transparent pixel is taken into effect. To fix it in Photoshop:
◦Select all zero-alpha pixels
◦Paint around the edges of the images with the edge color (the select region will protect the image)
◦Create Layar Mask -> Hide selected area.
The result is an image where the RGB part of zero-alpha pixels matches the edges of the texture and bled pixels look nice.
More tips to follow soon.
최적화와는 관계없지만 몇가지 편리한 팁들이 더 있습니다 :
■OnGUI()나 GUITexture를 사용하는 대신, 별도의 카메라로 모든 GUI를 그려주기
◦GUI를 위한 별도의 카메라를 만듭니다
: 평행isometric 카메라로 지정하고, 별도로 만든 GUI 오브젝트 레이어 이외의 모든 다른 레이어를 끄고,
(메인 카메라보다 나중에 찍도록) Depth값을 1로 주고, Clear flag를 Don't Clear로 맞추세요.
◦텍스트를 찍기 위해선 Text Mesh 와 Mesh Renderer를 사용합니다.
만들어진 GUI용 GameObject들은 별도로 만든 GUI 오브젝트 레이어 쪽으로 넣어줍니다.
이렇게 하면 유니티에서 현지화된 텍스트를 사용할때 매우 빠르고 융통성있게끔 만들 수 있습니다.
이런 덱스트는 변경 가능하고, 회전, 확대/축소할 수도 있으며 기본 폰트대신 사용자 정의된 매터리얼로 대치할수도 있습니다.
◦비슷한 형태로, 로고나 이미지는 박스를 이용해 찍을 수 있습니다.
평행isometric 카메라 상에서 상각 폴리곤을 찍는 처리비용은 거의 미미하며, 불필요한 옆면 등은 알아서 무시됩니다.
투명값을 가진 이미지를 사용할때는, 뒷면이 없어지게끔 컬링이 적용된 셰이더를 사용하거나 박스 자체를 카메라에 아주 가깝게 가져와서, 박스 앞면은 카메라 평면 뒤로 보내고 박스 뒷면만 보이게 합니다.
■(투명값을 갖는 텍스쳐의 경우) 텍스쳐 테두리의 흰색 띠가 보일 경우는 알파값 0를 가진 픽셀 색이 주변으로 일부 번지기 때문에 발생합니다.
이 경우, 테두리의 주변 RGB값들이 영향을 미치고 있는 것인데, 포토샵에서 이를 수정하려면 :
◦알파값 0 인 배경 픽셀들을 전부 선택한다
◦이미지 테두리를 따라 원하는 경계선 색을 다 칠해준다 (이미지 안쪽은 선택 영역이 보호해준다)
◦Layar Mask를 만들어, 방금 칠해준 선택 영역을 hide 시킨다
결과적으로 알파값이 0인 픽셀들도 원하는 테두리 색을 가지게 되어 보기 좋게 섞여진다.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*주1*
원문에는 will make sure that this shader is drawn right after Transparent pass. 라고 되어 있어서
원 저자의 의도대로 'Transparent pass 직후' 라고 번역이 되었습니다만...
http://unity3d.com/support/documentation/Components/SL-SubshaderTags.html 을 보시면, 각 렌더 패스마다 내부적으로 1000단위의 숫자가 매겨져 있고, Transparent의 값이 3000이니
저 Transparent-1 패스의 경우는 2999가 되어, 실제론 'Transparent pass 직전'이 맞습니다.
하지만 원문 내용은 Transparent pass 앞이냐 뒤냐가 중요한게 아니고, 저런 식으로 태그를 부여해서 원하는 drawing 작업을 분리된 하나의 drawing pass로 통합하는 방법을 보여주는 것이니
틀린 내용이라 하더라도 원 저자의 문맥대로 일단 번역하고 별도로 각주를 남깁니다.
* 원문에 이렇게 애매모호(?)한 부분이 두어 군데 더 보입니다만, 마찬가지로 패스... *
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
END
설정
트랙백
댓글
글
설정
트랙백
댓글
글
아직 BOX 2D 물리엔진을 접하지 못하였지만..
사내에서는 Flash Action Script 에 포팅된 Box 2D 물리엔진을 이용해서 게임을 구현한다.
url : http://www.box2d.org/
document : http://www.box2d.org/manual.html
위 사이트로 들어가서 확인해보시면.. 정말 자세히 나와 있습니다. (영어 죠 ~ ^^)
그중에 About 부분을 보시면 아래와 같습니다.
Box2D is a 2D rigid body simulation library for games.
Programmers can use it in their games to make objects move in believable ways and make the game world more interactive.
From the game's point of view a physics engine is just a system for procedural animation.
Box2D is written in portable C++. Most of the types defined in the engine begin with the b2 prefix.
Hopefully this is sufficient to avoid name clashing with your game engine.
오늘 블로그에 글을 올리는 주된 목적은 아래 주제의 내용때문에 올리게 되었다.
BOX 2D 물리엔진과 HTML5을 이용해서 게임을 만들어 보는 예제가 있기 때문!!!
Build your First Game with HTML5
http://net.tutsplus.com/tutorials/html-css-techniques/build-ayour-first-game-with-html5/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+nettuts+%28Nettuts%2B%29&utm_content=Google+Reader
그냥 군말없이 한번 해보도록 해라~ ㅎㅎㅎ
** 그냥 내 생각인데.. 아직 html5에 대한 활용이 미비하지만, 몇년후면 HTML5 가지고 못할것이 없어 보인다. html5 랑 javascript 만 잘해도 먹고 사는데 지장 없을듯 ㅎㅎㅎ
RECENT COMMENT