WRITTEN BY
빨강꼬마

,

프로젝트 작업중에 순차적으로 처리할 코드를 줄이다 보니 아래의 테스트코드를 작성하게 되었음.

왜 싱글턴을 사용했는지가 중요한게 아니므로 넘어가고 흐름만 보도록 하자.


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
IEnumerator Start()
{
yield return null;
bool checkSum = false;
for (int i = 0; i < 10; i++)
{
checkSum = false;
Test1.Instance.CallBackTest((success) => { checkSum = success; });
yield return new WaitUntil(()=>checkSum);
}
}
}
public class Test1 : MonoBehaviour
{
#region singleton
private static volatile Test1 instance;
private Test1() { }
public static Test1 Instance
{
get
{
if (instance == null)
{
GameObject go = new GameObject();
instance = go.AddComponent<Test1>();
}
return instance;
}
}
#endregion
Action<bool> mCB;
public void CallBackTest(Action<bool> _cb)
{
mCB = _cb;
StopCoroutine("StartCallBack");
StartCoroutine("StartCallBack");
}
IEnumerator StartCallBack()
{
yield return new WaitForSeconds(UnityEngine.Random.Range(0.5f, 3f));
if (mCB != null)
mCB.Invoke(true);
}
}

흐름은 Test 클래스 Start 함수에서 반복문으로 시작.

이후 지역변수 checkSum을 이용해 Test1쪽 콜백을 받으면 true로 변경되기 전까지 waituntil에서 대기하고,

checksum이 true로 되면 다음으로 진행되는 구조.


뭐 팁이랄것도 없이 아주 간단한 구조이긴한데, 눈으로 봐야 직성이 풀리는 성격이기도 하고 생존기록으로 남기고자..'ㅅ';


WRITTEN BY
빨강꼬마

,

ㅇ1년 정도 더된 글이지만..

http://qiita.com/Dorobou/items/9b71e6621095466083c4


핵심은 


 void Update () {
        if (Input.GetKeyDown (KeyCode.A)) {
            GameObject.Find("Plane").renderer.material.mainTexture = null;
        }
        else if (Input.GetKeyDown (KeyCode.B)) {
            DestroyObject(GameObject.Find("Plane"));
        }
        else if (Input.GetKeyDown (KeyCode.C)) {
            tex = null;
        }
        else if (Input.GetKeyDown (KeyCode.D)) {
            Resources.UnloadAsset(tex);
        }
        else if (Input.GetKeyDown (KeyCode.E)) {
            Resources.UnloadUnusedAssets();
        }
    }



일때


B > C > E 순서로 처리해야 객체의 참조가 전혀 없어지므로 메모리를 해제할 수 있음.




에셋번들 워크플로.


WRITTEN BY
빨강꼬마

,

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


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

,

DISABLE 간혹 코딩하다보면 선언은 되었는데, 실제 사용하지 않는 변수가 있을 경우 콘솔창에 warning이 뜨는 경우가 있다.


물론 해당 변수를 삭제하여 메모리 관리를 확실하게 할수는 있겠지만, 경우에 따라 선언을 해야 하는데 실제 사용하지 않는 경우도 있을 수 있다.


예를 들면,

스트림 처리를 사용하여 이벤트 데이터를 각 이벤트 리스너에게 전달할때, 보낸 순서대로 데이터를 읽어와야 하는데, 2개의 데이터를 보냈으나 받는쪽에서 두번째에 보낸 하나의 데이터만 사용할 경우 두개를 모두 읽어야 두번째의 데이터를 확인할 수 있다던지...

사실 이런 구조를 바꿔야 하는게 맞으나, 선언한 변수를 사용하진 않고 그냥 두어야 하는게 이 포스팅의 핵심이니 넘어가도록 하자 -.-;;;


경고를 뜨지 않게 하려면 전처리기를 사용하면 되는데, ms c# 컴파일러가 지원하는 #pragma warning 을 사용하면 이것을 무시하고 없앨수 있다.

변수를 포함하여, 함수, 클래스 모두 사용 가능하다.

(자세한 내용은 http://www.csharpstudy.com/CSharp/CSharp-preprocessor.aspx 참조..)


특정 변수위에 

#pragma warning disable 0219

로 처리해두면 하단에 있는 변수등에 대한 워닝이 비활성화된다.


뒤쪽에 있는 코드는 warning이 출력될때 CS0219와 같은 코드를 참고하여 해당 코드를 코딩해주면 된다.



* 추가.

disable과는 반대로 restore를 사용할수도 있지만 권장하지는 않는다고 한다.

http://answers.unity3d.com/questions/367829/c-variable-is-assigned-but-its-value-is-never-used.html

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

기수 정렬  (0) 2019.04.05
Image를 Base64 String으로 변환  (0) 2016.08.24
메소드 확장  (0) 2016.08.24

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

,

가령 테이블에 아래와 같은 형태의 컬럼이 n개 있는 경우가 있다.


item_type_1 

 item_count_1

 0

 10


만약 item_type_1, item_count_1이 n개 더 있어서 item_type_2, item_count_2... 등 더 늘어나고, 늘어날때마다 


int itemType1;

int itemCount1;


과 같은 변수도 같이 늘어난다고 가정하자. (이때 각 컬럼에 할당된 데이터도 변수에 있다고 가정)


일반적으로 조건문을 활용해서 구현할수도 있겠지만, 

Reflection 기능을 이용해서 좀더 짧은 코드로 유연하게 아래처럼 구현할 수도 있다.



using System.Reflection;


public class Program

{

public int itemType1;

public int itemCount1;

.....


public int columnCount = 10;    // 위의 종류가 반복되는 숫자


static void Main(string[] args)

{

for (int i = 0; i < columnCount ; i++)

{

string key1 = string.format("itemType{0}", i+1);

string key2 = string.format("itemCount{0}", i+1);


FieldInfo _typeField1 = this.GetType().GetField(key1, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

FieldInfo _typeField2 = this.GetType().GetField(key2, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);


int typeValue = (int)_typeField1.GetValue(this);

int itemCount = (int)_typeField2.GetValue(this);

}

}

}


이와는 반대로 변수명을 string 형태로 받아오는 것도 Reflection 기능을 이용하면 편하다.

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

강제 형변환 캐스팅과 as 의 차이  (0) 2024.01.12

WRITTEN BY
빨강꼬마

,
  1. static void Main(string[] args)  
  2. {  
  3.      string imagePath=@"E:\images\sample.png";  
  4.      string imgBase64String = GetBase64StringForImage(imagePath);  
  5.      Console.WriteLine(imgBase64String);  
  6. }  
  7. protected static string GetBase64StringForImage(string imgPath)  
  8. {  
  9.       byte[] imageBytes = System.IO.File.ReadAllBytes(imgPath);  
  10.       string base64String = Convert.ToBase64String(imageBytes);  
  11.       return base64String;  
  12. }  



원문 : http://www.c-sharpcorner.com/Blogs/get-base64-string-from-image-in-c-sharp

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

기수 정렬  (0) 2019.04.05
로그에 뜨는 경고 해제하기  (0) 2017.04.03
메소드 확장  (0) 2016.08.24

WRITTEN BY
빨강꼬마

,