메소드 확장

C#/Tip 2016. 8. 24. 10:47

http://www.c-sharpcorner.com/Blogs/extension-methods-in-c-sharp


ToString() 처럼 호출방식을 간단하게 처리할 수 있음.

자주 호출되는 로직에 적용 가능

'C# > Tip' 카테고리의 다른 글

기수 정렬  (0) 2019.04.05
로그에 뜨는 경고 해제하기  (0) 2017.04.03
Image를 Base64 String으로 변환  (0) 2016.08.24

WRITTEN BY
빨강꼬마

,

Facebook Unity SDK 적용할때 이슈.


Facebook 초기화시 이전에 로그인한 기록이 있는 상태에서 로그아웃 처리를 따로하지 않고 앱을 종료하고나서 다시 Facebook을 초기화할 경우 초기화완료와 함께 AccessToken이 있는 상태로 떨어짐.


즉, 로그인상태로 떨어지는데, 이때 초기화이후에도 AccessToken이 null일 경우가 있다.


Android에서는 별 영향이 없지만 iOS는 PlayerPrefs.DeleteAll()을 호출할 경우 유니티 버젼문제인지는 모르겠지만 Facebook의 AccessToken까지 날려버린다-_- 이것때메 몇일을 고생... 이ㅏㅓㅁㅈ;ㄷ럼ㅈㄷㅎㅁㅈ





WRITTEN BY
빨강꼬마

,

iOS 키체인을 활용해 문자열을 앱의 삭제 이후에도 보존하는 방법이다. 스크립트 하나를 아래와 같이 작성.

using UnityEngine;
using System.Runtime.InteropServices;

public class KeyChain {
	
	#if UNITY_IPHONE || UNITY_STANDALONE_OSX
	
	[DllImport("__Internal")]
	private static extern string getKeyChainUser();
	
	public static string BindGetKeyChainUser()
	{
		return getKeyChainUser();
	}
	
	[DllImport("__Internal")]
	private static extern void setKeyChainUser(string userId);
	
	public static void BindSetKeyChainUser(string userId)
	{
		setKeyChainUser(userId);
	}
	
	[DllImport("__Internal")]
	private static extern void deleteKeyChainUser();
	
	public static void BindDeleteKeyChainUser()
	{
		deleteKeyChainUser();
	}	


  #endif

}

이제 위의 작성한 스크립트의 함수를 받을 Objective-C 파일을 만들 차례.

당연하게 새롭게 만들거나 다운로드한 파일의 위치는 유니티 프로젝트 Plugins/IOS에 위치. (위에 만든 스크립트 위치는 상관없음)


[링크] <- 링크를 통해 아래의 2개 파일을 다운로드.

- UICKeyChainStore.h

- UICKeyChainStore.m



아래의 2개의 파일을 새롭게 생성.

- KeyChainPlugin.h

- KeyChainPlugin.mm


KeyChainPlugin.h의 내용은 아무것도 구현하지 않고 빈 파일로 둠.


KeyChainPlugin.mm의 내용은 아래와 같이 작성.

#import "KeyChainPlugin.h"

#import "UICKeyChainStore.h"

 

NSString *_keyForID = @"UserID";

 

@implementation KeyChainPlugin

 

extern "C" {

    char* getKeyChainUser();

    void setKeyChainUser(const char* userId);

    void deleteKeyChainUser();

}



char* getKeyChainUser()

{

    NSString *userId = [UICKeyChainStore stringForKey:_keyForID];

 

    if (userId == nil || [userId isEqualToString:@""]) {

        NSLog(@"No user information");

userId = @"";

    }

 

NSString* json = [NSString stringWithFormat:@"{\"userId\":\"%@\"}",userId];

 

    return makeStringCopy([json UTF8String]);

}

 

void setKeyChainUser(const char* userId)

{

    NSString *nsUseId = [NSString stringWithCString: userId encoding:NSUTF8StringEncoding];

 

    [UICKeyChainStore setString:nsUseId forKey:_keyForID];

}

 

void deleteKeyChainUser()

{

    [UICKeyChainStore removeItemForKey:_keyForID];

}

 

char* makeStringCopy(const char* str)

{

    if (str == NULL) {

        return NULL;

    }

 

    char* res = (char*)malloc(strlen(str) + 1);

    strcpy(res, str);

    return res;

}

 

@end




전체적인 흐름은 다음과 같음.


1. Keychain.getKeyChainUser() 호출.

2. KeychainPlugin.getKeyChainUser() 진입후, UICKeyChainStore.stringForKey함수를 사용하여 키체인에 접근, UserID의 키에 해당하는 값을 가져옴.

3. 함수를 보면 알겠지만, 값이 null이거나 빈값일 경우 json으로 리턴할 데이터에 값을 따로 지정하지 않음.

4. {"UserID":"ABC"} 형태로 리턴되므로, 유니티에서 해당 값을 반은 후 JSON 데이터를 파싱해서 사용.


* 유니티 API의 SystemInfo.deviceUniqueIdentifier은 호출시 고유한 값을 리턴하지만,  앱을 삭제하고 다시 설치후 호출할 경우 변경된 값을 리턴하므로, 위와 같은 방법을 통해 영구적인 형태로 사용할 수 있음.



참고링크

- http://bribser.co.jp/blog/pluginkeychain/

- http://docs.unity3d.com/kr/current/Manual/PluginsForIOS.html

- https://github.com/kishikawakatsumi/UICKeyChainStore


WRITTEN BY
빨강꼬마

,

Delegate 비교

Unity/스크립트 2016. 5. 17. 19:53
private bool CompareDelegate(Delegate action)
{
        //함수 등록이 중복이 되었는지 검사
        Delegate[] dels = action.GetInvocationList(); 

        for (int i = 0; dels.Length > i; i++)
        {
                Delegate del = dels[i];

                if (del.Target == action.Target && del.Method.Name == action.Method.Name)
                return true;
        }
        return false;
}

WRITTEN BY
빨강꼬마

,

Tween기능을 이용해 로딩 이미지의 애니메이션을 구현하고 데이터의 연산이 많은 작업을 시도할 경우 이미지의 애니메이션이 멈추는 현상이 있다.

이를 멀티쓰레드로 처리할수 있는데, Unity는 기본적으로 메인스레드 하나에서 동작하므로 연산되는 부분을 별도의 쓰레드로 처리하면 애니메이션이 멈추지 않고 동작함과 동시에 연산을 수행할 수 있다.


http://www.wolfpack.pe.kr/123?category=2


0422 추가

- Monobehavior의 코루틴은 메인스레드에서만 돌아감. 코루틴은 스레드를 나누어 작업하는데에 있어 정상적으로 동작하지 않으므로, 유의해서 사용해야함.


WRITTEN BY
빨강꼬마

,

Unity 작업시 개인 Tip

Unity 2016. 4. 14. 15:29

Unity Asset - IOS Native Plugins 사용해서 XCODE에서 최종 빌드시 참고사항


C# - 별도의 게임서버 없이 실제 시간 DateTime 가져오기


Unity API - 자동 화면 잠금 방지


Unity API - 현재 네트워크 연결상태


C# / Unity API - 유니크한 값 생성


Unity - 입사각, 반사각, 법선벡터 설명


C# - 시간데이터 비교 (헷갈릴때 참고)


Unity API - Attribute


Unity - 최적화


Unity - 단축키


XCODE - 앱 이름 지역화


Facebook SDK - Hashkey


C# - List 임의로 섞기


Unity API - OnApplicationPause()


버젼관리 - GitHub +Unity


Unity - 딥 프로파일링 불가시


C# - ref / out 키워드


C# - GC.Collect()


C# - Action을 사용한 이벤트 처리


C# - Action 과 무명 메소드를 활용하여 단일 함수 내에서의 이벤트 리스너 처리.


Unity - Randering Path


C# - 박싱과 언박싱


C# - Generic Type의 값 복사


IOS - splash 이미지 크기



WRITTEN BY
빨강꼬마

,

ios는 상관없지만.. android의 경우 시간을 사용자 임의로 변경할 수 있기 때문에, 시간과 관련하여 컨텐츠의 변경이 필요할 경우 정확한 시간의 정보가 필요함.


이럴때, 미국 국립표준 연구소의 시간을 받아와서 사용하는 방법이 있다.


출처는 - http://stackoverflow.com/questions/6435099/how-to-get-datetime-from-the-internet 요기

실제 수정해서 사용한 코드는 다음과 같음.

TcpClient tcpClient = new TcpClient("time.nist.gov", 13);

StreamReader sr = new StreamReader(tcpClient.GetStream());

        

// 형태 57486 16-04-08 08:53:18 50 0 0 737.0 UTC(NIST) * 

string readData = sr.ReadToEnd();

// 형태 16-04-08 08:57:07

string _time = readData.Substring(readData.IndexOf(" ") + 1, 17);


// 대한민국은 UTC 기준 +9시간.

Datetime currentTime = Convert.ToDateTime(_time).AddHours(9);


// Debug.Log("현재 시간 : " + currentTime.ToString("yyyy-MM-dd HH:mm:ss"));


'Unity > 스크립트' 카테고리의 다른 글

Delegate 비교  (1) 2016.05.17
Unity 에서의 멀티쓰레드 구현  (0) 2016.04.20
앱안에서의 웹뷰처리  (0) 2016.03.28
직렬화의 이해  (0) 2016.03.24
Reactive Extension  (0) 2015.12.11

WRITTEN BY
빨강꼬마

,

https://github.com/gree/unity-webview


1. 위 링크에서 파일을 다운로드 받고, dist 폴더안의 패키지 파일을 임포트.

2. 웹뷰로 사용할 객체를 미리 만들던, 그때 생성하고 삭제하던 편한 방법을 선택해도됨. 

3. 유니티 윈도우에디터에서는 에러나므로, 전처리기를 사용하거나, Application.platform 을 사용해서 분기처리를 반드시 해야함.

4. 아래의 코드로 웹뷰 온/오프 처리.


끝.


참조 블로그. http://blog.usagination.com/58


WRITTEN BY
빨강꼬마

,

https://docs.com/sunnykwak/7250/java-serialization


사전적 정의는 객체의 상태 혹은 데이터 구조를 기록할 수 있는 포맷으로 변환하고 추후 동일 혹은 다른 컴퓨터 환경에서 재구성할 수 있게끔 하는 절차.


직렬화가 중요한 것은 인터넷이 보편화된 시대에 네트워크를 통해 데이터를 주고 받아야 하니까.


직렬화는 네트워크 의존성이 높은 소프트웨어라면 성능을 좌우할 수 있음.


마샬링과 직렬화의 차이점
마샬링은 A -> B로 파라메터를 전달하는 작업
직렬화는 구조적인 데이터를 원시형 형태에서 바이트 스트림과 같은 형식으로 복사하는 작업.
즉 직렬화는 마샬링의 pass by value 개념을 구현하는 수단.


직렬화는 파일 저장소, 네트워크 통신, 데이터베이스, 웹환경에 적용할 수 있음.


직렬화 데이터 형식은
- Binary
- JSON
- XML
- YAML


WRITTEN BY
빨강꼬마

,

우연찮게 slideshare 문서를 보다가 RX를 봄.

얼마전 아는 후배녀석이 새롭게 이직한 회사에서 UniRx라는 것을 쓰는데 들어본적이 있냐고..
물론 들어본적이 없어서 그때 잠깐 찾아보고 slide를 보면서 느낀 생각은..


이 패턴을 꼭 공부해둬야겠다는 생각이 문득든다.


프로젝트를 하다보면 이벤트를 활용한다 하더라도 콜백이 콜백을 부르고... 그 콜백이 또 콜백을 부르는 무한(?) 콜백사태가 나버리면 노가다에 가까운 코딩이 필요하고, 사람이 하는 것이다 보니 버그도 나오기 마련...


우선 필수적으로 람다식의 이해가 필요하고, 열거자에 대한 이해가 필요해보인다.


20160324 추가.

- 음.. 이벤트 처리할때 람다식을 몇번써봤는데 그냥 편한 문법.. 뭐 이해하고 자시고가 없네..ㄷㄷ.. 역시 직접 몇번 사용해보면 바로 이해됨 ㅋ

'Unity > 스크립트' 카테고리의 다른 글

앱안에서의 웹뷰처리  (0) 2016.03.28
직렬화의 이해  (0) 2016.03.24
Raycast시 원하는 충돌레이어 지정  (0) 2015.10.16
Swipe 판별  (0) 2015.07.20
Android 국가코드 정보  (0) 2015.06.07

WRITTEN BY
빨강꼬마

,