Wednesday, July 16, 2014

keytool을 이용해 해쉬값 얻기

페이스북에 앱을 등록하기 위해서 앱의 hash값을 설정해야 하는데 이 값을 얻는 방법.

우선 키를 가지고 있다고 가정하고 이것을 nimblesix_key라고 하자.

커맨드 라인에서

keytool -exportcert -alias <별명> -keystore <키 파일> | openssl sha1 -binary | openssl base64

를 타이핑 하면 비밀번호를 묻는다. 해당 키의 비밀번호를 제대로 입력했다면 base64로 표현된 해쉬값을 얻는다.

하나의 키 파일은 하나 이상의 별명을 가질 수 있다. < >안에 그 내용을 타이핑 하면 된다. 예를 들어 별명이 flurryplanet, 키 파일이 nimblesix_key라고 한다면

keytool -exportcert -alias flurryplanet -keystore nimblesix_key | openssl sha1 -binary | openssl base64를 타이핑 하면 된다. 이 때 윈도우즈 시스템에는 openssl이 없을 수도 있는데 이때는 다음 사이트에서 프로그램을 다운로드 받고 커맨드 라인에서 사용하기 위해 환경변수를 등록해 주어야 한다.

다운로드 : http://slproweb.com/products/Win32OpenSSL.html

Saturday, February 1, 2014

Unity에서 빌보드 설정하기

Lookat 함수를 이용하는 방법도 있지만 전통적인 방법으로 행렬을 설정하고 그 행렬로 Transform을 변경하는 방법으로 빌보드를 구현해 보았다.


using UnityEngine;
using System.Collections;

public class billboard : MonoBehaviour {

// Use this for initialization
void Start () {

}

public static void TransformFromMatrix(Matrix4x4 matrix, Transform trans) {
trans.rotation = Quaternion.Inverse(QuaternionFromMatrix(matrix));
trans.position = matrix.GetColumn(3); // uses implicit conversion from Vector4 to Vector3
}

public static Quaternion QuaternionFromMatrix(Matrix4x4 m) {
// Adapted from: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
Quaternion q = new Quaternion();
q.w = Mathf.Sqrt( Mathf.Max( 0, 1 + m[0,0] + m[1,1] + m[2,2] ) ) / 2;
q.x = Mathf.Sqrt( Mathf.Max( 0, 1 + m[0,0] - m[1,1] - m[2,2] ) ) / 2;
q.y = Mathf.Sqrt( Mathf.Max( 0, 1 - m[0,0] + m[1,1] - m[2,2] ) ) / 2;
q.z = Mathf.Sqrt( Mathf.Max( 0, 1 - m[0,0] - m[1,1] + m[2,2] ) ) / 2;
q.x *= Mathf.Sign( q.x * ( m[2,1] - m[1,2] ) );
q.y *= Mathf.Sign( q.y * ( m[0,2] - m[2,0] ) );
q.z *= Mathf.Sign( q.z * ( m[1,0] - m[0,1] ) );
return q;
}

// Update is called once per frame
void Update ()
{

Vector3 origin = transform.position;
Vector3 cameraPos = Camera.main.transform.position;

Vector3 w = cameraPos - origin;
w = w.normalized;

Vector3 u = Vector3.Cross (Vector3.up, w);
u = u.normalized;

Vector3 v = Vector3.Cross (w, u);

Matrix4x4 mat = new Matrix4x4 ();
/*mat.m00 = 1;
mat.m01 = 0;
mat.m02 = 0;
mat.m03 = 0;

mat.m10 = 0;
mat.m11 = 1;
mat.m12 = 0;
mat.m13 = 0;

mat.m20 = 0;
mat.m21 = 0;
mat.m22 = 1;
mat.m23 = 0;*/

mat.m00 = u.x;
mat.m01 = u.y;
mat.m02 = u.z;
mat.m03 = 0;

mat.m10 = v.x;
mat.m11 = v.y;
mat.m12 = v.z;
mat.m13 = 0;

mat.m20 = w.x;
mat.m21 = w.y;
mat.m22 = w.z;
mat.m23 = 0;

mat.m30 = origin.x;
mat.m31 = origin.y;
mat.m32 = origin.z;
mat.m33 = 1;

TransformFromMatrix (mat, gameObject.transform);
}
}

Monday, December 2, 2013

Parser에서 신택스 트리를 반드시 작성해야 하는가?

Some parsers put out syntax trees as an intermediate data structure, rather than atom strings.

강제는 아님. 나는 꼭 만들어야 하는 줄 알았는데... 태균이 말이 맞았다.

Wednesday, November 13, 2013

NGUI의 UICenterOnChild 동작 원리

재밌는 방식으로 구성되어 있어 문서로 정리해 본다.

UICenterOnChild는 스크립트 콤포넌트로 추가되면 Draggable Object들을 화면 가운데로 정렬 하는데 이 정렬을 위해서 드래그가 끝났을 때 코드가 실행된다. UIDraggablePanel의 소스를 살펴 보면 UICenterOnChild와 연결된 부분은 전혀 없고

public OnDragFinished onDragFinished;

델리게이트 함수만 호출한다. 그런데 재밌는 점은 코드 어디에도 onDragFinished를 설정하는 부분이 없다는 점이다. 보통은 호출자에서 호출되는 부분의 함수를 연결하는데 NGUI는 그렇게 하지 않았다.

아무튼 onDragFinished가 연결되어 있다면 (null이 아니라면) 함수를 호출한다. 이는 다음과 같이 연결된다.

UICenterOnChild가 처음에 실행되면 OnEnable()가 호출되는데 여기서 Recenter()를 호출한다. Recenter는 OnDragFinished()가 호출될 때도 호출이 되는데 델리게이트를 연결하는 부분과 실제로 Center에 오브젝트를 정렬하는 기능 2개가 하나에 들어가 있다. (그래서 헷갈린다. 좋은 설계는 아니다.)

Recenter의 내부에 다음과 같은 코드가 있다.

---
if (mDrag == null)
{
mDrag = NGUITools.FindInParents<UIDraggablePanel>(gameObject);

if (mDrag == null)
{
Debug.LogWarning(GetType() + " requires " + typeof(UIDraggablePanel) + " on a parent object in order to work", this);
enabled = false;
return;
}
else
{
mDrag.onDragFinished = OnDragFinished;

if (mDrag.horizontalScrollBar != null)
mDrag.horizontalScrollBar.onDragFinished = OnDragFinished;

if (mDrag.verticalScrollBar != null)
mDrag.verticalScrollBar.onDragFinished = OnDragFinished;
}
}
if (mDrag.panel == null) return;

---

이 부분이 델리게이트를 연결하는 부분이ㅐ다. NGUITools의 FindINParents함수를 호출해서 현재 gameobject의 부모에 오브젝트를 가지고 온다. (그것은 UIDraggablePanel이 된다.)

그리고 mDrag의 onDragFinished에 현재 UICenterOnChild의 OnDragFinished 델리게이트를 연결한다. 이렇게 함으로써 UIDraggablePanel에서 드래그가 끝났을 때 UICenterOnChild의 OnDragFinished를 호출하고 여기서 오브젝트를 가운데로 정렬하는 로직이 실행된다.


끝.

Wednesday, October 23, 2013

프로젝트 아나키 NDK설정

프로젝트 아나키는 하복(Havok)에서 공개한 게임 엔진이며 안드로이드 예제를 실행하려는데 자꾸 NDK 설정 오류가 났다. NDK경로도 제대로 설정하고 Android SDK의 경로도 제대로 설정했는데 자꾸 오류가 나서 알아보니... x86용 NDK만 지원한단다...;

아직 64비트 버전은 돌아가지 않으므로 NDK를 다운로드 받을 때 x86용으로 받고 예제를 컴파일하면 실행 될 것이다.


Task in UnrealEngine

 https://www.youtube.com/watch?v=1lBadANnJaw