给对象唯一的 ID onStart

Giving objects unique ids onStart

我有一堆游戏对象,我在 Start 函数中为其分配了唯一的 ID。

void Start() {
    UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}

我认为这可行,但时不时地我会收到重复的 ID。我怎样才能确保它们始终是唯一的?

我会使用 guid。

UniqueID = Guid.NewGuid.ToString();

根据您的建议,2 个实例 运行 同时可以将相同的 "unique" UniqueID 应用于 2 个不同的对象。

Guid 即使在实例之间也应该是唯一的。

此方法不会在您的应用程序的多个实例中提供唯一 ID!

我建议使用 static long 变量并使用 Interlocked.Increment 来处理并发和同步,这样您就可以轻松地将 Id 分配给您的对象。它在调试方面比 GUID 更好,可读性更好,它使用的内存比 GUID 少。

//define an accessible static variable somewhere in your code
public static long __Id = 0;

//use it to assign unique Id to objects
UniqueID = Interlocked.Increment(ref __Id);

它的性能也比 GUID 好,这里是一个快速检查和结果

public static long __Id = 0;
private static void Main(string[] args)
{
    var sw1 = new Stopwatch();
    var guid = Guid.NewGuid();
    sw1.Start();
    for (var i = 0; i < 10000000; i++)
    {
        guid = Guid.NewGuid();
    }
    sw1.Stop();
    Console.WriteLine(guid);
    Console.WriteLine(sw1.ElapsedTicks);

    var sw2 = new Stopwatch();
    long id = 0;
    sw2.Start();
    for (var i = 0; i < 10000000; i++)
    {
        id = Interlocked.Increment(ref __Id);
    }
    sw2.Stop();
    Console.WriteLine(id);
    Console.WriteLine(sw2.ElapsedTicks);
}

结果

f91419e0-9d3a-4e64-b7fd-ed2080dad599
10376104 (guid time)
10000000
304231 (long time) 34 times faster than guid

Unity 已经为每个对象实例提供了唯一的 ID,请查看 GetInstanceID.