iOS 사용시 권장하는 텍스처 포맷 : PVRTC


Android 사용시 권장하는 텍스처 포맷 (GPU에 따라 다름)

- Tegra: DXT

- Adreno: ATC

- 공통: ETC1 (OpenGL ES 2.0)

현재 OS의 시스템 언어를 가져오는 법입니다.


switch 문으로 체크해서 언어설정 할때 쓰면 편하겠네요

Debug.Log(Application.systemLanguage);


public enum SystemLanguage

{

      Afrikaans = 0,

      Arabic = 1,

      Basque = 2,

      Belarusian = 3,

      Bulgarian = 4,

      Catalan = 5,

      Chinese = 6,

      Czech = 7,

      Danish = 8,

      Dutch = 9,

      English = 10,

      Estonian = 11,

      Faroese = 12,

      Finnish = 13,

      French = 14,

      German = 15,

      Greek = 16,

      Hebrew = 17,

      Hungarian = 18,

      Hugarian = 18,

      Icelandic = 19,

      Indonesian = 20,

      Italian = 21,

      Japanese = 22,

      Korean = 23,

      Latvian = 24,

      Lithuanian = 25,

      Norwegian = 26,

      Polish = 27,

      Portuguese = 28,

      Romanian = 29,

      Russian = 30,

      SerboCroatian = 31,

      Slovak = 32,

      Slovenian = 33,

      Spanish = 34,

      Swedish = 35,

      Thai = 36,

      Turkish = 37,

      Ukrainian = 38,

      Vietnamese = 39,

      Unknown = 40,

}


Awake 함수의 경우에 호출되는 시점이


저는 AddComponent 했을때 바로 호출된다고 생각을 했는데 (생성자 처럼)


그렇지 않아서 Add 한 후에 바로 안에 함수를 사용했을때 에러가 났습니다.


(Awake에서 GameObject 내부에서 Get해온다거나 하는 처리시, Awake보다 함수가 먼저 불려서 발생)


근데 바로 호출되는 시점이 있더군요


프리팹에 Component를 미리 추가해두고 그 프리팹을 불러와서 생성할 경우


Awake가 생성자처럼 바로 호출됩니다.

NGUI 초반버전때 NGUI에서 제공했던것으로 생각되는 조이스틱이다.


버전이 바뀌어서 수정할 부분이 있다.


1. 이걸 임포트하고나서 UIJoystick.cs가 Plugin폴더에 들어있는데 이걸 NGUI/Scripts/UI 폴더로 옮긴다.


2. UIJoystick.cs 스크립트에서 에러가 날것이니 아래 2가지를 전부 수정한다.

   - Tweener -> UITweener

   - UICamera.lastCamera -> UICamera.currentCamera



Unity4에 맞게, NGUI 2.5.1 버전에 맞게 다 수정해서 올려두었다.


이걸 왜 지금은 제공하지 않는건지 모르겠다.


(이거 있으면 정말 편한데.. 이거 없어서 얼마나 뻘짓을 했는지..)



처음부터 그냥 제공했으면 됬을거 아냐!





만약 조이스틱 컨트롤이 작동을 안할 경우에 Layer가 설정되어 있기 때문이므로 다른 Layer로 바꾸거나 Default로 바꿔주면 작동한다.


참조 : http://www.tasharen.com/forum/index.php?topic=55.0




NGUI Joystick.unitypackage


GameObject.active = true;

  • StartCoroutine : OK
  • Coroutine Method : OK
  • StopAllCoroutine : OK
  • Invoke : OK
  • InvokeRepeating : OK
  • CancelInvoke : OK


GameObject.active = false;

  • StartCoroutine : Error
  • Coroutine Method : Stop (active 상태에서 돌고 있는 상태였다면 정지된다.)
  • StopAllCoroutine : OK
  • Invoke : OK
  • InvokeRepeating : OK
  • CancelInvoke : OK

** 결론

  • StartCoroutine 으로 코루틴 메소드를 열심히 돌리다가 해당 GameObject 의 active 가 꺼지면 돌던 코루틴 메소드는 정지되고 다시 active 가 켜지더라도 재실행되지 않는다.....
  • 코루틴을 많이 사용하는 로직(Async 로 돌리는 함수들..(WWW, ... 같은...))에서는 꼭 염두해 두어야 한다..
  • OnDisable() {} 에서 관련 처리를 해 주는게 좋다.
  • Invoke 관련은 GameObject 의 active 유무랑 관계없이 돌아간다..

* Memory 해제 관련...

*. Prefab 을 public GameObject variable 로 연결하면 1개가 살아있다...
     - Resource 로 옮기고 Resource.Load 후 Instantiate 해준다음 Resource.UnloadUnusedAsset으로 로드했던 prefab을 해제시키자.


* Texture

- WWW 혹은 다른곳에서 load 한 texture 들은 사용하지 않을때 DestroyImmediate 로 꼭 해제시켜줘야 한다. DestroyImmediate 해주면 바로 memory 에서 해제된다.


*. GameObject Destroy 는 memory 를 바로 해제시키지 않는다.
     - Resource.UnloadUnusedAssets 를 해야 memory 에서 해제된다.
     - GameObject 를 DestroyImmediate 해도 포함되있는 Texture, material, 등은 memory에서 해제되지 않는다.

*. Load 한 Texture 들을 Member 로 가지고 있으면 GameObject Destroy 시 memory 해제 안된다.
     - Texture 는 개별 DestroyImmediate 하여 바로바로 해제하자.


출처: http://limchaeng.tistory.com/35


- 유니티 설정 바꾸기


1. 자신의 유니티 프로젝트를 엽니다.


2. 상단 메뉴에 Edit - Project Settings - Editor 를 누릅니다.




3. 그러면 오른쪽 Inspector창에 Editor Settings가 뜨는데

    Version Control 항목이 있습니다. 거기서 Disable을 Meta Files로 바꿔줍니다.


    스샷에서 빼먹은 부분이 있는데 Inspector창 맨 아래에 Asset Srialization Mode를 Force 

    Text로 바꿔주시기 바랍니다.




4. 프로젝트를 저장 하시고, Unity를 끕니다.




여기까지 따라 하셨다면 이제 SVN설정을 합시다.


SVN 체크아웃된 경로 안에 프로젝트 폴더가 복사되어 있다고 가정하고 쓰겠습니다.


중요한것은 프로젝트 경로명에 한글이 들어가서는 절대로 안됩니다.


- SVN 설정하기


1. 프로젝트 폴더에서 무시목록을 추가합니다.


*.DotSettings

*.csproj

*.pidb

*.sln

*.suo

*.unityproj

*.user

*.userprefs

Temp

obj


2. 프로젝트 폴더 안에 Library 폴더에서 무시목록을 추가합니다.


AnnotationManager

AssetImportState

AssetServerCacheV3

AssetVersioning.db

CurrentLayout.dwlt

EditorUserBuildSettings.asset

EditorUserSettings.asset

FailedAssetImports.txt

InspectorExpandedItems.asset

MonoManager.asset

ScriptAssemblies

ScriptMapper

UnityAssemblies

assetDatabase3

expandedItems

guidmapper

metadata


3. 커밋합니다.




- SmartSVN에서 설정하기 (회사에서 SmartSVN을 사용하기 때문에 SmartSVN에 대한 설명도 적겠습니다.)


1. SmartSVN을 켭니다.


2. 해당 프로젝트를 SVN 경로에 복사합니다.



3. Assets 폴더를 오른쪽 클릭후 Add 누르고 OK를 누릅니다.



4. ProjectSettings 폴더를 오른쪽 클릭후 Add 누르고 OK를 누릅니다.



5. 해당 프로젝트에 오른쪽 클릭후 Properties - Ignore Patterns를 누릅니다.



6. 위에 무시목록을 복사해서 붙여넣은 후 OK를 누릅니다. (Depth는 기본상태로 둡니다)



7. 해당 프로젝트에 Library 폴더에 오른쪽 클릭 후 Add 를 누릅니다. (OK버튼 바로 누르지 않도록 주의)



8. Add 팝업창에서 Depth를 Only this directory로 변경 후 OK를 누릅니다.



9. 해당 프로젝트에 Library 폴더에 오른쪽 클릭 후 Properties - Ignore Patterns를 누릅니다.



10. 위의 무시목록을 복사해서 붙여넣은 후 Depth를 Immediate children (files and directories)를 선택한 뒤 OK를 누릅니다.



11. Library 폴더에 전체 선택후 Add를 누릅니다.




그냥 Library 폴더를 무시목록 추가하고 OK 누르시면 됩니다.


12. 커밋합니다.





Vector3.Angle을 사용, 하지만 각도가 90도 이내로만 나온다.(0~360도 사이의 값으로 각도를 구하고 싶다면 문제가 됨) 이에 대한 해결책은 아래와 같다
public float ContAngle(Vector3 fwd, Vector3 targetDir)
{
    float angle = Vector3.Angle(fwd, targetDir);

    if (AngleDir(fwd, targetDir, Vector3.up) == -1)
    {
        angle = 360.0f - angle;
        if( angle > 359.9999f )
            angle -= 360.0f;
        return angle;
    }
    else
        return angle;
}

public int AngleDir( Vector3 fwd, Vector3 targetDir, Vector3 up)
{
    Vector3 perp = Vector3.Cross(fwd, targetDir);
    float dir = Vector3.Dot(perp, up);

    if (dir > 0.0)
        return 1;
    else if (dir < 0.0)
        return -1;
    else
        return 0;
}
참고 사이트: http://blog.naver.com/sdragoon/150108963945
http://forum.unity3d.com/threads/31420-Left-Right-test-function
http://answers.unity3d.com/questions/18105/how-to-calculate-the-angle-between-two-vectors