diff --git a/Source/AssetRipper.Assets/Collections/SerializedAssetCollection.cs b/Source/AssetRipper.Assets/Collections/SerializedAssetCollection.cs index 2a20e3e32..a86e57423 100644 --- a/Source/AssetRipper.Assets/Collections/SerializedAssetCollection.cs +++ b/Source/AssetRipper.Assets/Collections/SerializedAssetCollection.cs @@ -77,9 +77,9 @@ public sealed class SerializedAssetCollection : AssetCollection private static void ReadData(SerializedAssetCollection collection, SerializedFile file, AssetFactoryBase factory) { - foreach (ObjectInfo objectInfo in file.Metadata.Object) + foreach (ObjectInfo objectInfo in file.Objects) { - SerializedType? type = objectInfo.GetSerializedType(file.Metadata.Types); + SerializedType? type = objectInfo.GetSerializedType(file.Types); int classID = objectInfo.TypeID < 0 ? 114 : objectInfo.TypeID; AssetInfo assetInfo = new AssetInfo(collection, objectInfo.FileID, classID); IUnityObjectBase? asset = factory.ReadAsset(assetInfo, objectInfo.ObjectData, type); diff --git a/Source/AssetRipper.IO.Files/SerializedFiles/Parser/ObjectInfo.cs b/Source/AssetRipper.IO.Files/SerializedFiles/Parser/ObjectInfo.cs index 92414feda..8d43f7908 100644 --- a/Source/AssetRipper.IO.Files/SerializedFiles/Parser/ObjectInfo.cs +++ b/Source/AssetRipper.IO.Files/SerializedFiles/Parser/ObjectInfo.cs @@ -134,7 +134,7 @@ namespace AssetRipper.IO.Files.SerializedFiles.Parser return $"{ClassID}[{FileID}]"; } - public SerializedType? GetSerializedType(SerializedType[] types) + public SerializedType? GetSerializedType(ReadOnlySpan types) { if (SerializedTypeIndex >= 0) { @@ -146,11 +146,26 @@ namespace AssetRipper.IO.Files.SerializedFiles.Parser } else { - return types.Single(t => t.TypeID == TypeID && t.IsStrippedType == Stripped); + SerializedType? result = null; + foreach (SerializedType type in types) + { + if (type.TypeID == TypeID && type.IsStrippedType == Stripped) + { + if (result is null) + { + result = type; + } + else + { + throw new Exception($"Multiple types with the same ID {TypeID} and stripped {Stripped} found"); + } + } + } + return result ?? throw new Exception($"Type with ID {TypeID} and stripped {Stripped} not found"); } } - public void Initialize(SerializedType[] types) + public void Initialize(ReadOnlySpan types) { if (SerializedTypeIndex >= 0) { diff --git a/Source/AssetRipper.IO.Files/SerializedFiles/SerializedFile.cs b/Source/AssetRipper.IO.Files/SerializedFiles/SerializedFile.cs index 9e52f7d69..6dbb0caab 100644 --- a/Source/AssetRipper.IO.Files/SerializedFiles/SerializedFile.cs +++ b/Source/AssetRipper.IO.Files/SerializedFiles/SerializedFile.cs @@ -13,20 +13,15 @@ namespace AssetRipper.IO.Files.SerializedFiles public sealed class SerializedFile : FileBase { private SerializedFileHeader Header { get; } = new(); - public SerializedFileMetadata Metadata { get; } = new(); - public UnityVersion Version - { - get => Metadata.UnityVersion; - set => Metadata.UnityVersion = value; - } - public BuildTarget Platform - { - get => Metadata.TargetPlatform; - set => Metadata.TargetPlatform = value; - } + private SerializedFileMetadata Metadata { get; } = new(); + public UnityVersion Version => Metadata.UnityVersion; + public BuildTarget Platform => Metadata.TargetPlatform; public TransferInstructionFlags Flags => GetFlags(Header, Metadata, Name, FilePath); public EndianType EndianType => GetEndianType(Header, Metadata); public ReadOnlySpan Dependencies => Metadata.Externals; + public ReadOnlySpan Objects => Metadata.Object; + public ReadOnlySpan Types => Metadata.Types; + public bool HasTypeTree => Metadata.EnableTypeTree; private static TransferInstructionFlags GetFlags(SerializedFileHeader header, SerializedFileMetadata metadata, string name, string filePath) { diff --git a/Source/AssetRipper.Tools.TypeTreeExtractor/Program.cs b/Source/AssetRipper.Tools.TypeTreeExtractor/Program.cs index 39869017f..844b4ec41 100644 --- a/Source/AssetRipper.Tools.TypeTreeExtractor/Program.cs +++ b/Source/AssetRipper.Tools.TypeTreeExtractor/Program.cs @@ -73,13 +73,13 @@ namespace AssetRipper.Tools.TypeTreeExtractor private static void SaveTypeTrees(SerializedFile file) { - if (!file.Metadata.EnableTypeTree) + if (!file.HasTypeTree) { return; } - StringBuilder sb = new StringBuilder(); - foreach (SerializedType type in file.Metadata.Types.OrderBy(t => t.TypeID)) + StringBuilder sb = new(); + foreach (SerializedType type in file.Types.ToArray().OrderBy(t => t.TypeID)) { Console.WriteLine($"\tType ID: {type.TypeID,-10} Script Index: {type.ScriptTypeIndex, -5} Node Count: {type.OldType?.Nodes?.Count ?? 0}"); if (type.OldType is null)