'개발지식창고 > Unity3D' 카테고리의 다른 글

GUITexture의 좌표  (0) 2012.03.10
GUITexture의 객체 충돌체크방법  (0) 2012.03.10
Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
Posted by 모과이IT
,
GUITexture 의 location 부분에도 x,y,z 좌표가 존재 한다
x,y 좌표는 화면 해상도 상에서 2차원 개념적으로 x,y좌표 역할을 한다
하지만 한 가지 특이한 점은 z축으로 depth 역할을 을 한다.

예를 들면..



위와 같은 각각의 카드 GUITexture 객체가 있다고 가정한다면...
z좌표가 높은 순서가 GUI 상에서 상위에 그려지게된다.

A 카드 x = 0, y = 0, z = 0
8 카드 x = 50 , y = 0 , z =1

A카드가 8카드 z 좌표의 값이 낮다 그래서 A라는 카드는 밑에 있고 8 이란 카드는 위에 있는 것이다.

'개발지식창고 > Unity3D' 카테고리의 다른 글

GUI 콤보박스 생성  (0) 2012.03.12
GUITexture의 객체 충돌체크방법  (0) 2012.03.10
Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
Posted by 모과이IT
,

현재 프로젝트 진행중인 게임에서 GUITexture로 객체를 만든것에 대한 충돌체크를 고민 하였다

3D로 모델링 된것은 해당 객체에 Collider를 추가 시키고 RayCastHit이란 함수를 이용해서
쉽게 충돌 체크가 가능하였다.

하지만  GUITexture로 만들어진 객체는 근본 뿌리가 2D이기때문에 계속 3D 모델링 된것을 Collider를 추가 시켜서
충돌 테스트를 하는 삽질을 감행한 끝에....


위와 같은것을 Unity script API Reference에서 확인했다.
위의 코드는 해당 x,y,z 좌표의 값의 GUITexture가 있을경우 값을 bool 값으로 리턴을 해준다

인자 값으로 Input.mousePosition를 해주게 되면 현재 마우스포인터 값을 인자로 집어 넣을수있다

'개발지식창고 > Unity3D' 카테고리의 다른 글

GUI 콤보박스 생성  (0) 2012.03.12
GUITexture의 좌표  (0) 2012.03.10
Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
Posted by 모과이IT
,

http://unity3d.com/unity/ : 유니티 홈페이지

드디어... 우연치 않은 계기로 공부를 하게 되었습니다.
기본적으로 Unity 3D Engine은 모든 플랫폼을 지원하고, Javascript 와 C# 등을 이용하여 개발이 가능하네요..우선 Unity에 대해서 간략하게 정리 해놓은 글이 있어서..

특징!!!
첫 번째 멀티플렛폼 엔진
두 번째 통합 인터페이스
세 번째 저렴한 가격



참조글 : http://dustinlee.me/130110694303 에서 읽어 왔습니다.
극찬글 : http://blog.naver.com/fpdlwu2000?Redirect=Log&logNo=90116567963 

Unity3D의 역사

유니티는 2000년도 후반부터 가장 빠른 속도로 스포트라이트를 받고 있는 게임엔진이다.
실리콘 밸리도 아닌, 덴마크에서 시작한 이 회사의 기술력이 기존의 게임엔진들을 제치고 스포트라이트를 받는 원동력이 무엇일까? 

Unity의 역사를 살펴보면 지금과는 다르게 Mac만을 타겟으로 2001년부터 개발을 시작하여 2005년에 첫 버젼인 1.0을 출시한다. 그때 당시 쟁쟁하게 이름을 떨치던 다른 게임엔진들을 피해 맥에서 동작하는 3D게임개발 소프트웨어 제작을 목표로 집중하였고, 이런 노력을 인정받아 2006년 애플에서 Design Award 를 수상하게 된다.

처음에는 틈새시장인 애플에서 게임엔진을 만드는 것으로 목표로 하였지만 여기서 그치지 않고 확장성과 편의성, 그리고 빠른 처리 속도 모두를 잡을 수 있는 기술적인 방안에 대해서 중점적으로 고민하였고, 고민끝에 Mono를 기반 인프라로 채택한다.

Mono를 탑재한 2.0을 출시하면서 멀티플랫폼 기능으로 대중적으로 서서히 알려지게 되었으며, 모바일 바람이 불면서 이는 더욱 가속화되어  2009년도 탑 5 게임회사로 Gamasutra에 선정되면서 크게 주목받게 되었다.

이후 Unity는 전방에서 엔진 성능 및 게임제작에 필요한 기능들을 추가함으로서 게임엔진으로서 많은 발전을 하였고, 후방을 맡은 Mono도 제자리걸음을 하지 않고 PC, Linux, Mac, Smartphone에 이르는 멀티플랫폼을 안정적으로 지원해주면서, 쉽고, 빠르고, 멀티플랫폼지원이 되는 지금의 높은 생산성을 가진 솔루션이 탄생하게 되었다.
 
Unity3D과 기존엔진의 비교

 게임제작에 필요한 개발 소프트웨어를 크게 렌더링 엔진과 리소스와 렌더링 엔진을 연결하는 개발툴의 두가지로 나눈다면, 크게 2가지 게임엔진의 유형이 있을 것이다.
 
1. 에디터를 통해 모두 묶어서 제공하는 토털솔루션 유형.
2. 렌더링 엔진 중심으로 제공하되 보조툴을 별도로 제공하는 유형.

전자의 형태로 제공되는 게임엔진은 타겟이 어느정도 정해져 있어서, 이 타겟과 같은 장르의 게임을 제작한다면 빠른 기간에 퀄리티가 높은 결과물이 나올 수 있었으나 확장성이 매우 부족하여 다른 유형의 게임을 제작할 경우 소스코드를 뜯어서 재구성하는 경우가 많았다. 이런 엔진들은 주로 고가에 판매되어 다룰 수 있는 사람이 큰 규모의 게임회사인원으로 한정되어 있으며, 자유자재로 엔지니어링 하기 위해서 오랜기간의 노력과 리서치가 들어간다.

후자의 형태로 제공되는 게임엔진은, 엔진을 잘 이해한다면 다양한 장르의 괜찮은 퀄리티의 게임을 만들 수 있으나, 문제는 게임 제작에 필요한 개발툴의 제작기간이 오래걸리는 점이다. 게임이 완성되어질 쯤 엔진과 툴들은 전부 뜯어고쳐져서 원래의 모습은 흔적도 사라진 형태가 되는데, 게임브리오가 이런 유형의 대표적인 엔진이라고 볼 수 있다.
 
결국 양쪽 모두 개발기간이 오래걸리며, 주로 경험있는 개발자에 의해 프로젝트의 진행여부가 결정되는 경우가 많았다.

 
이런 구분에서 유니티를 평가한다면,
유니티는 토털솔루션이면서, 소스코드의 분석이 없이 다양한 게임의 제작이 가능한 매우 생산적인 게임제작도구라고 정의할 수 있다.

유니티가 기존의 다른 엔진을 뛰어넘는 만능 엔진이라는 맹목적인 찬사가 아니다. 
렌더링 엔진성능에 치중하는 기존 엔진회사들의 전략과는 다르게 게임제작의 생산성을 극대화하는쪽으로 치중하고, 이것이 아래에 설명하는 현재의 게임업계의 Trend와 부합되어 많은 고객들을 확보하고 있는 중이다.

게임업계의 Long-tail Trend

 SNS와 스마트폰의 발달은 단순한 유행이 아닌 하나의 큰 트렌드이고 향후 세상을 변화시킬 요소로 가장 주목받고 있음은 누구나 다 알고 있을 것이다.
 
Zynga, Rovio, Ngmoco  라는 회사들을 아는가?
 
기존의 EA와 같은 거대 공룡회사가 아닌 20여명내외의 작은 규모에서 출발하여 제각각 대박을 만든 신화적인 회사들이다. 불과 2-3년전에 갑작스럽게 벌어진 일들이다.
개발자의 관점에서 위 회사들의 게임 결과물을 보았을 때 관심을 가질만한 기술적인 장점이 그다지 안보인다. 최근에 나온 크라이시스2등의 그래픽과 비교한다면 너무 초라할 따름이다.
 
거품일수도 있지만 불과 20명 남짓한 웹 SNG(Social Network Game)전문 회사인 Zynga의 시가총액이 EA를 능가한다는 보도가 있으며, We Rule을 개발한 Ngmoco는 지난해 4500억원에 일본회사에 매각되었다. Rovio도 다르지 않다. 핀란드 벤쳐회사인 이 회사는 앵그리버드 하나로 핀란드의 삼성과 같은 존재인 노키아보다 더 많이 보도가 되고 있으며, 총 2억건 이상의 다운로드를 기록하고, 최근 4500만달러 투자를 유치하는 등 승승장구 중이다. 하지만 직원은 2011년 기준 이제 55명일 뿐이다.
 
이 회사들의 성공요인은 트렌드 붐이 일어나는 적절한 시점에 아이디어를 통해 시장을 선점하였다는 것이다.  독창적인 아이디어도 중요하지만 트렌드에 맞춘 시간적인 타이밍이 더욱 중요한 것이다.
 
최고의 MMORPG, FPS서비스를 위해 몇년동안 기존 엔진들의 소스를 분석하여 서버기술과 접목하여 재구성하는 노력이 메이저 게임 회사들이 지금까지 노력한 집중 포인트였다면, 이제는 아이디어를 바탕으로 가볍고 빠른 게임을 시장에 가장 먼저 내놓는 것이 트렌드인 것이다.
 
인터넷과 물류의 발달이 비인기상품들이 모여 틈새시장을 새롭게 형성하는 롱테일 현상을 가져다 주었다면, 모바일, SNS의 혁명은 대형 패키지 , 온라인 게임개발사가 차지했던 영역을 개인,소수 개발자들이 모여 새로운 게임의 장르를 형성하고 있다.

모바일에서도 게임은 전체 어플에서 차지하는 비중이 겨우 20%중반대이지만, 70%이상이 Top100안에 들정도로 매우 부가가치가 높은 장르다. 이 게임 앱들의 70%는 개인 혹은 소규모 게임 개발회사들이 제작하고 있다.
 
이들에게 필요한 것은 화려한 렌더링 기술, 많은 동접자를 처리하는 서버기술이 아닌 아이디어를 빠르게 시장에 선보이는 Time to Market을 단축시키는 기술이며, 이를 위한 게임엔진으로 유니티는 최고의 솔루션으로 자리매김 중에 있다.

유니티는 2005년도 1.0을 선보인 이래 2010년도에 25만명의 개발자가 등록했는데, 2011년도 초반에 벌써 50만 개발자가 등록하는 무서운 성장세를 보이고 있다.
 
유니티는 매년 3배씩 성장을 하고 있으며, 성장의 힘을 새로운 플랫폼을 안정적으로 지원하는 것과 개발자 고객을 지원하는데 사용하고 있다.  다른 게임엔진회사들이 고객에 대한 기술지원보다, 새로운 기술개발에 전념하는 것과는 180도 다른 전략이다. 

 Unity3D여야 하는 이유.
 
앞서서 말했듯이 Unity3D만의 차별화된 장점은 시대 Trend에 맞는 민첩한 생산성이다.
천재프로그래머인 당신이 어느날 멋진 아이디어가 떠올라 개인 혹은 소규모 회사를 창립한다 가정해보자.
OpenGL ES기반으로부터 직접 3D엔진을 만들고 게임까지 개발한다면 출시까지 얼마나 걸릴것인가? 이후 아이폰 및 안드로이드들의 고려한다면 당신의 천재성을 아이디어와 서비스 로직을 발전시키는데 활용할지, 각각의 기기들을 조율하는 엔지니어링에 활용할지 심각히 고민해볼 문제다. 또한 최종산출물 출시까지 걸린 시간과 노력의 댓가가 라이선스 값보다 과연 적게 들것인지 냉정하게 경제성 평가를 고민하여야 할것이다.
기술적으로 Unity3D를 사용함으로 얻게되는 생산성들을 정리해보면 다음과 같다.
  
- Mono VM 
  Mono를 한줄로 요약해본다면, 
 윈도우에서 만든 .NET 프로그램을 리눅스와 맥에서도 사용할 수 게 만들어주는 기반 인프라다.  '해킹이나 다른 비합법적인 방법을 통해 MS의 기밀을 빼내서 만든것이 아닌가?' 라는 생각이 들법도 한데
사실 .NET의 근간을 이루는 CLR이라는 체계는 MS만 사용했을 뿐이지, 표준기관인 ECMA를 통해 공개되어 있었고, Mono는 이 공개된 규약을 가지고 리눅스와 맥에서도 돌아가는 VM인프라를 제작한 것이다. 개발자 입장에서 보는 Mono의 큰 장점은 기존의 .NET 라이브러리 호환성이다.
 
.NET에서 제공하는 기본 라이브러리(List, Queue, Hashtable, Dictionary등등.)들을 사용하여 리눅스, 맥, 요즘 지원하는 안드로이드 및 iOS에서동작하는 어플리케이션의 제작이 가능하다는 것이다. VM레벨에서 명령어가 호환이 되므로 재사용을 위해 OS별로 다시 컴파일하는 과정도  필요없으며, 조금 더 생각해본다면 모듈을 의존성없이 잘 설계한다면 하나의 dll을 가지고 여러 OS에서 재활용 할 수 있다. 기존 C# 개발자들에 의해 만들어진 수많은 라이브러리도 같이.

그리고 .NET은 멈추지 않고 MS의 전폭적인 지원을 받으며 점점 성장하고 있다.
지난기간동안  .NET의 프로그래밍 기능에서의 큰 변화를 꼽으라면

- 2.0의 Delegate, Generic지원.
- 3.5의 Lambda expression을 통한 Linq.
- 4.0의 Parallel Programming지원
 
등이라 생각하는데, Mono는 현재 빠른속도로 업그레이드를 통해 MS가 만들어놓은 위의 기능들을 대부분 지원하고 있다. 
 
다만 상황이 글에서만큼 완벽한 것만은 아니다.

Mono가 Novell의 후원을 받고 있지만, 엄청난 두뇌와 자본이 모인 MS의 기술력을 따라잡기에는 많이 부족한것은 사실이다. MS는 C#이 cpp나 C와 견주어서 성능에서 큰 손색이 없도록 정말 많은 노력을 초창기에 쏟아부었고, Mono에서도 이러한 노하우와 퍼포먼스가 반영되기는 아직은 더 시간이 필요하다. 특히 스마트폰과 같은 Embedded 시스템에 .NET을 포팅하는 작업들은 이제 시작단계라 윈도우와 동일한 결과를 장담할 수 없고 기업차원에서 체계적인 기술지원이 없으면 이를 믿고 개발하는 사람들에게 위험한 상황이 발생할 수도 있다.

다행히 Mono의 전략이 Embedded시스템쪽으로 특화시키는 것으로 보여지며, Unity에서도 Mono와의 협력을 통해 각 OS별로 최적화된 작업을 추가적으로 진행하고 있다. 
 
예를 들면 안드로이드에 특화하여 Dalvik VM과 Mono CLR과 연동하는 기능의 제공이라던지,
.NET 기본 라이브러리 크기를 줄이는 Strip Byte Code기능등이 대표적인 예인데, 이를 통해 확장성있고 최적화된 앱들의 제작이 가능하다.
 
Java가 Oracle에 인수되고 Java아버지는 회사를 떠나고 없는 뒤숭숭한데, 노키아도 자사의 Java ME기반 OS를 버리고 윈도우폰을 사용하기로 협약한 이 상황에서 , Mono만큼의 좋은 결과를 보여주는 멀티플랫폼 솔루션은 없으며 이는 Unity와의 공조로 부족한 레퍼런스 및 최적화 기능들이 빠른 속도로 완성되가고 있다. 

 -  C#의 생산성
 
Unity는 C#과 Javascript의 사용이 가능한데, 개인적으로 선호하는 언어는 C#이다. 
개인적인 경험에 따른 이야기를 통해 C#의 생산성을 이야기하고자 한다. 
일전에 반년정도 기간동안 하나의 프로젝트를 한적이 있었다. php로 되어 있는 리눅스 웹 서비스를 6개월안에 윈도우즈 서버 플랫폼으로 변환하는 내용이었는데, 일이 언제나 그렇듯이 초기 3개월은 스펙하고 기획들을 협의하는데 시간을 소비하고, 시스템 구조 잡고, 하드웨어 세팅하다보니,시간이 훌쩍 흘러갔다.  설상가상으로 내정된 개발자가 중도에 퇴사를 하는 일이 발생하여 개발자가 없어졌고, C#에 과거에 경험이 있던 내가 직접할 수 밖에 없었다. 우리는 이 작업에 대해 3명, 3개월개발기간을 예상하였지만.. 
이 상황에서 적당한 해법을 찾기 위해 ASP.NET에 대해 좀 심도있게 살펴보았다. 이때가 ASP.NET MVC2버젼이 막 나왔을 무렵이었던거 같다. 프레임웍이 이해되고, LINQ 사용법에도 익숙해졌을 때, 기획이 어느정도 완성이 되자 ASP.NET MVC Framework 구조를 반영한 나름 최적화된 설계가 잡혔다. 이후 기획된 로직을 구현하면서 계속 리팩토링을 하다보니 어느순간 끝이 보이기 시작하면서 나머지는 비슷한 패턴들에 대한 반복작업이되었다. 시간을 보니 1개월 반정도 지난 시점에서 대부분의 기능들이 완료가 되어있었고, 남은 시간에 필드테스트를 거쳐 일정에 차질없이 서비스를 시작할 수 있었다.
 
  
이때 느낀점들은.
 
   - Java가 생산성 높은 구조를 위한 프로그래밍 환경제작에 많은 공헌을 하였다.
   - .NET이 Java가 만들어 놓은 좋은 것들을 다 소화하면서 따라오고 있다.
   - .NET은 새로운 개념을 도입하는데 전혀 주저하지 않으며 자신만의 장점도 계속 발전시키고 있다.
   - C#은 배를 조종하는 사공이 한사람만 있다. 사공이 정한 규칙을 잘 준수한다면 배를 타는 승객들은 누구보다 가장 빨리 목적지까지 갈 수 있다.
   - C#은 편하고 생산성 높은 언어다. 대신 잘쓰려면 공부를 많이 해야한다.
   - Visual Studio 2010의 단축키, 리팩토링, 고급기능을 적절히 활용하면 코딩시간의 큰 부분을 줄일 수 있다. 유니티는 Visual Studio 2010과 디버깅을 제외하고 완벽히 연동된다.
 

- 확장성
 
Unity3D는 엔진뿐 아니라 에디터의 구성요소까지 많은 부분을 모듈화하였다.
이를 통해 어느정도 에디터를 자신에 맞게 커스터마이징도 가능하다. 
모듈화된 구성요소들은 스크립트를 통해 제어가 가능하며. 이를 위한 문서들은 온라인사이트를 통해 잘 정리되서 제공된다. 게다가 개발자 커뮤니티가 활발히 활성화되어 있어 문제 해결에 도움받기가 무척 수월하다.
스크립트로 제어할 수 있는 수준은 원시적인 레벨까지 가능하며, 실제로 에디터에 아무 설정이 없어도, 스크립트를 통해 하나의 점으로부터 게임레벨까지 모두 동적으로 생성하는 것도  가능하다.
 
개인적으로 Unity3D가 제공하는 인프라를 보면 게임제작에만 활용되는 부분이 아깝기까지 하다.

지금은 게임개발에 종사하지 않지만, 현재 종사하는 분야의 솔루션을 위해 Unity3D 인프라를 이용하여 저작도구 및 시뮬레이션 어플리케이션을 제작하고 있는데, 현재까지의 성과는 매우 만족스럽다.
현재 어플리케이션을 만들면서 느끼는 점은 2D UI에 대한 지원이 생각보다 미흡하다는 점인데, Asset Store 커뮤니티에서는 다른 개발자들이 만든 3rd Party 솔루션들을 구입하여 사용하여 이를 보완하고 있다.
 
결론
 
소규모 혹은 1인게임개발을 꿈꾸거나, 아이디어가 있는데 빨리 출시를 생각한다면 유니티를 도입해보는 것을 적극추천한다.
우선 무료인 일반 버젼을 받은 후에 기본 기능들을 충분히 스터디를 하고, 상황에 따라 적절한 라이센서를 구입하여 프로젝트를 진행한다면 빠른 시간에 경제적으로 최종 결과물을 볼 수 있다.
개발에 대한 문서 및 레퍼런스등은 유니티 웹페이지와 커뮤니티를 통해 충분히 지원받을 수 있으며, 영어가 부담된다면 아직 우리나라에는 유니티관련된 깊이 있는 전문 커뮤니티가 부족하지만 unity3dkorea.com과 같은 커뮤니티를 통해 점점 활성화되고 있으니 이를 참고하면서 진행하면 많은 도움을 받을 수 있다.

대학에서도 무료 유니티강좌들이 시도되고 있으니, 이들을 활용하는 것도 처음 시작에 대한 감을 잡는데 좋은 방법이 될 수 있다.



그러쿠낭~ 반가워용

Unity 3를 이용한 Image Effects
http://www.youtube.com/watch?v=wc1vJ-FixM8

Posted by 모과이IT
,

Intermediate(중간) 단계의  강좌들입니다.
요걸 다 보고 나니... 볼것이 없네요.. 다른 강좌들이 있는지 좀 찾아 봐야 할것 같습니다..

1. Raycasting

많이 들어 본것 같은데 Ray(x-ray 들어봤는데.. 빛인가??) 는 안보이는 선인것 같다.
나중에 좀더 보충해야지.. 가상의 선을 그어.. 그 선과 다른 객체와의 관계를 나타내고 있습니다.

function Update () {
 
   var up = transform.TransformDirection(Vector3.up);
   var hit : RaycastHit;   

   Debug.DrawRay(transform.position, -up * 10, Color.green);
 
   if(Physics.Raycast(transform.position, -up, hit, 10)){
      Debug.Log("Hit");   
      if(hit.collider.gameObject.name == "floor"){
           Destroy(GetComponent(Rigidbody));
      }
   }
}

2. Basic Animation and Events

Animation 를 추가 해서.. 해당 시간에 해당 객체가 어떠한 이동/확대/회전 을 하느냐를 적용합니다.
또한 해당 이동시에 Flat 이라는 것을 적용해서 부드럽게 이동하도록 하는 효과도 주는 군요
애니메이션 과정중에 사운드도 집어 넣지요... 으하하핫

var blip : AudioClip;
 
function blipSounder () {
 AudioSource.PlayClipAtPoint(blip, transform.position);
}


Unity3DStudent 와 함께 있는 LearnUnity3D 가 있군요.. 형제(자매) 사이트 인듯 싶은데... 이곳에도 튜토리얼이 있더군요.. 참고하면 좋을 싶습니다. (영어를 잘한다면.. 쉽게 접근가능 하겠습니다.)
http://learnunity3d.com/ 

Posted by 모과이IT
,

Become a videogame developer 라는 부제를 가지고 있는 사이트입니다.
http://www.unity3dstudent.com/



교육 단계 모두 동영상으로 구성되어 있어서 , 공부하는데 정말 수월하게 진행 될수 있었습니다.
아래 내용은 제가 공부 하는데, 정리한 내용들이니.. 위에 사이트 가셔서 직접 공부하시는 것이 더더욱 도움이 많이 될것입니다. ^^

기본적으로 해당 강좌는 모두 javascript 로 구현되어져 있습니다.


Adding Mass / Gravity with Rigidbodies

해당 객체에 아래와같이 함수를 추가해주시고, 중력을 줍시다.

기본적으로 이렇게 중력을 추가하는 것이 가장 기본이고, 이게 너무 신기 했습니다.

1. Basic Collision Detection  
충돌 탐지 : 해당 객체에 아래와 같이 함수를 추가해 보시면.. 아래와 같이 디버깅 창에 로그가 나타납니다. 충돌이 되는 순간을 알수 있다라는 것 알게 되었지요


function OnCollisionEnter(theCollision : Collision){
 if(theCollision.gameObject.name == "Floor"){
  Debug.Log("Hit the floor");
 }else if(theCollision.gameObject.name == "Wall"){
  Debug.Log("Hit the wall");
 }
}


2. Detecting Input
입력값 탐지 : Update 함수는 Play가 되는 동안을 알수 있는 함수 있다.
스페이스바를 눌렀을때.. 로그가 나오는 거죠

 

function Update () {
    if(Input.GetButtonUp("Jump")){
        Debug.Log("We Have Hit the Space Bar!");
    }
}


3. Prefabs
Prefabs – How to make them, what they are for, and why!
Hierarchy에서 생성한 객체를 Prefabs 로 생성해서 추가합니다.
그리고 맘대로 쓸수가 있군요.. 한번 만든것을 응용해서 사용하자는 거군요.

4. Destroying Objects

오브젝트를 삭제하는 것을 알려 줍니다.
타겟을 지정하고, 지연시간을 추가할수도 있지요.

function Start () {
 Destroy(gameObject.Find("Cube"),2);
}


5.Instantiate to Create Objects

빈 객체(GameObject)에다가.. javascript로 객체 생성을 하고, prefab에다가... 기존에 만들어 놓은 BounyBox(prefab)를 추가하면.. 생성이 되지요

6.SImple Timer
타이머를 추가해서.. 이것저것 로그 찍어봅시다.

//A simple countdown timer
var myTimer : float = 5.0;
 
function Update () {
 if(myTimer > 0){
  myTimer -= Time.deltaTime;
 }
 if(myTimer <= 0){
  Debug.Log("GAME OVER");
 }
}

7. Basic Translate Movement
해당 객체를 이동시키는 거군요.. 간단 하면서..


//Basic movement of an object with Translate
var speed : float = 5.0;
 
function Update () {
 transform.Translate(Vector3(0,0,speed) * Time.deltaTime);
}

8. Basic Force Movement
힘...해당축으로 밀어주는 힘을 말하는 군요..냐하하하

//Basic force to move a rigidbody object
var power : float = 500.0;
 
function Start () {
 rigidbody.AddForce(Vector3(0,0,power));
}

9.Adding Materials
배경 입히는 것이군요..

10. Audio Basics

스크립트를 통해 사운드를 넣어주게 됩니다.

//Play an instance using attached AudioSource component
var myClip : AudioClip;
 
function Start () {
 audio.PlayOneShot(myClip);
}
Using PlayClipAtPoint:

//Spawn a new object with AudioSource and Clip set, at a point in the 3D world
var myClip : AudioClip;
 
function Start () {
 AudioSource.PlayClipAtPoint(myClip, transform.position);
}

11. Basic Joints
기본 관절... 헐..이음새 등을 이용하게 되는 군요.. 오홋 정말 신기합니다.
이음새를 연결하여 헐렁 헐렁...

12.Input with Axes

방향키로 객체를 조정하는 방법을 배워봅니다.
응용범위가 점점 넓어지는 군요

function Update () {
 var horiz : float = Input.GetAxis("Horizontal");
 Debug.Log(horiz); 
 transform.Translate(Vector3(horiz,0,0));

}

13. Trigger Collision Detection

Trigger를 체크 했을때, 객체가 통과가 되네요..
또한 통과했을때의 확인할수 있습니다.


function OnTriggerEnter (myTrigger : Collider) {
 if(myTrigger.gameObject.name == "box"){
  Debug.Log("Box went through!");
 }
}


14. GUI Text and Counters
GUIText 객체를 사용하는 방법에 대해서 알아봅니다.
오홋 카운트도 넣을수가 있네요.. 이런 말도 안되는;;

var Counter : int = 0;
 
function Update () {
 Counter++;
 guiText.text = "Counter is: "+Counter;
}


15. Adding Componets via Script

스크립트를 사용해서 다른 객체에게 기능을 추가하는 요소

function OnCollisionEnter (myCollision : Collision) {
 if(myCollision.gameObject.name == "Platform"){
  if(!myCollision.gameObject.rigidbody){
   myCollision.gameObject.AddComponent(Rigidbody);
  }
 }
}

16. Switching Scenes
화면 전환입니다.(Build Setting 를 사용할수도 있지요..)
플레이 화면과 결과 화면을 연동에 응용하면 좋을것 같습니다.

var myLevel : String;
 
function OnCollisionEnter (myCollision : Collision) {
 if(myCollision.gameObject.name == "Floor"){
  Application.LoadLevel(myLevel);
 }
}


17. Tweaking Components via script
스크립트를 이용하여, 불을 켜다...

function OnCollisionEnter (myCollision : Collision) {
 if(myCollision.gameObject.name == "Floor"){
  var myLight : Light = gameObject.Find("Light").GetComponent(Light);
   myLight.enabled = true;
   myLight.intensity = 5;
 }
}

18.Local vs World Direction
alt 키를 누르면 되고.. Local 과 World Direction은 좀더 찾아서 공부를 해봐야 할 것 같습니다.

function Update () {
 //transform.Translate(Vector3(0,0,1) * Time.deltaTime);
 var fwd = transform.forward * 100;
 rigidbody.AddForce(fwd);
}

19. Following with LookAt()
카메라 이동 컷입니다. 오호홋.. 바로 이거야. 멋쪄브렁


var myTransform : Transform;
function Update () {
 transform.LookAt(myTransform);
}

20. IF Statement and Booleans
boolean의 상태값 에 따라 변경하는 방법


var myCheck : boolean = true; 
function Update () {
 
 if(myCheck){
  guiText.text = "Its on!";
 }else{
  guiText.text = "Its Off!";
 }
 
 if(Input.GetButtonUp("Jump") && myCheck){
  myCheck = false;
 }else if(Input.GetButtonUp("Jump") && myCheck == false){
  myCheck = true;
 }
}


21. Finding Distance with Vector3
떨어지는 객체에 대한 거리를 측정하여, 다양한 액션을 취하도록 합니다.


var box : Transform; 
function Update () {
 var dist : float = Vector3.Distance(box.position, transform.position);
 Debug.Log(dist);
 
 if(dist <= 10){
  light.enabled = true;
 }else{
  light.enabled = false;
 }
}


22. Pausing Scripts with WaitForSeconds()
몇초동안 멈추는듯 한데유..
더욱 신기한것은 Instantiate 함수 입니다.
계속 인스턴스를 생성하네요 @.@

var box : GameObject;
var readynow : boolean = true;
 
function Update () {
 if(readynow){
  MakeBox();
 }
}
 
function MakeBox(){
 readynow=false;
 Instantiate(box, transform.position, transform.rotation);
 yield WaitForSeconds(2);
 readynow=true;
}


23. Particle Systems
파티클을 적용 해봅시다. 터지는 효과등에 사용하면 그만이겠군요!

var stars : ParticleEmitter;
 
function OnCollisionEnter (col : Collision) {
 Instantiate(stars, transform.position, transform.rotation);
 Destroy(gameObject);
}

24. For Loops
루프를 돌려 보자구용
var myPrefab : Rigidbody;
var distanceMultiplier : float = 2;
 
function Start(){
 
    var i : int = 0;
    var pos : Vector3 = transform.position;
 
    for(i=0; i&lt;=3; i++){
        Instantiate(myPrefab, Vector3(pos.x+i*distanceMultiplier, pos.y, pos.z), transform.rotation);
        yield WaitForSeconds(0.5);
        Debug.Log("made ball "+i);
 
    }
 
}

25. GUI Texture & mouse Event
드디어.. 버튼 롤오버.. 와 클릭 이벤트를 알아냈군요..
게임내 버튼을 만들면 되겠군요..요걸 가지고

var normalTex : Texture2D;
var hoverTex : Texture2D;
 
function OnMouseEnter () {
 guiTexture.texture = hoverTex;
}
 
function OnMouseExit(){
 guiTexture.texture = normalTex;
}
 
function OnMouseDown(){
 Debug.Log("clicked");
}


26. Using Mathf.Clamp to restrict values
이동의 제한을 두는 방법입니다.
Clamp 자체가 꺽쇠 라는 뜻이라는 군요..


function Update () {
 var xMove : float = Input.GetAxis("Horizontal") * Time.deltaTime * 20;
 transform.Translate(Vector3(xMove,0,0));
 transform.position.x = Mathf.Clamp(transform.position.x, -10, 10);
}


27.Using Time.timeScale to Pause
timeScale 를 이용한 일시정지..(스페이드바 키를 이용)

var paused : boolean = false;
 
function Update () {
 if(Input.GetButtonUp("Jump")){
  if(!paused){
   Time.timeScale = 0;
   paused=true;
  }else{
   Time.timeScale = 1;
   paused=false;
  }
 }
}


28. SendMessage() to Call External Functions

자.. 그러니까.. 외부 함수를 SendMessage를 통해서 전달할수가 있다는 말이야.

var downTexture : Texture2D;
 
function React () {
 renderer.material.mainTexture = downTexture;
 yield WaitForSeconds(1);
 gameObject.AddComponent(Rigidbody);
}

 

function OnCollisionEnter(col : Collision) {
 if(col.gameObject.name == "Switch"){
  gameObject.Find("Block").SendMessage("React");
 }
}


'개발지식창고 > Unity3D' 카테고리의 다른 글

Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
MonoBehaviour 로 오버라이딩 되는 함수 정리  (0) 2012.02.26
기본 용어 및 개념정리  (0) 2012.02.26
Unity 3D란?  (0) 2012.02.26
Posted by 모과이IT
,

출처 : http://kimseunghyun76.tistory.com/194

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 는 매 프레임마다 호출되지만 한 프레임에 여러번 호출될 수도 있습니다. ??
  
* FixedUpdate 는 매 프레임마다 호출됩니다. 그런데 한 프레임에 여러번 호출될 수도 있습니다. 사실 이거 거짓말입니다.
   그냥 알기 쉽게 하려고 이렇게 적어넣은 것이고... 정확히 하면 'FixedUpdate 는 1초에 50번 매 0.02초마다 호출됩니다.
   그러니까 실제 렌더링 프레임 사이에 여러번 호출될 수도 있습니다.
   Update 는 실제 렌더링 프레임 기반으로 동작하지만 FixedUpdate 는 고정 프레임(아마 50fps)으로 다른 쓰레드에서
   동작한다고 생각하시면 됩니다.

   이렇게 나뉘어져 있는 이유는 주로 '물리 연산 중의 충돌 체크 및 정확한 움직임 처리의 근사' 때문입니다.
   물체는 곡선운동도 하고 회전운동도 하므로 그 궤적이 항상 직사각형이나 실린더 모양이라고 생각할 수 없습니다.
   물리 공식에 의해 곡선으로 움직이는 궤적도 계산해 낼 수 있고, 궤적 사이에 충돌 체크를 할 수도 있겠지만 여기에는
   막대한 CPU 자원이 들어갈 것입니다. (사실 3차원 곡면 사이의 충돌 검출이라.... 생각하는 것만으로도 머리 아퍼)
   그래서 대체로 물리 엔진은 시간을 아주 짧게 잘라서 물체를 이동시키고 충돌 체킹을 하게 됩니다.

   3D 에서 평면 폴리곤으로 곡면을 표현하는 걸 생각하시면 될 것 같네요.
   잘게 자르면 자를 수록 점점 원하는 모양에 근사시킬 수 있죠?
  즉, 전체적인 모습을 보면 곡선의 움직임이지만 자세히 들여다 보면 직선 움직임의 덩어리라는 것이죠.
  계산상으로 직선을 처리하는 것 (1차 방정식) 과 곡선 (2차 이상의 방정식 or 심하면 음함수 그래프 같은 움직임까지)을
  처리하는 것은 넘사벽의 차이가 있습니다.
  어쨌든 계산을 빠르고 편하게, 하지만 나름 정확하게 하기 위해 이런 방식을 씁니다.
  (제가 예전에 담당하고 있던 라이브 게임에도 이펙트 코드에 가끔씩 이전 프레임과의 시간 차이를 계산한 후에
  더 자잘하게 잘라서 실제 처리하는 함수를 여러번 호출하는 루틴도 있었습니다.)
 
   참고로 테스트 해 보니 아무런 조작도 없을 때 FixedUpdate 실행 주기는 0.02 초 정도인 듯 합니다.
   (위에서 50fps 라고 적은 이유)
  
   사실 스크립트 짜는 데 아무런 도움도 안될 것 같은 느낌이 드는데 그냥 '이런 저런 사정 때문에 이런 함수가 있고,
   이렇게 동작한다.' 정도만 아시면 될 것 같습니다.
   

 // 매 프레임마다 rigid body 에 위로 향하는 힘을 가해준다.
 // 즉 이 예는 등가속 운동입니다. (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 클래스만으로도 충분합니다..

'개발지식창고 > Unity3D' 카테고리의 다른 글

Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
기본 용어 및 개념정리  (0) 2012.02.26
Unity 3D란?  (0) 2012.02.26
Posted by 모과이IT
,

1. 3D용어 

3D 그래픽스 좌우, 앞뒤, 상하를 표현한 그래픽스 
3D 그래픽스는 삼각형 폴리곤이 기본이고 이를 모아서 만든것이 Mesh라고 하며 모델을 생성한다.
vertex는 두선의 정점 
edge는 모서리
point는 점 
segment
3d오브젝트 좌표계 y,x,z축으로 구성 
world 좌표계

PS) 카메라 셋팅이 중요하다. 건물이 안보일수도 있다.


2. 카메라 

-  카메라 오브젝트와 대상이 되는 오브젝트의 위치를 카메라에 오브젝트가 개발자가 의도한대로 위치 시킨다.
-  카메라 속성

 - 투영법 -> 직교투영 - 원근감이 없는것 3d이지만 2d게임을 만들고 싶을때 쓴다. Orthographic
 -> 원근투영 - 원근감이 있는것 뒤에 있는것은 작아진다.  Perspective
     - frustum : 절두체 피라미드 머리를 날린다. Far와 Near를 이용하여 화면을 비율적으로 본다.
                     near이 0.3으로 되어 있는 이유 보이는 것이 있어야 하긴 때문에 0이 될수 없다.
         Far을 잡아 랜더링 할 부분까지 정해준다. 즉 최대 시야 범위를 정한다. 이 범위 만큼 리소스를 
         먹기 때문에 잘 정해줘야 한다. Far끝부분은 포그로 막아준다.
     - field of view : 화면의 각도를 늘리고 줄인다.  
 
 - 원근법


3. 화면구성

Scene - 화면 배치
Game - 실제 게임에서 보이는 화면
Project -  는 클래스라고 보면된다
Hierachy - 는 인스턴스라고 보면된다.
Inspector - 구성요소
transform - 객체 크기 위치 기울기 조정
GameObject - 객체
Component - 구성 메서드

PS) 3D는 오브젝트의 크기가 별로 중요하지 않다. 카메라 위치가 중요.


4. Scene 

- 오브젝트를 배치하고 연결하는 것


5. GameObject

plane - 장소 지형 texture(u,v) vertex(x,y,z) normal(x1,y1,z1)
plane의 한 폴리곤의 각점은 normalVector 값을 가지고 있다.
directional light 는 한방향에서만 쏟아지는 빛

-게임 오브젝트는 서로 부모 자식 관계를 가질수 있다. 자식은 부모의 행동을 따라 한다.
 
6. Vector   크기와 + 방향을 가진 
Vector2(x,y)
Vector3(x,y,z)
내적 , 외적? - ㅅ ㅡ ;
벡터를 꼭 마스터 하라!~
normal(x1,y1,x1)는 벡터의 크기를 없애버린다. - 정규화 1로만들어 버린다. 방향만을 알려준다. 바라보고 있는 방향을 나타낸다,

ps. 빛은 최소한으로 사용 하라 !! 리소스를 많이 먹는다.


7. 텍스처를 들고와 material를 이용하여 폴리곤에 표면상 이미지를 셋팅할수 있게 해준다.

8. 스크립트 적용 

  - 메인 카메라에 스크립트 달아 적용하는 방법 : 화면 전체에 일어 나는 변화는 여기에 다는것이 좋고 
 - 오브젝트에 스크립트를 달아 적용하는 방법 : 오브젝트에 일어 나는 변화는 여기에 다는것이 좋다.


9. JavaScript  구조

private var box:GameObject; // 받아올 오브젝트 변수 

function Start(){ // 화면이 처음 만들어 질때 호출 스타트 할때 최대한 변수를 초기화 해주는것이 좋다.
box = GameObject.Find("Cube"); // 받아올 오브젝트의 이름을 찾아 변수에 할당을 해준다.

}

function Update () {// 프래임을 연속 해서 뿌려주는 작업을 하는 함수 
// 백버퍼 플리핑 1프레임은 백버퍼에 잡은 화면 을 프론트 버퍼에 한번 뿌려 줬을때 한번 작업을 나타낸다.
// 모든 단말기의 프레임 속도를 고려 해서 타임을 맞춰 주어야 한다
box.transform.position.x +=1 * Time.deltaTime; 
// transForm 은 게임 오브젝트의 크기, 위치, 기울기를 수정 할 수 있다.
// Time.deltaTime 를 넣어줘야 프렝미 속도 뿌리른 타임이 통일 된다.
}




10.Prefab

- 게임오브젝을 구성과 모양을 저장해서 재사용을 가능하게 해준다.
                 (게임오브젝을 리소스로 만든다.) 
               게임오브젝트 중 파란 색이 들어오는것은 prefab의 오브젝이다. 

11. 접근한정자

private는 : 속성에서 숨겨 사용을 못하게 한다.
public : private가 없으면 public이며 게임 오브젝에 속성으로 나타난다.


12. Camera

ViewportToWorldPoint : Transforms position from viewport space into world space.
- 뷰 좌표를 월드 좌표로 바꿈
 ScreenToWorldPoint : Transforms position from screen space into world space.
- 스크린 좌표를 월드 좌표로 바꿈
ScreenToViewportPoint :Transforms position from screen space into viewport space. 
-  스크린 좌표를 뷰폴트 좌표로 바꿈


13. 3D 설계 수학

1)Vector - 좌표
2)Matrix - 행렬
3)Quaternion - 각도 // 거의 쓸일없음 


14.  배경 

Mesh Collider     -  plane에 대한 이벤트를 체크 하고  충돌과 효과를 준다.
Mesh Renderrer  -  plane에 대한 그래픽적 작업을 한다.
ps. 이둘을 잘 확인하여 bg맵을 만들어야 한다. 맵을 만들때 충돌 이벤트가 있는 부분은 따로 Collider로 만들어주는것이 좋다.





'개발지식창고 > Unity3D' 카테고리의 다른 글

Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
MonoBehaviour 로 오버라이딩 되는 함수 정리  (0) 2012.02.26
Unity 3D란?  (0) 2012.02.26
Posted by 모과이IT
,


Unity3D 다운로드

Unity3D는 C#, JavaScript, Boo 라는 언어로 개발이 가능 하다. 문득 이것중 어느것이 가장 효과적인 코딩을 지원 해줄까 의문이 들었다 그래서 조사에 나서 보았다. 아래 그림은 외국 사이트에서 조사된 Unity3D 개발자 언어 사용 분포도이다.

 
 보는 봐와 같이 오직 c#으로만 unity3d를 구현 하는 사람들이 오직 javascript를 이용해서 구현 하느 사람들보다 근소한 차이로 많았다 그리고 Boo는 생소 하기도하고 저조해서 일단 빼놓기로 하자  javascript, c#을 둘다 사용하여 개발하는 개발자들이 있었다. 
 이 정보로 봐선 둘중 하나를 쓰던지 둘다 쓰던지를 정해야 될꺼 같다.
 국내 다른 사람들의 정보를 알아보니.


『자기가 편한 걸 쓰는 것입니다만, C#이 더 가볍습니다. 한 가지 이유로 자바에서는 형을 var로 해서 쓰는 경우가 많은데, 형을 찾는 데 걸리는 시간이 들어 일반적인 자바스크립트같은 경우 C++에 비해 20배, Unity에서 쓰는 것같은 경우 수 배 량 구동시간이 차이가 납니다. C++에서 .Net개념을 도입한 것이 C#으로, C++같이 램관리를 철저하게 하지 않고 객체지향적알고리즘을 구현할 수 있습니다.  하여튼 요약하면 자바스크립트가 쉽긴하나 C#이 가볍고 에러도 적게나간다. 자기 편한거 쓰면 된다. 입니다』
 
라고 한다 그 즉슨 조금이나마 C#이 효율적인 코딩이 된다는 말이다.  
또 다른 의견을 들어보니

『c#을 강력하게 추천합니다. 저도 자바스크립트로 했다가 후회막급입니다. 여러가지 이유가 있습니다만 길어지고, 아무튼 c# 아니면 안되는 것도 많고, 고급 프로젝트 보면 전부다 c#입니다. 』 

라고 한다. 


나의 소견은 이러하다, 일단 초보자들은 Javascript로 공부를 시작 하는것이 좋을것이다 왜냐하면 접하기 쉬운언어이기 때문에 기초 강의 자료들 또한 Javascirpt가 많이 사용된다. 그러나 유니티로 본격적임 게임 개발을 한다면 c#을 사용하기를 권한다. C#은 실제 프로그래밍 환경과 훨씬 유사하며, 자바스크립트로는 어려운 관리를 효율적으로 할수 있는 장점이 있다.


Posted by 모과이IT
,