using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
[StructLayout(LayoutKind.Explicit), Serializable]
public struct AssetGuid : IComparable, IComparable<Guid>, IEquatable<Guid>
[FieldOffset(0)] public Guid Guid;
[FieldOffset(0)] public int guidPart1;
[FieldOffset(4)] public int guidPart2;
[FieldOffset(8)] public int guidPart3;
[FieldOffset(12)] public int guidPart4;
static public AssetGuid Zero = FromParts(0, 0, 0, 0);
public AssetGuid(string guid)
guidPart1 = guidPart2 = guidPart3 = guidPart4 = 0;
static public AssetGuid NewGuid()
var guid = new AssetGuid();
guid.Guid = Guid.NewGuid();
static public AssetGuid FromParts(int part1, int part2, int part3, int part4)
static public implicit operator Guid(AssetGuid uGuid) => uGuid.Guid;
static public implicit operator AssetGuid(Guid other) => new AssetGuid {Guid = other};
static public implicit operator string(AssetGuid uGuid) => uGuid.Guid.ToString("N");
static public implicit operator AssetGuid(string guidString) => new Guid(guidString);
override public string ToString() => this;
#region IComparable, IComparable<Guid>, IEquatable<Guid>
public int CompareTo(object obj)
if (obj is AssetGuid unityGuid)
return unityGuid.Guid.CompareTo(Guid);
return guid.CompareTo(Guid);
public int CompareTo(Guid other) => Guid.CompareTo(other);
public bool Equals(Guid other) => Guid == other;
override public bool Equals(object obj)
if (obj is AssetGuid unityGuid)
return unityGuid == Guid;
override public int GetHashCode() => Guid.GetHashCode();
public static void Main()
var s = new string[] {"5c994ab24ba77472e8c6eea910f50488" };
Console.WriteLine($" prefabGuid:\n guidPart1: {g.guidPart1}\n guidPart2: {g.guidPart2}\n guidPart3: {g.guidPart3}\n guidPart4: {g.guidPart4}");