GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

여기서 다룰 것은 , Editor와 같은 커스터마이징이 아닌, 플레이어의 색상을 커스터마이징 하는 방법을 다뤄보겠다. 

게임을 하다 보면, 플레이어는 자유롭게 갑옷의 색상을 정할 수 있는 게임이 존재하는데, 이러한 기능을 구현한다고 생각하면 된다.

그런데 이러한 기능을 구현하기 위해서는 먼저 Serialize에 대해 공부해야 한다.

Unity의 Inspector창에는 Transform의 position을 지정할 수 있고, rotation도 지정할 수 있으며, 그 외의 다른 컴포넌트를 붙였을 때는 그 컴포넌트들의 속성을 고칠 수 있게 된다. 그러나 이러한 기능들은 모두 MONOBEHAVIOR를 직접적으로 상속 받은 클래스에서만 가능한 얘기이다.

그 말은 즉,

1
2
3
4
public class MonoDerivedClass : MonoBehaviour{
    public string name;
    public float kkk;
}
위의 스크립트를 작성하고, 게임 오브젝트에 부착시켰을 때 name과 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;
}
그대로 적은 뒤에 게임 오브젝트에 장착시켰다면 위와는 다르게 name과 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이란 부모에 존재하는 함수를 자식함수에서 다시 구현한다는 것입니다.
GetObjectData는 ISerializable에 존재하는 함수고, 그 안에서 SerializationInfo.AddValue를 통해 내가 정의한 변수들을 Inspector 창에서 보여지도록 할 수 있다.
Unity 공식 홈페이지에서도 자료를 찾아볼 수 없으니까 일단 추측글을 한번 써보도록하자.
Unity 내부적으로 MonoBehavior를 상속받은 클래스들을 판단을 해서 자동적으로 Serialization이 되어 Inspector창에 보이는 것이고, 그 외의 클래스들은 멤버 변수들을 수동으로 serialize를 시켜 줘야 inspector창에 보이게 되는 것이다.

즉, MonoBehavior는 SerializationInfo를 가지고 있고 Inspector는 그 SerializtionInfo를 바탕으로 정보를 표시하는 것이다
따라서 AddValue로 SerializationInfo를 추가해줌으로써 내가 원하는 정보들도 Inspector 창에 띄울 수 있다는 결과를 얻게 된다고 본다.

여튼.. Serialize는 원래 직렬화라는 용어로 변수들을 binary로 변환시켜 저장하거나, 로드할 때 필요한 것이라고 보면 된다. 

AND

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ARCHIVE