using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; [Serializable] [DisallowMultipleComponent] public partial class UIdSystem : MonoBehaviour { public bool IsPrefab; public ulong Id; [SerializeField] private List componentIdPairs = new List(); /// /// 为该实体对象和组件重新分配唯一的 Id。 /// public void CreateId(ulong offset = 0, bool recursive = true) { this.Id = GUID.NewGuid() - offset; var components = this.gameObject.GetComponents(); foreach (var component in components) { var index = GetComponentIndex(component); if (index == -1) { var componentIdPair = new ComponentIdPair(component, GUID.NewGuid() - offset); componentIdPairs.Add(componentIdPair); } else { var componentIdPair = componentIdPairs[index]; componentIdPair.Id = GUID.NewGuid() - offset; } } if (recursive) CreateIdRecursively(offset); } /// /// 为该实体对象和组件重新分配唯一 Id,已分配过的组件不会再分配。 /// public void ReassignId(ulong offset = 0, bool recursive = true) { this.Id = GUID.NewGuid() - offset; var components = this.gameObject.GetComponents(); foreach (var component in components) { var index = GetComponentIndex(component); if (index == -1) { var componentIdPair = new ComponentIdPair(component, GUID.NewGuid() - offset); componentIdPairs.Add(componentIdPair); } } if (recursive) AssignIdRecursively(offset, true); } /// /// 为该实体对象和组件更新唯一 Id,已分配过的组件不会再更新。 /// public void UpdateId(ulong offset = 0, bool recursive = true) { if (this.Id <= 0) this.Id = GUID.NewGuid() - offset; var components = this.gameObject.GetComponents(); foreach (var component in components) { var index = GetComponentIndex(component); if (index == -1) { var componentIdPair = new ComponentIdPair(component, GUID.NewGuid() - offset); componentIdPairs.Add(componentIdPair); } } if (recursive) AssignIdRecursively(offset, false); } private void AssignIdRecursively(ulong offset, bool reassign) { foreach (Transform child in transform) { var entity = child.gameObject; var component = entity.GetComponent(); if (component == null) component = entity.AddComponent(); component.IsPrefab = this.IsPrefab; if (reassign) component.ReassignId(offset, true); else component.UpdateId(offset, true); } } private void CreateIdRecursively(ulong offset) { foreach (Transform child in transform) { var entity = child.gameObject; var component = entity.GetComponent(); if (component == null) component = entity.AddComponent(); component.IsPrefab = this.IsPrefab; component.CreateId(offset, true); } } private int GetComponentIndex(Component component) { return componentIdPairs.FindIndex((componentIdPair) => componentIdPair.Component == component); } private void Reset() { IsPrefab = false; this.ReassignId(); } }