Beispiel #1
0
        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));
 }