이 방법은 생각보다 많이 까다로울 수 있기때문에 오브젝트가 갖는 값을 유추해 볼 수 있는 클래스를 새로 생성한 후 이 클래스의 값을 저장하는 방법을 사용합니다.
예를 들어, RPC 호출을 통해서 여러개의 AnimationStates를 전달하고자 할때, AnimationStates를 대신할 수 있는 클래스를 만들고 이 값을 전달하는 것이죠.
아래의 예제는 어떤 클래스라도 문자열로 변환할 수 있게 해주는 방법을 보여줍니다.
이것을 이용해서 모든 파라미터 값을 RPC를 통해 보낼 수 있습니다.
============================================================================== using UnityEngine; using System.Collections; using System.Collections.Generic; // 리스트를 쓰기 위해 추가합니다. // BinaryFormatter를 사용하기 위해서는 반드시 아래의 네임스페이스를 추가해줘야 해요. using System; using System.Runtime.Serialization.Formatters.Binary; using System.IO; public class csTest : MonoBehaviour { // 이렇게 클래스를 만들고 [Serializable] // 저장하기 위해서 있어야 합니다. public class ScoreEntry { public string name; public int score; } // 만든 클래스를 리스트에 담아서 관리하면 마치 테이블처럼 사용할 수 있습니다. public List<ScoreEntry> highScore = new List<ScoreEntry>(); [RPC] void ReceiveHighScores(byte[] highScores) { var binaryFormatter = new BinaryFormatter(); var memoryStream = new MemoryStream(highScores); // 받은 데이터를 바이트 배열로 변환합니다. var otherPlayerScores = (List<ScoreEntry>)binaryFormatter.Deserialize(memoryStream); } void UpdateScores(byte[] highScores) { var binaryFormatter = new BinaryFormatter(); var memoryStream = new MemoryStream(); // highScores를 바이트 배열로 변환해서 저장합니다. binaryFormatter.Serialize(memoryStream, highScores); // 그리고 다른 유저에게 전달해주는거죠. networkView.RPC("ReceiveHighScores", RPCMode.Others, memoryStream.GetBuffer()); } } ==============================================================================RPC 역시 바이트 배열을 보낼 수 있습니다.
이 값은 BinaryFormatter를 이용해서 우리가 원하는 값으로 바로 변환할 수 있도록 도와줍니다.
문자열로부터 변환하는 시간을 줄일 수 있어서 더 좋다고 할 수 있습니다.
웹으로 전달할때는 WWWForm을 이용합니다.
또는 Convert.ToBase64String()을 이용해서 할 수도 있습니다.
사용하는 서버에 따라 적절하게 하면 될 것 같네요.
파일로 저장하는 법은 Application.persistentDataPath를 이용해서 하되, MemoryStream 대신 FileStream을 사용하면 됩니다.
============================================================================== using UnityEngine; using System.Collections; using System.Collections.Generic; // 리스트를 쓰기 위해 추가합니다. // BinaryFormatter를 사용하기 위해서는 반드시 아래의 네임스페이스를 추가해줘야 해요. using System; using System.Runtime.Serialization.Formatters.Binary; using System.IO; public class csTest : MonoBehaviour { // 이렇게 클래스를 만들고 [Serializable] // 저장하기 위해서 있어야 합니다. public class ScoreEntry { public string name; public int score; } // 만든 클래스를 리스트에 담아서 관리하면 마치 테이블처럼 사용할 수 있습니다. public List<ScoreEntry> highScore = new List<ScoreEntry>(); void SaveScores() { var binaryFomatter = new BinaryFormatter(); // 저장할 파일의 위치를 정해주고 만들어줍시다. var fileStream = File.Create(Application.persistentDataPath + "/highScores.dat"); binaryFomatter.Serialize(fileStream, highScore); // 작업이 끝나면 닫아주는 것을 잊지 마세요 fileStream.Close(); } void Start() { // 시작할때 저장한 파일을 불러옵니다. // 데이터가 비어있지 않다면 if (File.Exists(Application.persistentDataPath + "/highScores.dat")) { var binaryFormatter = new BinaryFormatter(); // 불러올 파일 경로와 이름이 틀리지 않도록 주의하시구요. var fileStream = File.Open(Application.persistentDataPath + "/highScores.dat", FileMode.Open); highScore = (List<ScoreEntry>)binaryFormatter.Deserialize(fileStream); // 작업이 끝나면 닫아주는 것을 잊지 마세요 fileStream.Close(); } } } ==============================================================================
댓글 없음:
댓글 쓰기