Unity3D 에서 plyerPrefs 를 관리 할수 있게 singleTon으로 따로 묶어서 관리 하기 위해서 만들었다~!

소스는 아래 참고 입니다.~


using UnityEngine;

using System.Collections;


public class CPlayerPrefs : MonoBehaviour {


    private static CPlayerPrefs _instance;  

    public static CPlayerPrefs Instance  

{   

get  

{   

            if (_instance == null)  

_instance = new CPlayerPrefs();

                return _instance;  

        }  

    }  

 

    

    public void OnApplicationQuit()

    {

        _instance = null;

    }

 

    public int _mNoticeVal;

 

    public int mNoticeVal

    {

        get

        {

if(PlayerPrefs.HasKey("NoticeVal")) {

                 _mNoticeVal = PlayerPrefs.GetInt("NoticeVal");

else {

_mNoticeVal = 0;

}

                return _mNoticeVal;

   }

   set

        {

            _mNoticeVal = value;

            PlayerPrefs.SetInt("NoticeVal", _mNoticeVal);

        }

    }

}

Unity3D 에서 흔히 카카오 게임에서 쓰이는 시간 계산 법?.?


private System.DateTime mResetTime;

private System.DateTime mNowTime;

private System.TimeSpan mCompareTime;

    void Start () {


  

mResetTime = new System.DateTime(2013,7,23,0,0,0);

   }


    void Update ()

    {

   mNowTime   = System.DateTime.Now;

mCompareTime = (mResetTime - mNowTime);

Debug.Log(mCompareTime.Seconds);

Debug.Log(mCompareTime.Days+"일"+mCompareTime.Hours+":"+mCompareTime.Minutes+":"+mCompareTime.Seconds);


    }  



서버에서 리셋 시간을 가져 와서 사용 하면 될듯 합니다.~!~!


^^ 더 좋은 방법 있으면 댓글 부탁드려요~~~~

Unity3D를 하면서 2D게임을 만들려고 하면 거의 NGUI를 사용 하게 된다. 사용을 안하더라도 들어는 봤을 것이다. 


이 NGUI에서 ScrollView 또한 지원 해준다 ..


Atlas 에서 UISprite 와 UILabel UIButton을 Panel에 add 하면 정상적으로 작동은 한다 .그런데 


외부 이미지를 가져 와서 빈 cube 오브젝트를 생성 한후 add 하면 clipping 이 정상적으로 되지 않는 것을 알수 있다. 


그래서 보통 이미지를 곧바로 


동적 으로 Texture를 해줄때..


 string nameShader = "Unlit/Transparent";

Texture bumpMap = Resources.LoadAssetAtPath("Assets/Resources/pet_1.png",typeof(Texture)) as Texture;

MeshRenderer render  = clip.FindChild("mcThumb").gameObject.GetComponent<MeshRenderer>();

render.material.shader = Shader.Find (nameShader);

// npcMaterial.SetTexture("pet_1.png",bumpMap);

clip.FindChild("mcThumb").gameObject.renderer.material.SetTexture("_MainTex",bumpMap);

clip.FindChild("mcThumb").transform.localScale = new Vector3(bumpMap.width,bumpMap.height,0);


보통 이렇게 texture를 씌워 준다 다른 방법이 있으면 가르쳐 주세요 ㅜㅜ

근데 이런씩으로 texture를 하여 add 하면 clipping이 작동 하지 않아서 새로운 방법을 찾게 된다. 


찾다 보니 NGUI도 UITexture class가 있어서 이 class를 사용 하면 된다. ~


Texture bumpMap = Resources.LoadAssetAtPath("Assets/Resources/pet_1.png",typeof(Texture)) as Texture;

UITexture ut = NGUITools.AddWidget<UITexture>(clip.FindChild("mcThumb").gameObject);

ut.material = new Material(Shader.Find("Unlit/Transparent Colored"));

ut.material.mainTexture = bumpMap;

Transform temp = clip.FindChild("mcThumb").FindChild("Texture").transform;

// temp.localRotation = new Quaternion(0,0,180,0);

temp.localPosition = new Vector3(0,10,-5.5f);

temp.localScale = new Vector3(bumpMap.width,bumpMap.height,0);

ut.MakePixelPerfect();


흠.... 상당히 이미지 한장 부여 하는 데도 많이 들어 간다 ~!~!~!~!~!

위 방식으로 적용 하면... 잘된다. 


그런데 여기서 


 "Unlit/Transparent";

"Unlit/Transparent Colored"

의 차이점을 아시는분 ~~~~ ?.?

댓글 부탁드립니다.~







/* 각 축별 각을 이용해 회전을 하는 함수 */

 

Rotate( Vector3 오일러각, Space.Self ); 

 

Rotate( Vector3, float 각도, Space Self );

 

Rotate( float X각, float Y각, float Z각, Space.Self ); 

 

 

 

 

/* 특정 점을 기준으로 축을 잡아 회전하는 메소드 */

 

RotateAround( Vector3 원점, Vector3 축, flaot 각도 );

 

 

 

 

/* Quaternion */

 

Quaternion.Lookrotation( Vector3 방향 ); // 해당 방향으로 쿼터니언 생성

 

Quaternion.Angle( Quaternion rotation, Quaternion rotation ); // 두 쿼터니언간의 각도 (flaot)

 

Quaternion.Euler( Vector3 오일러각 ); // 오일러각에 해당하는 쿼터니언 생성

 

Quaternion.Slerp( Quaternion from, Quaternion to, float time ); // to에서 from으로 시간에 따른 변화값

 

Quaternion.FromToRotation( Vector3 from, Vector3 to ); // to에서 from으로의 쿼터니언

 

Quaternion.Identity( ); // 회전 없음

 

 

 

 

/* Quaternion 활용 */

 

1. 특정 벡터에서 쿼터니언 얻어오기

 

Quaternion rotValue = Quaternion.LookRotation( target.position );

 

rotValue를 rotation객체에 넣으면 자동으로 해당 방향으로 회전처리한다

 

 

 

 

2. 특정 x,y,z각으로 회전

 

transform.rotation = Quaternion.Euler( X, Y, Z );

 

해당 각으로 회전한다. 오일러 회전처럼 축이 변화하지 않으므로, 동일한 값은 Update루틴에 넣어도 동일한 회전으로 유지된다. (오일러 회전은 계속 변한다)

 

 

 

 

3. 특정 지점을 원점으로 회전

 

float distance = Vector3.Distance( A, B ); // 기준점과의 거리 저장

 

Quaternion quat = Quaternion.Euler( new Vector3( 30, 0, 0 ); // X축을 기준으로 30도 회전

 

transform.rotation = quat; // 해당 쿼터니언을 rotation으로 지정

 

transform.position = Vector3 (기준점);

 

transform.position -= quat * Vector3.forward * distance; // 포워드벡터를 quat으로 회전시키고, 해당 축을 기준으로 distance만큼 뒤로 이동

 

transform.LookAt( Vector3 (기준점) ); // 이동처리 후 기준점을 바라본다

 

 

 

 

 

/* 캐릭터를 따라다니는 스무스 카메라 */

 

이 소스는 rotation 변수에 넣어 변환 파이프라인을 타지않고, 직접 포지션을 변경

 

타겟을 따라다니는 카메라는 타겟을 원점으로 Y축을 잡는다

 

카메라는 해당 Y축을 주변으로 회전하면 된다

 

 

public Transform target; // 따라다닐 타겟

 

// 카메라의 고정값 설정

public float distance = 10.0f;

 

public float height = 5.0f;

 

// 변경시 변위

float heightDamping = 2.0f;

 

float rotationDamping = 3.0f;

 

 

// 모든 업데이트 이후 호출

void LateUpdate( )

{

    // 현재 카메라의 Y축 앵글과 높이

    float currentAngle = transform.eulerAngles.y;

    float currentHeight = transform.position.y;

 

    // 타겟의 앵글과 높이

    float targetAngleY = target.eulerAngles.y;

    float targetHeight = target.position.y + height;

 

    // 원하는 앵글을 시간변위에 따라 현재 앵글값 얻음

    currentAngleY = Mathf.LerpAngle( currentAngleY, targetAngleY, rotationDamping * Time.deltaTime );

 

    // 높이도 똑같이

    currentHeight = Mathf.Lerp( currentHeight, targetHeight, heightDamping * Time.deltaTime );

 

    // 이동할 앵글을 회전으로 변환

    Quaternion newRotation = Quaternion.Euler( 0, currentAngleY, 0 );

 

    // 카메라의 포지션 이동

    Vector3 newPosition = transform.position;

 

    newPosition.position = target.position;

 

    newPosition.position -= newRotation * Vector3.forward * distance;

 

    // 높이 설정

    newPosition.y = currentHeight;

 

    // 최종 이동

    transform.position = newPosition;

 

    // 타겟을 바라보게 설정

    transform.LookAt( target );

 

}


 [출처] Rotate/Quaternion|작성자 라파공

[출처] Rotate/Quaternion|작성자 라파공



참고)iOS 디버그 & 최적화 기법

1.alloc,new,copy로 시작하지 않는 메시지는 생성된 오브젝트는 자동으로 해제 된다.

2.만약 그런 오브젝트 중에 자동으로 해제되면 곤란한 경우에는 retain을 호출한다.

3.alloc,new,copy로 시작하는 메시지로 생성된 오브젝트를 자동으로 해제하고 싶을땐,autorelease 메시지를 보낸다.

4.retain,release는 레퍼런스 카운트를 즉석에서 증감 시키지만, autorelease는 지연하면서 레퍼런스 카운트를 감소 시킨다.


 


1. Empty Application 으로 프로젝트를 생성 한다.
2.New - File 해서 User Interface - Empty 를 한다.
3.Device Family - iPhone 로 변경하여 프로젝트를 생성 한다.
4.MainWindow.xib 를 선택 한후 Object 를 하나 추가 한다. Object의 Class명을 Delegate의 최상의 클   래스 명으로 바꾼다.
5.File's Owner 의 Class명을 UIApplication으로 변경 한다.
6.Window View를 하나 새로 Object 밑에 하나 추가 한다.
7.Delegate.h 파일에 UIWindow *window -> IBOutlet UIWindow *window 로 변경한다.
8.File's Owner 를 App Delegate 에  Outlets로 연결 한다.
9.App Delegate에서 Outlets를 Window 를 Window에 연결 한다.
10.Delegate 의 m파일에서 (BOOL)application 메서드에서 [self.window makeKeyAndVisible]; 와               return YES;를 제외한 나머지 소스를         주석처리 한다. 

11.Target 프로젝트의 Main Interface를 MainWindow로 변경 한다  

a = a + b;
b = a - b;
a = a - b;



-----------------------   속도 더 바르게 ---------------------
a = a ^ b;
b = a ^ b;
a = a ^ b;

---------------------- 이상입니다..!!!

1.NSString형을 int형으로 변경 하는 방법.

NSString *str = @"7";

int i = [str intValue];

NSLog(@"i = %d",i);


2.int형을 NSString형으로 변경 하는 방법.

int i = 7;

NSString *str = [NSString stringWithFormat:@"%d",i];


이상입니다. ^^



-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
 {
UIMenuController *menuController = [UIMenuController sharedMenuController];
if (menuController) {
[UIMenuController sharedMenuController].menuVisible = NO;
}
return NO;
}

그냥 이거 붙여 넣으면 됩니다. ^^

피드백은 리플로 받겠습니다.~!~! ^^

또한 텍스트 필드를 비번 입력 하듯이 안보이게 설정 하는 방법
[textPassword setSecureTextEntry:YES];

이렇게 설정 해주면 됩니다. ^^ 여기서 textPassword 는 텍스트 필드명입니다.~! 사용자 마다 틀리겠죠? ^^

로그인 view를 만드는 프로젝트를 하는 중에 E-mail 텍스트 필드나 유져 아이디를 입력 받는 텍스트 필드는

영어만 들어 가야 하는 조건이 많이 있습니다.

따라서 그 텍스트 필드의 값 NSString를 ASCII로 변환 하여 사용 하는 법이 편할것 같습니다.

변환 하는 법은

for(int i = 0 ; i < [[temp text] lenght] ; i++)
{
      int c = [[temp text] characterAtIndex:i];

    NSLog(@" char %d = %d",i,c);

}

이렇게 하여 각 특수 문자의 아스키 코드값을 확인 해도 되고 NSString의 길이 만큼 쪼개서 아스키 코드값을 볼수 있게 됩니다.

여기서 temp는 텍스트 필드 명입니다. ^^

참고)  @   = 64
           .     = 46

이 되겠습니다. E-mail 만들시에 @가 들어가 있지 않으면 팝업창을 띄어 주기 위해서 이 부분을 이용해도 될것 같네요 ^^

이상입니다.~!~!

+ Recent posts