от
Я устанавливаю механизм объединения объектов в единстве, в основном, как он работает: У вас есть базовый абстрактный класс с именем «Poolable», со статической очередью, содержащей в себе объекты (в данном случае GameObjects), есть класс с именем Projectile, который наследуется от Poolable, поскольку это то, что я сейчас хочу объединять. Кроме того, он распространяется на класс Bullet, который наследуется от Projectile, но проблема в том, что если бы у меня был класс Arrow, который наследовал от Projectile, он бы использовал тот же пул, потому что пул статичен внутри Poolable. Кто-нибудь знает, как я мог бы решить эту проблему? Я думал о том, чтобы сделать его нестатичным, но тогда объекты не будут знать о пуле, они будут знать о своем собственном пуле. То же самое с интерфейсами, но они не принимают переменные, которые не являются свойствами Единственное текущее исправление, которое я вижу, - это добавление его к каждому сценарию, в котором я использую пул, но это затем сводит на нет всю цель наследования, поскольку я пытался создать полиморфную структуру, в которой у вас будет несколько пулов, несколько снарядов, может быть несколько пуль / стрел?
public abstract class Poolable : MonoBehaviour
{
    protected static Queue objPool = new Queue(); // doesn't work because every poolable object will use this pool only
    [SerializeField] protected GameObject prefab;

    public GameObject Get()
    {
        if(objPool.Count == 0)
        {
            AddObjects();
        }

        return objPool.Dequeue();
    }

    protected void ReturnToPool(GameObject retObj)
    {
        objPool.Enqueue(retObj);
        retObj.SetActive(false);
    }

    AddObjects()
    {
    }
}
             

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Если я не ошибаюсь, ваш пул объектов должен быть однородным. Это означает, что ваш пул содержит только один тип объекта. Например, вы не хотите, чтобы
arrow
и
bullet
совместно использовали один и тот же пул, даже если они все
projectiles
. У нас нет c
decltype
в c #, поэтому, если вы хотите, чтобы у вашего объекта была его нестатическая функция-член
ReturnToPool
, вы должны отложить оценку типа во время выполнения (используя словарь типов). Вот код, который может удовлетворить ваши потребности:
using System.Collections.Generic;
using UnityEngine;
using System;

public abstract class Poolable : MonoBehaviour
{
    private static Dictionary
...