diff --git a/Unity Studio/Unity Classes/VideoClip.cs b/Unity Studio/Unity Classes/VideoClip.cs
new file mode 100644
index 0000000..0b87f0b
--- /dev/null
+++ b/Unity Studio/Unity Classes/VideoClip.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Unity_Studio
+{
+ class VideoClip
+ {
+ public string m_Name;
+ public byte[] m_VideoData;
+
+ public VideoClip(AssetPreloadData preloadData, bool readSwitch)
+ {
+ var sourceFile = preloadData.sourceFile;
+ var a_Stream = preloadData.sourceFile.a_Stream;
+ a_Stream.Position = preloadData.Offset;
+
+ m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
+ var m_OriginalPath = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
+ var m_ProxyWidth = a_Stream.ReadUInt32();
+ var m_ProxyHeight = a_Stream.ReadUInt32();
+ var Width = a_Stream.ReadUInt32();
+ var Height = a_Stream.ReadUInt32();
+ var m_PixelAspecRatioNum = a_Stream.ReadUInt32();
+ var m_PixelAspecRatioDen = a_Stream.ReadUInt32();
+ var m_FrameRate = a_Stream.ReadDouble();
+ var m_FrameCount = a_Stream.ReadUInt64();
+ var m_Format = a_Stream.ReadInt32();
+ //m_AudioChannelCount
+ var size = a_Stream.ReadInt32();
+ a_Stream.Position += size * 2;
+ a_Stream.AlignStream(4);
+ //m_AudioSampleRate
+ size = a_Stream.ReadInt32();
+ a_Stream.Position += size * 4;
+ //m_AudioLanguage
+ size = a_Stream.ReadInt32();
+ for (int i = 0; i < size; i++)
+ {
+ a_Stream.ReadAlignedString(a_Stream.ReadInt32());
+ }
+ //StreamedResource m_ExternalResources
+ var m_Source = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
+ m_Source = Path.Combine(Path.GetDirectoryName(sourceFile.filePath), m_Source.Replace("archive:/", ""));
+ var m_Offset = a_Stream.ReadUInt64();
+ var m_Size = a_Stream.ReadUInt64();
+ var m_HasSplitAlpha = a_Stream.ReadBoolean();
+
+ if (readSwitch)
+ {
+ if (m_Source == null)
+ {
+ m_VideoData = a_Stream.ReadBytes((int)m_Size);
+ }
+ else if (File.Exists(m_Source) || File.Exists(m_Source = Path.Combine(Path.GetDirectoryName(sourceFile.filePath), Path.GetFileName(m_Source))))
+ {
+ using (var reader = new BinaryReader(File.OpenRead(m_Source)))
+ {
+ reader.BaseStream.Position = (long)m_Offset;
+ m_VideoData = reader.ReadBytes((int)m_Size);
+ }
+ }
+ else
+ {
+ if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(m_Source), out var reader))
+ {
+ reader.Position = (long)m_Offset;
+ m_VideoData = reader.ReadBytes((int)m_Size);
+ }
+ else
+ {
+ MessageBox.Show($"can't find the resource file {Path.GetFileName(m_Source)}");
+ }
+ }
+ }
+ else
+ {
+ preloadData.extension = Path.GetExtension(m_OriginalPath);
+ if (m_Name != "") { preloadData.Text = m_Name; }
+ else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; }
+ if (m_Source != null)
+ preloadData.fullSize = preloadData.Size + (int)m_Size;
+ preloadData.SubItems.AddRange(new[] { preloadData.TypeString, preloadData.fullSize.ToString() });
+ }
+ }
+ }
+}
diff --git a/Unity Studio/Unity Studio Classes/UnityStudio.cs b/Unity Studio/Unity Studio Classes/UnityStudio.cs
index 0cb8bfa..b5fbe05 100644
--- a/Unity Studio/Unity Studio Classes/UnityStudio.cs
+++ b/Unity Studio/Unity Studio Classes/UnityStudio.cs
@@ -312,6 +312,12 @@ namespace Unity_Studio
ab = new AssetBundle(asset);
break;
}
+ case 329: //VideoClip
+ {
+ var m_VideoClip = new VideoClip(asset, false);
+ exportable = true;
+ break;
+ }
case 21: //Material
case 74: //AnimationClip
case 90: //Avatar
@@ -1809,6 +1815,14 @@ namespace Unity_Studio
File.WriteAllText(exportPath, sb.ToString());
}
+ public static void ExportVideo(VideoClip m_VideoClip, string exportFilename)
+ {
+ if (m_VideoClip.m_VideoData != null)
+ {
+ File.WriteAllBytes(exportFilename, m_VideoClip.m_VideoData);
+ }
+ }
+
public static bool ExportFileExists(string filename)
{
if (File.Exists(filename))
diff --git a/Unity Studio/Unity Studio-x86.csproj b/Unity Studio/Unity Studio-x86.csproj
index 841e158..b270d13 100644
--- a/Unity Studio/Unity Studio-x86.csproj
+++ b/Unity Studio/Unity Studio-x86.csproj
@@ -142,6 +142,7 @@
True
+
diff --git a/Unity Studio/Unity Studio.csproj b/Unity Studio/Unity Studio.csproj
index 4090dc0..89c852a 100644
--- a/Unity Studio/Unity Studio.csproj
+++ b/Unity Studio/Unity Studio.csproj
@@ -142,6 +142,7 @@
ShaderResource.resx
+
diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs
index bc37b13..17b893c 100644
--- a/Unity Studio/UnityStudioForm.cs
+++ b/Unity Studio/UnityStudioForm.cs
@@ -1102,11 +1102,22 @@ namespace Unity_Studio
}
break;
#endregion
-
+ #region VideoClip
+ case 329:
+ {
+ string str = asset.ViewStruct();
+ if (str != null)
+ {
+ textPreviewBox.Text = str;
+ textPreviewBox.Visible = true;
+ }
+ break;
+ }
+ #endregion
default:
{
- string str;
- if ((str = asset.ViewStruct()) != null)
+ string str = asset.ViewStruct();
+ if (str != null)
{
textPreviewBox.Text = str;
textPreviewBox.Visible = true;
@@ -1624,7 +1635,14 @@ namespace Unity_Studio
ExportMesh(m_Mesh, exportpath + asset.Text + asset.extension);
exportedCount++;
}
-
+ break;
+ case 329: //VideoClip
+ var m_VideoClip = new VideoClip(asset, true);
+ if (!ExportFileExists(exportpath + asset.Text + asset.extension))
+ {
+ ExportVideo(m_VideoClip, exportpath + asset.Text + asset.extension);
+ exportedCount++;
+ }
break;
default:
if (!ExportFileExists(exportpath + asset.Text + asset.extension))