#if UNITY_EDITOR using UnityEngine; using System; using System.Linq; using System.Collections.Generic; namespace O3DWB { [Serializable] public class NamedEntityCollection where EntityType : class, INamedEntity { #region Protected Variables [SerializeField] protected List _namedEntities = new List(); #endregion #region Public Properties public bool IsEmpty { get { return NumberOfEntities == 0; } } public int NumberOfEntities { get { return _namedEntities.Count; } } #endregion #region Public Methods public bool ContainsEntity(EntityType namedEntity) { return _namedEntities.Contains(namedEntity); } public bool ContainsEntityWithName(string entityName) { List entitiesWithSameName = _namedEntities.FindAll(item => item.Name == entityName); return entitiesWithSameName != null && entitiesWithSameName.Count > 0; } public bool ContainsEntityByPredicate(Predicate predicate) { List foundEntities = GetEntitiesByPredicate(predicate); return foundEntities.Count != 0; } public void AddEntity(EntityType namedEntity) { if (CanEntityBeAddedToCollection(namedEntity)) _namedEntities.Add(namedEntity); } public virtual void RemoveEntity(EntityType namedEntity) { _namedEntities.Remove(namedEntity); } public virtual void RemoveEntityAtIndex(int indexOfEntityToRemove) { _namedEntities.RemoveAt(indexOfEntityToRemove); } public virtual void RemoveAllEntities() { _namedEntities.Clear(); } public void RemoveWithPredicate(Predicate predicate) { _namedEntities.RemoveAll(predicate); } public void RenameEntity(EntityType entity, string newName) { if(!string.IsNullOrEmpty(newName)) { entity.Name = UniqueEntityNameGenerator.GenerateUniqueName(newName, GetAllEntityNames()); } } public EntityType GetEntityByIndex(int index) { return _namedEntities[index]; } public EntityType GetEntityByName(string name) { List entitiesWithName = _namedEntities.FindAll(item => item.Name == name); if (entitiesWithName.Count != 0) return entitiesWithName[0]; return null; } public EntityType GetEntityByPredicate(Predicate predicate) { List entities = _namedEntities.FindAll(predicate); if (entities.Count != 0) return entities[0]; return null; } public List GetEntitiesByPredicate(Predicate predicate) { return _namedEntities.FindAll(predicate); } public int GetEntityIndex(EntityType entity) { return _namedEntities.FindIndex(item => ReferenceEquals(item, entity)); } public List GetAllEntities() { return new List(_namedEntities); } public void GetAllEntities(List entities) { entities.Clear(); entities.AddRange(_namedEntities); } public List GetAllEntityNames() { return (from entity in _namedEntities select entity.Name).ToList(); } public void GetAllEntityNames(List names) { names.Clear(); foreach (var entity in _namedEntities) names.Add(entity.Name); } public void RemoveNullEntries() { _namedEntities.RemoveAll(item => EqualityComparer.Default.Equals(item, default(EntityType))); } #endregion #region Private Methods private bool CanEntityBeAddedToCollection(EntityType namedEntity) { return !ContainsEntity(namedEntity); } #endregion } } #endif