카카오의 친구 정보를 받아서 Unity3D로 값을 넘겨 줄때 Json 으로 변환 하여 NSString 을 넘겨 주는 방식으로 하다 보니 


malloc error이 발생 하였다... 


해결 방법은


char *MakeStringCopy(const char* string) {

    if (string == NULL)

        return NULL;

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

    strcpy (res, string);

    return res;

}


extern "C" {

    const char *_GetFriendInfoList() {

        

        

        NSString *JSONString = @"";

        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[[DataManager manager] friendList]

                                                           options:0

                                                             error:nil];

        if (!jsonData) {

            NSLog(@"Error");

        } else {

            

            JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];

            NSLog(@"JSONString = %@",JSONString);

            return MakeStringCopy([JSONString UTF8String]);

        }

        

        return MakeStringCopy([JSONString UTF8String]);

        

    }

    float getTest() {

    return 0.5f;

    }

}



ngui 사용시 위와 같은 이미지 자른 후에 1~2픽셀의 공간이 생기는 현상이 있습니다. 

흔히 모든 해상도에 대응을 하게 되면 생기는 현상 같기도 하구요..


이 문제점을 해결 하는 방법은 ngui 의 Atlas 텍스쳐의 Filter Mode를 Point로 변경 하면 해결 됩니다. ㅜㅜ


너무 힘들었네요 이 부분 찾느라 ~ 


그럼 즐 코딩 하세요~


IEnumerator fImageDownCheck() {


WWW www = new WWW(_url);

yield return www;


if(www.size == 0) {

mImage = true;

StopCoroutine("fImageDownCheck");

else {

noticeManager.fNoticeTextureMake(www.texture);

Debug.Log("Image Save");

// Texture2D savedTexture = _materialToSave.mainTexture as Texture2D;

       Texture2D newTexture = new Texture2D(www.texture.width, www.texture.height, TextureFormat.ARGB32, false);

 

             newTexture.SetPixels(0,0, www.texture.width, www.texture.height, www.texture.GetPixels());

       newTexture.Apply();

             byte[] bytes = newTexture.EncodeToPNG();

Debug.Log(bytes);

            File.WriteAllBytes(Application.temporaryCachePath+"/"+"test.png", bytes);

}

}


Application.temporaryCachePath 폴더 : /var/folders/dy/********************/T/DefaultCompany/ProjectName

에 저장 됩니다. 



아래의 extable 은 각 고유 키를 넣어 주면 됩니다. ^^



byte[] extable = {0x1D, 0x1D, 0x1B, 0x3F} ;

byte[] _changeBuf = {0,0,0,0} ;


void Start() {

Debug.Log(intToXOR(1000));

int kTemp = intToXOR(1000);

Debug.Log(xorToINT(kTemp));

Debug.Log(intToXOR(10000));

kTemp = intToXOR(10000);

Debug.Log(xorToINT(kTemp));

}

private void IntToByte(int num, byte[] value)

{

    value[0] = (byte)((num >> 24) ^ extable[0]);

    value[1] = (byte)((num >> 16) ^ extable[1]);

    value[2] = (byte)((num >> 8) ^ extable[2]);

    value[3] = (byte)(num ^ extable[3]);

}

private int ByteToIntNon(byte[] value)

{

    int retV = 0;

    

    retV = (((value[0] & 0xFF)) << 24) |

    (((value[1] & 0xFF)) << 16) |

    (((value[2] & 0xFF)) << 8) |

    ((value[3] & 0xFF));

    

    return retV;

}

private void IntToByteNon(int num, byte[] value)

{

   value[0] = ((byte)(num >> 24));

    value[1] = ((byte)(num >> 16));

    value[2] = ((byte)(num >> 8));

    value[3] = ((byte)(num));

}

private int ByteToInt(byte[] value)

{

    int retV = 0;

    

    retV = (((value[0] & 0xFF) ^ extable[0]) << 24) |

    (((value[1] & 0xFF) ^ extable[1]) << 16) |

    (((value[2] & 0xFF) ^ extable[2]) << 8) |

    ((value[3] & 0xFF) ^ extable[3]);

    

    return retV;

}

public int intToXOR(int _value) {

IntToByte(_value,_changeBuf);

return ByteToIntNon(_changeBuf);

}

public int xorToINT(int _value) {

    IntToByteNon(_value,_changeBuf);

return ByteToInt(_changeBuf);

}

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|작성자 라파공


+ Recent posts