니티로 실시간 네트워크 게임을 혼자서 만드는 중인데..
다음과 같이 데이터를 서로 주고 받습니다..
//구조체를 바이트배열로 만듬
public static byte[] StructToByteArray(this object obj)
{
int datasize = Marshal.SizeOf(obj);
IntPtr buff = Marshal.AllocHGlobal(datasize);
Marshal.StructureToPtr(obj, buff, false);
byte[] byte[datasize];
Marshal.Copy(buff, data, 0, datasize);
Marshal.FreeHGlobal(buff);
return data;
}
//바이트배열을 구조체로 만듬
public static T ByteToStructure<T>(byte[] data)
{
IntPtr buff = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, buff, data.Length);
object obj = Marshal.PtrToStructure(buff, typeof(T));
Marshal.FreeHGlobal(buff);
return (T)obj;
}
다음과 같이 데이트를 바이트로 넘기는데..문제는 struct의 구조체 속성정의가 생각보다 쉽지는 않네요..
길이가 명확한 데이터는 만들기 쉬운데..그렇지 않은 경우 어떻게 하는지 궁금합니다..테스트 환경이 별로 좋지 못해서..계속 빌드하려니 깊은 빡침을 느껴서 아는분 쫌 알려주세요..
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CreateGameObjectFromResource
{
public byte func; //호출되는 함수
public int objectID; //오브젝트 ID
public Vector3 position; //생성 포지션
//여유있게 40으로 잡음
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
public string path; //리소스 경로
public Peer peer;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ChattingMessage
{
public byte func;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string message;
}
위와 같이 구조체를 만들어서 잘쓰고 있습니다.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct StringArrayTest
{
public byte func;
public string[] stringData;
}
문제는 위와 같이 stringarray데이터를 주고 받고 싶은데..어떻게 써야될지 모르겠네요..
Marshal은 유니티 커뮤니티보다 이쪽이 더 쓰시느 분이 많을거같아서 질문드립니다.
아 감사합니다..
근데 제가 궁금한거는 ByValArray로 잡아줬을 경우 int형이기 대문에 길이가 명확하지만..그렇지 않은 경우 처리할수 있는 방법이 있는지 궁금한겁니다...