여기서 다룰 것은 , Editor와 같은 커스터마이징이 아닌, 플레이어의 색상을 커스터마이징 하는 방법을 다뤄보겠다.
게임을 하다 보면, 플레이어는 자유롭게 갑옷의 색상을 정할 수 있는 게임이 존재하는데, 이러한 기능을 구현한다고 생각하면 된다.
그런데 이러한 기능을 구현하기 위해서는 먼저 Serialize에 대해 공부해야 한다.
Unity의 Inspector창에는 Transform의 position을 지정할 수 있고, rotation도 지정할 수 있으며, 그 외의 다른 컴포넌트를 붙였을 때는 그 컴포넌트들의 속성을 고칠 수 있게 된다. 그러나 이러한 기능들은 모두 MONOBEHAVIOR를 직접적으로 상속 받은 클래스에서만 가능한 얘기이다.
그 말은 즉,
1 2 3 4 | public class MonoDerivedClass : MonoBehaviour{ public string name; public float kkk; } |
반면 다음과 같은 스크립트를 부착시켰을 때는 위와 다른 결과를 얻게 될 것이다.
1 2 3 4 5 6 7 8 | public class MonoDerivedClass : MonoBehaviour{ public ClassINeed INeed; } public class ClassINeed{ public string name; public float kkk; } |
자체적인 클래스(Monobehavior를 상속 받지 않는)를 제작하지 않는다면 이러한 문제는 아무런 문제가 없을테지만... 우리는 가끔 자체적인 클래스를 적지 않는가..
여튼 이러한 문제를 해결해주는 것이 Serialize라는 것이다.
먼저 해결책을 보자면 다음과 같다.
using
UnityEngine;
using
System;
using
System.Collections;
using
System.IO;
using
System.Runtime.Serialization;
using
System.Runtime.Serialization.Formatters.Binary;
using
System.Text;
using
System.Reflection;
public
class
MonoDerivedClass : MonoBehaviour{
public
ClassINeed INeed;
}
[System.Serializable]
public
class
ClassINeed : ISerializable{
public
string
name;
public
float
kkk;
public
void
GetObjectData(SerializationInfo info, StreamingContext ctxt){
info.AddValue(
"MyName"
,name);
info.AddValue(
"MyFloat"
,kkk);
}
}
위의 using문들은 나중에 데이터를 저장/로드 하기 위해 필요한 것들을 모두 적어놓은 것이다.
창에 보여주기 위해서는 꼭 GetObjectData를 Overriding해 줘야 된다.
//Overriding이란 부모에 존재하는 함수를 자식함수에서 다시 구현한다는 것입니다.
//Overriding이란 부모에 존재하는 함수를 자식함수에서 다시 구현한다는 것입니다.
GetObjectData는 ISerializable에 존재하는 함수고, 그 안에서 SerializationInfo.AddValue를 통해 내가 정의한 변수들을 Inspector 창에서 보여지도록 할 수 있다.
Unity 공식 홈페이지에서도 자료를 찾아볼 수 없으니까 일단 추측글을 한번 써보도록하자.
Unity 내부적으로 MonoBehavior를 상속받은 클래스들을 판단을 해서 자동적으로 Serialization이 되어 Inspector창에 보이는 것이고, 그 외의 클래스들은 멤버 변수들을 수동으로 serialize를 시켜 줘야 inspector창에 보이게 되는 것이다.
즉, MonoBehavior는 SerializationInfo를 가지고 있고 Inspector는 그 SerializtionInfo를 바탕으로 정보를 표시하는 것이다
따라서 AddValue로 SerializationInfo를 추가해줌으로써 내가 원하는 정보들도 Inspector 창에 띄울 수 있다는 결과를 얻게 된다고 본다.
여튼.. Serialize는 원래 직렬화라는 용어로 변수들을 binary로 변환시켜 저장하거나, 로드할 때 필요한 것이라고 보면 된다.
'[Unity3D]' 카테고리의 다른 글
BMFONT 이용하여 직접 제작한 font 사용하기 (1) | 2012.05.08 |
---|---|
커스터마이징 기능 구현하기 2. 데이터의 저장. (0) | 2012.05.03 |
앵그리버드 만들기 1탄. (0) | 2012.04.03 |
[Unity] Network 정리 (2) | 2012.03.25 |
[Unity] 정리들 (0) | 2012.03.25 |