블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2731)
Unity3D (814)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (57)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (51)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
03-29 07:22

유니티를 안드로이드 버전으로 빌드하기 위해서 테스트를 해봤다.


내 폰은 아이폰이라 넣으면서 하진 못하고, 우선 apk 파일 만들기까지 해 봄..


아래는 안드로이드 빌드하기 위해 준비한 것 들.. 생각외로 간단하다..


1) 아래 링크로 가서 안드로이드 SDK를 설치한다.

    (http://developer.android.com/sdk/index.html)


2) JDK가 없으면 1) 설치 중에 JDK 설치하라고 뜬다. 아래 링크로 가서 Java SE를 받아서 설치해 주자..

    참고로 V7 버전이 빌드가 잘 안된다는 글이 있어서 V6으로 깔았다. 아래 링크에 두 버전 다 있음.. 선택..

    그리고, 윈도가 64bit(x64)라고 해서 64bit(x64)를 깔면 안됨.. 32bit(x86)로 깔라고 한다..

    (http://www.oracle.com/technetwork/java/javase/downloads/index.html)


3) 위 두 파일이 모두 설치되고 나면, 유니티의 'Edit-Preferences.-External Tools-Android SDK Location'으로 가서 폴더를 지정해 준다.(폴더 선택하러 들어가면 해당 폴더는 알아서 찾는 것 같다. 우측의 블럭된 폴더명을 삭제하고 그냥 '폴더 선택'을 누르면 된다.)


4) 'Android SDK Location' 셋팅을 하고 나서 'File-Build Settings-Platform'을 Android로 맞춘다.


5) 'File-Build Settings' 아래 Player 'Settings..' 를 누르면 Inspector 창에 이런저런 정보가 나오는데 아래와 같이 셋팅한다.

   (셋팅 설명은 있는데 정확히 무슨 옵션이고 뭘 위한건지 체크는 하지 못했다. 디폴트로 해보기도 해야될 것 같다.)

OtherSetting을 누르고

Identification 에서 Bundle Identifier 가 있는데 com.회사이름.플젝이름 이런식으로 고쳐서 써줌니다.

예) com.ABC.Project1

그리고 Minimum Api Level 에 현재 빌드할 폰의 안드로이드 버전에 맞게 설정합니다.

현재 폰의 버전보다 적은 버전해도 상관없음

Configuration 에서 Devices Level 을 ARMv6 with VFP 로 바꾸시고(Unity 4.x  버전에서는 ARMv7밖에 없으니 ARMv7로 하세요)

Graphics Level 을 OpenGL ES 1.x 로 바꿉니다.

그리고 Resolution and Presentation 을 누르고

Default Orientation 으로 어플의 뭐 가로세로 방향 을 고정시킬수있습니다.

Status Bar에 Status Bar Hidden은 핸드폰의 상단 바를 보이느냐 마느냐를 설정하는 것입니다.


6) 다하고나서 'File-Build Settings-Build' 를 하면 apk 파일이 생성된다.


7) 알아서 폰에 넣고 설치를..



참조 : http://cookzy.tistory.com/698

참조 : http://blog.naver.com/nameisljk/110136124090

반응형
Posted by blueasa
, |

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 는 매 프레임마다 호출되지만 한 프레임에 여러번 호출될 수도 있습니다. ??
   

더보기


   

 // 매 프레임마다 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으로 바뀐 정보)을 전달할 것인지 받을 것인지에 대해서 자동으로 판단합니다.
 (이 오브젝트를 소유권에 따라서 처리됩니다. 소유자는 보내고 나머지는 받고.)



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

반응형
Posted by blueasa
, |

따로 솔루션을 열 때는 활성화가 되던데, 유니티에서 스크립트 파일을 더블클릭하면 Visual Assist(이하 VAX)가 비활성화 돼 있어서 해결방법이 없나 하고 찾아봤다.


완전한 해결책은 아니지만, VS를 켜놓는 한은 계속 유지되니 이 방법으로 우선 살아도 될 것 같다.


1) 유니티에서 스크립트 더블클릭해서 VS로 오픈(External Script Editor를 VS2010으로 변경 해놓은 상태)한다.


2) 열어보면 VAX가 활성화가 안돼 있다.


3) Assets-Sync MonoDevelop Project 클릭


4) 열려있던 VS2010 창을 클릭해보면 '리로드' 하라고 뜬다.


5) '리로드' 하면 VAX가 활성화 돼있다.


6) 이후 VS창을 끌 때까진 VAX가 활성화 상태다.(VS를 끄면 위 방법대로 다시 실행하면 됨)




참조 : http://answers.unity3d.com/questions/138135/issues-using-visual-assist-x-with-visual-studio-20.html


반응형
Posted by blueasa
, |

유니티3D에서 text 파일 읽고/쓰는 소스코드 몇가지를 올립니다. 
이거 잘 안되서 저는 엄청 혼났거든요. 
아래 소스들 중 골라서 사용해보세요. 

1. c#코드, FileInfo 클래스 사용하는게 특징이네요. 
파일 읽기는 부분만 있습니다. 

using System; 
using System.IO; 

public class LineReader : MonoBehaviour 

    protected FileInfo theSourceFile = null; 
    protected StreamReader reader = null; 
    protected string text = " "; // assigned to allow first line to be read below 

    void Start () { 
        theSourceFile = new FileInfo ("Test.txt"); 
        reader = theSourceFile.OpenText(); 
    } 
    
    void Update () { 
        if (text != null) { 
            text = reader.ReadLine(); 
            //Console.WriteLine(text); 
            print (text); 
        } 
    } 


******* 
2. javascript 코드, 
파일 읽고/쓰는 함수가 다 있습니다. 
읽을 때 File 클래스를 사용합니다. 

import System.IO; 
var filePath = "/Users/ResetOfDirectoryPath/testWrite.txt"; 

function Update() { 
if (Input.GetKeyDown("r")) { 
WriteFile(filePath); 

if (Input.GetKeyDown("f")) { 
ReadFile(filePath); 



function WriteFile(filepathIncludingFileName : String) 

var sw : StreamWriter = new StreamWriter(filepathIncludingFileName); 
sw.WriteLine("Line to write"); 
sw.WriteLine("Another Line"); 
sw.Flush(); 
sw.Close(); 


function ReadFile(filepathIncludingFileName : String) { 
sr = new File.OpenText(filepathIncludingFileName); 

input = ""; 
while (true) { 
input = sr.ReadLine(); 
if (input == null) { break; } 
Debug.Log("line="+input); 

sr.Close(); 


****** 
3. javascript 코드, 파일 읽기는 부분만인데 
읽을 때 StreamReader 클래스를 이용합니다. 

import System.IO; 
var fileName = "foo.txt"; 
function Start () 

    var sr = new StreamReader(Application.dataPath + "/" + fileName); 
    var fileContents = sr.ReadToEnd(); 
    sr.Close(); 
    var lines = fileContents.Split("\n"[0]); 
    for (line in lines) { 
        print (line); 
    } 


***** 
4. 기타 
이 부분은 저도 테스트를 못했습니다. 
var pathToFile = "path/to/example.txt"; 
var url = "file://" + pathToFile; 
yiel download = new WWW(url); 
text = download.data; 

**** 
여기 나온 코드들은 unity3d 포럼에 나와있는 코드들인데 개발 시에 사용하려고 복사해뒀던 것들입니다.



출처 : http://www.applclub.com/bbs/board.php?bo_table=F&wr_id=1170&sca=%B0%AD%C1%C2%2F%C6%C1

반응형

'Unity3D' 카테고리의 다른 글

Inspector에 다차원 배열 값 셋팅하기(for C#)  (1) 2012.10.24
Unity3D Scripting Overview  (0) 2012.10.24
에셋 서버 Scene Merge 관련..  (0) 2012.10.19
유니티 관련  (0) 2012.10.17
Transform Custom Editor  (0) 2012.10.15
Posted by blueasa
, |

1) 유니티 실행 아이콘 우클릭-속성-대상


2) 커맨드라인으로 '-projectPath' 추가.

    (예:"C:\Program Files (x86)\Unity\Editor\Unity.exe" -projectPath)


3) '확인' 버튼


4) 실행

반응형
Posted by blueasa
, |

새벽코딩반 (2012/02/22) 삭제 채택

3.5 부터는 씬머지를 하실 수 있습니다. Edit->Project Settings-> Editor에 가셔서 Asset Serialization 부분을 Force Text로 설정해주시면 됩니다.


라고 써있네요.


수정해봐야 겠습니다.


참조 : http://sizx.blog.me/100155808518


출처 : http://korea.unity3d.com/board/?db=qnalist&no=264&mari_mode=view@view

반응형

'Unity3D' 카테고리의 다른 글

Unity3D Scripting Overview  (0) 2012.10.24
text 파일 Read/Write 하는 소스 몇가지  (0) 2012.10.22
유니티 관련  (0) 2012.10.17
Transform Custom Editor  (0) 2012.10.15
Gizmos로 카메라 프러스텀 보이게 하기  (0) 2012.10.15
Posted by blueasa
, |

Transform Custom Editor

Unity3D / 2012. 10. 15. 15:26

링크 : http://wiki.unity3d.com/index.php?title=TransformInspector


위 링크를 보면 Transform Custom Editor 기본 소스가 있다.


스크립트를 저장해서 Assets/Editor 안에 넣으면 준비 완료..


이제 고치면..되는데..


삽질이 필요한 시기군..

반응형

'Unity3D' 카테고리의 다른 글

에셋 서버 Scene Merge 관련..  (0) 2012.10.19
유니티 관련  (0) 2012.10.17
Gizmos로 카메라 프러스텀 보이게 하기  (0) 2012.10.15
유니티에 툴바 만들기..  (0) 2012.10.15
유니티에서 툴 만들기  (0) 2012.10.12
Posted by blueasa
, |

나(me)같은 초보를 위해 사용법(?) 추가..;


1. C# 스크립트 생성.

2. 생성한 스크립트에 아래 소스 추가/저장.

3. 생성한 스크립트를 Main Camera에 드래그&드랍..

4. Scene창의 Gizmos에 보면 추가한 스크립트가 추가된 게 보이고, 토글이 가능하다.

------------------------------------------------------------------------------------------

NGUI(무료버전) 레이아웃 작업 중....


현재 화면에서 GUI배치하기가 너무 어려워서 현재 화면 크기를 카메라를 선택하지 않아도 계속 유지하고 싶었다.


역시나 나 같은 생각을 가진 사람이 있었다. 아래 링크를 참고하자.

http://answers.unity3d.com/questions/291467/scene-view-stretches-camera-frustum-gizmo.html


링크를 가고 싶지 않은 사람은 아래 코드를 가져다가 쓰면 된다.


    public static Vector2 GetMainGameViewSize()

{ System.Type T = System.Type.GetType("UnityEditor.GameView,UnityEditor"); System.Reflection.MethodInfo GetSizeOfMainGameView = T.GetMethod("GetSizeOfMainGameView",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); System.Object Res = GetSizeOfMainGameView.Invoke(null,null); return (Vector2)Res; } void OnDrawGizmos() { Camera cam = this.camera; // Top left Vector3 tlN = cam.ScreenToWorldPoint(new Vector3(Screen.width*0, Screen.height, cam.nearClipPlane)); Vector3 tlF = cam.ScreenToWorldPoint(new Vector3(Screen.width*0, Screen.height, cam.farClipPlane)); // Top right Vector3 trN = cam.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, cam.nearClipPlane)); Vector3 trF = cam.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, cam.farClipPlane)); // Bottom left Vector3 blN = cam.ScreenToWorldPoint(new Vector3(0.0f, 0.0f, cam.nearClipPlane)); Vector3 blF = cam.ScreenToWorldPoint(new Vector3(0.0f, 0.0f, cam.farClipPlane)); // Bottom right Vector3 brN = cam.ScreenToWorldPoint(new Vector3(Screen.width, 0.0f, cam.nearClipPlane)); Vector3 brF = cam.ScreenToWorldPoint(new Vector3(Screen.width, 0.0f, cam.farClipPlane)); // Scale for aspect ratio Vector2 gameViewsize = GetMainGameViewSize(); // float gameViewAspect = gameViewsize.x / gameViewsize.y;

 // 화면 비율에 맞추기 위해서 수정[blueasa]

float gameViewAspect = Screen.width / Screen.height; float s = gameViewAspect / cam.aspect; tlN.x *= s; tlF.x *= s; trN.x *= s; trF.x *= s; blN.x *= s; blF.x *= s; brN.x *= s; brF.x *= s; Gizmos.color = Color.white; // Near Gizmos.DrawLine(tlN, trN); Gizmos.DrawLine(trN, brN); Gizmos.DrawLine(brN, blN); Gizmos.DrawLine(blN, tlN); // Far Gizmos.DrawLine(tlF, trF); Gizmos.DrawLine(trF, brF); Gizmos.DrawLine(brF, blF); Gizmos.DrawLine(blF, tlF); // Sides Gizmos.DrawLine(tlN, tlF); Gizmos.DrawLine(trN, trF); Gizmos.DrawLine(brN, brF); Gizmos.DrawLine(blN, blF); }


[출처] 유니티. Gizmos로 카메라 프러스텀 보이게 하기.|작성자 괴발자

반응형

'Unity3D' 카테고리의 다른 글

유니티 관련  (0) 2012.10.17
Transform Custom Editor  (0) 2012.10.15
유니티에 툴바 만들기..  (0) 2012.10.15
유니티에서 툴 만들기  (0) 2012.10.12
[링크] 유니티 관련 사이트  (0) 2012.10.12
Posted by blueasa
, |
using UnityEngine;
using UnityEditor;

public class MyToolbar : EditorWindow  
{
    // Add menu named "My Window" to the Window menu
    [MenuItem ("Window/Toolbar")]
    static void Init () {
        // Get existing open window or if none, make a new one:
        MyToolbar window = EditorWindow.GetWindow (typeof (MyToolbar)) as MyToolbar;
		//window.minSize = new Vector2(34f, 34f);
		//window.maxSize = new Vector2(1024f, 70f);
		window.position = new Rect(0,0,200,34);
    }
	
    void OnGUI()
	{
		// GUILayout, EditorGUILayout 둘 다 되는데 무슨 차이일까..
        //EditorGUILayout.BeginHorizontal ("Toolbar");
		GUILayout.BeginHorizontal ("Toolbar");

		// 텍스트이름 버튼
		if(GUILayout.Button ("AS", GUILayout.Width( 32f ), GUILayout.Height( 32f )))
		{
			// 유니티 메뉴에서 실행할 메뉴선택
			EditorApplication.ExecuteMenuItem( "Window/Asset Store" );	
		}
		
		GUILayout.Button ("Pop up", GUILayout.Width( 32f ), GUILayout.Height( 32f ));
		GUILayout.Space (10f);        // 표준 에디터 간격을 넣는다.
		GUILayout.Button ("Drop me down", GUILayout.Width( 32f ), GUILayout.Height( 32f ));
		
		// 이미지 버튼 넣기(이미지 없으면 텍스트로)
		string TPath = string.Format( "Assets/Room/Bluesky Up.jpg" ); 
        Texture tex = Resources.LoadAssetAtPath( TPath, typeof(Texture) ) as Texture; 
        if( tex != null ) 
        { 
            if( GUILayout.Button( tex, GUILayout.Width( 32f ), GUILayout.Height( 32f ) ) )
			{
                EditorApplication.ExecuteMenuItem( "Window/Asset Server" ); 
			}
        }
		else
		{
			if( GUILayout.Button( "Asset Server", GUILayout.Width( 32f ), GUILayout.Height( 32f ) ) )
			{
                EditorApplication.ExecuteMenuItem( "Window/Asset Server" ); 
			}
		}

		//EditorGUILayout.EndHorizontal ();
		GUILayout.EndHorizontal ();
    }
}



소스에 주석이 달려 있으므로 별로 설명은 필요 없을 것 같지만..


기본적으로 해야는 것 같은(?)건..


1. 툴바도 우선 메뉴는 필요한 듯..메뉴 포함 윈도우를 만듬.(크기 조절은 좀 필요할 듯 하다.)

2. 필요한 버튼을 만든다.(이미지로 처리된다면 Assets/아래 리소스를 첨부해야 될 듯)

3. 툴바 버튼 눌렀을 때 실행할 메뉴를 링크해 준다.(외부 프로그램도 실행방법이 있겠지? 나중에 확인해야지..)



P.s. 괴발자님의 블로그 글을 보고 이리저리 삽질하면서 만들었다.

       유니티는 아직 초보라 잘 설명해준 글도 삽질은 별 수 없나보다..

       정보 공유해주신 괴발자님 감사합니다. :)


참조 : http://blog.naver.com/clater11/80167664654

반응형

'Unity3D' 카테고리의 다른 글

Transform Custom Editor  (0) 2012.10.15
Gizmos로 카메라 프러스텀 보이게 하기  (0) 2012.10.15
유니티에서 툴 만들기  (0) 2012.10.12
[링크] 유니티 관련 사이트  (0) 2012.10.12
Visual Studio C# Integration  (0) 2012.10.05
Posted by blueasa
, |