멍멍이네 블로그

비주얼 같은 경우 NuGet 솔루션 패키지 관리에서 다운 받아서 사용했습니다.

(유니티에서 보자면... 에셋 스토어 - 무료 패키지 같은 느낌... 이랄까요!)

https://hungry2s.tistory.com/204?category=526895

 

 

그런데 유니티에서는 어떻게 써야 할지 찾아보았습니다.

유니티는 직접 코딩하거나 라이브러리를 다운 받아서(혹은 만들거나) 사용하고자 했는데, 더 쉬운 자료가 있네요.

굳이 힘들게 할 필요 없으니 이용해볼까 합니다.

 

 

이 엑셀 리드의 메커니즘은.

1. 엑셀 파일을 실행 후 다른 이름으로 저장 - csv(쉼표로 분리)로 저장 시 csv 파일로 저장이 됩니다.

2. csv 파일은 엑셀 파일의 각 열을 쉼표로 분리하여 저장합니다.

3. 저장된 데이터를 split(쉼표)로 잘라서 사용. - 끝 -

 

엑셀의 1행에는 header(머리말)이 들어가도록 돼 있어서, 보기도 쉽네요.

(리더기는 2행 1열부터 읽음)

 

엑셀 리드 코딩은 간단합니다.

구글링 합시다.

 

출처 : https://github.com/tikonen/blog/tree/master/csvreader

(2014년 9월 13일 자 글)

 

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class CSVReader
{
	static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
	static string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
	static char[] TRIM_CHARS = { '\"' };

	public static List<Dictionary<string, object>> Read(string file)
	{
		var list = new List<Dictionary<string, object>>();
		TextAsset data = Resources.Load (file) as TextAsset;

		var lines = Regex.Split (data.text, LINE_SPLIT_RE);

		if(lines.Length <= 1) return list;

		var header = Regex.Split(lines[0], SPLIT_RE);
		for(var i=1; i < lines.Length; i++) {

			var values = Regex.Split(lines[i], SPLIT_RE);
			if(values.Length == 0 ||values[0] == "") continue;

			var entry = new Dictionary<string, object>();
			for(var j=0; j < header.Length && j < values.Length; j++ ) {
				string value = values[j];
				value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", "");
				object finalvalue = value;
				int n;
				float f;
				if(int.TryParse(value, out n)) {
					finalvalue = n;
				} else if (float.TryParse(value, out f)) {
					finalvalue = f;
				}
				entry[header[j]] = finalvalue;
			}
			list.Add (entry);
		}
		return list;
	}
}

 

그리고 필요한 곳에서

List<Dictionary<string, object>> 변수명 = CSVReader.Read("파일명(확장자x)");

선언 후 데이터를 사용하면 된다.

for(int i=0; i<data_dialog.Count; i++)
{
	Debug.Log("i : " + i + " [ " + 변수명[i]["damage"].ToString() + " ] " + " [ " + data_dialog[i]["hp"].ToString() + " ] ");
}

(ex) i : 1 [ 1 ]  [ 1 ] 

이런 식으로 출력된다.

 

다만, 필요에 따라 수정이 필요할 듯하다.

* 파일 경로 *

- 기본적으로 Resources.Load를 사용하기 때문에 Resources 폴더에 있는 csv를 사용하는 장점이자 단점이 있다.

서버나 다른 경로에서 읽어오기 위해서 stream으로 변경해서 사용하는 게 더 활용도가 높을 듯.

 

 

 

php -> unity로 배열 값을 보낼 때, json_encode를 이용해서 보낼 시, unity에서 받은 값으로 바로 JsonUtility로 파싱 할 수 없다.

이는 php와 unity에서 json 파싱하는 형태가 다르기 때문이다.

잘못 파싱할 경우 뜨는 에러&문제와 함께 방법을 알아보자.

 

 

JsonUtility.FromJson 할 경우

1. NullReferenceException: Object reference not set to an instance of an object

2. ArgumentException: JSON must represent an object type.

3. 에러는 없고 변수에 값이 안 들어가거나(array type인데 Debug.Log로 Length 찍어보면 0이 나옴)

 

위와 같은 다양한 오류를 볼 수 있다.

 

그러면 다시 한번 파싱을 제대로 했는지 확인해야 한다.(어딘가 잘못 짰으니, 에러가 뜨는 거겠죠)

 

 

1번과 2번 문제의 경우, 파싱 에러 - 앞에 "Items" 값을 추가해야 된다.

_value = "{\"Items\":" + _value + "}";

// retrun value
//          [{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]

// need type for translate to json
// {"Items":[{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]}

_value = "{\"Items\":" + _value + "}";

php에서 json_encode로 값을 보낼 경우, 윗 줄과 같이 오는데, unity에서 JsonUtility.FromJson을 사용하기 위해선 밑의 형태로 바꿔줘야 한다.(array type)

꼭 "Items" 값이 들어가야 하며, 그래도 위와 같은 에러가 뜰 경우 Debug로 괄호나 역슬러시, 큰따옴표 등 값이 제대로 들어갔는지 확인! 

 

 

3번 문제의 경우, Serializable 선언을 확인해주자.

FromJson의 type의 class를 Serializable 선언해주자.

using System; // Serializable

[Serializable]
public class KeyClass
{
    public string key1;
    public string key2;
}

 

 

http://ateliersera.blog.me/220398012149


인터넷 검색 도중 좋은 글이 있어서 참고하고자 링크를 걸어둠.

Rejected because no crossdomain.xml policy file was found

 

원인

서버 접근하는데 위와 같은 에러가 발생.

검색 시 유니티에서 플랫폼이 Web Player일 경우 발생하는 에러라고 함.

 

해결

빌드세팅에서 플랫폼을 다른걸로 바꿔주자!

 

 

 

Unable to verify assembly data; you must provide an authorization key when loading this assembly.
UnityEngine.Security:LoadAndVerifyAssembly(Byte[])
c__Iterator0:MoveNext() (at Assets/Plugins/Facebook/Scripts/FB.cs:423)

Could not securely load assembly from https://integrated-plugin-canvas-rsrc.fbsbx.com/rsrc/unity/lib/sdk_6.2/CanvasFacebook.dll
UnityEngine.Debug:LogError(Object)
FbDebug:Error(String)
c__Iterator0:MoveNext() (at Assets/Plugins/Facebook/Scripts/FB.cs:427)

 

 

원인

- 처음 Unity3D에서 FacebookAPI를 다운받아서 사용하려고 하는데 위와 같은 에러가 뜸.

 

해결방법(Unity3D 5.1버전대 / 페이스북 (140825일자 버전 사용)

- FB.cs파일에서 411번째 줄 정도에

  #if UNITY_4_5  -> #if UNITY_4_5 || UNITY_4_6 || UNITY_5_0 || UNITY_5_1 으로 수정함.

유니티로 프로젝트를 진행하다가 간혹 드로우콜(Draw Call)에 관한 문제를 많이 겪는다. - 특히나 모바일 같은 경우 -

 

PC기반은 어느정도 사양에 의해 커버가 돼는데 - 그런데도 발생하기도 함.. 극한으로 최적화를 안하거나 드로우콜을 낭비할 경우 - 모바일은 사양이 좋아졌다지만, 아직 한참 부족한 상태다 - PC처럼 최적화없이 낭비할 경우 커버가 안됀다 -

 

 

서론은 이쯤 하고, 본론으로 들어가면

 

일단 드로우 콜(Draw Call)이란 무엇일까?

CPU가 그래픽 API를 호출해서 GPU에게 렌더링을 요청하는 것을 말합니다.
이 작업은 자원이 많이 들기 때문에 드로우 콜을 줄이는 것이 성능 향상에 있어 매우 중요합니다.
스프라이트들을 스프라이트 시트에 모두 모아놓으면 단 한번의 드로우 콜로 모든 스프라이트를 화면에 표시할 수 있습니다. 게임에 사용하는 스프라이트가 많을수록 성능이 획기적으로 향상 됩니다.
(출처 : http://blog.daum.net/yy.kim.0410/278)

 

드로우 콜이란 화면에서 얼마나 많은 이미지를 뿌려주는 가에 관해 드로우 콜의 수가 늘어난다

유니티에서 많은 이미지를 낭비하게 되면 그만큼 개발프로그램에서 부담이 가는 부분이기 때문에 최적화 및 드로우콜 수의 감소는 선택이 아닌 필수이다.

 

가장 좋은방법으로는 이미지의 수를 줄이는 것.

애초에 이미지 수를 줄여서 드로우콜을 줄이면 가장 좋지만, 그것이 안되는 경우가 대다수.

 

그 다음 방법으로는 이미지의 아틀라스화 이다.

이미지 아틀라스화의 장단점은 직접 찾아보면 금방 나옵니다.

간단하게 설명하자면 장점은 드로우콜의 수를 쉽게 줄일 수 있다.

여러 이미지를 압축하는 방식이기 때문이다.

 

단점 역시 간단하게 말하자면 이미지 관리가 철저해야됀다는것이다.

이미지를 압축해서 사용하는 영역을 침범하면 안되고, 겹픽셀 같은 경우 간혹 발생하는경우도 있고 - NGUI 아틀라스 사용 시 생기는 문제 -

이미지 낭비가 생기는 경우도 없잖아 있다 - 아틀라스는 대게 이미지가 사각형이며 2의 배수이다. 500x500의 4장을 합치면 2000x 2000이 아니라 2048x2048이 되기 때문에 많은 메모리가 필요 이상으로 이용된다.

 

그밖에 자세한 글은 구글링 외 다른 곳에서 참조하시고, 제 글은 간단하게나마 이렇구나 정도로 읽어주시면 됍니다 ㅎ

 

p.s.

저는 NGUI를 이용해서 아틀라스화 할 때 생기는 문제들이였고, 이미지패커? 라는 기능이 프로버전에 지원하는 것 같더군요.

틀리거나 지적사항 및 수정사항에 대해서 댓글 부탁드립니다.

Unity - iOS 접근 플러그인 방법

 

제목 : Unity for IOS_Screen Capture한 이미지 카메라롤 에 등록하기.

 

Explan.

IOS에서 Application.CaptureScreenShot(path) 메소드를 사용할경우
캡처는 진행되나 해당 app 의 document폴더로 들어가서 카메라 롤에서 확인할수가 없다.
이를 등록해주는 방법 포스팅.


CaptureHelper.h

#import <Foundation/Foundation.h>

@interface CaptureHelper : NSObject

+(CaptureHelper *)sharedInstancs;

@end
CaptureHelper.mm
#import "CaptureHelper.h"

static CaptureHelper * captureHelper = [CaptureHelper sharedInstancs];

@implementation CaptureHelper : NSObject

+ (void)initialize{
    if(captureHelper == nil)
        captureHelper = [[CaptureHelper alloc] init];
}

+ (CaptureHelper *)sharedInstancs{
    return captureHelper;
}

- (id)init{
    if(captureHelper != nil){
        return  captureHelper;
    }
    
    self = [super init];
    if(self){
        captureHelper = self;
    }
    
    return self;
}


- (NSString *)getDocumentDirectory {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    return [paths objectAtIndex:0];
}

@end

extern "C"{
    void CaptureToCameraRoll(const char *fileName)
    {
        NSString *file = [NSString stringWithUTF8String:(fileName)];
        NSString *filePath = [[captureHelper getDocumentDirectory] stringByAppendingString:file];
        UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath];
        
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }
}

위 2개의 파일을 생성후 Plugin/IOS 폴더에 위치 그후

how to used.

[DllImport("__Internal")]
public static extern void CaptureToCameraRoll(String fileName);

// 그이후 스크린 캡처 진행시.

Application.CaptureScreenShot(path);
CaptureToCameraRoll(string.Format("/{0}",path));

이후 카메라롤에서 캡쳐된 이미지를 확인하실수 있다.

 

 

 

URL : http://gomlib.blogspot.kr/2014/10/unity-for-iosscreen-capture.html

 

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

 

제목 : [iOS] 이미지, 동영상을 카메라 롤에 저장

 

이미지

 
1
2
3
4
5
6
7
8
9
10
11
12
13
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// 이미지를 카메라 롤에 저장
UIImageWriteToSavedPhotosAlbum(image, self,
@selector(image:didFinishSavingWithError:contextInfo:), nil);
 
// 저장한 이후에 실행 될 메소드
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    if (error) {
        NSLog(@"error: %@", [error localizedDescription]);
    } else {
        NSLog(@"saved");
    }
}


동영상

?
1
2
3
4
5
6
7
8
9
10
11
12
13
NSURL *mediaUrl = [info objectForKey:UIImagePickerControllerMediaURL];
// 동영상을 카메라 롤에 저장
UISaveVideoAtPathToSavedPhotosAlbum([mediaUrl path], self,
@selector(video:didFinishSavingWithError:contextInfo:), nil);
 
// 저장한 이후에 실행 될 메소드
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    if (error) {
        NSLog(@"error: %@", [error localizedDescription]);
    } else {
        NSLog(@"saved");
    }
}

 

출처 URL : http://fra3il.tistory.com/66

 

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

 

-(void) GetImageFromAlbum {
    [self GetImage:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
}

 

-(void) StartCameraImagePic {
    NSLog(@"StartCameraImagePic");
    [self GetImage:UIImagePickerControllerSourceTypeCamera];
}

 

-(void) GetImageFromCamera {
    BOOL cameraAvailableFlag = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
    if (cameraAvailableFlag) {
        [self performSelector:@selector(StartCameraImagePic) withObject:nil afterDelay:0.9];
    }
}

 

-(void) GetImage: (UIImagePickerControllerSourceType )source {
    UIViewController *vc =  UnityGetGLViewController();
   
    if(_imagePicker == NULL) {
        _imagePicker = [[UIImagePickerController alloc] init];
        _imagePicker.delegate = self;

    }
   
    _imagePicker.sourceType = source;
   
    [vc presentViewController:_imagePicker animated:YES completion:nil];
}

 

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *vc =  UnityGetGLViewController();
    [vc dismissViewControllerAnimated:YES completion:nil];
   
    // added video support
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; // get media type
    // if mediatype is video
    if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) {
        NSURL *videoUrl=(NSURL*)[info objectForKey:UIImagePickerControllerMediaURL];
        NSString *moviePath = [videoUrl path];
        UnitySendMessage("IOSCamera", "OnVideoPickedEvent", [ISNDataConvertor NSStringToChar:moviePath]);
    } else{
        // it must be an image
        UIImage *photo = [info objectForKey:UIImagePickerControllerOriginalImage];
        NSString *encodedImage = @"";
        if (photo == nil) {
            NSLog(@"no photo");
        } else {
            // NSLog(@"MaxImageSize: %i", [self MaxImageSize]);
            //  NSLog(@"photo.size.width: %f", photo.size.width);
           
            if(photo.size.width > [self MaxImageSize] || photo.size.height > [self MaxImageSize] ) {
                NSLog(@"resizing image");
                CGSize s = CGSizeMake([self MaxImageSize], [self MaxImageSize]);
               
                if(photo.size.width > photo.size.height) {
                    CGFloat new_height = [self MaxImageSize] / (photo.size.width / photo.size.height);
                    s.height = new_height;

                } else {
                    CGFloat new_width = [self MaxImageSize] / (photo.size.height / photo.size.width);
                    s.width = new_width;
                }
                             
                photo =   [ISNCamera imageWithImage:photo scaledToSize:s];
            }
           
            NSData *imageData = nil;
            NSLog(@"ImageCompressionRate: %f", [self ImageCompressionRate]);
            if([self encodingType] == 0) {
                imageData = UIImagePNGRepresentation(photo);
            } else {
                imageData = UIImageJPEGRepresentation(photo, [self ImageCompressionRate]);
            }
            encodedImage = [imageData base64Encoding];
        }
       
        UnitySendMessage("IOSCamera", "OnImagePickedEvent", [ISNDataConvertor NSStringToChar:encodedImage]);
    }
}

 

 

유니티에서 드래그로 오브젝트 선택하는거 만들기 영상

 

출처 : https://www.youtube.com/watch?v=2wgeDQlwnQ0&list=PLm1w78-UUlMJ-S8Apf96YzzAaa2yfZzAx

이벤트 함수의 실행 순서

Unity 스크립팅시, 미리 정의된 순서대로 실행되는 많은 이벤트 함수가 있습니다. 아래에서는, 실행 순서를 설명합니다.

에디터

  • __ Reset : __ Reset은 개체가 처음 연결되었을 때 스크립트의 프로퍼티로 초기화하는 데 호출됩니다. Reset 명령을 실행했을 때도 마찬가지입니다.

첫 번째 씬 로드

이 함수는 씬이 시작되면 호출됩니다(씬의 각 오브젝트에 대해 한 번).

  • __ Awake : __이 함수는 항상 Start 함수의 이전 및 프리팹의 인스턴스화 직후에 호출됩니다. (만약 게임 오브젝트가 시작할 때 무효인 경우, 활성화되거나 연결된 하나의 스크립트 함수가 호출될 때까지, Awake는 호출되지 않습니다.)
  • __ OnEnable : __ (오브젝트가 활성화된 경우에만 호출됩니다): 이 함수는 오브젝트를 활성화 한 직후에 호출됩니다. 이것은 MonoBehaviour 인스턴스가 생성될 때, 예를 들어 레벨 로드 또는 스크립트 컴포넌트에 연결된 게임 오브젝트가 인스턴스화 될 때 발생합니다.

씬에 추가 된 오브젝트에서 모든 스크립트는 Start, Update 등기 기타 함수가 호출되기 전에 Awake와 OnEnable 함수가 호출되는 것에 주의하십시오. 당연히 오브젝트가 게임 플레이 중에 인스턴스화 되었을 때 강제로 호출할 수 없습니다.

첫 번째 프레임의 업데이트 전

  • __ Start : __ 스크립트의 인스턴스가 활성화되면 첫 번째 프레임의 업데이트 전에 Start가 호출됩니다.

씬에 추가된 오브젝트의 Start 함수는 모든 스크립트 Update 및 기타 함수가 호출되기 전에 호출됩니다. 당연히 오브젝트가 게임 플레이 중에 인스턴스화되었을 때 강제로 호출 할 수 없습니다.

프레임 사이

  • __ OnApplicationPause : __ 일반 프레임 업데이트 사이에서 pause가 탐지된 프레임의 끝에서 호출 됩니다. OnApplicationPause가 호출되면 추가 프레임이 발행되어, pause 상태를 나타내는 그래픽 인디케이터가 표시 됩니다.

업데이트 순서

게임 로직 인터랙션, 애니메이션, 카메라 위치 등을 추적하는 경우, 각종 이벤트를 사용할 수 있습니다. 일반적인 패턴은 Update() 함수 내에서 대부분의 작업을 수행하는 것입니다만, 다른 함수도 사용할 수 있습니다.

  • __ FixedUpdate : __ FixedUpdate()Update()보다 자주 호출되는 경우가 많습니다. 프레임 속도가 낮은 경우에는 프레임마다 여러 번 호출 할 수 있지만, 프레임 속도가 높을 경우 프레임간에 호출 할 수 없습니다. FixedUpdate() 직후에 모든 물리적 특성 계산 및 업데이트가 발생합니다. FixedUpdate()에서 이동 계산을 적용 할 때 Time.deltaTime 값을 곱할 필요는 없습니다. 이것은 프레임 속도와는 독립적으로 FixedUpdate()가 신뢰할 수있는 타이머에서 호출되기 때문 입니다.

  • __ Update : __ Update는 프레임마다 한 번씩 호출됩니다. 이것은 프레임의 업데이트에 대한 주요 기능입니다.

  • __ LateUpdate : __ LateUpdate()Update() 후 프레임마다 한 번씩 호출됩니다. Update()에서 수행되는 계산이 완료되면 LateUpdate() 함수가 시작 합니다. LateUpdate()의 일반적인 사용은 다음의 3인칭 카메라입니다. Update()에서 캐릭터를 이동하고 회전시킬 경우 LateUpdate()에서 카메라의 이동과 회전 계산을 수행할 수 있습니다. 이렇게하면 캐릭터가 카메라가 그 위치를 추적하기 전에 완전히 이동합니다.

렌더링

  • __ OnPreCull : __ 카메라가 씬을 추려내기 전에 호출됩니다. 컬링(Culling)하여 카메라에 어떤 오브젝트를 표시할 지가 결정됩니다. OnPreCull은 컬링이 발생하기 직전에 호출됩니다.
  • __ OnBecameVisible / OnBecameInvisible : __ 오브젝트가 카메라에 표시되거나 표시되지 않게 될 때 호출됩니다.
  • __ OnWillRenderObject : __ 오브젝트가 표시되면 각 카메라에 __ 한 번 __ 호출됩니다.
  • __ OnPreRender : __ 카메라가 씬의 렌더링을 시작하기 전에 호출됩니다.
  • __ OnRenderObject : __ 모든 씬 렌더링 종료 후에 호출됩니다. GL 클래스 또는 Graphics.DrawMeshNow을 사용하여 이 시점에 사용자 지정 지오메트리를 그릴 수 있습니다.
  • __ OnPostRender : __ 카메라가 씬의 렌더링을 종료한 후 호출됩니다.
  • __ OnRenderImage: __ 화면 렌더링이 완료되고, 화면 이미지 처리가 가능하게 된 후에 호출됩니다.
  • __ OnGUI : __ GUI 이벤트에 따라 프레임마다 여러 차례 호출됩니다. 레이아웃 및 리페인트 이벤트가 먼저 처리된 후 레이아웃 및 키보드 / 마우스 이벤트가 각 입력 이벤트에 대해 처리됩니다.
  • __ OnDrawGizmos__ 시각화를 위한 씬 뷰에서 기즈모(Gizmos)를 그리는 데 사용됩니다.

코루틴

일반적인 코루틴 업데이트는 Update 함수가 반환된 후 수행됩니다. 코루틴은 YieldInstruction이 종료할 때까지 그 실행(생성)을 중지할 수 있는 함수입니다. 코루틴의 다른 사용법은 아래와 같습니다.

  • __ yield__ 코루틴은 다음 프레임에서 모든 Update 함수가 호출된 후에 속행합니다.
  • __ yield WaitForSeconds__ 프레임에 대한 모든 Update 함수가 호출된 후 지정된 시간 지연 후에 속행합니다.
  • __ yield WaitForFixedUpdate__ 모든 스크립트에서 모든 FixedUpdate 호출 후 속행합니다.
  • __ yield WWW__ WWW 다운로드 완료 후 속행합니다.
  • __ yield StartCoroutine__ 코루틴을 연결하고 MyFunc 코루틴이 먼저 완료될 때까지 기다립니다.

오브젝트를 파기할 때

  • __ OnDestroy : __ 오브젝트 생존기간의 마지막 프레임의 프레임 업데이트 후 OnDestroy가 호출됩니다. (오브젝트는 Object.Destroy 또는 씬 종료시에 파기됩니다)

종료 시

이 함수는 씬 안에 있는 모든 활성 오브젝트에서 호출됩니다. :

  • __ OnApplicationQuit : __이 함수는 응용 프로그램 종료 전에 모든 게임 오브젝트에서 호출됩니다. 에디터에서는 사용자가 재생 모드를 중지하면 호출됩니다. 웹 플레이어에서는 웹 뷰가 닫힐 때 호출됩니다.
  • __ OnDisable : __이 함수는 동작이 비활성화 될 때 호출됩니다.

스크립트 라이프 사이클 플로우차트(Script Lifecycle Flowchart)

다음 그림은 스크립트의 유효기간 동안 이벤트 함수의 순서와 반복 처리를 정리 한 것입니다.

 

출처 유니티 레퍼런스

http://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html

어플리케이션의 스테이트에 따라서 특정한 처리가 요구될 경우가 있습니다.

이를 위해 안드로이드. iOS 양쪽 모두 통용되는 메소드를 지원하고 있습니다. 

 

OnApplicationPause(bool pause) : 홈키로 어플을 내려 pause 상태로 만들었을 때의 처리

OnApplicationQuit() : 어플을 종료할 때의 처리

 

메소드의 이름만 보면, 안드로이드 쪽에 가깝군요. 하지만 Unity3D는 여러가지 면에서 iOS를 더 사랑하는 것 같습니다.

(푸시 지원 해주는 것만 봐도...) 간략한 예제를 통해서 어떤 식으로 쓰이게 되는지 알아보도록 하겠습니다.

 

 

1) OnApplicationPause

 

bool bPaused = false;  // 어플리케이션이 내려진 상태인지 아닌지의 스테이트를 저장하기 위한 변수

 

void OnApplicationPause(bool pause)

{

  if (pause)

  {

    bPaused = true;

    // todo : 어플리케이션을 내리는 순간에 처리할 행동들 /

  }

  else

  {

    if (bPaused)

    {

      bPaused = false;

      //todo : 내려놓은 어플리케이션을 다시 올리는 순간에 처리할 행동들 

    }

  }

 

 

2) OnApplicationQuit

 

void OnApplicationQuit()

{

  // todo : 어플리케이션을 종료하는 순간에 처리할 행동들

}

 

출처 : http://blueasa.tistory.com/1147