public static IObjectPool <ReplicatedObject> CreateReplicatedPool( Func <GameObject, IReplicatedObjectDatabase, ReplicatedObject> gameObjectReplicationDecorator, IReplicatedObjectDatabase objectDatabase, Func <GameObject> gameObjectFactory) { var gameObjectPool = GameObject.Find("ObjectPool") ?? new GameObject("ObjectPool"); return(new ObjectPool <ReplicatedObject>(() => { var gameObject = gameObjectFactory(); // Force awake gameObject.SetActive(true); var replicatedObject = gameObjectReplicationDecorator(gameObject, objectDatabase); return new ManagedObject <ReplicatedObject>( instance: replicatedObject, onReturnedToPool: () => { if (!gameObject.IsDestroyed() && !gameObjectPool.IsDestroyed()) { gameObject.SetActive(false); gameObject.transform.parent = gameObjectPool.transform; } replicatedObject.MessageHandler.ClearLastReceivedMessages(); }, onTakenFromPool: () => {}); })); }
public static IObjectPool <ReplicatedObject> CreateReplicatedPool( Func <GameObject, IReplicatedObjectDatabase, ReplicatedObject> gameObjectReplicationDecorator, IReplicatedObjectDatabase objectDatabase, Func <GameObject> gameObjectFactory) { var gameObjectPool = GameObject.Find("ObjectPool") ?? new GameObject("ObjectPool"); var replicatedObjectPool = GameObject.Find("ReplicatedObjects") ?? new GameObject("ReplicatedObjects"); return(new ObjectPool <ReplicatedObject>(() => { var gameObject = gameObjectFactory(); var resetables = gameObject.GetComponentsOfInterfaceInChildren <IResetable>(); return new ManagedObject <ReplicatedObject>( instance: gameObjectReplicationDecorator(gameObject, objectDatabase), onReturnedToPool: () => { if (!gameObject.IsDestroyed()) { gameObject.SetActive(false); gameObject.transform.parent = gameObjectPool.transform; for (int i = 0; i < resetables.Count; i++) { resetables[i].Reset(); } } }, onTakenFromPool: () => { gameObject.transform.parent = replicatedObjectPool.transform; }); })); }
public static Maybe <ReplicatedObject> FindObject(this IReplicatedObjectDatabase db, ObjectType type, ObjectRole role = ObjectRoles.Everyone) { ObjectCache.Clear(); db.FindObjects(type, ObjectCache, role); if (ObjectCache.Count > 0) { return(Maybe.Just(ObjectCache[0])); } return(Maybe <ReplicatedObject> .Nothing); }
public static IList <ReplicatedObject> FindObjects(this IReplicatedObjectDatabase db, ObjectType type, ObjectRole role = ObjectRoles.Everyone) { ObjectCache.Clear(); return(db.FindObjects(type, ObjectCache, role)); }