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

카테고리

분류 전체보기 (2737)
Unity3D (817)
Script (91)
Extensions (14)
Effect (3)
NGUI (77)
UGUI (8)
Physics (2)
Shader (36)
Math (1)
Design Pattern (2)
Xml (1)
Tips (200)
Link (22)
World (1)
AssetBundle (25)
Mecanim (2)
Plugins (70)
Trouble Shooting (68)
Encrypt (7)
LightMap (4)
Shadow (4)
Editor (8)
Crash Report (3)
Utility (9)
UnityVS (2)
Facebook SDK (2)
iTween (3)
Font (11)
Ad (14)
Photon (2)
IAP (1)
Google (8)
Android (45)
iOS (41)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
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
04-28 00:03

OnBecameVisible/OnBecameInvisible 이벤트 함수가 스크립트가 꺼져 있어도 상관없이 동작 한다길래,


신기해서 테스트 해보려고 Empty GameObject에 넣고 테스트 해봤는데 이벤트가 발생하질 않아서 뭔가 하고 찾아봤다.


OnBecameVisible/OnBecameInvisible 두 함수는 Renderer 관련 함수여서 Mesh Renderer Component가 추가 돼 있어야 이벤트가 발생한다.


삽질 좀 하고..


좀 유용하게 써먹어야겠다.

반응형

'Unity3D > Tips' 카테고리의 다른 글

C# 사용할때 주의할 점  (0) 2013.01.15
Expand/Collapse All(모두 펴기/접기)  (0) 2013.01.04
iOS 프로젝트 포팅/최적화 팁  (0) 2012.12.06
2D 게임을 위한 텍스쳐(Texture) 설정  (0) 2012.11.28
성능 최적화  (0) 2012.11.18
Posted by blueasa
, |

Unity3D iOS 프로젝트 포팅/최적화 팁

원저 : Itay Keren, Untame Games - 31 Dec 2010


아래의 글은 유니티3D로 만들었던 제 게임 'Rope Racket'을
iOS(iPhone/iPad)로 이식하면서 얻은 팁들에 대해 대략적으로 정리해놓은,
미완성된 리스트입니다.
아래 리스트를 필요하면 그때그때 업데이트할 예정이니,
종종 들러서 확인해보시기 바랍니다.


물리엔진 관련 Physics


유니티3D는 매우 잘 최적화된 PhysX 물리엔진을 사용합니다.
일반적으로 물리에 관련된 모든 기능들은 이 엔진에 의해 자동적으로 처리됩니다.
하지만 iOS에 적용할 경우 고려해 볼 만한 점이 좀 있습니다 :
  • 충돌자Colliders
    불필요한 충돌자들을 없애고, 하나로 묶으세요.  Ex) 적 오브젝트는 한개의 충돌자만 쓰게끔

  • 겹쳐진 충돌자들Overlapping colliders은 매 프레임당 (많으면)3번까지의 반복 처리를 유발할 수 있으므로,
    충돌자가 붙은 오브젝트의 위치를 강제로 배치할 경우 특별히 유념하시기 바랍니다.
    (씬 에디터 상에서의 수동 배치나, transform값 수정에 의한 배치 등 직접 position값을 주는 경우를 말함 - 역주)

  • 좀 더 간단한 형태의 충돌자를 사용
    메쉬mesh 충돌자보다는 입방체cube, 입방체 보다 구체sphere 충돌자가 더 간단합니다.

  • 조인트Joints의 연쇄 반응에 주의
    조인트 사용시, 한쪽 끝의 움직임은 항상 반대쪽 끝까지의 연쇄적인 움직임을 유발합니다.
    서로 연결된 몇개의 조인트를 사용하게 되면 필연적으로 연쇄 반응하는 움직임을 양산하므로,
    사용에 주의하시기 바랍니다.

일반적인 최적화 General Optimization


코드 최적화는 성능을 두드러지게 향상시킬 수 있습니다.
대부분의 경우, 최적화가 안돼서 성능이 떨어지는 주된 원인은 프로그래밍이 (애초에) 부적절하게된 점에서 발생합니다.
  • 몇가지 작업들은 굳이 매 프레임마다 돌릴 필요가 없는 경우가 있습니다.
    Ex) 버튼의 상태 체크, 거리 체크, AI 전략 판단 등등
    이런 동작들 대부분은 초당 10번 정도만 하게끔 바꿔도 아무도 모를 겁니다.

  • Get...()류의 함수들은 개념적으로는 좋습니다만, 성능적으로 (처리 비용이) 비쌀 경우가 있습니다.
    public 변수 정의로 값을 빼놓는 방법은 지저분해보이긴 합니다만, 외부에서 값을 억세스할 경우 더 빠릅니다.

  • transform도 알고 보면 Get...()류의 함수를 쓰고 있습니다.  
    반복해서 사용할 경우 변수값에다 따로 빼놓으세요.

  • 종종 CPU 사용량이 비정상적으로 튀는(CPU spikes) 현상을 방지하려면,
    System.GC.Collect()를 사용, 적절히 정해진 간격으로 가비지 컬렉터를 호출하세요.

  • sin/cos/atan/sqrt등의 수학 함수는 가능한 한 미리 계산된 테이블값을 사용하거나,
    최소한 자주 변하지 않는 값들을 찾아 변수에 담아놓고 불러다 사용하세요.


그래픽 Graphics


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


그리기 호출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

최적화와는 관계없지만 몇가지 편리한 팁들이 더 있습니다 :
  • 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인 픽셀들도 원하는 테두리 색을 가지게 되어 보기 좋게 섞여진다.

More tips to follow soon.

Enjoy,
— Itay

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

*주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로 통합하는 방법을 보여주는 것이니
틀린 내용이라 하더라도 원 저자의 문맥대로 일단 번역하고 별도로 각주를 남깁니다.
* 원문에 이렇게 애매모호(?)한 부분이 두어 군데 더 보입니다만, 마찬가지로 패스... *

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

반응형
Posted by blueasa
, |

2D 게임을 만들기 위해 유니티에서 이미지를 임포트하면 웬지 모르게 이미지가 뭉게져 보이는데요. 이는 유니티가 3D 엔진이기 때문에, 임포트되는 텍스쳐에 대해서 자동으로 밉맵(Min Map)을 생성하기 때문입니다.

이를 해결하고 선명한 이미지를 만들기 얻기 위해서는 텍스쳐 타입을 "GUI" 로 설정하면 간단히 해결됩니다.

하지만, 만약 "Alpha from Grayscale" 을 사용해 이미지를 투명하게 처리해야할 필요가 있다면 텍스쳐 타입을 "Advanced" 로 선택 후 "Generate Mip Maps" 을 꺼 주시면 됩니다... ^^

마지막으로, 텍스처 "Max Size" 는 실제 게임에서 사용할 크기에 맞게 적절하게 설정하시고.. "Texture Format" 은 웬만하시면 Automatic Truecolor 을 선택하세요... 2D 게임의 경우, 압축 이미지를 사용하면 티가 많이 나더군요.. =ㅁ=

참... 쉽죠? ^^ㅋ;;



출처 : http://mobilism.tistory.com/entry/Unity3D-2D-%EA%B2%8C%EC%9E%84%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%85%8D%EC%8A%A4%EC%B3%90-%EC%84%A4%EC%A0%95

반응형
Posted by blueasa
, |

성능 최적화

Unity3D/Tips / 2012. 11. 18. 16:41

1. Use Static Typing

When using JavaScript the most important optimization is to use static typing instead of dynamic typing. Unity uses a technique called type inference to automatically convert JavaScript constructs to statically typed code without you having to do any work.

var foo = 5;

In the above example foo will automatically be inferred to be an integer value. Thus Unity can apply a lot of compile time optimizations, without costly dynamic name variable lookups etc. This is one of the reasons why Unity's JavaScript is on average around 20 times faster than other JavaScript implementations.

The only problem is that sometimes not everything can be type inferred, thus Unity will fall back to dynamic typing for those variables. By falling back to dynamic typing, writing JavaScript code is simpler. However it also makes the code run slower.

Let's see some examples.

function Start ()
{
var foo = GetComponent(MyScript);
foo.DoSomething();
}

Here foo will be dynamically typed, thus calling the function DoSomething takes longer than necessary - because the type offoo is unknown, it has to figure out whether it supports DoSomething function, and if it does, invoke that function.

function Start ()
{
var foo : MyScript = GetComponent(MyScript);
foo.DoSomething();
}

Here we're forcing foo to be of specific type. You will get much better performance.

2. Use #pragma strict

Now the problem is of course, that you don't usually notice when you are using dynamic typing. #pragma strict to the rescue! Simply add #pragma strict at the top of a script and Unity will disable dynamic typing in that script, forcing you to use static typing. Wherever a type is not known, Unity will report compile errors. So in this case, foo will produce an error when compiling:

#pragma strict
function Start ()
{
var foo = GetComponent(MyScript);
foo.DoSomething();
}

3. Cache component lookups

Another optimization is caching of components. This optimization unfortunately requires a bit of coding effort and is not always worth it. But if your script is really used a lot and you need to get the last bit of performance out of it, this can be a very good optimization.

Whenever you access a component through GetComponent or an accessor variable, Unity has to find the right component from the game object. This time can easily be saved by caching a reference to the component in a private variable.

Simply turn this:

function Update () {
transform.Translate(0, 0, 5);
}

Into this:

private var myTransform : Transform;
function Awake () {
myTransform = transform;
}

function Update () {
myTransform.Translate(0, 0, 5);
}

The latter code will run a lot faster since Unity doesn't have to find the transform component in the game object each frame. The same applies for scripted components, where you use GetComponent instead of the transform or other shorthand property.

4. Use Builtin arrays

Builtin arrays are fast, very fast, so use them.

While the ArrayList or Array classes are easier to use since you can easily add elements they don't have nearly the same speed. Builtin arrays have a fixed size but most of the time you know the maximum size in advance and can just fill it out later. The best thing about builtin arrays is that they directly embed struct data types in one tightly packed buffer, without any extra type information or other overhead. Thus iterating through is very easy on the cache as everything is linear in memory.

private var positions : Vector3[];
function Awake () {
positions = new Vector3[100];
for (var i=0;i<100;i++)
positions[i] = Vector3.zero;
}

5. Don't call a function if you don't have to

The simplest and best of all optimizations is to perform less work. For example , when an enemy is far away it is most of the time perfectly acceptable to have the enemy fall asleep. That is do nothing until the player comes close. The slow way of handling this situation would be:

function Update ()
{
// Early out if the player is too far away.
if (Vector3.Distance(transform.position, target.position) > 100)
return;
perform real work work...
}

This is not a good idea since Unity has to invoke the update function and you are performing work every frame. A better solution is to disabling the behaviour until the player comes closer. There are 3 ways to do this: 1. Use OnBecameVisible and OnBecameInvisible. These call backs are tied into the rendering system. As soon as any camera can see the object, OnBecameVisible will be called, when no camera sees it anymore OnBecameInvisible will be called. This is useful in some cases, but often for AI it is not useful because enemies would become disabled as soon as you turn the camera away from them.

function OnBecameVisible () {
enabled = true;
}

function OnBecameInvisible ()
{
enabled = false;
}

2. Use triggers. A simple sphere trigger can work wonders though. You get OnTriggerEnter/Exit calls when exiting the sphere of influence you want

function OnTriggerEnter (c : Collider)
{
if (c.CompareTag("Player"))
enabled = true;
}

function OnTriggerExit (c : Collider)
{
if (c.CompareTag("Player"))
enabled = false;
}

3. Use Coroutines. The problem with Update calls is that they happen every frame. Quite possibly checking the distance to the player could be performed only every 5 seconds. This would save a lot of processing power.


출처 : https://sites.google.com/site/cotranslation/munseo-beon-yeog-jalyo/unity3d/seukeulibteu-lepeoleonseu/seongneung-choejeoghwahagi

반응형
Posted by blueasa
, |

 
[아래는 블로그 주인이신 귀요미님의 글입니다.]

파티클 한번만 플레이, NGUI에서 한글 라벨 적용, 멀티플랫폼 사용법, 물체 기준으로 공전하기(카메라 or 오브젝트)
 
제가 공부하면서 알아낸것들 정리해놓은 블로그인데 생각 외로 저랑 똑같은 문제를 가지고 고민하시는 분들이 많더라고요 '- '
(저밖에 없을 줄 알았는데...ㅋㅋ)
 
공부하면서 알아낸것들은 추가적으로 포스팅하고있습니당.
 
유용하게 보세요!

반응형
Posted by blueasa
, |

1. Rendering Components 
This group contains all Components that have to do with rendering in-game and user interface elements. Lighting and special effects are also included in this group. 
해당 그룹에 속한 컴포넌트들은 게임안의 렌더링과 사용자 인터페이스 요소안에 쓰여지는 것을 이란다. 빛과 특별한 효과들은 모두 이 그룹에 포함되어 있데유  

  1) Camera  : http://unity3d.com/support/documentation/Components/class-Camera.html
 **새로운 프로젝트를 만들 때 포함된 기본 asset 패키지에 도움이 될만한 카메라 스크립트들(메뉴의 Components->Camera-Control)
  2) Flare Layer(Camera 연계) : http://unity3d.com/support/documentation/Components/class-FlareLayer.html
  3) GUILayer (Camera 연계): http://unity3d.com/support/documentation/Components/class-GUILayer.html
  4) GUI Text : http://unity3d.com/support/documentation/Components/class-GuiText.html
  5) GUI Texture : http://unity3d.com/support/documentation/Components/class-GuiTexture.html
  6) Halo (후광) : http://unity3d.com/support/documentation/Components/class-Halo.html
  7) Halo Layer(Camera 연계) : http://unity3d.com/support/documentation/Components/class-HaloLayer.html
  8) Lens Flare : http://unity3d.com/support/documentation/Components/class-LensFlare.html
  9) Light : http://unity3d.com/support/documentation/Components/class-Light.html
  10) Projector : http://unity3d.com/support/documentation/Components/class-Projector.html
  11) Sky box  : http://unity3d.com/support/documentation/Components/class-Skybox.html


2. Movie Texture ( tex·ture 미국∙영국 [|tekstʃə(직물의) 감촉[질감])
 http://unity3d.com/support/documentation/Components/class-MovieTexture.html
 ==> 요건 지난번에 설명을 한것 같기도 하고.. Pro 버전에서만 지원을 한다... texture를 사용해서 적용하면 되는 것 뭐 어려운것 없다.. play 와 stop 정도만 ^^;; 

3. Game Object
 http://unity3d.com/support/documentation/Components/class-GameObject.html
게임 오브젝트들은 하나의 저장고 !!
라이트 매핑된 섬이라든가 물리적인 효과가 적용된 자동차와 같은 여러 다른 조각들을 담을 수 있는 빈 박스와 같습니다. 이 각각의 조각들은 구성요소(Componets)라 불립니다. (cf..스크립트도 구성요소로 볼수 있다는 점도 기억하시길 바랍니다. 스크립트 내에 모든 가변요소들은 게임 오브젝트의 인스펙터상에 편집이나 링크가 가능하구요....)
어떤 오브젝트를 만들고 싶은가에 따라 서로 다른 구성요소의 조합을 게임 오브젝트에 더 해 주게 됩니다. 게임 오브젝트를 하나의 빈 과자틀이라 가정하고 구성요소들을 게임이라는 과자를 굽는데 필요한 다양한 재료라고 생각하면 됩니다.

모든 게임 Object에는 Object Name, Tag, Layer, Transform Component의 구성요소를 가지고 있다.
이중에 Transform Component는 게임 오브젝트의 Position, Rotation , Scale ...필수적인 성질을 정의
Transform Compoonet는 유니티의 편집기능에 이용되는 페어런팅(Parenting - 상하위 관계를 형성하는 것을 의미)도 가능하게 합니다.

 * Transform Component
 http://unity3d.com/support/documentation/Components/class-Transform.html

** shift + Ctrl + N : Game Object 생성 단축키

 
4. Prefabs   ( pre·fab 미국∙영국 [|pri:fӕb] 조립식 건물 )
http://unity3d.com/support/documentation/Manual/Prefabs.html

Prefabs은 씬에서 재사용될 수 있는 게임오브젝트와 구성요소의 집합체입니다. 
몇 개의 동일한 오브젝트들이 하나의 Prefab에서 만들어질 수 있습니다. (이를 instancing이라 합니다.)

나무로 예를 들어 보겠습니다. 
나무 Prefab을 만든다면 몇 개의 동일한 나무들을 복사하여(instance) 당신의 씬에 넣는 것입니다.
모든 나무들은 Prefab에 링크되어 있기 때문에 Prefab에 적용되는 모든 변화들은 자동적으로 모든 복사된 나무들에게도(tree instance) 적용이 됩니다. 
그렇기 때문에 매시나 재질이나 기타 다른 사항들을 변경하기 원한다면 Prefab만 한 번 바꿔주면 됩니다.
반대로 복사된 오브젝트를 수정한 뒤 메인메뉴의 GameObject->Apply Changes to Prefab을 통해서도 가능합니다. 이 작업은 asset을 설정해주고 업데이트 하는데 많은 시간을 절약할 수 있게 해줍니다.

다수의 구성요소들과 하위게임오브젝트를 포함하는 게임오브젝트가 있다면 최상위의 게임오브젝트의 Prefab을 만들고 그 모든 집합체를 재사용할 수도 있습니다.

Prefab을 게임오브젝트의 구조에 대한 청사진으로 생각하십시오. 모든 Prefab의 복제는 청사진과 동일합니다. 그렇기 때문에 청사진이 업데이트 되면 Prefab의 복제도 마찬가지로 업데이트 됩니다. Prefab의 복제 중 하나를 변경하고 그 변경사항을 청사진에 적용함으로써 Prefab자체를 업데이트 할 수 있는 다양한 방법들이 있습니다. 


5. Scene 
게임의 오브젝트들을 포함( 배경,장애물 , 장식들) 배치
메인 메뉴를 만들거나, 개별 레벨을 만드는데 사용 

6. Asset ( asset미국·영국 [|ӕset] : [명사]~ (to sb/sth)자산(이 되는 사람・물건) )


7. Asset 작업 과정
 1) 3D 모델링 프로그램을 이용해서 asset 의 러프 버전(초기 모델의 의미) 제작 
 2) import : Unity Asset 폴더에 저장을 하면, 자동으로 임포트 
 3) import Setting 
 4) Scene에 Asset 추가 : Mesh 를 프로젝트 뷰에서 클릭하여 Hierarchy 나 Scene 뷰에 드래그 추가
 5) 다른 Asset 함께 위치
 - texture 는 material에 적용
 - material은 Game Object에 적용 (with an Mesh Render Component) 
- Animation은 Game Object에 적용(with an Animation Component)
 - A sound file is applied to a Game Object (with an Audio Source Component)
6) Prefab 만들기
7) Assets Update

* Mesh Render 구성요소를 지닌 게임오브젝트를 만들고 있음을 의미
텍스쳐 나 사운드 파일로 작업 중이라면, 이미 씬이나 프로젝트에 존재하는 게임오브젝트에 그것을 추가해 줘야 함.


8. Script 호출 순서
http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.html

Assets->Create->JavaScript 의 순서로 제작을 하며...

Awake => Start => Update

Awake : 이 스크립트를 사용하는 인스턴스들이 Start하기전에 무조건 딱한번 실행됩니다.
Start :  현재 인스턴스가 활성화될때 Update 바로 직전 딱한번 호출됩니다.

스크립트를 사용하는 인스턴스가 1,2 가 있다면
Awake1 - Awake2 - Start1 - Start2  (0)
Awake1 - Start1 - Awake2 - Start2  (x)




반응형
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
, |

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


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

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


3) '확인' 버튼


4) 실행

반응형
Posted by blueasa
, |


링크 : http://stnzone.com/gboard/blog/?id=1763


반응형
Posted by blueasa
, |