블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

실시간 그림자

Unity3D/Shadow / 2014. 3. 7. 01:00

배경이 평면이어야 된다는 제약이 있긴하지만 좋은 방법인 듯..


링크 : http://blog.naver.com/zeodtr/70186005934





반응형
Posted by blueasa
, |



Jenkins로 유니티 자동 빌드 세팅하기 (2)


Jenkins로 유니티 자동 빌드 세팅하기 (3) - ios 앱 빌드 준비 과정


Jenkins로 유니티 자동 빌드 세팅하기 (4) - ios 앱 코드 사이닝



반응형
Posted by blueasa
, |

링크 : http://viewspace.tistory.com/9


웹상에서 다이렉트 링크를 지원하는 곳을 찾는 중 드롭박스가 이전엔 자동으로 Public 폴더(다이렉트 링크를 지원하는 폴더)를 줬는데 2012년 10월 4일 이후 가입자는 퍼블릭 링크가 비활성화 되어 있다고 한다.


그걸 푸는 방법이 위 링크에 포스팅 돼 있다.


간단히 요약하면..


1. 드롭박스 로그인(의리를 위해 위 링크의 '드롭 박스 가입하기'를 통해 가입해주면 좋을 듯 하네요.)


2. https://www.dropbox.com/enable_public_folder <-- 클릭

반응형
Posted by blueasa
, |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using UnityEngine;
 
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    static T m_Instance = null;
 
    public static T instance
    {
        get
        {
            if( m_Instance != null )
            {
                return m_Instance;
            }
 
            System.Type type = typeof(T);
 
            T instance = GameObject.FindObjectOfType(type) as T;
 
            if( instance == null )
            {
                string typeName = type.ToString();
 
                GameObject gameObject = new GameObject( typeName, type );
                instance = gameObject.GetComponent<T>();
 
                if( instance == null )
                {
                    Debug.LogError("Problem during the creation of " + typeName,gameObject );
                }
            }
            else
            {
                Initialize(instance);
            }
            return m_Instance;
        }
    }
 
    static void Initialize(T instance)
    {
        if( m_Instance == null )
        {
            m_Instance = instance;
 
            m_Instance.OnInitialize();
        }
        else if( m_Instance != instance )
        {
            DestroyImmediate( instance.gameObject );
        }
    }
 
    static void Destroyed(T instance)
    {
        if( m_Instance == instance )
        {
            m_Instance.OnFinalize();
 
            m_Instance = null;
        }
    }
 
    public virtual void OnInitialize() {}
    public virtual void OnFinalize() {}
 
    void Awake()
    {
        Initialize( this as T );
    }
 
    void OnDestroy()
    {
        Destroyed( this as T );
    }
 
    void OnApplicationQuit()
    {
        Destroyed( this as T );
    }
}

使い方は

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using System.Collections;
 
public class TestSingleton : MonoSingleton<TestSingleton>
{
    public override void OnInitialize()
    {
        Debug.Log ( "TestSingleton#OnInitialize" );
    }
 
    public override void OnFinalize()
    {
        Debug.Log ( "TestSingleton#OnFinalize" );
    }
}


출처 : http://caitsithware.com/wordpress/?p=118

반응형

'Unity3D > Script' 카테고리의 다른 글

Unity Singleton  (0) 2014.03.24
Platform Dependent Compilation  (0) 2014.03.11
Singleton  (0) 2014.03.05
Serializable, NonSerialized  (0) 2013.07.30
Get MAC address on Android device  (0) 2013.07.24
Posted by blueasa
, |

Singleton

Unity3D/Script / 2014. 3. 5. 10:41

일반형 Singleton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class MySingleton
{
    private static MySingleton instance;
 
    //
    private MySingleton()
    {
 
    }
 
    static MySingleton()
    {
        instance = new MySingleton();
    }
 
    public static MySingleton Instance
    {
        get
        {
            return instance;
        }
    }
};

Component용 Singleton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using UnityEngine;
using System.Collections;
 
public class MySingleton : MonoBehaviour {
 
    private static MySingleton instance;
     
    //
    private MySingleton()
    {
    }
     
    //
    public static MySingleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance =  FindObjectOfType(typeof (MySingleton)) as MySingleton;
             
                if (instance == null)
                {
                    GameObject obj = new GameObject("MySingleton");
                    instance = obj.AddComponent(typeof (MySingleton)) as MySingleton;
                    Debug.Log ("Could not locate an MySingleton object. MySingleton was Generated Automaticly.");
                }
            }
  
            return instance;
        }
    }
     
    void Awake()
    {
        DontDestroyOnLoad(this);
    }
     
    void OnApplicationQuit()
    {
        instance = null;
    }
}

제네릭 버전

일반형 Singleton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class  Singleton<T> where T : class, new()
{
    private static T instance;
         
    static Singleton()
    {
        instance = new T();
    }
     
    public static T Instance
    {
        get
        {
            return instance;
        }
    }
};

Component용 Singleton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using UnityEngine;
using System.Collections;
  
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    private static T instance;
     
    //
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance =  FindObjectOfType(typeof(T)) as T;
             
                if (instance == null)
                {
                    GameObject obj = new GameObject(typeof (T).ToString());
                    instance = obj.AddComponent(typeof (T)) as T;
                    instance.Init();
         
                    Debug.Log ("Could not locate an " + typeof (T).ToString() +" object. " + typeof (T).ToString() + " was Generated Automaticly.");
                }
            }
         
            return instance;
        }
    }
      
    void Awake()
    {
        if (instance == null)
        {
            instance = this as T;
            instance.Init();
        }
         
        DontDestroyOnLoad(this);
    }
      
    void OnApplicationQuit()
    {
        instance = null;
    }
     
    public virtual void Init()
    {
         
    }
}



반응형
Posted by blueasa
, |



반응형
Posted by blueasa
, |

링크 : http://unitystudy.net/bbs/board.php?bo_table=newwriting&wr_id=357&sca=&sfl=wr_subject&stx=%EC%97%90%EC%85%8B&sop=and

반응형
Posted by blueasa
, |

유니티에서 보통 간단하게 값들을 저장하려면 PlayerPrefs를 많이 씁니다.

물론 로컬에 저장되기 때문에 값이 유저들에게 손쉽게 노출이 되어 변경되기 쉽다는 단점이 있습니다.

 

<PlayerPrefs에 간단한 소개 및 저장위치>

http://docs.unity3d.com/Documentation/ScriptReference/PlayerPrefs.html

 

이를 막기 위해서는 서버에도 값을 저장해서 대조해 본다거나 하는 방법이 필요하겠지만,

간단하게 암호화해서 값이 조작될 경우를 알아내도록 하는 방법이 있습니다.

C#에서 제공하는 라이브러리가 있어 이를 활용해서 만들어 보려고 하다가,

유니티 포럼에 Mudloop란 분이 깔끔하게 클라스로 구현해주셔서 공유하려고 합니다.

저도 덕분에 수고를 많이 줄였거든요 ^^


원리는 secret key 와 private key를 이용해 MD5로 해쉬값을 만들어서,

이를 playerprefs에 저장된 값과 비교하여 일치하는지를 체크하는 방식입니다. 

 

<원본 위치>

http://forum.unity3d.com/threads/26437-PlayerPrefs-Encryption

 

사용법은 간단합니다.

 

우선, https://gist.github.com/ftvs/5299600 에 있는 EncryptedPlayerPrefs.cs를 복붙으로 만듭니다.

 

그리고 아래 키 값을 playerprefs 암호화가 필요한 곳 앞에 넣습니다. (키값은 적당히 바꾸시구요)

아마 start() 같은 곳이 적당하겠죠?

 

  1.         EncryptedPlayerPrefs.keys=new string[5];
  2.         EncryptedPlayerPrefs.keys[0]="23Wrudre";
  3.         EncryptedPlayerPrefs.keys[1]="SP9DupHa";
  4.         EncryptedPlayerPrefs.keys[2]="frA5rAS3";
  5.         EncryptedPlayerPrefs.keys[3]="tHat2epr";
  6.         EncryptedPlayerPrefs.keys[4]="jaw3eDAs"

 

EncryptedPlayerPrefs.cs의 private key 값도 적당히 바꿉니다.


그리고 사용하실 때는 EncryptedPlayerPrefs.SetInt("someKey",value); 와 같이 PlayerPrefs와 동일하게 사용해주시면 됩니다.




출처 : http://ideapot.tistory.com/15


참조 : http://wiki.unity3d.com/index.php/MD5

반응형
Posted by blueasa
, |

유니티는 Profiler라는 기능을 지원하여 현재 사용중인 플랫폼의 어플 동작상태를 알수가있는데

폰과 연결이 되지않아 사용을 못하고있었는데 오늘 해결책을 알게되어 공유합니다.

 

1. 빌드시 Development Build 체크

2. Autoconnect Profiler 체크

 

빌드후 어플실행시 Profiler 가 실행되고, Active Profiler 에 AndroidPlayer가 보이게된다.

이때 AndroidPlayer 선택이 되지 않는다면

윈도우 커맨드창에(Console)

안드로이드SDK/platform-tools/ 폴더로 가서

 

adb forward tcp:54999 localabstract:Unity-패키지명(Product Name)

 

와 같이 입력후 다시 선택하면 됩니다.

(명령어 입력시 콘솔창에는 아무것도 어떠한 출력도 하지않고 다시 입력대기상태가됩니다.)

Profiler 를 이용하면 기기에서 어플 동작중 어떤 스크립트에서 CPU 를 얼마나 쓰다던지의 좋은 정보를 많이알수있기때문에 메모리와 퍼포먼스관련 문제를 해결하는데

큰 도움이 될꺼라 생각합니다.


* 회사메일로 공유한내용을 혹시나 도움이 되실까 올립니다 ㅎ



출처 ; http://www.gamecodi.com/board/zboard-id-GAMECODI_Talkdev-no-1919-z-2.htm 쿠하님



참조 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&page=1&sn1&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=2364

반응형
Posted by blueasa
, |

링크 : AssetBundle 생성부터 패치 및 적용까지. 0 - 관련 링크들 정리


링크 : AssetBundle 생성부터 패치 및 적용까지. 1 - Build AssetBundle


링크 : AssetBundle 생성부터 패치 및 적용까지. 2 - CoRoutine 활용에서 AssetBundle Patch하기



반응형
Posted by blueasa
, |