잘 설명되어 있는 블로그가 있어 남김..


http://developug.blogspot.kr/2014/09/unity-vector-lerp.html


아래 포스팅했던 유니티 Color 클래스에서 제공하고 있는 Lerp 함수도 이와 비슷하고,

NGUI Tween스크립트를 보다보니 Quaternion쪽에서도 Slerp 와 같은 함수도 이와 의미는 같다.



WRITTEN BY
빨강꼬마

,
  1. float duration = 5; // This will be your time in seconds.
  2. float smoothness = 0.02f; // This will determine the smoothness of the lerp. Smaller values are smoother. Really it's the time between updates.
  3. Color currentColor = Color.white; // This is the state of the color in the current interpolation.
  4. void Start()
  5. {
  6. StartCoroutine("LerpColor");
  7. }
  8. IEnumerator LerpColor()
  9. {
  10. float progress = 0; //This float will serve as the 3rd parameter of the lerp function.
  11. float increment = smoothness/duration; //The amount of change to apply.
  12. while(progress < 1)
  13. {
  14. currentColor = Color.Lerp(Color.red, Color.blue, progress);
  15. progress += increment;
  16. yield return new WaitForSeconds(smoothness);
  17. }
  18. return true;
  19. }


출처

http://answers.unity3d.com/questions/328891/controlling-duration-of-colorlerp-in-seconds.html

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

코루틴 문제  (0) 2018.06.21
코루틴과 플래그 처리를 이용한 순차처리 구조.  (0) 2017.11.30
Facebook 초기화시 accesstoken 문제  (0) 2016.08.23
Delegate 비교  (1) 2016.05.17
Unity 에서의 멀티쓰레드 구현  (0) 2016.04.20

WRITTEN BY
빨강꼬마

,

예전에 NGUI를 쓸때 유니티파티클을 NGUI의 스프라이트와 스프라이트 사이에 출력시키기 위해서는 렌더큐를 따로 설정하는 스크립트를 만들거나 다른 방법을 취해서 구현해야 했다.


얼마전에 iOS 크래시 이슈로 인해 유니티버젼을 업데이트하고나니 전에보이지 않던 Material 쪽 인스펙터 옵션중 렌더큐를 직접 제어할 수 있도록 노출이 되어있는것이 아닌가! 


즉시 NGUI 페널의 렌더큐를 설정하고 테스트하니 우왕굿..이젠 따로 만들지 않아도 패널만 나눠서 렌더큐 지정해두면 손쉽게 NGUI 기반에서 파티클을 적용할 수 있게 되었다..


새롭게 유니티버젼 나올때마다 새롭게 생기는 버그때문에 짜증나기도 하지만 편리함도 늘어만 간다. ㅋㅋㅋㅋ


WRITTEN BY
빨강꼬마

,

와 대체 이것때메 시간을 얼마나 버린거지...-ㅅ-


PC 플랫폼으로 빌드를 한 후에 페이스북에 캔버스 호스팅으로 빌드한것을 업로드하고, 게임룸을 통해 로그인을 시도할 경우


[URL을 불러올 수 없습니다: 앱 도메인에 포함되어 있지 않은 URL입니다. 이 URL을 불러오려면 회원님의 앱 설정에서 앱 도메인 필드에 모든 도메인과 서브 도메인들을 추가해주세요.]

라거나, 차단된 URL 이라는 에러 메세지로 로그인이 안되는 현상이 있다.


스택오버플로우를 비롯해 다수의 사이트들을 리서치해봤으나 localhost를 웹사이트 플랫폼을 추가해서 등록하라던지, 몇몇개의 솔루션이 있었으나 전부 정상적으로 동작하지 않았다.


슬슬 멘붕이 올려던 찰나, 검색어를 좀더 다양하게 검색하던 도중 페이스북의 레퍼런스 문서에서 검색된 단어가 보이길래 들어갔는데, 내가 그토록 계속보아왔던 한글번역이 된 레퍼런스 문서 페이지였고 이게 왠걸, 들어간 페이지에서는 단어가 보이질 않는다 -_-;;


이거 설마... 이러면서 구글에서 검색된 페이지에서 저장된 페이지로 이동하니, 영어로 된 페이지에서 문제가 되었던 부분의 설정내용이 떡하니 친절하게 이미지와 함께 설명이 되어있었다...


즉, 한글화된 문서에는 정작 중요한 내용이 빠져있었고, 영어로 된 원래의 페이지에서는 설명이 되어 있었.... 으어어어어어어어어 

페이스북을 주깁시다..-.-


먼저 페이스북의 레퍼런스 문서들이 최근들어 한글화를 점점 늘려가고 있는 건 좋은 현상이다. 다만, 이런 부분에 있어서는 좀더 디테일하게 준비를 해야하지 않나 싶다......후우....



아참 설정방법을 얘기하지 않았는데, 캔버스 호스팅을 사용해서 빌드를 업로드한 경우

- 페이스북 로그인 > 설정 으로 이동

- https://apps.facebook.com/{APP_ID} 를 유효한 OAuth 리디렉션 URI 에 추가하고, 클라이언트 OAuth 로그인과 웹 OAuth 로그인을 킨 후 저장.


하면되고, 만약 캔버스 호스팅이 아니라 직접 CDN이나 AWS등에 업로드한 경우 

- 설정 > 기본설정 으로 이동

- 단순 애플리케이션 호스팅이 꺼져있으므로 보안 캔버스 URL이 있을텐데 거기에 https://localhost/을 추가.



아 이 간단한것을...ㅠㅠㅠㅠ.... 워낙 이 문제와 관련된 내용이 인터넷에 없으므로 부디 도움이 되길 바란다..



관련 페이스북 링크는..아래를 참고.

https://developers.facebook.com/docs/games/gameroom/requirements?locale=en_US

'Unity' 카테고리의 다른 글

Vector3.Lerp 함수에 대해.  (0) 2017.04.29
NGUI와 유니티 파티클 시스템.  (0) 2017.04.21
iOS 키체인을 사용한 영구적인 문자열 저장.  (2) 2016.07.13
Unity 작업시 개인 Tip  (2) 2016.04.14
Android 다국어 셋팅시  (0) 2015.03.04

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
빨강꼬마

,