如何从Unity3D的预制文件中读取数据?

时间:2016-05-19 11:30:34

标签: c# file unity3d stream binary

所以,我正在尝试为在线Unity游戏创建一个测试应用程序,但为了做我需要它做的事情,我必须从位于.prefab文件中的十六进制偏移量中读取数据。 然后,我将从数据加载服务器端的预制件。对于来自客户端的反对撞机黑客。

我必须读取unityVer,localScale,localPosition,localSize,collider size等数据。

编辑:我必须在简单的控制台应用程序上创建它,而不是在Unity中。

我的工作代码不正确:

try {
            string[] prefabFiles = Directory.GetFiles(Path.Combine(Environment.CurrentDirectory, "data\\prefabs\\"));
            foreach (var prefab in prefabFiles) {
                if (prefab != null && prefab.Split('.')[1] == "prefab") {
                    try {
                        using (var reader = new BinaryReader(new FileStream(prefab, FileMode.Open, FileAccess.Read))) {
                            FileInfo info = new FileInfo(prefab);
                            Console.WriteLine("Analyzing File : " + info.Name);

                            reader.BaseStream.Position = 0xA;

                            //string unityVer = reader...

                            //float localPositionX = reader...
                            //float localPositionY = reader...
                            //float localPositionZ = reader...

                            //float localScaleX = reader...
                            //float localScaleY = reader...
                            //float localScaleZ = reader...

                            //float colliderRadius = reader...
                        }
                        Console.WriteLine("File parse success.");
                    } catch { Console.WriteLine("Parse error in the data file."); }
                }
            }
        } catch (Exception e_Ex) {
            Console.WriteLine(e_Ex.ToString());
        }

我的预制六角树:

HEX TREE IMAGE

我是读取和写入位于十六进制数据位置的数据的新手,所以任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

部分答案是将资产保存为YAML文本文件而不是二进制文件。该格式是人类可读的,这使得解码更容易。在项目设置下 - > 编辑,有资产序列化,应设置为强制文本。当然,所有现有资产都将被重新导入,现有的构建将不得不重新部署。

答案 1 :(得分:0)

我觉得你太努力了,或者我误解了你的观点。

如果您的项目中引用了预制件,Unity将创建它的实例,它不会在场景中显示并保留在内部。然后,当您使用Instantiate时,它将复制所有信息和数据。

这意味着你可以像在任何游戏对象上访问它一样访问预制件上的信息:

public GameObject myPrefab;

void Start(){
    Debug.Log(myPrefab.transform.position);
    Collider col = myPrefab.GetComponent<Collider>();
    // Use Collider
}