'잡다한것들전부'에 해당되는 글 207건

  1. 2014.01.17 맥에서 스크린샷 캡쳐하기
  2. 2014.01.16 [펌] 유니티 디바이스 화면에 디버깅 콘솔 찍기
  3. 2014.01.16 [펌] 유니티3D Conditional Attribute 사용
  4. 2014.01.16 [펌] 유니티 엔진 - 텍스트 파일을 이용하여 에셋 번들 한꺼번에 생성 하기
  5. 2014.01.16 [펌] 유니티엔진 - 유니티 스키닝 설정.
  6. 2014.01.16 [펌] 유니티 안드로이드 빌링 api3 적용 팁입니다.
  7. 2014.01.16 [펌] 유니티 엔진 팁 - 광고 모듈 붙이기
  8. 2014.01.16 [펌] 유니티 엔진 - 오브젝트 풀 시스템
  9. 2014.01.16 [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서
  10. 2014.01.16 [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기

맥에서 스크린샷 캡쳐하기

|

= 스크린샷 단축키 =
화면의 그림을 파일로 저장                   shift + command + 3
화면의 그림을 클립보드에 복사             control + shift + command + 3
선택한 영역의 그림을 파일로 저장         shift + command + 4
선택한 영억의 그림을 클립보드에 복사   control + shift + command + 4

Trackback 0 And Comment 0

[펌] 유니티 디바이스 화면에 디버깅 콘솔 찍기

|
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=317


using UnityEngine;
using System;
using System.Collections.Generic;
 
/// <summary>
/// A console that displays the contents of Unity's debug log.
/// </summary>
/// <remarks>
/// Developed by Matthew Miner (www.matthewminer.com)
/// Permission is given to use this script however you please with absolutely no restrictions.
/// </remarks>
public class Console : MonoBehaviour
{
public static readonly Version version = new Version(1, 0);
 
struct ConsoleMessage
{
public readonly string message;
public readonly string stackTrace;
public readonly LogType type;
 
public ConsoleMessage (string message, string stackTrace, LogType type)
{
this.message = message;
this.stackTrace = stackTrace;
this.type = type;
}
}
 
public KeyCode toggleKey = KeyCode.BackQuote;
 
List<ConsoleMessage> entries = new List<ConsoleMessage>();
Vector2 scrollPos;
bool show;
bool collapse;
 
// Visual elements:
 
const int margin = 20;
Rect windowRect = new Rect(margin, margin, Screen.width - (2 * margin), Screen.height - (2 * margin));
 
GUIContent clearLabel = new GUIContent("Clear", "Clear the contents of the console.");
GUIContent collapseLabel = new GUIContent("Collapse", "Hide repeated messages.");
 
void OnEnable () { Application.RegisterLogCallback(HandleLog); }
void OnDisable () { Application.RegisterLogCallback(null); }
 
void Update ()
{
if (Input.GetKeyDown(toggleKey)) {
show = !show;
}
}
 
void OnGUI ()
{
if (!show) {
return;
}
 
windowRect = GUILayout.Window(123456, windowRect, ConsoleWindow, "Console");
}
 
/// <summary>
/// A window displaying the logged messages.
/// </summary>
/// <param name="windowID">The window's ID.</param>
void ConsoleWindow (int windowID)
{
scrollPos = GUILayout.BeginScrollView(scrollPos);
// Go through each logged entry
for (int i = 0; i < entries.Count; i++) {
ConsoleMessage entry = entries[i];
 
// If this message is the same as the last one and the collapse feature is chosen, skip it
if (collapse && i > 0 && entry.message == entries[i - 1].message) {
continue;
}
 
// Change the text colour according to the log type
switch (entry.type) {
case LogType.Error:
case LogType.Exception:
GUI.contentColor = Color.red;
break;
 
case LogType.Warning:
GUI.contentColor = Color.yellow;
break;
 
default:
GUI.contentColor = Color.white;
break;
}
 
GUILayout.Label(entry.message);
}
 
GUI.contentColor = Color.white;
 
GUILayout.EndScrollView();
 
GUILayout.BeginHorizontal();
 
// Clear button
if (GUILayout.Button(clearLabel)) {
entries.Clear();
}
// Collapse toggle
collapse = GUILayout.Toggle(collapse, collapseLabel, GUILayout.ExpandWidth(false));
 
GUILayout.EndHorizontal();
 
// Set the window to be draggable by the top title bar
GUI.DragWindow(new Rect(0, 0, 10000, 20));
}
 
/// <summary>
/// Logged messages are sent through this callback function.
/// </summary>
/// <param name="message">The message itself.</param>
/// <param name="stackTrace">A trace of where the message came from.</param>
/// <param name="type">The type of message: error/exception, warning, or assert.</param>
void HandleLog (string message, string stackTrace, LogType type)
{
ConsoleMessage entry = new ConsoleMessage(message, stackTrace, type);
entries.Add(entry);
}
}


유용하네요

아무 GameObject에 컴포넌트로 붙이고

` (FPS에서 콘솔 버튼으로 많이 쓰는) 누르시면.... 좋겠으나...





폰은... 자판이 없을테니 별도로 콜하는 메서드 만드셔야합니다.


show 키변경으로 쓰시려면 KeyCode.Menu 권장


Trackback 0 And Comment 0

[펌] 유니티3D Conditional Attribute 사용

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=315



·미리보기 | 소스복사·
  1. using ConditionalAttribute = System.Diagnostics.ConditionalAttribute;  
·미리보기 | 소스복사·
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. using ConditionalAttribute = System.Diagnostics.ConditionalAttribute;  
  5.   
  6. public class NewBehaviourScript : MonoBehaviour {  
  7.   
  8.     // Use this for initialization  
  9.     void Start () {  
  10.       
  11.     }  
  12.       
  13.     // Update is called once per frame  
  14.     void Update () {  
  15.         call0 ();  
  16.         call1 ();  
  17.         call2 ();     
  18.     }  
  19.       
  20.     void call0()  
  21.     {  
  22.         Debug.Log("call0");  
  23.     }     
  24.       
  25.     [Conditional("CON1")]  
  26.     void call1()  
  27.     {  
  28.         Debug.Log("call1");  
  29.     }  
  30.       
  31.     [Conditional("CON2")]  
  32.     void call2()  
  33.     {  
  34.         Debug.Log("call2");  
  35.     }     
  36. }  


Trackback 0 And Comment 0

[펌] 유니티 엔진 - 텍스트 파일을 이용하여 에셋 번들 한꺼번에 생성 하기

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=309


에셋 번들을 만들어야 하는데 파일 하나하나 찍어서 만들기가 너무 귀찮았습니다.

플랫폼마다 똑같은 노가다를 반복 해야 한다고 생각하니 눈앞이 캄캄하더군요.
그래서 텍스트 파일에 리스트를 쭉 적어놓고 읽어와서 일괄 생성하게 만들었습니다.


아래와 같이 파일의 경로를 쭉 적어줍니다.
patch_list.txt 로 저장을 하고 위치는 Resources폴더 아래에 둡니다.


Resources/Sound/main.ogg
Resources/Sound/fire.wav
Resources/character/human.prefab
Resources/character/lion.prefab
Resources/ui/shop.prefab
.
.
.
[Resources/patch_list.txt의 내용]



소스코드는 Assets/Editor 밑에 xxx.cs 로 넣어놓습니다. 파일 이름은 아무거나 넣어도 됩니다.
·미리보기 | 소스복사·
  1. [MenuItem("Assets/Generate All from file(Windows)")]    // 메뉴가 들어갈 위치입니다. Assets메뉴 하위.
  2. static void GenerateAll()  
  3. {  
  4.     // 빌드 타겟은 적절하게 맞춰주면 되겠죠.  
  5.     ExportAll(BuildTarget.StandaloneWindows);  
  6. }  
  7.   
  8.   
  9.   
  10.   
  11.   
  12. static void ExportAll(BuildTarget target)    
  13. {    
  14.     // 리스트를 읽어와서 줄 단위로 분리 해 줍니다.  
  15.     TextAsset filelist_obj = Resources.Load("patch_list"typeof(TextAsset)) as TextAsset;    
  16.     string[] filelist = filelist_obj.text.Split('\n');    
  17.     
  18.   
  19.     foreach (string original_path in filelist)    
  20.     {  
  21.         // *중요함! 개행 문자를 제거 해 줍니다.  
  22.         string path = original_path.Trim('\n');    
  23.         path = path.Trim('\r');    
  24.     
  25.         if (path.Length <= 0)    
  26.         {    
  27.             continue;    
  28.         }    
  29.   
  30.         // 확장자, 경로 다 빼고 파일 이름만 쏙 빼옵니다.    
  31.         int last_split_pos = path.LastIndexOf('/') + 1;    
  32.         int extend_length = path.Length - path.LastIndexOf('.');    
  33.         string filename = path.Substring(last_split_pos, (path.Length - last_split_pos) - extend_length);    
  34.   
  35.         // 번들 파일이 생성될 경로 입니다.
  36.         // 프로젝트 상위 폴더에 "patch/(플랫폼명)" 형태의 폴더를 미리 만들어 놓아야 합니다.
  37.         // 예)
  38.         // d:/project/patch/Android    <- 번들 파일이 생성될 폴더
  39.         // d:/project/gamecodi  <- 프로젝트 폴더
  40.         // d:/project/gamecodi/Assets
  41.         string output_path = string.Format("../patch/{0}/{1}.unity3d", target.ToString(), filename);    
  42.   
  43.         // 리스트에 기입된 경로에서 오브젝트를 로드합니다.  
  44.         string included_path = "Assets/" + path;    
  45.         UnityEngine.Object obj = Resources.LoadAssetAtPath(included_path, typeof(UnityEngine.Object));    
  46.         if (obj == null)    
  47.         {    
  48.             Debug.LogError("Cannot find the resource. " + included_path);    
  49.             continue;    
  50.         }    
  51.   
  52.         // 생성!  
  53.         BuildPipeline.BuildAssetBundle(obj, null, output_path,    
  54.             BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,    
  55.             target);    
  56.     
  57.         Debug.Log("completed... : " + included_path);    
  58.     }    
  59. }    
파일 경로를 읽어온 뒤 개행 문자를 제거 해 주는것이 굉장히 중요합니다.
이것을 빼먹고 했더니 리소스 로딩이 실패나서 한참 고생했습니다.ㅠ_ㅠ

이렇게 만들어 놓고 플랫폼만 바꿔서 클릭 한번만 하면 되겠습니다.
끝~


Trackback 0 And Comment 0

[펌] 유니티엔진 - 유니티 스키닝 설정.

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=311



안녕하세요.


오늘 새로 추가되는 세트옷 덕분에 유니티 스키닝에 대해 알게 되었네요 -ㅅ-;

다들 fbx 를 임포트 해서 prefab으로 만들어서 모델 데이터를 쓰고 계실겁니다.

프리팹을 열면 Skinned Mesh Renderer 이 있는데. 거기 속성중에.

Quality 라는 속성이 있습니다. 기본은  Auto 로 잡혀 있고요.

이 속성이 스키닝 본 개수를 설정 할 수 있습니다. 

기본 Auto로 잡을경우 2개. 1bone, 2bone, 4bone 선택이 가능합니다. (유니티 3.5.6기준)

유니티는 스키닝 계산을 cpu 에서 처리 하니깐, 모바일에서 써도 크게 문제는 되지 않을거 같네요 (정확한 프로파일링을 아직 못해봤네요..)

다른 사람들은 저처럼 삽질 하지 마세요 ㅠ.ㅠ


Trackback 0 And Comment 0

[펌] 유니티 안드로이드 빌링 api3 적용 팁입니다.

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=291


안녕하세요.


게임 코디 눈팅 족이었다가, 저처럼 삽질 많이 하실분이 있을거 같아 이렇게 강좌를 쓰내요.

안드로이드 billing api3를 작업하면서, 유용한 플러그인 (prime31)을 쓸려고 했지만,

Purchase 의 Json이랑, Signature 정보를 안주드라고요 ㅠㅠ 

그래서 직접 구글 샘플을 가지고, 직접 이클립스 프로젝트에 코딩을 했습니다 (ctrl + c, ctrl + v)

예제 다 따라해서 안드로이드 샘플 코드 그대로 동작을 하면 잘 됩니다만..

이제 이벤트를 연결해서 , 아이템을 Purchage 성공 이벤트를 유니티에서 캡쳐해서, Java 의  Consume 함수 처리를 할때

앱이 중단 되는 사태가 나왔습니다. 

문제의 근원은  Consume 처리시, IabHelper의 consumeAsyncInternal 이 함수에서 핸들러를 만들고 쓰레드 를 생성해 처리를 하는데,

이렇게 쓰지 마시고. consumeAsyncInternal  에 MainActivity를 인자를 받으시고 runOnUiThread 로 작업을 수행하게 해주면 잘 동작됩니다.

이것때문에 결재 한 40번 넘게 테스트 한거 같내요.. 계속 패키지 빌드 하고, 기계에 심고 , 로그 보고 ㅠ


Trackback 0 And Comment 0

[펌] 유니티 엔진 팁 - 광고 모듈 붙이기

|
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=277



[유니티 엔진 팁 - 광고 모듈 붙이기]

외부 광고모듈 적용.
- IOS : 해외버전은 apple의 iAD / 국내버전은 MezzoMedia라는 광고업체의 모듈을 사용하였습니다.
iAD는 자료찾기가 비교적 쉬웠고요, 국내업체의 광고모듈은 유니티엔진을 따로 지원하지는 않더군요.

- 삽질한부분...
xcode <-> 유니티 연동을 처음 하는거라 생각처럼 쉽게는 안되었음.
초기 프로젝트 설정할때는 수십개의 링크에러가 발생하여 멘붕상태가 되었는데요,
어떤 경우에는 xcode를 재시작하니 빌드오류가 싹 사라지는 경우도 있더군요.
그리고 유니티에서 빌드를 할때 xcode프로젝트가 다시 생성되면서 기존 파일들을 싹 지워버리는 경우도 있었습니다.

- 광고모듈이 계속 무한루프를 도는 현상.
처음에 광고를 딱 붙이고 올려보니 viewDidLoad함수가 끊임없이 호출되는 문제 발생했습니다.
구글링으로 해결방법을 찾아내어 loadView라는 빈 함수를 제거해주는것으로 해결했습니다.

- 불편했던점
xcode와 유니티를 전환해 가며 코딩해야하는 불편함이 있었습니다.
생소한 개발환경(visual studio처럼 익숙하지 않아서 빌드설정값 하나 찾는데도 애먹음).
개발/배포 인증서, 프로파일, 프로비저닝등 개념정립이 안되어서 재발급 받고 세팅하는것만 5~6번 반복하였음.

빌드 결과물인 .app파일이 순수 xcode native로 작업했을때 생기는 경로와 다른것도 걸림돌이었네요.
게다가 mac os업그레이드를 하고 나면 "라이브러리"폴더가 숨김설정 되어있기 때문에
이것을 풀어줘야 아웃풋 파일을 확인할 수 있습니다.
(실제 경로는 "라이브러리\Developer\..." 어딘가에 있음)
이런 사소한것 하나도 구글링해야 했기 때문에 시간도 지체되고 몸도 지쳐갔음.ㅠ_ㅠ



- Android : T-store의 T-ad를 사용하였음.
유니티용 모듈이 올라와 있지만 꼭 이걸 써야만 하는것은 아닙니다.
그냥 eclipse에 라이브러리 링크시켜 놓고 유니티와 연동하면 가능하거든요.

- 불편했던점
유니티에서 스크립트 작업만으로는 불가능하기 때문에 유니티activity소스를 긁어다가
eclipse에 붙여넣는등 번거로운 작업을 해야만 했습니다.
정보들이 인터넷 여기저기에 흩어져 있기 때문에 괜한 삽질을 한 적이 많았네요.

- 팁
adb logcat을 활용하여 디버깅 하면 도움이 많이 됩니다.
(폰 환경에서 돌렸을때 logcat이라는 프로그램을 통해서 PC화면에서 로그를 볼 수 있음)

activity가 따운되는 현상 및 클래스를 찾지 못하는 문제들이 자주 발생하였는데
대부분 라이브러리가 실행파일에 포함(?)되지 않아서 그런것입니다.
(포함이라는 용어가 맞는지는 모르겠지만 개념상 비슷하다고 했을때).
eclipse 빌드 설정에서 해당 라이브러리들을 아웃풋 파일에 넣어주는 옵션이 있습니다.

광고업체에서 보여줄 광고가 없을때는 아무것도 나오지 않기 때문에 
광고출력 위치에 땜빵할 UI를 넣어놓는것이 좋습니다. apple은 이것때문에 리젝걸기도 하더군요.


Trackback 0 And Comment 0

[펌] 유니티 엔진 - 오브젝트 풀 시스템

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=280

·미리보기 | 소스복사·
  1. using System.Collections;  
  2.   
  3. using System.Collections.Generic;  
  4.   
  5.    
  6.   
  7. /* 
  8.  
  9.  * Usage 
  10.  
  11.  *  
  12.  
  13.  * CGameObjectPool<GameObject> monster_pool; 
  14.  
  15.  * ... 
  16.  
  17.  *  
  18.  
  19.  * // Create monsters. 
  20.  
  21.  * this.monster_pool = new CGameObjectPool<GameObject>(5, () =>  
  22.  
  23.     {  
  24.  
  25.         GameObject obj = new GameObject("monster"); 
  26.  
  27.         return obj; 
  28.  
  29.     }); 
  30.  
  31.      
  32.  
  33.      
  34.  
  35.     ... 
  36.  
  37.      
  38.  
  39.     // Get from pool 
  40.  
  41.     GameObject obj = this.monster_pool.pop(); 
  42.  
  43.      
  44.  
  45.     ... 
  46.  
  47.      
  48.  
  49.     // Return to pool 
  50.  
  51.     this.monster_pool.push(obj); 
  52.  
  53.  * */  
  54.   
  55. public class CGameObjectPool<T> where T : class  
  56.   
  57. {  
  58.   
  59.     // Instance count to create.  
  60.   
  61.     short count;  
  62.   
  63.       
  64.   
  65.     public delegate T Func();  
  66.   
  67.     Func create_fn;  
  68.   
  69.       
  70.   
  71.     // Instances.  
  72.   
  73.     Stack<T> objects;  
  74.   
  75.    
  76.   
  77.     // Construct  
  78.   
  79.     public CGameObjectPool(short count, Func fn)  
  80.   
  81.     {  
  82.   
  83.         this.count = count;  
  84.   
  85.         this.create_fn = fn;  
  86.   
  87.    
  88.   
  89.         this.objects = new Stack<T>(this.count);  
  90.   
  91.         allocate();  
  92.   
  93.     }  
  94.   
  95.       
  96.   
  97.     void allocate()  
  98.   
  99.     {  
  100.   
  101.         for (int i=0; i<this.count; ++i)  
  102.   
  103.         {  
  104.   
  105.             this.objects.Push(this.create_fn());  
  106.   
  107.         }  
  108.   
  109.     }  
  110.   
  111.       
  112.   
  113.     public T pop()  
  114.   
  115.     {  
  116.   
  117.         if (this.objects.Count <= 0)  
  118.   
  119.         {  
  120.   
  121.             allocate();  
  122.   
  123.         }  
  124.   
  125.    
  126.   
  127.         return this.objects.Pop();  
  128.   
  129.     }  
  130.   
  131.       
  132.   
  133.     public void push(T obj)  
  134.   
  135.     {  
  136.   
  137.         this.objects.Push(obj);  
  138.   
  139.     }  
  140.   
  141. }  
유니티 엔진에서 사용 할 수 있는 오브젝트 풀 스크립트 입니다.
c#으로 코딩했기 때문에 꼭 유니티가 아닌 프로젝트에서도 사용 할 수 있습니다.
모바일 게임을 만들다 보니 실시간으로 객체를 생성하는것이 굉장한 부담으로 다가오더군요.
그래서 이런 풀 시스템을 사용하여 미리 적당한 개수를 만들어 놓고 
꺼내오고, 넣어주고 하는 방법을 사용했습니다.

이걸 쓰기 전에는 몬스터가 나올때 마다 딜레이가 생겼었는데,
풀을 쓰고나니 처음에 로딩시간이 약간 더 걸린다는 단점이 있지만,
게임 플레이중에는 아주 쾌적하게 돌아가더군요.^_^)
더불어 메모리 사용량도 예측 가능하게 됐죠.

이 시스템을 사용하는 이유가 객체의 재사용 측면도 있지만,
그것보다는 객체 생성/해제시 딜레이를 없애준다는 점이 더 큰 성과인것 같습니다.

예제가 들어있는 패키지 파일은 첨부파일로 올렸습니다.
집에서 시간날때 만든것이고요, 소스코드 수정/배포/사용등은 사용하는 사람의 자유입니다.
시간없을땐 그냥 휙휙 긁어다가 사용해서 야근을 줄이세요~ㅎㅎ
더 좋은 방법이 있으면 댓글로 조언 남겨주시면 감사하겠습니다.



gameobjectpool.unitypackage


Trackback 0 And Comment 0

[펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서

|
출처 :http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=275

[유니티 엔진 팁 - 로딩시간 최적화에 대해서]


로딩시간 최적화
- 직감도 좋지만 프로파일러를 적극 활용하는것이 정답입니다.
에디터의 profiler탭을 보면 함수들의 수행시간이 표시되는데
시간을 많이 잡아먹는 부분을 집중적으로 수정하면 됩니다.

프로파일러를 확인하지 않았을때 모르고 지나갔던 부분들...
불필요한 물리 오브젝트 제거!
스프라이트 출력용도로만 사용하던 오브젝트에 BoxCollider가 붙어있었는데,
프로파일러를 확인해 보니 이 collider를 재설정 하는데 많은 시간이 소요되더군요.
이부분을 제거하고 나니 로딩속도가 눈에띠게 빨라졌습니다.

- Find류의 함수는 주의할 것.
특히 Update등 매프레임마다 호출되는 곳에서는 GameObject.Find같은 검색함수는
되도록 사용하지 않는것이 좋습니다. 초기화할때 미리 레퍼런스를 갖고 있는것을 권장하고요,
성능좋은 PC에서는 차이가 없어보이지만 모바일에서는 확연한 차이를 발생시킵니다.

- 릴리즈 전 Debug.Log 지우기.
릴리즈 할때는 Debug.Log등의 로그출력부분은 모두 제거하는것이 좋습니다.
로그 남기는것 자체가 프레임에 영향을 주기 때문이죠.
예)
//Debug.Log("[ERROR] " + msg);   // 이런 문자열 합성코드가 들어있으면 가비지 컬렉터의
영향을 받습니다.
그리고 Debug.Log는 콘솔이나 파일로 기록을 남기기 때문에 속도가 굉장히 느리죠.

유니티 로딩 시스템 이해
아이폰이나 안드로이드용 유니티 어플을 실행해보면 다음과 같은 순서로 진행됩니다.

1) 어플실행 -> 2) 유니티 로고 출력 -> 3) 게임화면

"2)번 유니티 로고 출력"시 씬에 올라와 있는 오브젝트들을 모두 로딩하게 됩니다.
이때에는 로고 이미지 한장만 랜더링 할 수 있는 상태이기 때문에
로딩 진행상황등을 표시 하기가 어렵습니다(스크립트로 제어가 불가능함).
따라서 이부분을 빨리 지나가게 한 뒤 "3)번 게임화면"에 들어왔을때
별도의 로딩화면을 만들어 동적으로 로딩하도록 하는 시스템을 갖추는것이 좋아 보이더군요.


Trackback 0 And Comment 0

[펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기

|
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=276

[유니티 엔진 팁 - 비동기 로딩 흉내내기]


비동기 로딩 흉내내기.
유니티에서는 멀티쓰레드 로딩을 지원하지 않습니다.
Resources.Load같은 유니티 함수들은 메인쓰레드에서만 작동하게 되어 있다고 하네요.

- 비동기 로딩을 흉내내는 방법은 몇가지가 있는데
1) assetbundle 시스템을 이용하는 방법,
2) scene의 background로딩 기능을 이용하는 방법,
3) 코루틴을 사용하여 비슷하게 흉내내는 방법등이 있습니다.

1) assetbundle은 리소스가 바뀔때마다 매번 만들어 줘야 하는 번거로움이 있습니다.
2) scene의 background로딩 기능은 메뉴얼 대로 했는데도 제대로 작동하지 않는것 같더군요.
background로딩을 걸어놓고 다른 scene의 OnGUI등에서 매프레임마다 변수를 출력해봤는데
자연스럽게 랜더링 되지 않고 중간중간 블럭이 걸렸습니다.

3) 코루틴을 사용하여 로딩하는 방식 : 한번에 로드하는 오브젝트의 크기를 최소화 하여
잘게 나눈 후 "로딩 -> yield -> 로딩 -> yield" 를 반복하여 처리하였습니다.
- yield를 할때 화면 랜더링이 한번 이루어지기 때문에 비동기 로딩처럼 보일 수가 있죠.

- 테스트결과 랜더링이 블럭되는 시간이 짧기 때문에 자연스러움은 있지만,
전체적인 로딩시간은 오히려 더 길어지는 문제가 발생하였습니다!
아마도 화면 랜더링을 하는 시간 때문인지 yield후 다음 오브젝트 로딩까지의 
딜레이가 조금씩 생기더군요.

이런것들이 여러개 모이니 전체적인 로딩시간이 몇초정도 더 길어지게 되었습니다.
(PC에선 몇초가 큰 의미 없겠지만 모바일에선 길게 느껴지더군요.ㅠ_ㅠ)
결국 GUI, sound, object등 큰 줄기로만 구분하여 중간중간 로딩 진행상황만 표시해주는것으로 처리하였는데,
이렇게만 해줘도 중간에 무한 대기 상태로 빠지지 않기 때문에 유저입장에서 볼 때
로딩이 약간 빨라진듯한 느낌이 들게 됩니다.



Trackback 0 And Comment 0
prev | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ··· | 21 | next