diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 805b356..7001929 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -11,20 +11,48 @@ namespace AssetStudio { public class AssetsManager { - public string SpecifyUnityVersion; public bool ZstdEnabled = true; public bool LoadingViaTypeTreeEnabled = true; public List assetsFileList = new List(); - private HashSet filteredAssetTypesList = new HashSet(); internal Dictionary assetsFileIndexCache = new Dictionary(StringComparer.OrdinalIgnoreCase); internal ConcurrentDictionary resourceFileReaders = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private UnityVersion specifiedUnityVersion; private List importFiles = new List(); + private HashSet filteredAssetTypesList = new HashSet(); private HashSet importFilesHash = new HashSet(StringComparer.OrdinalIgnoreCase); private HashSet noexistFiles = new HashSet(StringComparer.OrdinalIgnoreCase); private HashSet assetsFileListHash = new HashSet(StringComparer.OrdinalIgnoreCase); + public UnityVersion SpecifyUnityVersion + { + get => specifiedUnityVersion; + set + { + if (specifiedUnityVersion == value) + { + return; + } + if (value == null) + { + specifiedUnityVersion = null; + Logger.Info("Specified Unity version: None"); + return; + } + + if (string.IsNullOrEmpty(value.BuildType)) + { + throw new NotSupportedException("Specified Unity version is not in a correct format.\n" + + "Specify full Unity version, including letters at the end.\n" + + "Example: 2017.4.39f1"); + } + + specifiedUnityVersion = value; + Logger.Info($"Specified Unity version: {specifiedUnityVersion}"); + } + } + public void SetAssetFilter(params ClassIDType[] classIDTypes) { if (filteredAssetTypesList.Count == 0) @@ -230,7 +258,7 @@ namespace AssetStudio return true; } - private bool LoadAssetsFromMemory(FileReader reader, string originalPath, string unityVersion = null) + private bool LoadAssetsFromMemory(FileReader reader, string originalPath, UnityVersion assetBundleUnityVer = null) { if (!assetsFileListHash.Contains(reader.FileName)) { @@ -238,9 +266,9 @@ namespace AssetStudio { var assetsFile = new SerializedFile(reader, this); assetsFile.originalPath = originalPath; - if (!string.IsNullOrEmpty(unityVersion) && assetsFile.header.m_Version < SerializedFileFormatVersion.Unknown_7) + if (assetBundleUnityVer != null && assetsFile.header.m_Version < SerializedFileFormatVersion.Unknown_7) { - assetsFile.SetVersion(unityVersion); + assetsFile.SetVersion(assetBundleUnityVer); } CheckStrippedVersion(assetsFile); assetsFileList.Add(assetsFile); @@ -270,7 +298,7 @@ namespace AssetStudio Logger.Info("Loading " + reader.FullPath); try { - var bundleFile = new BundleFile(reader, ZstdEnabled, SpecifyUnityVersion); + var bundleFile = new BundleFile(reader, ZstdEnabled, specifiedUnityVersion); foreach (var file in bundleFile.fileList) { var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName); @@ -448,11 +476,11 @@ namespace AssetStudio public void CheckStrippedVersion(SerializedFile assetsFile) { - if (assetsFile.IsVersionStripped && string.IsNullOrEmpty(SpecifyUnityVersion)) + if (assetsFile.version.IsStripped && specifiedUnityVersion == null) { - throw new NotSupportedException("The Unity version has been stripped, please set the version in the options"); + throw new NotSupportedException("The asset's Unity version has been stripped, please set the version in the options"); } - if (!string.IsNullOrEmpty(SpecifyUnityVersion)) + if (specifiedUnityVersion != null) { assetsFile.SetVersion(SpecifyUnityVersion); } @@ -560,7 +588,7 @@ namespace AssetStudio obj = new RectTransform(objectReader); break; case ClassIDType.Shader: - if (objectReader.version[0] < 2021) + if (objectReader.version < 2021) obj = new Shader(objectReader); break; case ClassIDType.SkinnedMeshRenderer: diff --git a/AssetStudio/BundleFile.cs b/AssetStudio/BundleFile.cs index 6b492fa..6881492 100644 --- a/AssetStudio/BundleFile.cs +++ b/AssetStudio/BundleFile.cs @@ -3,7 +3,6 @@ using ZstdSharp; using System; using System.IO; using System.Linq; -using System.Text.RegularExpressions; namespace AssetStudio { @@ -48,7 +47,7 @@ namespace AssetStudio public string signature; public uint version; public string unityVersion; - public string unityRevision; + public UnityVersion unityRevision; public long size; public uint compressedBlocksInfoSize; public uint uncompressedBlocksInfoSize; @@ -76,13 +75,13 @@ namespace AssetStudio public StreamFile[] fileList; - public BundleFile(FileReader reader, bool useZstd, string specUnityVer = "") + public BundleFile(FileReader reader, bool useZstd, UnityVersion specUnityVer = null) { m_Header = new Header(); m_Header.signature = reader.ReadStringToNull(); m_Header.version = reader.ReadUInt32(); m_Header.unityVersion = reader.ReadStringToNull(); - m_Header.unityRevision = reader.ReadStringToNull(); + m_Header.unityRevision = new UnityVersion(reader.ReadStringToNull()); switch (m_Header.signature) { case "UnityArchive": @@ -104,15 +103,25 @@ namespace AssetStudio ReadHeader(reader); var isUnityCnEnc = false; - var unityVerStr = string.IsNullOrEmpty(specUnityVer) ? m_Header.unityRevision : specUnityVer; - int[] ver = Regex.Matches(unityVerStr, @"\d+").Cast().Select(x => int.Parse(x.Value)).ToArray(); - if (ver.Length > 0 && ver[0] != 0) + var unityVer = m_Header.unityRevision; + if (specUnityVer != null) + { + if (!unityVer.IsStripped && specUnityVer != unityVer) + { + Logger.Warning($"Detected Unity version is different from the specified one ({specUnityVer.FullVersion.Color(ColorConsole.BrightCyan)}).\n" + + $"Assets may load with errors.\n" + + $"It is recommended to specify the detected Unity version: {unityVer.FullVersion.Color(ColorConsole.BrightCyan)}"); + } + unityVer = specUnityVer; + } + + if (!unityVer.IsStripped) { // https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch - if (ver[0] < 2020 - || (ver[0] == 2020 && ver[1] <= 3 && ver[2] < 34) - || (ver[0] == 2021 && ver[1] <= 3 && ver[2] < 2) - || (ver[0] == 2022 && ver[1] <= 1 && ver[2] < 1)) + if (unityVer < 2020 + || unityVer.IsInRange(2020, (2020, 3, 34)) + || unityVer.IsInRange(2021, (2021, 3, 2)) + || unityVer.IsInRange(2022, (2022, 1, 1))) { isUnityCnEnc = ((CnEncryptionFlags)m_Header.flags & CnEncryptionFlags.OldFlag) != 0; } @@ -123,10 +132,14 @@ namespace AssetStudio } if (isUnityCnEnc) { - throw new NotSupportedException("Unsupported bundle file. UnityCN encryption was detected."); + var msg = "Unsupported bundle file. "; + msg += specUnityVer != null + ? "UnityCN encryption was detected or the specified Unity version is incorrect." + : "UnityCN encryption was detected."; + throw new NotSupportedException(msg); } - ReadBlocksInfoAndDirectory(reader, ver); + ReadBlocksInfoAndDirectory(reader, unityVer); using (var blocksStream = CreateBlocksStream(reader.FullPath)) { ReadBlocks(reader, blocksStream, useZstd); @@ -261,7 +274,7 @@ namespace AssetStudio } } - private void ReadBlocksInfoAndDirectory(FileReader reader, int[] unityVer) + private void ReadBlocksInfoAndDirectory(FileReader reader, UnityVersion unityVer) { byte[] blocksInfoBytes; @@ -269,7 +282,7 @@ namespace AssetStudio { reader.AlignStream(16); } - else if (unityVer[0] >= 2019 && unityVer[1] >= 4) + else if (unityVer >= (2019, 4)) { //check if we need to align the reader //- align to 16 bytes and check if all are 0 diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 4ea8af3..b6fdd85 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -25,7 +25,7 @@ namespace AssetStudio value = readerFunc(); inSlope = readerFunc(); outSlope = readerFunc(); - if (reader.version[0] >= 2018) //2018 and up + if (reader.version >= 2018) //2018 and up { weightedMode = reader.ReadInt32(); inWeight = readerFunc(); @@ -55,7 +55,7 @@ namespace AssetStudio m_PreInfinity = reader.ReadInt32(); m_PostInfinity = reader.ReadInt32(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up + if (version >= (5, 3)) //5.3 and up { m_RotationOrder = reader.ReadInt32(); } @@ -323,7 +323,7 @@ namespace AssetStudio path = reader.ReadAlignedString(); classID = (ClassIDType)reader.ReadInt32(); script = new PPtr(reader); - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 2)) //2022.2 and up + if (version >= (2022, 2)) //2022.2 and up { flags = reader.ReadInt32(); } @@ -369,7 +369,7 @@ namespace AssetStudio path = reader.ReadAlignedString(); classID = reader.ReadInt32(); script = new PPtr(reader); - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 2)) //2022.2 and up + if (version >= (2022, 2)) //2022.2 and up { flags = reader.ReadInt32(); } @@ -401,9 +401,9 @@ namespace AssetStudio public xform(ObjectReader reader) { var version = reader.version; - t = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + t = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up q = reader.ReadQuaternion(); - s = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + s = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up } } @@ -445,9 +445,9 @@ namespace AssetStudio m_X = new xform(reader); m_WeightT = reader.ReadSingle(); m_WeightR = reader.ReadSingle(); - if (version[0] >= 5)//5.0 and up + if (version >= 5)//5.0 and up { - m_HintT = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + m_HintT = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_HintWeightT = reader.ReadSingle(); } } @@ -470,7 +470,7 @@ namespace AssetStudio { var version = reader.version; m_RootX = new xform(reader); - m_LookAtPosition = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + m_LookAtPosition = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_LookAtWeight = reader.ReadVector4(); int numGoals = reader.ReadInt32(); @@ -485,13 +485,13 @@ namespace AssetStudio m_DoFArray = reader.ReadSingleArray(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up + if (version >= (5, 2))//5.2 and up { int numTDof = reader.ReadInt32(); m_TDoFArray = new Vector3[numTDof]; for (int i = 0; i < numTDof; i++) { - m_TDoFArray[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + m_TDoFArray[i] = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up } } } @@ -646,7 +646,7 @@ namespace AssetStudio { var version = reader.version; m_ID = reader.ReadUInt32(); - if (version[0] < 5 || (version[0] == 5 && version[1] < 5))//5.5 down + if (version < (5, 5)) //5.5 down { m_TypeID = reader.ReadUInt32(); } @@ -698,11 +698,11 @@ namespace AssetStudio var version = reader.version; m_StreamedClip = new StreamedClip(reader); m_DenseClip = new DenseClip(reader); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_ConstantClip = new ConstantClip(reader); } - if (version[0] < 2018 || (version[0] == 2018 && version[1] < 3)) //2018.3 down + if (version < (2018, 3)) //2018.3 down { m_Binding = new ValueArrayConstant(reader); } @@ -806,18 +806,18 @@ namespace AssetStudio var version = reader.version; m_DeltaPose = new HumanPose(reader); m_StartX = new xform(reader); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up + if (version >= (5, 5)) //5.5 and up { m_StopX = new xform(reader); } m_LeftFootStartX = new xform(reader); m_RightFootStartX = new xform(reader); - if (version[0] < 5)//5.0 down + if (version < 5)//5.0 down { m_MotionStartX = new xform(reader); m_MotionStopX = new xform(reader); } - m_AverageSpeed = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + m_AverageSpeed = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_Clip = new OffsetPtr(reader); m_StartTime = reader.ReadSingle(); m_StopTime = reader.ReadSingle(); @@ -827,7 +827,7 @@ namespace AssetStudio m_AverageAngularSpeed = reader.ReadSingle(); m_IndexArray = reader.ReadInt32Array(); - if (version[0] < 4 || (version[0] == 4 && version[1] < 3)) //4.3 down + if (version < (4, 3)) //4.3 down { var m_AdditionalCurveIndexArray = reader.ReadInt32Array(); } @@ -837,13 +837,13 @@ namespace AssetStudio { m_ValueArrayDelta[i] = new ValueDelta(reader); } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up + if (version >= (5, 3))//5.3 and up { m_ValueArrayReferencePose = reader.ReadSingleArray(); } m_Mirror = reader.ReadBoolean(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_LoopTime = reader.ReadBoolean(); } @@ -851,7 +851,7 @@ namespace AssetStudio m_LoopBlendOrientation = reader.ReadBoolean(); m_LoopBlendPositionY = reader.ReadBoolean(); m_LoopBlendPositionXZ = reader.ReadBoolean(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up + if (version >= (5, 5))//5.5 and up { m_StartAtOrigin = reader.ReadBoolean(); } @@ -881,7 +881,7 @@ namespace AssetStudio path = reader.ReadUInt32(); attribute = reader.ReadUInt32(); script = new PPtr(reader); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + if (version >= (5, 6)) //5.6 and up { typeID = (ClassIDType)reader.ReadInt32(); } @@ -891,7 +891,7 @@ namespace AssetStudio } customType = reader.ReadByte(); isPPtrCurve = reader.ReadByte(); - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 1)) //2022.1 and up + if (version >= (2022, 1)) //2022.1 and up { isIntCurve = reader.ReadByte(); } @@ -980,7 +980,7 @@ namespace AssetStudio data = reader.ReadAlignedString(); objectReferenceParameter = new PPtr(reader); floatParameter = reader.ReadSingle(); - if (version[0] >= 3) //3 and up + if (version >= 3) //3 and up { intParameter = reader.ReadInt32(); } @@ -1045,11 +1045,11 @@ namespace AssetStudio public AnimationClip(ObjectReader reader) : base(reader) { - if (version[0] >= 5)//5.0 and up + if (version >= 5)//5.0 and up { m_Legacy = reader.ReadBoolean(); } - else if (version[0] >= 4)//4.0 and up + else if (version >= 4)//4.0 and up { m_AnimationType = (AnimationType)reader.ReadInt32(); if (m_AnimationType == AnimationType.Legacy) @@ -1060,7 +1060,7 @@ namespace AssetStudio m_Legacy = true; } m_Compressed = reader.ReadBoolean(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up + if (version >= (4, 3))//4.3 and up { m_UseHighQualityCurve = reader.ReadBoolean(); } @@ -1079,7 +1079,7 @@ namespace AssetStudio m_CompressedRotationCurves[i] = new CompressedAnimationCurve(reader); } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up + if (version >= (5, 3))//5.3 and up { int numEulerCurves = reader.ReadInt32(); m_EulerCurves = new Vector3Curve[numEulerCurves]; @@ -1110,7 +1110,7 @@ namespace AssetStudio m_FloatCurves[i] = new FloatCurve(reader); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { int numPtrCurves = reader.ReadInt32(); m_PPtrCurves = new PPtrCurve[numPtrCurves]; @@ -1122,20 +1122,20 @@ namespace AssetStudio m_SampleRate = reader.ReadSingle(); m_WrapMode = reader.ReadInt32(); - if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up + if (version >= (3, 4)) //3.4 and up { m_Bounds = new AABB(reader); } - if (version[0] >= 4)//4.0 and up + if (version >= 4)//4.0 and up { m_MuscleClipSize = reader.ReadUInt32(); m_MuscleClip = new ClipMuscleConstant(reader); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_ClipBindingConstant = new AnimationClipBindingConstant(reader); } - if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 3)) //2018.3 and up + if (version >= (2018, 3)) //2018.3 and up { var m_HasGenericRootTransform = reader.ReadBoolean(); var m_HasMotionFloatCurves = reader.ReadBoolean(); @@ -1147,7 +1147,7 @@ namespace AssetStudio { m_Events[i] = new AnimationEvent(reader); } - if (version[0] >= 2017) //2017 and up + if (version >= 2017) //2017 and up { reader.AlignStream(); } diff --git a/AssetStudio/Classes/Animator.cs b/AssetStudio/Classes/Animator.cs index c7f5046..0f2ffa4 100644 --- a/AssetStudio/Classes/Animator.cs +++ b/AssetStudio/Classes/Animator.cs @@ -17,47 +17,47 @@ namespace AssetStudio m_Controller = new PPtr(reader); var m_CullingMode = reader.ReadInt32(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up + if (version >= (4, 5)) //4.5 and up { var m_UpdateMode = reader.ReadInt32(); } var m_ApplyRootMotion = reader.ReadBoolean(); - if (version[0] == 4 && version[1] >= 5) //4.5 and up - 5.0 down + if (version == 4 && version.Minor >= 5) //4.5 and up - 5.0 down { reader.AlignStream(); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { var m_LinearVelocityBlending = reader.ReadBoolean(); - if (version[0] > 2021 || (version[0] == 2021 && version[1] >= 2)) //2021.2 and up + if (version >= (2021, 2)) //2021.2 and up { var m_StabilizeFeet = reader.ReadBoolean(); } reader.AlignStream(); } - if (version[0] < 4 || (version[0] == 4 && version[1] < 5)) //4.5 down + if (version < (4, 5)) //4.5 down { var m_AnimatePhysics = reader.ReadBoolean(); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_HasTransformHierarchy = reader.ReadBoolean(); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up + if (version >= (4, 5)) //4.5 and up { var m_AllowConstantClipSamplingOptimization = reader.ReadBoolean(); } - if (version[0] >= 5 && version[0] < 2018) //5.0 and up - 2018 down + if (version.IsInRange(5, 2018)) //5.0 and up - 2018 down { reader.AlignStream(); } - if (version[0] >= 2018) //2018 and up + if (version >= 2018) //2018 and up { var m_KeepAnimatorControllerStateOnDisable = reader.ReadBoolean(); reader.AlignStream(); diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index 24cdcdf..5baecb0 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -17,7 +17,7 @@ namespace AssetStudio word0 = reader.ReadUInt32(); word1 = reader.ReadUInt32(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 2)) //5.2 and up + if (version >= (5, 2)) //5.2 and up { word2 = reader.ReadUInt32(); } @@ -73,12 +73,12 @@ namespace AssetStudio m_SkeletonMask = new SkeletonMask(reader); m_Binding = reader.ReadUInt32(); m_LayerBlendingMode = reader.ReadInt32(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up + if (version >= (4, 2)) //4.2 and up { m_DefaultWeight = reader.ReadSingle(); } m_IKPass = reader.ReadBoolean(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up + if (version >= (4, 2)) //4.2 and up { m_SyncedLayerAffectsTiming = reader.ReadBoolean(); } @@ -131,7 +131,7 @@ namespace AssetStudio } m_DestinationState = reader.ReadUInt32(); - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { m_FullPathID = reader.ReadUInt32(); } @@ -140,7 +140,7 @@ namespace AssetStudio m_UserID = reader.ReadUInt32(); m_TransitionDuration = reader.ReadSingle(); m_TransitionOffset = reader.ReadSingle(); - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { m_ExitTime = reader.ReadSingle(); m_HasExitTime = reader.ReadBoolean(); @@ -154,7 +154,7 @@ namespace AssetStudio m_Atomic = reader.ReadBoolean(); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up + if (version >= (4, 5)) //4.5 and up { m_CanTransitionToSelf = reader.ReadBoolean(); } @@ -252,43 +252,41 @@ namespace AssetStudio { var version = reader.version; - if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + if (version >= (4, 1)) //4.1 and up { m_BlendType = reader.ReadUInt32(); } m_BlendEventID = reader.ReadUInt32(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + if (version >= (4, 1)) //4.1 and up { m_BlendEventYID = reader.ReadUInt32(); } m_ChildIndices = reader.ReadUInt32Array(); - if (version[0] < 4 || (version[0] == 4 && version[1] < 1)) //4.1 down + if (version < (4, 1)) //4.1 down { m_ChildThresholdArray = reader.ReadSingleArray(); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + if (version >= (4, 1)) //4.1 and up { m_Blend1dData = new Blend1dDataConstant(reader); m_Blend2dData = new Blend2dDataConstant(reader); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { m_BlendDirectData = new BlendDirectDataConstant(reader); } m_ClipID = reader.ReadUInt32(); - if (version[0] == 4 && version[1] >= 5) //4.5 - 5.0 + if (version == 4 && version.Minor >= 5) //4.5 - 5.0 { m_ClipIndex = reader.ReadUInt32(); } m_Duration = reader.ReadSingle(); - if (version[0] > 4 - || (version[0] == 4 && version[1] > 1) - || (version[0] == 4 && version[1] == 1 && version[2] >= 3)) //4.1.3 and up + if (version >= (4, 1, 3)) //4.1.3 and up { m_CycleOffset = reader.ReadSingle(); m_Mirror = reader.ReadBoolean(); @@ -313,7 +311,7 @@ namespace AssetStudio m_NodeArray[i] = new BlendTreeNodeConstant(reader); } - if (version[0] < 4 || (version[0] == 4 && version[1] < 5)) //4.5 down + if (version < (4, 5)) //4.5 down { m_BlendEventArrayConstant = new ValueArrayConstant(reader); } @@ -354,7 +352,7 @@ namespace AssetStudio m_BlendTreeConstantIndexArray = reader.ReadInt32Array(); - if (version[0] < 5 || (version[0] == 5 && version[1] < 2)) //5.2 down + if (version < (5, 2)) //5.2 down { int numInfos = reader.ReadInt32(); m_LeafInfoArray = new LeafInfoConstant[numInfos]; @@ -372,41 +370,41 @@ namespace AssetStudio } m_NameID = reader.ReadUInt32(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_PathID = reader.ReadUInt32(); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { m_FullPathID = reader.ReadUInt32(); } m_TagID = reader.ReadUInt32(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 1)) //5.1 and up + if (version >= (5, 1)) //5.1 and up { m_SpeedParamID = reader.ReadUInt32(); m_MirrorParamID = reader.ReadUInt32(); m_CycleOffsetParamID = reader.ReadUInt32(); } - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up + if (version >= (2017, 2)) //2017.2 and up { var m_TimeParamID = reader.ReadUInt32(); } m_Speed = reader.ReadSingle(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + if (version >= (4, 1)) //4.1 and up { m_CycleOffset = reader.ReadSingle(); } m_IKOnFeet = reader.ReadBoolean(); - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { m_WriteDefaultValues = reader.ReadBoolean(); } m_Loop = reader.ReadBoolean(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + if (version >= (4, 1)) //4.1 and up { m_Mirror = reader.ReadBoolean(); } @@ -480,7 +478,7 @@ namespace AssetStudio m_AnyStateTransitionConstantArray[i] = new TransitionConstant(reader); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { int numSelectors = reader.ReadInt32(); m_SelectorStateConstantArray = new SelectorStateConstant[numSelectors]; @@ -509,7 +507,7 @@ namespace AssetStudio { var version = reader.version; - if (version[0] < 5 || (version[0] == 5 && version[1] < 5)) //5.5 down + if (version < (5, 5)) //5.5 down { m_BoolValues = reader.ReadBooleanArray(); reader.AlignStream(); @@ -517,7 +515,7 @@ namespace AssetStudio m_FloatValues = reader.ReadSingleArray(); } - if (version[0] < 4 || (version[0] == 4 && version[1] < 3)) //4.3 down + if (version < (4, 3)) //4.3 down { m_VectorValues = reader.ReadVector4Array(); } @@ -527,7 +525,7 @@ namespace AssetStudio m_PositionValues = new Vector3[numPosValues]; for (int i = 0; i < numPosValues; i++) { - m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + m_PositionValues[i] = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up } m_QuaternionValues = reader.ReadVector4Array(); @@ -536,10 +534,10 @@ namespace AssetStudio m_ScaleValues = new Vector3[numScaleValues]; for (int i = 0; i < numScaleValues; i++) { - m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + m_ScaleValues[i] = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up + if (version >= (5, 5)) //5.5 and up { m_FloatValues = reader.ReadSingleArray(); m_IntValues = reader.ReadInt32Array(); diff --git a/AssetStudio/Classes/AssetBundle.cs b/AssetStudio/Classes/AssetBundle.cs index 24b88bd..b6199f7 100644 --- a/AssetStudio/Classes/AssetBundle.cs +++ b/AssetStudio/Classes/AssetBundle.cs @@ -42,7 +42,7 @@ namespace AssetStudio var m_MainAsset = new AssetInfo(reader); - if (version[0] == 5 && version[1] == 4) //5.4.x + if (version == (5, 4)) //5.4.x { var m_ClassVersionMapSize = reader.ReadInt32(); for (var i = 0; i < m_ClassVersionMapSize; i++) @@ -52,12 +52,12 @@ namespace AssetStudio } } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up + if (version >= (4, 2)) //4.2 and up { var m_RuntimeCompatibility = reader.ReadUInt32(); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { m_AssetBundleName = reader.ReadAlignedString(); diff --git a/AssetStudio/Classes/AudioClip.cs b/AssetStudio/Classes/AudioClip.cs index 2237272..53a4c93 100644 --- a/AssetStudio/Classes/AudioClip.cs +++ b/AssetStudio/Classes/AudioClip.cs @@ -33,7 +33,7 @@ namespace AssetStudio public AudioClip(ObjectReader reader) : base(reader) { - if (version[0] < 5) + if (version < 5) { m_Format = reader.ReadInt32(); m_Type = (FMODSoundType)reader.ReadInt32(); @@ -41,7 +41,7 @@ namespace AssetStudio m_UseHardware = reader.ReadBoolean(); reader.AlignStream(); - if (version[0] >= 4 || (version[0] == 3 && version[1] >= 2)) //3.2.0 to 5 + if (version >= (3, 2)) //3.2.0 to 5 { int m_Stream = reader.ReadInt32(); m_Size = reader.ReadInt32(); diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index 97505ab..e8593a90 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -23,7 +23,7 @@ namespace AssetStudio public Limit(ObjectReader reader) { var version = reader.version; - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up + if (version >= (5, 4))//5.4 and up { m_Min = reader.ReadVector3(); m_Max = reader.ReadVector3(); @@ -50,7 +50,7 @@ namespace AssetStudio var version = reader.version; m_PreQ = reader.ReadVector4(); m_PostQ = reader.ReadVector4(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + if (version >= (5, 4)) //5.4 and up { m_Sgn = reader.ReadVector3(); } @@ -189,7 +189,7 @@ namespace AssetStudio m_LeftHand = new Hand(reader); m_RightHand = new Hand(reader); - if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down + if (version < (2018, 2)) //2018.2 down { int numHandles = reader.ReadInt32(); m_Handles = new Handle[numHandles]; @@ -210,7 +210,7 @@ namespace AssetStudio m_HumanBoneMass = reader.ReadSingleArray(); - if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down + if (version < (2018, 2)) //2018.2 down { m_ColliderIndex = reader.ReadInt32Array(); } @@ -225,7 +225,7 @@ namespace AssetStudio m_FeetSpacing = reader.ReadSingle(); m_HasLeftHand = reader.ReadBoolean(); m_HasRightHand = reader.ReadBoolean(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 2)) //5.2 and up + if (version >= (5, 2)) //5.2 and up { m_HasTDoF = reader.ReadBoolean(); } @@ -254,7 +254,7 @@ namespace AssetStudio m_AvatarSkeleton = new Skeleton(reader); m_AvatarSkeletonPose = new SkeletonPose(reader); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_DefaultPose = new SkeletonPose(reader); @@ -265,7 +265,7 @@ namespace AssetStudio m_HumanSkeletonIndexArray = reader.ReadInt32Array(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_HumanSkeletonReverseIndexArray = reader.ReadInt32Array(); } @@ -273,7 +273,7 @@ namespace AssetStudio m_RootMotionBoneIndex = reader.ReadInt32(); m_RootMotionBoneX = new xform(reader); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_RootMotionSkeleton = new Skeleton(reader); m_RootMotionSkeletonPose = new SkeletonPose(reader); diff --git a/AssetStudio/Classes/Font.cs b/AssetStudio/Classes/Font.cs index 52b8371..0f76fa2 100644 --- a/AssetStudio/Classes/Font.cs +++ b/AssetStudio/Classes/Font.cs @@ -11,7 +11,7 @@ namespace AssetStudio public Font(ObjectReader reader) : base(reader) { - if ((version[0] == 5 && version[1] >= 5) || version[0] > 5)//5.5 and up + if (version >= (5, 5))//5.5 and up { var m_LineSpacing = reader.ReadSingle(); var m_DefaultMaterial = new PPtr(reader); @@ -43,7 +43,7 @@ namespace AssetStudio { int m_AsciiStartOffset = reader.ReadInt32(); - if (version[0] <= 3) + if (version <= 3) { int m_FontCountX = reader.ReadInt32(); int m_FontCountY = reader.ReadInt32(); @@ -52,7 +52,7 @@ namespace AssetStudio float m_Kerning = reader.ReadSingle(); float m_LineSpacing = reader.ReadSingle(); - if (version[0] <= 3) + if (version <= 3) { int m_PerCharacterKerning_size = reader.ReadInt32(); for (int i = 0; i < m_PerCharacterKerning_size; i++) @@ -86,7 +86,7 @@ namespace AssetStudio float vertheight = reader.ReadSingle(); float width = reader.ReadSingle(); - if (version[0] >= 4) + if (version >= 4) { var flipped = reader.ReadBoolean(); reader.AlignStream(); @@ -103,7 +103,7 @@ namespace AssetStudio float second = reader.ReadSingle(); } - if (version[0] <= 3) + if (version <= 3) { var m_GridFont = reader.ReadBoolean(); reader.AlignStream(); diff --git a/AssetStudio/Classes/GLTextureSettings.cs b/AssetStudio/Classes/GLTextureSettings.cs index c81d1c6..461a98b 100644 --- a/AssetStudio/Classes/GLTextureSettings.cs +++ b/AssetStudio/Classes/GLTextureSettings.cs @@ -16,7 +16,7 @@ m_FilterMode = reader.ReadInt32(); m_Aniso = reader.ReadInt32(); m_MipBias = reader.ReadSingle(); - if (version[0] >= 2017)//2017.x and up + if (version >= 2017)//2017.x and up { m_WrapMode = reader.ReadInt32(); //m_WrapU int m_WrapV = reader.ReadInt32(); diff --git a/AssetStudio/Classes/GameObject.cs b/AssetStudio/Classes/GameObject.cs index d129beb..1fec233 100644 --- a/AssetStudio/Classes/GameObject.cs +++ b/AssetStudio/Classes/GameObject.cs @@ -23,7 +23,7 @@ namespace AssetStudio m_Components = new PPtr[m_Component_size]; for (int i = 0; i < m_Component_size; i++) { - if ((version[0] == 5 && version[1] < 5) || version[0] < 5) //5.5 down + if (version < (5, 5)) //5.5 down { int first = reader.ReadInt32(); } diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index dcc9f21..be2a55f 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -34,7 +34,7 @@ namespace AssetStudio m_TexEnvs[i] = new KeyValuePair(reader.ReadAlignedString(), new UnityTexEnv(reader)); } - if (version[0] >= 2021) //2021.1 and up + if (version >= 2021) //2021.1 and up { int m_IntsSize = reader.ReadInt32(); m_Ints = new KeyValuePair[m_IntsSize]; @@ -69,39 +69,39 @@ namespace AssetStudio { m_Shader = new PPtr(reader); - if (version[0] == 4 && version[1] >= 1) //4.x + if (version == 4 && version.Minor >= 1) //4.x { var m_ShaderKeywords = reader.ReadStringArray(); } - if (version[0] > 2021 || (version[0] == 2021 && version[1] >= 3)) //2021.3 and up + if (version >= (2021, 3)) //2021.3 and up { var m_ValidKeywords = reader.ReadStringArray(); var m_InvalidKeywords = reader.ReadStringArray(); } - else if (version[0] >= 5) //5.0 ~ 2021.2 + else if (version >= 5) //5.0 ~ 2021.2 { var m_ShaderKeywords = reader.ReadAlignedString(); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { var m_LightmapFlags = reader.ReadUInt32(); } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + if (version >= (5, 6)) //5.6 and up { var m_EnableInstancingVariants = reader.ReadBoolean(); //var m_DoubleSidedGI = a_Stream.ReadBoolean(); //2017 and up reader.AlignStream(); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { var m_CustomRenderQueue = reader.ReadInt32(); } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 1)) //5.1 and up + if (version >= (5, 1)) //5.1 and up { var stringTagMapSize = reader.ReadInt32(); for (int i = 0; i < stringTagMapSize; i++) @@ -111,7 +111,7 @@ namespace AssetStudio } } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + if (version >= (5, 6)) //5.6 and up { var disabledShaderPasses = reader.ReadStringArray(); } diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index e11c637..5251f7d 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -40,7 +40,7 @@ namespace AssetStudio m_Vertices = new PackedFloatVector(reader); m_UV = new PackedFloatVector(reader); - if (version[0] < 5) + if (version < 5) { m_BindPoses = new PackedFloatVector(reader); } @@ -49,15 +49,15 @@ namespace AssetStudio m_Weights = new PackedIntVector(reader); m_NormalSigns = new PackedIntVector(reader); m_TangentSigns = new PackedIntVector(reader); - if (version[0] >= 5) + if (version >= 5) { m_FloatColors = new PackedFloatVector(reader); } m_BoneIndices = new PackedIntVector(reader); m_Triangles = new PackedIntVector(reader); - if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 and up + if (version >= (3, 5)) //3.5 and up { - if (version[0] < 5) + if (version < 5) { m_Colors = new PackedIntVector(reader); } @@ -87,7 +87,7 @@ namespace AssetStudio channelMask = reader.ReadUInt32(); offset = reader.ReadUInt32(); - if (version[0] < 4) //4.0 down + if (version < 4) //4.0 down { stride = reader.ReadUInt32(); align = reader.ReadUInt32(); @@ -131,14 +131,14 @@ namespace AssetStudio { var version = reader.version; - if (version[0] < 2018)//2018 down + if (version < 2018)//2018 down { m_CurrentChannels = reader.ReadUInt32(); } m_VertexCount = reader.ReadUInt32(); - if (version[0] >= 4) //4.0 and up + if (version >= 4) //4.0 and up { var m_ChannelsSize = reader.ReadInt32(); m_Channels = new ChannelInfo[m_ChannelsSize]; @@ -148,9 +148,9 @@ namespace AssetStudio } } - if (version[0] < 5) //5.0 down + if (version < 5) //5.0 down { - if (version[0] < 4) + if (version < 4) { m_Streams = new StreamInfo[4]; } @@ -164,7 +164,7 @@ namespace AssetStudio m_Streams[i] = new StreamInfo(reader); } - if (version[0] < 4) //4.0 down + if (version < 4) //4.0 down { GetChannels(version); } @@ -178,7 +178,7 @@ namespace AssetStudio reader.AlignStream(); } - private void GetStreams(int[] version) + private void GetStreams(UnityVersion version) { var streamCount = m_Channels.Max(x => x.stream) + 1; m_Streams = new StreamInfo[streamCount]; @@ -213,7 +213,7 @@ namespace AssetStudio } } - private void GetChannels(int[] version) + private void GetChannels(UnityVersion version) { m_Channels = new ChannelInfo[6]; for (int i = 0; i < 6; i++) @@ -305,20 +305,20 @@ namespace AssetStudio { var version = reader.version; - if (version[0] == 4 && version[1] < 3) //4.3 down + if (version < (4, 3)) //4.3 down { var name = reader.ReadAlignedString(); } firstVertex = reader.ReadUInt32(); vertexCount = reader.ReadUInt32(); - if (version[0] == 4 && version[1] < 3) //4.3 down + if (version < (4, 3)) //4.3 down { var aabbMinDelta = reader.ReadVector3(); var aabbMaxDelta = reader.ReadVector3(); } hasNormals = reader.ReadBoolean(); hasTangents = reader.ReadBoolean(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { reader.AlignStream(); } @@ -352,7 +352,7 @@ namespace AssetStudio { var version = reader.version; - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { int numVerts = reader.ReadInt32(); vertices = new BlendShapeVertex[numVerts]; @@ -425,17 +425,17 @@ namespace AssetStudio indexCount = reader.ReadUInt32(); topology = (GfxPrimitiveType)reader.ReadInt32(); - if (version[0] < 4) //4.0 down + if (version < 4) //4.0 down { triangleCount = reader.ReadUInt32(); } - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3)) //2017.3 and up + if (version >= (2017, 3)) //2017.3 and up { baseVertex = reader.ReadUInt32(); } - if (version[0] >= 3) //3.0 and up + if (version >= 3) //3.0 and up { firstVertex = reader.ReadUInt32(); vertexCount = reader.ReadUInt32(); @@ -474,12 +474,12 @@ namespace AssetStudio public Mesh(ObjectReader reader) : base(reader) { - if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) //3.5 down + if (version < (3, 5)) //3.5 down { m_Use16BitIndices = reader.ReadInt32() > 0; } - if (version[0] == 2 && version[1] <= 5) //2.5 and down + if (version <= (2, 5)) //2.5 and down { int m_IndexBuffer_size = reader.ReadInt32(); @@ -505,21 +505,21 @@ namespace AssetStudio m_SubMeshes[i] = new SubMesh(reader); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + if (version >= (4, 1)) //4.1 and up { m_Shapes = new BlendShapeData(reader); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_BindPose = reader.ReadMatrixArray(); m_BoneNameHashes = reader.ReadUInt32Array(); var m_RootBoneNameHash = reader.ReadUInt32(); } - if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and up + if (version >= (2, 6)) //2.6.0 and up { - if (version[0] >= 2019) //2019 and up + if (version >= 2019) //2019 and up { var m_BonesAABBSize = reader.ReadInt32(); var m_BonesAABB = new MinMaxAABB[m_BonesAABBSize]; @@ -532,9 +532,9 @@ namespace AssetStudio } var m_MeshCompression = reader.ReadByte(); - if (version[0] >= 4) + if (version >= 4) { - if (version[0] < 5) + if (version < 5) { var m_StreamCompression = reader.ReadByte(); } @@ -545,9 +545,9 @@ namespace AssetStudio reader.AlignStream(); //Unity fixed it in 2017.3.1p1 and later versions - if ((version[0] > 2017 || (version[0] == 2017 && version[1] >= 4)) || //2017.4 - ((version[0] == 2017 && version[1] == 3 && version[2] == 1) && buildType.IsPatch) || //fixed after 2017.3.1px - ((version[0] == 2017 && version[1] == 3) && m_MeshCompression == 0))//2017.3.xfx with no compression + if (version >= (2017, 4) //2017.4 + || version == (2017, 3, 1) && buildType.IsPatch //fixed after 2017.3.1px + || version == (2017, 3) && m_MeshCompression == 0)//2017.3.xfx with no compression { var m_IndexFormat = reader.ReadInt32(); m_Use16BitIndices = m_IndexFormat == 0; @@ -569,7 +569,7 @@ namespace AssetStudio } } - if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) //3.4.2 and earlier + if (version < (3, 5)) //3.4.2 and earlier { m_VertexCount = reader.ReadInt32(); m_Vertices = reader.ReadSingleArray(m_VertexCount * 3); //Vector3 @@ -586,7 +586,7 @@ namespace AssetStudio m_UV1 = reader.ReadSingleArray(reader.ReadInt32() * 2); //Vector2 - if (version[0] == 2 && version[1] <= 5) //2.5 and down + if (version <= (2, 5)) //2.5 and down { int m_TangentSpace_size = reader.ReadInt32(); m_Normals = new float[m_TangentSpace_size * 3]; @@ -611,7 +611,7 @@ namespace AssetStudio } else { - if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down + if (version < (2018, 2)) //2018.2 down { m_Skin = new BoneWeights4[reader.ReadInt32()]; for (int s = 0; s < m_Skin.Length; s++) @@ -620,7 +620,7 @@ namespace AssetStudio } } - if (version[0] == 3 || (version[0] == 4 && version[1] <= 2)) //4.2 and down + if (version <= (4, 2)) //4.2 and down { m_BindPose = reader.ReadMatrixArray(); } @@ -628,14 +628,14 @@ namespace AssetStudio m_VertexData = new VertexData(reader); } - if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and later + if (version >= (2, 6)) //2.6.0 and later { m_CompressedMesh = new CompressedMesh(reader); } reader.Position += 24; //AABB m_LocalAABB - if (version[0] < 3 || (version[0] == 3 && version[1] <= 4)) //3.4.2 and earlier + if (version <= (3, 4)) //3.4.2 and earlier { int m_Colors_size = reader.ReadInt32(); m_Colors = new float[m_Colors_size * 4]; @@ -651,12 +651,12 @@ namespace AssetStudio int m_MeshUsageFlags = reader.ReadInt32(); - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 1)) //2022.1 and up + if (version >= (2022, 1)) //2022.1 and up { int m_CookingOptions = reader.ReadInt32(); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { var m_BakedConvexCollisionMesh = reader.ReadUInt8Array(); reader.AlignStream(); @@ -664,14 +664,14 @@ namespace AssetStudio reader.AlignStream(); } - if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up + if (version >= (2018, 2)) //2018.2 and up { var m_MeshMetrics = new float[2]; m_MeshMetrics[0] = reader.ReadSingle(); m_MeshMetrics[1] = reader.ReadSingle(); } - if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 3)) //2018.3 and up + if (version >= (2018, 3)) //2018.3 and up { reader.AlignStream(); m_StreamData = new StreamingInfo(reader); @@ -690,12 +690,12 @@ namespace AssetStudio m_VertexData.m_DataSize = resourceReader.GetData(); } } - if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 and up + if (version >= (3, 5)) //3.5 and up { ReadVertexData(); } - if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and later + if (version >= (2, 6)) //2.6.0 and later { DecompressCompressedMesh(); } @@ -716,7 +716,7 @@ namespace AssetStudio var channelMask = new BitArray(new[] { (int)m_Stream.channelMask }); if (channelMask.Get(chn)) { - if (version[0] < 2018 && chn == 2 && m_Channel.format == 2) //kShaderChannelColor && kChannelFormatColor + if (version < 2018 && chn == 2 && m_Channel.format == 2) //kShaderChannelColor && kChannelFormatColor { m_Channel.dimension = 4; } @@ -752,7 +752,7 @@ namespace AssetStudio else componentsFloatArray = MeshHelper.BytesToFloatArray(componentBytes, vertexFormat); - if (version[0] >= 2018) + if (version >= 2018) { switch (chn) { @@ -841,7 +841,7 @@ namespace AssetStudio m_UV1 = componentsFloatArray; break; case 5: - if (version[0] >= 5) //kShaderChannelTexCoord2 + if (version >= 5) //kShaderChannelTexCoord2 { m_UV2 = componentsFloatArray; } @@ -906,7 +906,7 @@ namespace AssetStudio } } //BindPose - if (version[0] < 5) + if (version < 5) { if (m_CompressedMesh.m_BindPoses.m_NumItems > 0) { @@ -983,7 +983,7 @@ namespace AssetStudio } } //FloatColor - if (version[0] >= 5) + if (version >= 5) { if (m_CompressedMesh.m_FloatColors.m_NumItems > 0) { @@ -1074,7 +1074,7 @@ namespace AssetStudio m_Indices.Add(m_IndexBuffer[firstIndex + i + 2]); } } - else if (version[0] < 4 || topology == GfxPrimitiveType.TriangleStrip) + else if (version < 4 || topology == GfxPrimitiveType.TriangleStrip) { // de-stripify : uint triIndex = 0; @@ -1238,9 +1238,9 @@ namespace AssetStudio SInt32 } - public static VertexFormat ToVertexFormat(int format, int[] version) + public static VertexFormat ToVertexFormat(int format, UnityVersion version) { - if (version[0] < 2017) + if (version < 2017) { switch ((VertexChannelFormat)format) { @@ -1258,7 +1258,7 @@ namespace AssetStudio throw new ArgumentOutOfRangeException(nameof(format), format, null); } } - else if (version[0] < 2019) + else if (version < 2019) { switch ((VertexFormat2017)format) { diff --git a/AssetStudio/Classes/MonoScript.cs b/AssetStudio/Classes/MonoScript.cs index cea9e89..dd9776c 100644 --- a/AssetStudio/Classes/MonoScript.cs +++ b/AssetStudio/Classes/MonoScript.cs @@ -13,11 +13,11 @@ namespace AssetStudio public MonoScript(ObjectReader reader) : base(reader) { - if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up + if (version >= (3, 4)) //3.4 and up { var m_ExecutionOrder = reader.ReadInt32(); } - if (version[0] < 5) //5.0 down + if (version < 5) //5.0 down { var m_PropertiesHash = reader.ReadUInt32(); } @@ -25,17 +25,17 @@ namespace AssetStudio { var m_PropertiesHash = reader.ReadBytes(16); } - if (version[0] < 3) //3.0 down + if (version < 3) //3.0 down { var m_PathName = reader.ReadAlignedString(); } m_ClassName = reader.ReadAlignedString(); - if (version[0] >= 3) //3.0 and up + if (version >= 3) //3.0 and up { m_Namespace = reader.ReadAlignedString(); } m_AssemblyName = reader.ReadAlignedString(); - if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down + if (version < (2018, 2)) //2018.2 down { var m_IsEditorScript = reader.ReadBoolean(); } diff --git a/AssetStudio/Classes/Object.cs b/AssetStudio/Classes/Object.cs index 44ea063..8a58bbe 100644 --- a/AssetStudio/Classes/Object.cs +++ b/AssetStudio/Classes/Object.cs @@ -11,7 +11,7 @@ namespace AssetStudio public ObjectReader reader; public long m_PathID; [JsonIgnore] - public int[] version; + public UnityVersion version; protected BuildType buildType; [JsonIgnore] public BuildTarget platform; diff --git a/AssetStudio/Classes/PlayerSettings.cs b/AssetStudio/Classes/PlayerSettings.cs index 245385b..c5168c8 100644 --- a/AssetStudio/Classes/PlayerSettings.cs +++ b/AssetStudio/Classes/PlayerSettings.cs @@ -12,7 +12,7 @@ namespace AssetStudio public PlayerSettings(ObjectReader reader) : base(reader) { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4.0 nad up + if (version >= (5, 4)) //5.4.0 and up { var productGUID = reader.ReadBytes(16); } @@ -23,12 +23,12 @@ namespace AssetStudio reader.AlignStream(); int defaultScreenOrientation = reader.ReadInt32(); int targetDevice = reader.ReadInt32(); - if (version[0] < 5 || (version[0] == 5 && version[1] < 3)) //5.3 down + if (version < (5, 3)) //5.3 down { - if (version[0] < 5) //5.0 down + if (version < 5) //5.0 down { int targetPlatform = reader.ReadInt32(); //4.0 and up targetGlesGraphics - if (version[0] > 4 || (version[0] == 4 && version[1] >= 6)) //4.6 and up + if (version >= (4, 6)) //4.6 and up { var targetIOSGraphics = reader.ReadInt32(); } @@ -40,7 +40,7 @@ namespace AssetStudio var useOnDemandResources = reader.ReadBoolean(); reader.AlignStream(); } - if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 and up + if (version >= (3, 5)) //3.5 and up { var accelerometerFrequency = reader.ReadInt32(); } diff --git a/AssetStudio/Classes/Renderer.cs b/AssetStudio/Classes/Renderer.cs index 2899db0..a62f6d5 100644 --- a/AssetStudio/Classes/Renderer.cs +++ b/AssetStudio/Classes/Renderer.cs @@ -25,7 +25,7 @@ namespace AssetStudio protected Renderer(ObjectReader reader) : base(reader) { - if (version[0] < 5) //5.0 down + if (version < 5) //5.0 down { var m_Enabled = reader.ReadBoolean(); var m_CastShadows = reader.ReadBoolean(); @@ -34,27 +34,27 @@ namespace AssetStudio } else //5.0 and up { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + if (version >= (5, 4)) //5.4 and up { var m_Enabled = reader.ReadBoolean(); var m_CastShadows = reader.ReadByte(); var m_ReceiveShadows = reader.ReadByte(); - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up + if (version >= (2017, 2)) //2017.2 and up { var m_DynamicOccludee = reader.ReadByte(); } - if (version[0] >= 2021) //2021.1 and up + if (version >= 2021) //2021.1 and up { var m_StaticShadowCaster = reader.ReadByte(); } var m_MotionVectors = reader.ReadByte(); var m_LightProbeUsage = reader.ReadByte(); var m_ReflectionProbeUsage = reader.ReadByte(); - if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up + if (version >= (2019, 3)) //2019.3 and up { var m_RayTracingMode = reader.ReadByte(); } - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { var m_RayTraceProcedural = reader.ReadByte(); } @@ -69,12 +69,12 @@ namespace AssetStudio reader.AlignStream(); } - if (version[0] >= 2018) //2018 and up + if (version >= 2018) //2018 and up { var m_RenderingLayerMask = reader.ReadUInt32(); } - if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 3)) //2018.3 and up + if (version >= (2018, 3)) //2018.3 and up { var m_RendererPriority = reader.ReadInt32(); } @@ -83,12 +83,12 @@ namespace AssetStudio var m_LightmapIndexDynamic = reader.ReadUInt16(); } - if (version[0] >= 3) //3.0 and up + if (version >= 3) //3.0 and up { var m_LightmapTilingOffset = reader.ReadVector4(); } - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { var m_LightmapTilingOffsetDynamic = reader.ReadVector4(); } @@ -100,13 +100,13 @@ namespace AssetStudio m_Materials[i] = new PPtr(reader); } - if (version[0] < 3) //3.0 down + if (version < 3) //3.0 down { var m_LightmapTilingOffset = reader.ReadVector4(); } else //3.0 and up { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up + if (version >= (5, 5)) //5.5 and up { m_StaticBatchInfo = new StaticBatchInfo(reader); } @@ -118,17 +118,17 @@ namespace AssetStudio var m_StaticBatchRoot = new PPtr(reader); } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + if (version >= (5, 4)) //5.4 and up { var m_ProbeAnchor = new PPtr(reader); var m_LightProbeVolumeOverride = new PPtr(reader); } - else if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 - 5.3 + else if (version >= (3, 5)) //3.5 - 5.3 { var m_UseLightProbes = reader.ReadBoolean(); reader.AlignStream(); - if (version[0] >= 5)//5.0 and up + if (version >= 5)//5.0 and up { var m_ReflectionProbeUsage = reader.ReadInt32(); } @@ -136,9 +136,9 @@ namespace AssetStudio var m_LightProbeAnchor = new PPtr(reader); //5.0 and up m_ProbeAnchor } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { - if (version[0] == 4 && version[1] == 3) //4.3 + if (version == (4, 3)) //4.3 { var m_SortingLayer = reader.ReadInt16(); } diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index e0fbc41..f92aa78 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -243,14 +243,14 @@ namespace AssetStudio } rtSeparateBlend = reader.ReadBoolean(); reader.AlignStream(); - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up + if (version >= (2017, 2)) //2017.2 and up { zClip = new SerializedShaderFloatValue(reader); } zTest = new SerializedShaderFloatValue(reader); zWrite = new SerializedShaderFloatValue(reader); culling = new SerializedShaderFloatValue(reader); - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { conservative = new SerializedShaderFloatValue(reader); } @@ -359,7 +359,7 @@ namespace AssetStudio m_NameIndex = reader.ReadInt32(); m_Index = reader.ReadInt32(); m_SamplerIndex = reader.ReadInt32(); - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3)) //2017.3 and up + if (version >= (2017, 3)) //2017.3 and up { var m_MultiSampled = reader.ReadBoolean(); } @@ -380,7 +380,7 @@ namespace AssetStudio m_NameIndex = reader.ReadInt32(); m_Index = reader.ReadInt32(); - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { m_ArraySize = reader.ReadInt32(); } @@ -415,7 +415,7 @@ namespace AssetStudio { m_VectorParams[i] = new VectorParameter(reader); } - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3)) //2017.3 and up + if (version >= (2017, 3)) //2017.3 and up { int numStructParams = reader.ReadInt32(); m_StructParams = new StructParameter[numStructParams]; @@ -426,11 +426,8 @@ namespace AssetStudio } m_Size = reader.ReadInt32(); - if ((version[0] == 2020 && version[1] > 3) || - (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up - (version[0] > 2021) || - (version[0] == 2021 && version[1] > 1) || - (version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 and up + if (version.IsInRange((2020, 3, 2), 2021) //2020.3.2f1 and up + || version >= (2021, 1, 4)) //2021.1.4f1 and up { m_IsPartialCB = reader.ReadBoolean(); reader.AlignStream(); @@ -584,7 +581,7 @@ namespace AssetStudio m_BlobIndex = reader.ReadUInt32(); m_Channels = new ParserBindChannels(reader); - if ((version[0] >= 2019 && version[0] < 2021) || (version[0] == 2021 && version[1] < 2)) //2019 ~2021.1 + if (version.IsInRange(2019, (2021, 2))) //2019 ~2021.1 { var m_GlobalKeywordIndices = reader.ReadUInt16Array(); reader.AlignStream(); @@ -594,7 +591,7 @@ namespace AssetStudio else { m_KeywordIndices = reader.ReadUInt16Array(); - if (version[0] >= 2017) //2017 and up + if (version >= 2017) //2017 and up { reader.AlignStream(); } @@ -604,11 +601,8 @@ namespace AssetStudio m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte(); reader.AlignStream(); - if ((version[0] == 2020 && version[1] > 3) || - (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up - (version[0] > 2021) || - (version[0] == 2021 && version[1] > 1) || - (version[0] == 2021 && version[1] == 1 && version[2] >= 1)) //2021.1.1f1 and up + if (version.IsInRange((2020, 3, 2), 2021) //2020.3.2f1 and up + || version >= (2021, 1, 1)) //2021.1.1f1 and up { m_Parameters = new SerializedProgramParameters(reader); } @@ -663,7 +657,7 @@ namespace AssetStudio m_UAVParams[i] = new UAVParameter(reader); } - if (version[0] >= 2017) //2017 and up + if (version >= 2017) //2017 and up { int numSamplers = reader.ReadInt32(); m_Samplers = new SamplerParameter[numSamplers]; @@ -674,9 +668,9 @@ namespace AssetStudio } } - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up + if (version >= (2017, 2)) //2017.2 and up { - if (version[0] >= 2021) //2021.1 and up + if (version >= 2021) //2021.1 and up { var m_ShaderRequirements = reader.ReadInt64(); } @@ -705,16 +699,13 @@ namespace AssetStudio m_SubPrograms[i] = new SerializedSubProgram(reader); } - if ((version[0] == 2020 && version[1] > 3) || - (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up - (version[0] > 2021) || - (version[0] == 2021 && version[1] > 1) || - (version[0] == 2021 && version[1] == 1 && version[2] >= 1)) //2021.1.1f1 and up + if (version.IsInRange((2020, 3, 2), 2021) //2020.3.2f1 and up + || version >= (2021, 1, 1)) //2021.1.1f1 and up { m_CommonParameters = new SerializedProgramParameters(reader); } - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 1)) //2022.1 and up + if (version >= (2022, 1)) //2022.1 and up { m_SerializedKeywordStateMask = reader.ReadUInt16Array(); reader.AlignStream(); @@ -756,7 +747,7 @@ namespace AssetStudio { var version = reader.version; - if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up + if (version >= (2020, 2)) //2020.2 and up { int numEditorDataHash = reader.ReadInt32(); m_EditorDataHash = new Hash128[numEditorDataHash]; @@ -767,7 +758,7 @@ namespace AssetStudio reader.AlignStream(); m_Platforms = reader.ReadUInt8Array(); reader.AlignStream(); - if (version[0] < 2021 || (version[0] == 2021 && version[1] < 2)) //2021.1 and down + if (version <= (2021, 1)) //2021.1 and down { m_LocalKeywordMask = reader.ReadUInt16Array(); reader.AlignStream(); @@ -791,12 +782,12 @@ namespace AssetStudio progGeometry = new SerializedProgram(reader); progHull = new SerializedProgram(reader); progDomain = new SerializedProgram(reader); - if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up + if (version >= (2019, 3)) //2019.3 and up { progRayTracing = new SerializedProgram(reader); } m_HasInstancingVariant = reader.ReadBoolean(); - if (version[0] >= 2018) //2018 and up + if (version >= 2018) //2018 and up { var m_HasProceduralInstancingVariant = reader.ReadBoolean(); } @@ -805,7 +796,7 @@ namespace AssetStudio m_Name = reader.ReadAlignedString(); m_TextureName = reader.ReadAlignedString(); m_Tags = new SerializedTagMap(reader); - if (version[0] == 2021 && version[1] >= 2) //2021.2 ~2021.x + if (version == 2021 && version.Minor >= 2) //2021.2 ~2021.x { m_SerializedKeywordStateMask = reader.ReadUInt16Array(); reader.AlignStream(); @@ -898,7 +889,7 @@ namespace AssetStudio m_SubShaders[i] = new SerializedSubShader(reader); } - if (version[0] > 2021 || (version[0] == 2021 && version[1] >= 2)) //2021.2 and up + if (version >= (2021, 2)) //2021.2 and up { m_KeywordNames = reader.ReadStringArray(); m_KeywordFlags = reader.ReadUInt8Array(); @@ -916,7 +907,7 @@ namespace AssetStudio m_Dependencies[i] = new SerializedShaderDependency(reader); } - if (version[0] >= 2021) //2021.1 and up + if (version >= 2021) //2021.1 and up { int m_CustomEditorForRenderPipelinesSize = reader.ReadInt32(); m_CustomEditorForRenderPipelines = new SerializedCustomEditorForRenderPipeline[m_CustomEditorForRenderPipelinesSize]; @@ -977,11 +968,11 @@ namespace AssetStudio public Shader(ObjectReader reader) : base(reader) { - if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up + if (version >= (5, 5)) //5.5 and up { m_ParsedForm = new SerializedShader(reader); platforms = reader.ReadUInt32Array().Select(x => (ShaderCompilerPlatform)x).ToArray(); - if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up + if (version >= (2019, 3)) //2019.3 and up { offsets = reader.ReadUInt32ArrayArray(); compressedLengths = reader.ReadUInt32ArrayArray(); @@ -1002,7 +993,7 @@ namespace AssetStudio new PPtr(reader); } - if (version[0] >= 2018) + if (version >= 2018) { var m_NonModifiableTexturesCount = reader.ReadInt32(); for (int i = 0; i < m_NonModifiableTexturesCount; i++) @@ -1020,7 +1011,7 @@ namespace AssetStudio m_Script = reader.ReadUInt8Array(); reader.AlignStream(); var m_PathName = reader.ReadAlignedString(); - if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4 + if (version == 5 && version.Minor >= 3) //5.3 - 5.4 { decompressedSize = reader.ReadUInt32(); m_SubProgramBlob = reader.ReadUInt8Array(); diff --git a/AssetStudio/Classes/SkinnedMeshRenderer.cs b/AssetStudio/Classes/SkinnedMeshRenderer.cs index d45f29e..000de6a 100644 --- a/AssetStudio/Classes/SkinnedMeshRenderer.cs +++ b/AssetStudio/Classes/SkinnedMeshRenderer.cs @@ -18,7 +18,7 @@ namespace AssetStudio var m_SkinNormals = reader.ReadBoolean(); //3.1.0 and below reader.AlignStream(); - if (version[0] == 2 && version[1] < 6) //2.6 down + if (version < (2, 6)) //2.6 down { var m_DisableAnimationWhenOffscreen = new PPtr(reader); } @@ -31,7 +31,7 @@ namespace AssetStudio m_Bones[b] = new PPtr(reader); } - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (version >= (4, 3)) //4.3 and up { m_BlendShapeWeights = reader.ReadSingleArray(); } diff --git a/AssetStudio/Classes/Sprite.cs b/AssetStudio/Classes/Sprite.cs index 2e597e6..6f5eaa4 100644 --- a/AssetStudio/Classes/Sprite.cs +++ b/AssetStudio/Classes/Sprite.cs @@ -68,7 +68,7 @@ namespace AssetStudio var version = reader.version; pos = reader.ReadVector3(); - if (version[0] < 4 || (version[0] == 4 && version[1] <= 3)) //4.3 and down + if (version <= (4, 3)) //4.3 and down { uv = reader.ReadVector2(); } @@ -99,12 +99,12 @@ namespace AssetStudio var version = reader.version; texture = new PPtr(reader); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 2)) //5.2 and up + if (version >= (5, 2)) //5.2 and up { alphaTexture = new PPtr(reader); } - if (version[0] >= 2019) //2019 and up + if (version >= 2019) //2019 and up { var secondaryTexturesSize = reader.ReadInt32(); secondaryTextures = new SecondarySpriteTexture[secondaryTexturesSize]; @@ -114,7 +114,7 @@ namespace AssetStudio } } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + if (version >= (5, 6)) //5.6 and up { var m_SubMeshesSize = reader.ReadInt32(); m_SubMeshes = new SubMesh[m_SubMeshesSize]; @@ -141,11 +141,11 @@ namespace AssetStudio reader.AlignStream(); } - if (version[0] >= 2018) //2018 and up + if (version >= 2018) //2018 and up { m_Bindpose = reader.ReadMatrixArray(); - if (version[0] == 2018 && version[1] < 2) //2018.2 down + if (version < (2018, 2)) //2018.2 down { var m_SourceSkinSize = reader.ReadInt32(); for (int i = 0; i < m_SourceSkinSize; i++) @@ -157,18 +157,18 @@ namespace AssetStudio textureRect = new Rectf(reader); textureRectOffset = reader.ReadVector2(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + if (version >= (5, 6)) //5.6 and up { atlasRectOffset = reader.ReadVector2(); } settingsRaw = new SpriteSettings(reader); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up + if (version >= (4, 5)) //4.5 and up { uvTransform = reader.ReadVector4(); } - if (version[0] >= 2017) //2017 and up + if (version >= 2017) //2017 and up { downscaleMultiplier = reader.ReadSingle(); } @@ -210,28 +210,26 @@ namespace AssetStudio { m_Rect = new Rectf(reader); m_Offset = reader.ReadVector2(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up + if (version >= (4, 5)) //4.5 and up { m_Border = reader.ReadVector4(); } m_PixelsToUnits = reader.ReadSingle(); - if (version[0] > 5 - || (version[0] == 5 && version[1] > 4) - || (version[0] == 5 && version[1] == 4 && version[2] >= 2) - || (version[0] == 5 && version[1] == 4 && version[2] == 1 && buildType.IsPatch && version[3] >= 3)) //5.4.1p3 and up + if (version >= (5, 4, 2) + || version == (5, 4, 1) && buildType.IsPatch && version.Build >= 3) //5.4.1p3 and up { m_Pivot = reader.ReadVector2(); } m_Extrude = reader.ReadUInt32(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 3)) //5.3 and up + if (version >= (5, 3)) //5.3 and up { m_IsPolygon = reader.ReadBoolean(); reader.AlignStream(); } - if (version[0] >= 2017) //2017 and up + if (version >= 2017) //2017 and up { var first = new Guid(reader.ReadBytes(16)); var second = reader.ReadInt64(); @@ -244,7 +242,7 @@ namespace AssetStudio m_RD = new SpriteRenderData(reader); - if (version[0] >= 2017) //2017 and up + if (version >= 2017) //2017 and up { var m_PhysicsShapeSize = reader.ReadInt32(); m_PhysicsShape = new Vector2[m_PhysicsShapeSize][]; diff --git a/AssetStudio/Classes/SpriteAtlas.cs b/AssetStudio/Classes/SpriteAtlas.cs index c1a97c5..dfe34a5 100644 --- a/AssetStudio/Classes/SpriteAtlas.cs +++ b/AssetStudio/Classes/SpriteAtlas.cs @@ -22,14 +22,14 @@ namespace AssetStudio alphaTexture = new PPtr(reader); textureRect = new Rectf(reader); textureRectOffset = reader.ReadVector2(); - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up + if (version >= (2017, 2)) //2017.2 and up { atlasRectOffset = reader.ReadVector2(); } uvTransform = reader.ReadVector4(); downscaleMultiplier = reader.ReadSingle(); settingsRaw = new SpriteSettings(reader); - if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up + if (version >= (2020, 2)) //2020.2 and up { var secondaryTexturesSize = reader.ReadInt32(); secondaryTextures = new SecondarySpriteTexture[secondaryTexturesSize]; diff --git a/AssetStudio/Classes/StreamingInfo.cs b/AssetStudio/Classes/StreamingInfo.cs index 535621b..a78a2a2 100644 --- a/AssetStudio/Classes/StreamingInfo.cs +++ b/AssetStudio/Classes/StreamingInfo.cs @@ -12,7 +12,7 @@ { var version = reader.version; - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { offset = reader.ReadInt64(); } diff --git a/AssetStudio/Classes/Texture.cs b/AssetStudio/Classes/Texture.cs index 42f3f5f..43c2608 100644 --- a/AssetStudio/Classes/Texture.cs +++ b/AssetStudio/Classes/Texture.cs @@ -6,15 +6,15 @@ protected Texture(ObjectReader reader) : base(reader) { - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3)) //2017.3 and up + if (version >= (2017, 3)) //2017.3 and up { - if (version[0] < 2023 || (version[0] == 2023 && version[1] < 2)) //2023.2 down + if (version < (2023, 2)) //2023.2 down { var m_ForcedFallbackFormat = reader.ReadInt32(); var m_DownscaleFallback = reader.ReadBoolean(); } - if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up + if (version >= (2020, 2)) //2020.2 and up { var m_IsAlphaChannelOptional = reader.ReadBoolean(); } diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index b21d5fc..74a4a55 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -78,12 +78,12 @@ namespace AssetStudio m_Width = reader.ReadInt32(); m_Height = reader.ReadInt32(); m_CompleteImageSize = reader.ReadInt32(); - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { var m_MipsStripped = reader.ReadInt32(); } m_TextureFormat = (TextureFormat)reader.ReadInt32(); - if (version[0] < 5 || (version[0] == 5 && version[1] < 2)) //5.2 down + if (version < (5, 2)) //5.2 down { m_MipMap = reader.ReadBoolean(); } @@ -91,17 +91,17 @@ namespace AssetStudio { m_MipCount = reader.ReadInt32(); } - if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and up + if (version >= (2, 6)) //2.6.0 and up { var m_IsReadable = reader.ReadBoolean(); } - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { var m_IsPreProcessed = reader.ReadBoolean(); } - if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up + if (version >= (2019, 3)) //2019.3 and up { - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 2)) //2022.2 and up + if (version >= (2022, 2)) //2022.2 and up { var m_IgnoreMipmapLimit = reader.ReadBoolean(); reader.AlignStream(); @@ -111,38 +111,35 @@ namespace AssetStudio var m_IgnoreMasterTextureLimit = reader.ReadBoolean(); } } - if (version[0] >= 3) //3.0.0 - 5.4 + if (version.IsInRange(3, (5, 5))) //3.0.0 - 5.4 { - if (version[0] < 5 || (version[0] == 5 && version[1] <= 4)) - { - var m_ReadAllowed = reader.ReadBoolean(); - } + var m_ReadAllowed = reader.ReadBoolean(); } - if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 2)) //2022.2 and up + if (version >= (2022, 2)) //2022.2 and up { var m_MipmapLimitGroupName = reader.ReadAlignedString(); } - if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up + if (version >= (2018, 2)) //2018.2 and up { var m_StreamingMipmaps = reader.ReadBoolean(); } reader.AlignStream(); - if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up + if (version >= (2018, 2)) //2018.2 and up { var m_StreamingMipmapsPriority = reader.ReadInt32(); } m_ImageCount = reader.ReadInt32(); var m_TextureDimension = reader.ReadInt32(); m_TextureSettings = new GLTextureSettings(reader); - if (version[0] >= 3) //3.0 and up + if (version >= 3) //3.0 and up { var m_LightmapFormat = reader.ReadInt32(); } - if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5.0 and up + if (version >= (3, 5)) //3.5.0 and up { var m_ColorSpace = reader.ReadInt32(); } - if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up + if (version >= (2020, 2)) //2020.2 and up { m_PlatformBlob = reader.ReadUInt8Array(); reader.AlignStream(); @@ -152,7 +149,7 @@ namespace AssetStudio m_PlatformBlob = Array.Empty(); } var image_data_size = reader.ReadInt32(); - if (image_data_size == 0 && ((version[0] == 5 && version[1] >= 3) || version[0] > 5))//5.3.0 and up + if (image_data_size == 0 && version >= (5, 3))//5.3.0 and up { m_StreamData = new StreamingInfo(reader); } diff --git a/AssetStudio/Classes/Texture2DArray.cs b/AssetStudio/Classes/Texture2DArray.cs index 59fcca5..4d3070f 100644 --- a/AssetStudio/Classes/Texture2DArray.cs +++ b/AssetStudio/Classes/Texture2DArray.cs @@ -30,7 +30,7 @@ namespace AssetStudio m_MipCount = reader.ReadInt32(); m_DataSize = reader.ReadUInt32(); m_TextureSettings = new GLTextureSettings(reader); - if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up + if (version >= (2020, 2)) //2020.2 and up { var m_UsageMode = reader.ReadInt32(); } diff --git a/AssetStudio/Classes/VideoClip.cs b/AssetStudio/Classes/VideoClip.cs index d29ce0f..bd73648 100644 --- a/AssetStudio/Classes/VideoClip.cs +++ b/AssetStudio/Classes/VideoClip.cs @@ -34,7 +34,7 @@ namespace AssetStudio var m_ProxyHeight = reader.ReadUInt32(); Width = reader.ReadUInt32(); Height = reader.ReadUInt32(); - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up + if (version >= (2017, 2)) //2017.2 and up { var m_PixelAspecRatioNum = reader.ReadUInt32(); var m_PixelAspecRatioDen = reader.ReadUInt32(); @@ -46,7 +46,7 @@ namespace AssetStudio reader.AlignStream(); var m_AudioSampleRate = reader.ReadUInt32Array(); var m_AudioLanguage = reader.ReadStringArray(); - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { var m_VideoShadersSize = reader.ReadInt32(); var m_VideoShaders = new PPtr[m_VideoShadersSize]; @@ -57,7 +57,7 @@ namespace AssetStudio } m_ExternalResources = new StreamedResource(reader); m_HasSplitAlpha = reader.ReadBoolean(); - if (version[0] >= 2020) //2020.1 and up + if (version >= 2020) //2020.1 and up { var m_sRGB = reader.ReadBoolean(); } diff --git a/AssetStudio/ObjectReader.cs b/AssetStudio/ObjectReader.cs index deb253b..d0580db 100644 --- a/AssetStudio/ObjectReader.cs +++ b/AssetStudio/ObjectReader.cs @@ -17,7 +17,7 @@ namespace AssetStudio public BuildTarget platform; public SerializedFileFormatVersion m_Version; - public int[] version => assetsFile.version; + public UnityVersion version => assetsFile.version; public BuildType buildType => assetsFile.buildType; public ObjectReader(EndianBinaryReader reader, SerializedFile assetsFile, ObjectInfo objectInfo) : base(reader.BaseStream, reader.Endian) diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index 43fc660..e1b26c6 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -13,7 +13,7 @@ namespace AssetStudio public string fullName; public string originalPath; public string fileName; - public int[] version = { 0, 0, 0, 0 }; + public UnityVersion version = new UnityVersion(); public BuildType buildType; public List Objects; public Dictionary ObjectsDic; @@ -73,7 +73,7 @@ namespace AssetStudio if (header.m_Version >= SerializedFileFormatVersion.Unknown_7) { unityVersion = reader.ReadStringToNull(); - SetVersion(unityVersion); + SetVersion(new UnityVersion(unityVersion)); } if (header.m_Version >= SerializedFileFormatVersion.Unknown_8) { @@ -217,19 +217,13 @@ namespace AssetStudio //reader.AlignStream(16); } - public void SetVersion(string stringVersion) + public void SetVersion(UnityVersion unityVer) { - if (stringVersion != strippedVersion) + if (unityVer != null && !unityVer.IsStripped) { - unityVersion = stringVersion; - var buildSplit = Regex.Replace(stringVersion, @"\d", "").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries); - if (buildSplit.Length == 0) - throw new NotSupportedException("Specified Unity version is not in a correct format.\n" + - "Specify full Unity version, including letters at the end.\n" + - "Example: 2017.4.39f1"); - buildType = new BuildType(buildSplit[0]); - var versionSplit = Regex.Replace(stringVersion, @"\D", ".").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries); - version = versionSplit.Select(int.Parse).ToArray(); + unityVersion = unityVer.FullVersion; + buildType = new BuildType(unityVer.BuildType); + version = unityVer; } } @@ -377,9 +371,5 @@ namespace AssetStudio Objects.Add(obj); ObjectsDic.Add(obj.m_PathID, obj); } - - public bool IsVersionStripped => unityVersion == strippedVersion; - - private const string strippedVersion = "0.0.0"; } } diff --git a/AssetStudio/UnityVersion.cs b/AssetStudio/UnityVersion.cs new file mode 100644 index 0000000..5a957d6 --- /dev/null +++ b/AssetStudio/UnityVersion.cs @@ -0,0 +1,449 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; + +namespace AssetStudio +{ + public class UnityVersion : IComparable + { + public int Major { get; } + public int Minor { get; } + public int Patch { get; } + public int Build { get; } + public string BuildType { get; } + public string FullVersion { get; } + + public bool IsStripped => this == (0, 0, 0); + + public UnityVersion(string version) + { + if (string.IsNullOrEmpty(version)) + throw new ArgumentException("Unity version cannot be empty."); + + try + { + int[] ver = Regex.Matches(version, @"\d+").Cast().Select(x => int.Parse(x.Value)).ToArray(); + (Major, Minor, Patch) = (ver[0], ver[1], ver[2]); + if (ver.Length == 4) + Build = ver[3]; + FullVersion = version; + } + catch (Exception) + { + throw new NotSupportedException($"Failed to parse Unity version: \"{version}\"."); + } + + string[] build = Regex.Matches(version, @"\D+").Cast().Select(x => x.Value).ToArray(); + if (build.Length > 2) + { + BuildType = build[2]; + } + } + + public UnityVersion(int major = 0, int minor = 0, int patch = 0) + { + (Major, Minor, Patch) = (major, minor, patch); + FullVersion = $"{Major}.{Minor}.{Patch}"; + if (!IsStripped) + { + Build = 1; + BuildType = "f"; + FullVersion += $"{BuildType}{Build}"; + } + } + + #region UnityVer, UnityVer + public static bool operator ==(UnityVersion left, UnityVersion right) + { + return Equals(left, right); + } + + public static bool operator !=(UnityVersion left, UnityVersion right) + { + return !Equals(left, right); + } + + public static bool operator >(UnityVersion left, UnityVersion right) + { + return left?.CompareTo(right) > 0; + } + + public static bool operator <(UnityVersion left, UnityVersion right) + { + return left?.CompareTo(right) < 0; + } + + public static bool operator >=(UnityVersion left, UnityVersion right) + { + return left == right || left > right; + } + + public static bool operator <=(UnityVersion left, UnityVersion right) + { + return left == right || left < right; + } + #endregion + + #region UnityVer, int + public static bool operator ==(UnityVersion left, int right) + { + return left?.Major == right; + } + + public static bool operator !=(UnityVersion left, int right) + { + return left?.Major != right; + } + + public static bool operator >(UnityVersion left, int right) + { + return left?.Major > right; + } + + public static bool operator <(UnityVersion left, int right) + { + return left?.Major < right; + } + + public static bool operator >=(UnityVersion left, int right) + { + return left?.Major >= right; + } + + public static bool operator <=(UnityVersion left, int right) + { + return left?.Major <= right; + } + #endregion + + #region UnityVer, (int, int) + public static bool operator ==(UnityVersion left, (int, int) right) + { + return (left?.Major, left?.Minor) == (right.Item1, right.Item2); + } + + public static bool operator !=(UnityVersion left, (int, int) right) + { + return (left?.Major, left?.Minor) != (right.Item1, right.Item2); + } + + public static bool operator >(UnityVersion left, (int, int) right) + { + return left?.CompareTo(right) > 0; + } + + public static bool operator <(UnityVersion left, (int, int) right) + { + return left?.CompareTo(right) < 0; + } + + public static bool operator >=(UnityVersion left, (int, int) right) + { + return left == right || left > right; + } + + public static bool operator <=(UnityVersion left, (int, int) right) + { + return left == right || left < right; + } + #endregion + + #region UnityVer, (int, int, int) + public static bool operator ==(UnityVersion left, (int, int, int) right) + { + return (left?.Major, left?.Minor, left?.Patch) == (right.Item1, right.Item2, right.Item3); + } + + public static bool operator !=(UnityVersion left, (int, int, int) right) + { + return (left?.Major, left?.Minor, left?.Patch) != (right.Item1, right.Item2, right.Item3); + } + + public static bool operator >(UnityVersion left, (int, int, int) right) + { + return left?.CompareTo(right) > 0; + } + + public static bool operator <(UnityVersion left, (int, int, int) right) + { + return left?.CompareTo(right) < 0; + } + + public static bool operator >=(UnityVersion left, (int, int, int) right) + { + return left == right || left > right; + } + + public static bool operator <=(UnityVersion left, (int, int, int) right) + { + return left == right || left < right; + } + #endregion + + #region int, UnityVer + public static bool operator ==(int left, UnityVersion right) + { + return left == right?.Major; + } + + public static bool operator !=(int left, UnityVersion right) + { + return left != right?.Major; + } + + public static bool operator >(int left, UnityVersion right) + { + return left > right?.Major; + } + + public static bool operator <(int left, UnityVersion right) + { + return left < right?.Major; + } + + public static bool operator >=(int left, UnityVersion right) + { + return left >= right?.Major; + } + + public static bool operator <=(int left, UnityVersion right) + { + return left <= right?.Major; + } + #endregion + + #region (int, int), UnityVer + public static bool operator ==((int, int) left, UnityVersion right) + { + return (left.Item1, left.Item2) == (right?.Major, right?.Minor); + } + + public static bool operator !=((int, int) left, UnityVersion right) + { + return (left.Item1, left.Item2) != (right?.Major, right?.Minor); + } + + public static bool operator >((int, int) left, UnityVersion right) + { + return right?.CompareTo(left) < 0; + } + + public static bool operator <((int, int) left, UnityVersion right) + { + return right?.CompareTo(left) > 0; + } + + public static bool operator >=((int, int) left, UnityVersion right) + { + return left == right || left > right; + } + + public static bool operator <=((int, int) left, UnityVersion right) + { + return left == right || left < right; + } + #endregion + + #region (int, int, int), UnityVer + public static bool operator ==((int, int, int) left, UnityVersion right) + { + return (left.Item1, left.Item2, left.Item3) == (right?.Major, right?.Minor, right?.Patch); + } + + public static bool operator !=((int, int, int) left, UnityVersion right) + { + return (left.Item1, left.Item2, left.Item3) != (right?.Major, right?.Minor, right?.Patch); + } + + public static bool operator >((int, int, int) left, UnityVersion right) + { + return right?.CompareTo(left) < 0; + } + + public static bool operator <((int, int, int) left, UnityVersion right) + { + return right?.CompareTo(left) > 0; + } + + public static bool operator >=((int, int, int) left, UnityVersion right) + { + return left == right || left > right; + } + + public static bool operator <=((int, int, int) left, UnityVersion right) + { + return left == right || left < right; + } + #endregion + + private int CompareTo((int, int) other) + { + var result = Major.CompareTo(other.Item1); + if (result != 0) + { + return result; + } + + result = Minor.CompareTo(other.Item2); + if (result != 0) + { + return result; + } + + return 0; + } + + private int CompareTo((int, int, int) other) + { + var result = CompareTo((other.Item1, other.Item2)); + if (result != 0) + { + return result; + } + + result = Patch.CompareTo(other.Item3); + if (result != 0) + { + return result; + } + + return 0; + } + + private int CompareTo(UnityVersion other) + { + return CompareTo((other.Major, other.Minor, other.Patch)); + } + + private bool Equals(UnityVersion other) + { + return (Major, Minor, Patch) == (other.Major, other.Minor, other.Patch); + } + + public override bool Equals(object other) + { + return other is UnityVersion otherUnityVer && Equals(otherUnityVer); + } + + public override int GetHashCode() + { + var result = Major * 31; + result = result * 31 + Minor; + result = result * 31 + Patch; + result = result * 31 + Build; + + return result.GetHashCode(); + } + + public int CompareTo(object obj) + { + return CompareTo((UnityVersion)obj); + } + + public sealed override string ToString() + { + return FullVersion; + } + + public Tuple ToTuple() + { + return new Tuple(Major, Minor, Patch); + } + + public int[] ToArray() + { + return new[] {Major, Minor, Patch}; + } + } + + public static class UnityVersionExtensions + { + /// + /// Checks if the Unity version is within the range limits specified by the "lowerLimit" and "upperLimit" attributes. + /// + /// + /// Minimal version. Included in the range. + /// Maximal version. Not included in the range. + /// if the Unity version is within the specified range; otherwise . + /// [lowerLimit, upperLimit) + public static bool IsInRange(this UnityVersion ver, UnityVersion lowerLimit, UnityVersion upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, int lowerLimit, UnityVersion upperLimit) + { + return ver.Major >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int) lowerLimit, UnityVersion upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int, int) lowerLimit, UnityVersion upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, UnityVersion lowerLimit, int upperLimit) + { + return ver >= lowerLimit && ver.Major < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, UnityVersion lowerLimit, (int, int) upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, UnityVersion lowerLimit, (int, int, int) upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, int lowerLimit, int upperLimit) + { + return ver.Major >= lowerLimit && ver.Major < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, int lowerLimit, (int, int) upperLimit) + { + return ver.Major >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, int lowerLimit, (int, int, int) upperLimit) + { + return ver.Major >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int) lowerLimit, int upperLimit) + { + return ver >= lowerLimit && ver.Major < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int, int) lowerLimit, int upperLimit) + { + return ver >= lowerLimit && ver.Major < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int) lowerLimit, (int, int) upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int) lowerLimit, (int, int, int) upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int, int) lowerLimit, (int, int) upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + + public static bool IsInRange(this UnityVersion ver, (int, int, int) lowerLimit, (int, int, int) upperLimit) + { + return ver >= lowerLimit && ver < upperLimit; + } + } +} diff --git a/AssetStudioCLI/Options/CLIOptions.cs b/AssetStudioCLI/Options/CLIOptions.cs index 12f24b5..a839f81 100644 --- a/AssetStudioCLI/Options/CLIOptions.cs +++ b/AssetStudioCLI/Options/CLIOptions.cs @@ -115,7 +115,7 @@ namespace AssetStudioCLI.Options public static Option o_maxParallelExportTasks; public static Option o_exportAssetList; public static Option o_assemblyPath; - public static Option o_unityVersion; + public static Option o_unityVersion; public static Option f_notRestoreExtensionName; public static Option f_avoidLoadingViaTypetree; public static Option f_loadAllAssets; @@ -427,9 +427,9 @@ namespace AssetStudioCLI.Options optionExample: "", optionHelpGroup: HelpGroups.Advanced ); - o_unityVersion = new GroupedOption + o_unityVersion = new GroupedOption ( - optionDefaultValue: "", + optionDefaultValue: null, optionName: "--unity-version ", optionDescription: "Specify Unity version\n", optionExample: "Example: \"--unity-version 2017.4.39f1\"\n", @@ -970,7 +970,16 @@ namespace AssetStudioCLI.Options } break; case "--unity-version": - o_unityVersion.Value = value; + try + { + o_unityVersion.Value = new UnityVersion(value); + } + catch (Exception e) + { + Console.WriteLine($"{"Error".Color(brightRed)} during parsing [{option.Color(brightYellow)}] option with value [{value.Color(brightRed)}].\n{e.Message}\n"); + ShowOptionDescription(o_unityVersion); + return; + } break; default: Console.WriteLine($"{"Error:".Color(brightRed)} Unknown option [{option.Color(brightRed)}].\n"); diff --git a/AssetStudioCLI/ParallelExporter.cs b/AssetStudioCLI/ParallelExporter.cs index a5c49ae..91b87b5 100644 --- a/AssetStudioCLI/ParallelExporter.cs +++ b/AssetStudioCLI/ParallelExporter.cs @@ -118,7 +118,7 @@ namespace AssetStudioCLI { var sb = new StringBuilder(); sb.AppendLine($"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav.."); - sb.AppendLine(m_AudioClip.version[0] < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}"); + sb.AppendLine(m_AudioClip.version < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}"); sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}"); sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}"); sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}"); @@ -143,7 +143,7 @@ namespace AssetStudioCLI { var sb = new StringBuilder(); sb.AppendLine($"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\".."); - sb.AppendLine(m_AudioClip.version[0] < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}"); + sb.AppendLine(m_AudioClip.version < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}"); sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}"); sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}"); sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}"); diff --git a/AssetStudioCLI/Studio.cs b/AssetStudioCLI/Studio.cs index d697e29..0706502 100644 --- a/AssetStudioCLI/Studio.cs +++ b/AssetStudioCLI/Studio.cs @@ -208,7 +208,7 @@ namespace AssetStudioCLI var log = $"Finished loading {assetsManager.assetsFileList.Count} files with {parsedAssetsList.Count} exportable assets"; var unityVer = assetsManager.assetsFileList[0].version; long m_ObjectsCount; - if (unityVer[0] > 2020) + if (unityVer > 2020) { m_ObjectsCount = assetsManager.assetsFileList.Sum(x => x.m_Objects.LongCount(y => y.classID != (int)ClassIDType.Shader diff --git a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs index 22dd2e1..476d7e3 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs @@ -316,7 +316,7 @@ this.customCompressionZstdToolStripMenuItem.CheckOnClick = true; this.customCompressionZstdToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.customCompressionZstdToolStripMenuItem.Name = "customCompressionZstdToolStripMenuItem"; - this.customCompressionZstdToolStripMenuItem.Size = new System.Drawing.Size(130, 22); + this.customCompressionZstdToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.customCompressionZstdToolStripMenuItem.Text = "Zstd"; this.customCompressionZstdToolStripMenuItem.ToolTipText = "If selected, Zstd-decompression will be used for assets with custom compression t" + "ype"; @@ -326,7 +326,7 @@ // this.customCompressionLZ4ToolStripMenuItem.CheckOnClick = true; this.customCompressionLZ4ToolStripMenuItem.Name = "customCompressionLZ4ToolStripMenuItem"; - this.customCompressionLZ4ToolStripMenuItem.Size = new System.Drawing.Size(130, 22); + this.customCompressionLZ4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.customCompressionLZ4ToolStripMenuItem.Text = "Lz4/Lz4HC"; this.customCompressionLZ4ToolStripMenuItem.ToolTipText = "If selected, Lz4-decompression will be used for assets with custom compression ty" + "pe"; @@ -339,6 +339,7 @@ this.toolStripMenuItem14.Name = "toolStripMenuItem14"; this.toolStripMenuItem14.Size = new System.Drawing.Size(213, 22); this.toolStripMenuItem14.Text = "Specify Unity version"; + this.toolStripMenuItem14.DropDownClosed += new System.EventHandler(this.specifyUnityVersion_Close); // // specifyUnityVersion // diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 1e03886..f07b7b5 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -172,7 +172,6 @@ namespace AssetStudioGUI } } } - assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text; await Task.Run(() => assetsManager.LoadFilesAndFolders(out openDirectoryBackup, paths)); saveDirectoryBackup = openDirectoryBackup; BuildAssetStructures(); @@ -184,7 +183,6 @@ namespace AssetStudioGUI if (openFileDialog1.ShowDialog(this) == DialogResult.OK) { ResetForm(); - assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text; await Task.Run(() => assetsManager.LoadFilesAndFolders(out openDirectoryBackup, openFileDialog1.FileNames)); BuildAssetStructures(); } @@ -197,12 +195,29 @@ namespace AssetStudioGUI if (openFolderDialog.ShowDialog(this) == DialogResult.OK) { ResetForm(); - assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text; await Task.Run(() => assetsManager.LoadFilesAndFolders(out openDirectoryBackup, openFolderDialog.Folder)); BuildAssetStructures(); } } + private void specifyUnityVersion_Close(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(specifyUnityVersion.Text)) + { + assetsManager.SpecifyUnityVersion = null; + return; + } + + try + { + assetsManager.SpecifyUnityVersion = new UnityVersion(specifyUnityVersion.Text); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } + } + private async void extractFileToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog(this) == DialogResult.OK) @@ -288,7 +303,7 @@ namespace AssetStudioGUI allToolStripMenuItem.Checked = true; var log = $"Finished loading {assetsManager.assetsFileList.Count} file(s) with {assetListView.Items.Count} exportable assets"; var unityVer = assetsManager.assetsFileList[0].version; - var m_ObjectsCount = unityVer[0] > 2020 ? + var m_ObjectsCount = unityVer > 2020 ? assetsManager.assetsFileList.Sum(x => x.m_Objects.LongCount(y => y.classID != (int)ClassIDType.Shader)) : assetsManager.assetsFileList.Sum(x => x.m_Objects.Count); var objectsCount = assetsManager.assetsFileList.Sum(x => x.Objects.Count); @@ -948,7 +963,7 @@ namespace AssetStudioGUI { //Info assetItem.InfoText = "Compression format: "; - if (m_AudioClip.version[0] < 5) + if (m_AudioClip.version < 5) { switch (m_AudioClip.m_Type) { diff --git a/AssetStudioGUI/ParallelExport.cs b/AssetStudioGUI/ParallelExport.cs index 77a33f0..ab622fe 100644 --- a/AssetStudioGUI/ParallelExport.cs +++ b/AssetStudioGUI/ParallelExport.cs @@ -117,7 +117,7 @@ namespace AssetStudioGUI { var sb = new StringBuilder(); sb.AppendLine($"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav.."); - sb.AppendLine(m_AudioClip.version[0] < 5 + sb.AppendLine(m_AudioClip.version < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}"); sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}"); @@ -144,7 +144,7 @@ namespace AssetStudioGUI { var sb = new StringBuilder(); sb.AppendLine($"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\".."); - sb.AppendLine(m_AudioClip.version[0] < 5 + sb.AppendLine(m_AudioClip.version < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}"); sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}"); diff --git a/AssetStudioUtility/AudioClipConverter.cs b/AssetStudioUtility/AudioClipConverter.cs index 3dec1b7..2a78e56 100644 --- a/AssetStudioUtility/AudioClipConverter.cs +++ b/AssetStudioUtility/AudioClipConverter.cs @@ -105,7 +105,7 @@ namespace AssetStudio public string GetExtensionName() { - if (m_AudioClip.version[0] < 5) + if (m_AudioClip.version < 5) { switch (m_AudioClip.m_Type) { @@ -170,7 +170,7 @@ namespace AssetStudio { public static bool IsConvertSupport(this AudioClip m_AudioClip) { - if (m_AudioClip.version[0] < 5) + if (m_AudioClip.version < 5) { switch (m_AudioClip.m_Type) { diff --git a/AssetStudioUtility/SerializedTypeHelper.cs b/AssetStudioUtility/SerializedTypeHelper.cs index 5d2fc8a..bc9839f 100644 --- a/AssetStudioUtility/SerializedTypeHelper.cs +++ b/AssetStudioUtility/SerializedTypeHelper.cs @@ -4,9 +4,9 @@ namespace AssetStudio { public class SerializedTypeHelper { - private readonly int[] version; + private readonly UnityVersion version; - public SerializedTypeHelper(int[] version) + public SerializedTypeHelper(UnityVersion version) { this.version = version; } @@ -24,7 +24,7 @@ namespace AssetStudio { nodes.Add(new TypeTreeNode($"PPtr<{type}>", name, indent, false)); nodes.Add(new TypeTreeNode("int", "m_FileID", indent + 1, false)); - if (version[0] >= 5) //5.0 and up + if (version >= 5) //5.0 and up { nodes.Add(new TypeTreeNode("SInt64", "m_PathID", indent + 1, false)); } @@ -58,7 +58,7 @@ namespace AssetStudio nodes.Add(new TypeTreeNode("float", "value", indent + 4, false)); nodes.Add(new TypeTreeNode("float", "inSlope", indent + 4, false)); nodes.Add(new TypeTreeNode("float", "outSlope", indent + 4, false)); - if (version[0] >= 2018) //2018 and up + if (version >= 2018) //2018 and up { nodes.Add(new TypeTreeNode("int", "weightedMode", indent + 4, false)); nodes.Add(new TypeTreeNode("float", "inWeight", indent + 4, false)); @@ -66,7 +66,7 @@ namespace AssetStudio } nodes.Add(new TypeTreeNode("int", "m_PreInfinity", indent + 1, false)); nodes.Add(new TypeTreeNode("int", "m_PostInfinity", indent + 1, false)); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 3)) //5.3 and up + if (version >= (5, 3)) //5.3 and up { nodes.Add(new TypeTreeNode("int", "m_RotationOrder", indent + 1, false)); } @@ -75,7 +75,7 @@ namespace AssetStudio public void AddGradient(List nodes, string name, int indent) { nodes.Add(new TypeTreeNode("Gradient", name, indent, false)); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + if (version >= (5, 6)) //5.6 and up { AddColorRGBA(nodes, "key0", indent + 1); AddColorRGBA(nodes, "key1", indent + 1); @@ -113,7 +113,7 @@ namespace AssetStudio nodes.Add(new TypeTreeNode("UInt16", "atime5", indent + 1, false)); nodes.Add(new TypeTreeNode("UInt16", "atime6", indent + 1, false)); nodes.Add(new TypeTreeNode("UInt16", "atime7", indent + 1, false)); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up + if (version >= (5, 5)) //5.5 and up { nodes.Add(new TypeTreeNode("int", "m_Mode", indent + 1, false)); } @@ -134,7 +134,7 @@ namespace AssetStudio AddGUIStyleState(nodes, "m_OnActive", indent + 1); AddGUIStyleState(nodes, "m_OnFocused", indent + 1); AddRectOffset(nodes, "m_Border", indent + 1); - if (version[0] >= 4) //4 and up + if (version >= 4) //4 and up { AddRectOffset(nodes, "m_Margin", indent + 1); AddRectOffset(nodes, "m_Padding", indent + 1); @@ -146,7 +146,7 @@ namespace AssetStudio } AddRectOffset(nodes, "m_Overflow", indent + 1); AddPPtr(nodes, "Font", "m_Font", indent + 1); - if (version[0] >= 4) //4 and up + if (version >= 4) //4 and up { nodes.Add(new TypeTreeNode("int", "m_FontSize", indent + 1, false)); nodes.Add(new TypeTreeNode("int", "m_FontStyle", indent + 1, false)); @@ -171,7 +171,7 @@ namespace AssetStudio AddVector2f(nodes, "m_ClipOffset", indent + 1); nodes.Add(new TypeTreeNode("float", "m_FixedWidth", indent + 1, false)); nodes.Add(new TypeTreeNode("float", "m_FixedHeight", indent + 1, false)); - if (version[0] >= 3) //3 and up + if (version >= 3) //3 and up { nodes.Add(new TypeTreeNode("int", "m_FontSize", indent + 1, false)); nodes.Add(new TypeTreeNode("int", "m_FontStyle", indent + 1, false)); diff --git a/AssetStudioUtility/ShaderConverter.cs b/AssetStudioUtility/ShaderConverter.cs index ba346d5..0202fef 100644 --- a/AssetStudioUtility/ShaderConverter.cs +++ b/AssetStudioUtility/ShaderConverter.cs @@ -871,11 +871,11 @@ namespace AssetStudio public int Length; public int Segment; - public ShaderSubProgramEntry(BinaryReader reader, int[] version) + public ShaderSubProgramEntry(BinaryReader reader, UnityVersion version) { Offset = reader.ReadInt32(); Length = reader.ReadInt32(); - if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up + if (version >= (2019, 3)) //2019.3 and up { Segment = reader.ReadInt32(); } @@ -887,7 +887,7 @@ namespace AssetStudio public ShaderSubProgramEntry[] entries; public ShaderSubProgram[] m_SubPrograms; - public ShaderProgram(BinaryReader reader, int[] version) + public ShaderProgram(BinaryReader reader, UnityVersion version) { var subProgramsCapacity = reader.ReadInt32(); entries = new ShaderSubProgramEntry[subProgramsCapacity]; diff --git a/AssetStudioUtility/Texture2DConverter.cs b/AssetStudioUtility/Texture2DConverter.cs index 20c4bfa..d831458 100644 --- a/AssetStudioUtility/Texture2DConverter.cs +++ b/AssetStudioUtility/Texture2DConverter.cs @@ -13,7 +13,7 @@ namespace AssetStudio private int m_HeightCrop; private TextureFormat m_TextureFormat; private byte[] m_PlatformBlob; - private int[] version; + private UnityVersion version; private BuildTarget platform; private int outPutDataSize; @@ -748,7 +748,7 @@ namespace AssetStudio private bool UnpackCrunch(byte[] image_data, out byte[] result) { - if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3) //2017.3 and up + if (version >= (2017, 3) //2017.3 and up || m_TextureFormat == TextureFormat.ETC_RGB4Crunched || m_TextureFormat == TextureFormat.ETC2_RGBA8Crunched) {