Skip to content
This repository has been archived by the owner on Jan 21, 2023. It is now read-only.

Commit

Permalink
support export MonoBehaviour
Browse files Browse the repository at this point in the history
  • Loading branch information
Perfare committed Jan 15, 2017
1 parent dcde890 commit fbfdb78
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 21 deletions.
2 changes: 1 addition & 1 deletion Unity Studio/AssetsFile.cs
Expand Up @@ -340,7 +340,7 @@ private void readBase5()
baseStrings[894] = "TypelessData";
baseStrings[907] = "UInt16";
baseStrings[928] = "UInt8";
baseStrings[934] = "unsigned int";
baseStrings[934] = "UInt";
baseStrings[981] = "vector";
baseStrings[988] = "Vector2f";
baseStrings[997] = "Vector3f";
Expand Down
2 changes: 1 addition & 1 deletion Unity Studio/EndianStream.cs
Expand Up @@ -167,7 +167,7 @@ public string ReadAlignedString(int length)
{
byte[] stringData = new byte[length];
base.Read(stringData, 0, length);
var result = System.Text.Encoding.UTF8.GetString(stringData); //must verify strange characters in PS3
var result = Encoding.UTF8.GetString(stringData); //must verify strange characters in PS3

/*string result = "";
char c;
Expand Down
5 changes: 3 additions & 2 deletions Unity Studio/Unity Classes/GameObject.cs
Expand Up @@ -16,7 +16,7 @@ public class GameObject : TreeNode
public string m_Name;
public ushort m_Tag;
public bool m_IsActive;

public string uniqueID = "0";//this way file and folder TreeNodes will be treated as FBX scene

public GameObject(AssetPreloadData preloadData)
Expand Down Expand Up @@ -56,6 +56,7 @@ public GameObject(AssetPreloadData preloadData)
m_SkinnedMeshRenderer = sourceFile.ReadPPtr();
break;
default:
a_Stream.Position -= 4;
PPtr m_Component = sourceFile.ReadPPtr();
break;
}
Expand All @@ -67,7 +68,7 @@ public GameObject(AssetPreloadData preloadData)
if (m_Name == "") { m_Name = "GameObject #" + uniqueID; }
m_Tag = a_Stream.ReadUInt16();
m_IsActive = a_Stream.ReadBoolean();

base.Text = m_Name;
preloadData.Text = m_Name;
//name should be unique
Expand Down
166 changes: 166 additions & 0 deletions Unity Studio/Unity Classes/MonoBehaviour.cs
@@ -0,0 +1,166 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Unity_Studio
{
class MonoBehaviour
{
public string serializedText;

public MonoBehaviour(AssetPreloadData preloadData, bool readSwitch)
{
var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream;
a_Stream.Position = preloadData.Offset;

var m_GameObject = sourceFile.ReadPPtr();
var m_Enabled = a_Stream.ReadByte();
a_Stream.AlignStream(4);
var m_Script = sourceFile.ReadPPtr();
var m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
if (readSwitch)
{
preloadData.extension = ".txt";
a_Stream.Position = preloadData.Offset;
ClassStrStruct classStructure;
if (sourceFile.ClassStructures.TryGetValue(preloadData.Type1, out classStructure))
{
var member = classStructure.members;
var strs = member.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
var sb = new StringBuilder();
Read(sb, strs, a_Stream);
serializedText = sb.ToString();
}
else
{
var str = "PPtr<GameObject> m_GameObject\r\n";
str += "\tint m_FileID = " + m_GameObject.m_FileID + "\r\n";
str += "\tint64 m_PathID = " + m_GameObject.m_PathID + "\r\n";
str += "UInt8 m_Enabled = " + m_Enabled + "\r\n";
str += "PPtr<MonoScript> m_Script\r\n";
str += "\tint m_FileID = " + m_Script.m_FileID + "\r\n";
str += "\tint64 m_PathID = " + m_Script.m_PathID + "\r\n";
str += "string m_Name = \"" + m_Name + "\"\r\n";
serializedText = str;
}
}
else
{
if (m_Name != "")
{
preloadData.Text = m_Name;
}
else
{
preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID;
}
preloadData.SubItems.AddRange(new string[] { preloadData.TypeString, preloadData.Size.ToString() });
}
}

private void Read(StringBuilder sb, string[] strs, EndianStream a_Stream)
{
for (int i = 0; i < strs.Length; i++)
{
var strs2 = strs[i].Split(' ');
var str = strs2[0].Split('\t');
var level = str.Length - 1;
var varTypeStr = str.Last();
var varNameStr = strs2[1];
if (varTypeStr == "int")
{
var value = a_Stream.ReadInt32();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "UInt")
{
var value = a_Stream.ReadUInt32();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "int64")
{
var value = a_Stream.ReadInt64();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "UInt16")
{
var value = a_Stream.ReadUInt16();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "SInt16")
{
var value = a_Stream.ReadInt16();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "UInt8")
{
var value = a_Stream.ReadByte();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "float")
{
var value = a_Stream.ReadSingle();
sb.AppendFormat("{0}{1} {2} = {3:f}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "bool")
{
var value = a_Stream.ReadBoolean();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
a_Stream.AlignStream(4);
}
else if (varTypeStr == "string")
{
var value = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
i += 3;//skip
}
else if (varTypeStr == "Array")
{
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
var size = a_Stream.ReadInt32();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size);
var array = ReadArray(strs, level, i);
for (int j = 0; j < size; j++)
{
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j);
Read(sb, array, a_Stream);
}
i += array.Length + 1;//skip
}
else
{
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
}
}
}

private string[] ReadArray(string[] strs, int level, int index)
{
List<string> strs3 = new List<string>();
for (int i = index + 2; i < strs.Length; i++)//skip int size
{
var strs2 = strs[i].Split(' ');
var str = strs2[0].Split('\t');
var level2 = str.Length - 1;
if (level2 <= level)
{
return strs3.ToArray();
}
else
{
strs3.Add(strs[i]);
}
}
return strs3.ToArray();
}
}
}
1 change: 0 additions & 1 deletion Unity Studio/Unity Classes/Shader.cs
Expand Up @@ -34,7 +34,6 @@ public Shader(AssetPreloadData preloadData, bool readSwitch)
if (m_Name != "") { preloadData.Text = m_Name; }
else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; }
preloadData.SubItems.AddRange(new string[] { preloadData.TypeString, preloadData.exportSize.ToString() });

}
}
else
Expand Down
1 change: 1 addition & 0 deletions Unity Studio/Unity Studio.csproj
Expand Up @@ -171,6 +171,7 @@
<Compile Include="Unity Classes\Mesh.cs" />
<Compile Include="Unity Classes\GameObject.cs" />
<Compile Include="helpers.cs" />
<Compile Include="Unity Classes\MonoBehaviour.cs" />
<Compile Include="Unity Classes\PlayerSettings.cs" />
<Compile Include="Unity Classes\RectTransform.cs" />
<Compile Include="Unity Classes\Renderer.cs" />
Expand Down
49 changes: 33 additions & 16 deletions Unity Studio/UnityStudioForm.cs
Expand Up @@ -569,6 +569,7 @@ private void enablePreview_Check(object sender, EventArgs e)
break;
case 48:
case 49:
case 114:
textPreviewBox.Visible = !textPreviewBox.Visible;
break;
case 128:
Expand Down Expand Up @@ -701,7 +702,7 @@ private void BuildAssetStrucutres()
}
case 48: //Shader
{
Shader m_TextAsset = new Shader(asset, false);
Shader m_Shader = new Shader(asset, false);
exportable = true;
break;
}
Expand All @@ -717,7 +718,13 @@ private void BuildAssetStrucutres()
exportable = true;
break;
}
//case 89: //CubeMap
case 114: //MonoBehaviour
{
var m_MonoBehaviour = new MonoBehaviour(asset, false);
if (asset.Type1 != asset.Type2 && assetsFile.ClassStructures.ContainsKey(asset.Type1))
exportable = true;
break;
}
case 128: //Font
{
unityFont m_Font = new unityFont(asset, false);
Expand All @@ -730,19 +737,6 @@ private void BuildAssetStrucutres()
productName = plSet.productName;
break;
}
case 114: //MonoBehaviour
{
if (asset.Offset + 0x1c + 4 > asset.sourceFile.a_Stream.BaseStream.Length)
break;
asset.sourceFile.a_Stream.Position = asset.Offset + 0x1c;
var len = asset.sourceFile.a_Stream.ReadInt32();
if (len > 0 && len < asset.Size - 4 - 0x1c)
{
var bytes = asset.sourceFile.a_Stream.ReadBytes(len);
asset.Text = Encoding.UTF8.GetString(bytes);
}
break;
}
case 21: //Material
case 43: //Mesh
case 74: //AnimationClip
Expand Down Expand Up @@ -1315,6 +1309,16 @@ private void PreviewAsset(AssetPreloadData asset)
break;
}
#endregion
#region MonoBehaviour
case 114:
{
MonoBehaviour m_MonoBehaviour = new MonoBehaviour(asset, true);
textPreviewBox.Text = m_MonoBehaviour.serializedText;
textPreviewBox.Visible = true;

break;
}
#endregion
#region Font
case 128: //Font
{
Expand Down Expand Up @@ -3144,7 +3148,7 @@ private void ExportAssets_Click(object sender, EventArgs e)
}
break;
case 48:
if (!ExportFileExists(exportpath + asset.Text + ".txt", asset.TypeString))
if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString))
{
ExportShader(new Shader(asset, true), exportpath + asset.Text + ".txt");
exportedCount++;
Expand All @@ -3158,6 +3162,14 @@ private void ExportAssets_Click(object sender, EventArgs e)
exportedCount++;
}
break;
case 114:
MonoBehaviour m_MonoBehaviour = new MonoBehaviour(asset, true);
if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString))
{
ExportMonoBehaviour(m_MonoBehaviour, exportpath + asset.Text + asset.extension);
exportedCount++;
}
break;
case 128:
unityFont m_Font = new unityFont(asset, true);
if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString))
Expand Down Expand Up @@ -3395,6 +3407,11 @@ private bool ExportAudioClip(AssetPreloadData asset, string exportFilename, stri
return true;
}

private void ExportMonoBehaviour(MonoBehaviour m_MonoBehaviour, string exportFilename)
{
File.WriteAllText(exportFilename, m_MonoBehaviour.serializedText);
}

private void ExportShader(Shader m_Shader, string exportFilename)
{
File.WriteAllBytes(exportFilename, m_Shader.m_Script);
Expand Down

0 comments on commit fbfdb78

Please sign in to comment.