2014년 1월 18일 토요일

[Unity] Main Camera의 내용을 UI Camera에 출력하기.



 Unity 게임을 만들 때 게임을 위한 Main Camera와 UI를 위한 Camera를 따로 두는 게 보편적이다.

그리하여 케릭터의 대화창이다 텍스트 이펙트( ex. 타격 수치 값 )등과 같이 UI Camera에 그 결과를 출력해줘야 하는 경우가 있는데 이때는 카메라 변환을 통하여 생성된 위치를 맞춰줘야 한다. 

무슨 말인고 하니 Main Camera에 비춰지는 캐릭터 대화창 및 텍스트 이펙트의 좌표를 UI Camera에 맞게 변경해줘야 한다.

방법은 아래와 같다.

 Main Camera나 UI Camera의 스크린 좌표는 같을 테니 Main Camera가 비추는 케릭터의 월드좌표(World Position)를 스크린 좌표(Screen Position)으로 변환 후에 그 스크린 좌표를 UI Camera 기준으로 비춰지는 월드좌표로 변환하면 된다.


{
Vector3 mainCamera_ScreenPos = Camera.main.WorldToScreenPoint(Character.transform.position);
Vector3 uiCamera_WorldPos = UICamera.mainCamera.ScreenToWorldPoint(mainCamera_ScreenPos );
}

2014년 1월 5일 일요일

[Unity] Facebokk SDK에 있는 MiniJson 간단한 사용법

1) CASE 1
[
{
 
 "A" : "A12345",
 "B" : "B12345"
},
{
 
 "A" : "A12345",
 "B" : "B12345"
}
]
위와 같은 json 형식을 데이터 형식으로 변경하는 방법 ( 오브젝트 = object )
참고 : 소스가 태그랑 섞여나왔습니다.
private void Parse(string json)
{
List<오브젝트> list = Json.Deserialize(json) as List<오브젝트>;

foreach(var item in list)
{
 Dictionary dic = (Dictionary)item;
 Debug.Log("Result : " + (string)dic["BLOCK_TYPE"] + " " +  (string)dic["X"] + " " + (string)dic["Y"]);
}

}
2) CASE 2
{
 
 "A" : "A12345",
 "B" : "B12345"
}
위와 같은 경우에는
Dictionary dic = Json.Deserialize(json text) as Dictionary;

string valueA = (string)dic["A"];

2014년 1월 4일 토요일

[PHP] PHP를 이용하여 DB 내용을 json format으로 받아오기

* PHP를 이용하여 DB 내용을 json format으로 받아오기.


2013년 12월 31일 화요일

[C#] Boxing과 UnBoxing

* Boxing

값 타입에서 참조타입으로의 변환을 의미한다.
Boxing 과정은 Stack 메모리에 저장되는 값들을 Heap 메모리로 옮긴다.

ex)
int stackValue = 10;
object boxedValue = stackValue;
* Unboxing

참조타입에서 값 타입으로의 변환을 의미한다.
Unboxing 과정은 Heap 메모리에 저장된 값들을 Stack 메모리로 옮긴다.

ex)
int stackValue = 10;
object boxedValue = stackValue;
int UnboxedValue = (int) boxedValue;

* 단점

- Boxing이 필요한 곳이 있으나 Performance와 메모리 사용량을 늘리기에 사용을 자제해야 한다.
- Unboxing은 NullReferenceException을 생기게 할 수도 있다.
ex)
int? stackValue = null;
object boxedValue = stackValue;
int unBoxed = (int)boxedValue;

* 사용이유

현재는 잘 사용하지 않으나 Generic 이전에는 사용하였다.
ex)
ArrayList x = new ArrayList();
x.Add(10); // Boxing
int y = (int) x[0];


2013년 12월 29일 일요일

[Programming] 싱글톤 사용 이유, 단점

* 싱글톤 사용 이유

1) 지정한 클래스 인스턴스가 절대로 한개밖에 존재하지 않는 것을 보증하고 싶을 경우 싱글톤 패턴을 사용한다.

2) 보통 객체 생성 시 new 키워드를 사용하여 객체화 한다.
객체를 생성하게 되면 그 클래스의 인스턴스는 Heap 메모리에 올라가게 되고 그 인스턴스를 가리키고 있는 변수는 Stack 메모리 영역에 생기게 된다.
이러한 작업 자체가 시간이 걸리는 일이며 한 객체를 여러번 new하게 되면 시간이 더욱 오래 걸리게 된다.

그래서 자주 사용되는 객체는 한번만 생성하고 Heap에 존재하는 이 객체를 가르키도록만 만들면 된다. 즉, 객체가 생성될 때 Heap 영역에 올라가는 시간과 메모리를 줄일 수 있다.


* 싱글톤 단점

1) 싱글톤을 사용하여 여러곳에서 효과적으로 호출할 수 있어서 편하지만 결과적으로 프로그램의 Coupling을 높이게 되어 한곳에서의 변경이 다른 부분에 영향을 미치게 될 확률이 높아지게 된다.

2) 멀티 쓰레드 응용 프로그램에서 명시적 초기화가 필요한 경우, 쓰레딩 문제를 예방하기 위해서 조치를 취해야 한다.

[Programming] 메모리 영역(code, data, stack, heap)

1) code 영역
- 코드 자체를 구성하는 메모리 영역으로 Hex파일이나 BIN파일 메모리다.
- 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.
   
2) data 영역
- 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.
     가) 초기화 된 데이터는 data 영역에 저장되고,
        나) 초기화 되지 않은 데이터는 BSS (Block Stated Symbol) 영역에 저장된다.
- 프로그램이 실행 될 때 생성되고 프로그램이 종료 되면 시스템에 반환 된다.
- 함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간만 할당되고, 그 함수가 실행 될 때 초기화 된다.
   
Q) data영역과 bss 영역을 구분 하는 이유?
   컴파일 해서 이미지를 올릴 때 초기화 되지 않은 데이터까지 올리게 되면 ROM 사이즈가 커지기 때문에 구분하지 않았을까? -> 혹시 정확히 아시는 분은 답변 부탁 드립니다. 
   
3) heap 영역
- 필요에 의해 동적으로 메모리를 할당 하고자 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부르며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
- 이 영역에 데이터를 저장 하기 위해서 C는 malloc(), C++은 new() 함수를 사용한다.
   
 4) stack 영역
프로그램이 자동으로 사용하는 임시 메모리 영역이다.
- 지역(local) 변수, 매개변수(parameter), 리턴 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
- 함수 호출 시 생성되고, 함수가 끝나면 시스템에 반환 된다.
- 스택 사이즈는 각 프로세스마다 할당 되지만 프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다.
- 명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정 한다.

출처)

[Programming] 전역변수 사용 이유, 단점

* 전역변수 사용 이유

1) 전역적으로 사용할 수 있다.

2) 함수가 종료되어도 해당 변수가 소멸되지 않고 계속해서 메모리에 저장되어 있도록, 저장된 값을 사라지지 않고 누적되게끔 할 수 있다.


* 전역변수의 단점

1) 오브젝트들은 사용 범위가 좁을수록 이용하기 쉽다. 전역변수는 반대로 사용 범위도 넓어  처음에는 쉽게 사용하게 되지만 이러한 사용이 쌓이다 보면 어떻게 사용하게 되는지 이해하기가 어려워진다.

2) 많은 곳에서 사용되다 보니 가독성과 신뢰성이 떨어지며 객체지향 프로그래밍에서의 은폐성 요소를 갖추지 못하게 된다.

3) 직간접적으로 다른 변수, 함수들과 연관성을 가지게 되므로 프로그램의 규모가 커질수록 커플링(Coupling)이 심해진다.

4) 지역변수, 전역변수의 이름이 겹치는 문제를 발생시킬 수 있다.

5) 여러 쓰레드 사용 시 전역변수 접근과 관련하여 안정성이 떨어질 수 있다.