Что возвращает метод?

Программирование на Юнити.

Что возвращает метод?

Сообщение Heliosis 30 май 2019, 14:53

Добрый день.
Вот такая проблема появилась: у меня есть, так сказать, база данных эффектов (то бишь всякие там баффы/дебаффы, отравления, благословения), откуда при помощи метода GetEffectByID(int ID) перебором самого списка эффектов достается эффект с требуемым ID, каждый эффект - отдельный класс, который наследуется от главного класса Effect.
Происходит следующее, когда вызывается вот этот вот метод (который хранится в самом классе Effect)
Синтаксис:
Используется csharp
public static void ApplyEffect(Effect effectToApply, Creature effectHandler, Creature effectSender, int duration, int level)
    {
        effectHandler.currentEffects.Add(effectToApply);
        effectHandler.currentEffects[effectHandler.currentEffects.Count - 1].effectDuration = duration;
        effectHandler.currentEffects[effectHandler.currentEffects.Count - 1].effectLevel = level;
        effectHandler.currentEffects[effectHandler.currentEffects.Count - 1].effectSender = effectSender;
        effectHandler.currentEffects[effectHandler.currentEffects.Count - 1].effectHandler = effectHandler;
        effectHandler.currentEffects[effectHandler.currentEffects.Count - 1].OnEffectBegin();
    }

все выходит нормально, на врага накладывается эффект (то есть добавляется в список действующих эффектов на враге и назначается тот, кто его сотворил (то бишь игрок) и жертва эффекта (то бишь сам враг). Враг, атакуя, накладывает такой же эффект на игрока, и вот что случается: у врага меняются местами жертва эффекта и его творец, у игрока же все нормально в этом плане.
Проверка через
Синтаксис:
Используется csharp
MonoBehaviour.print(EffectsDatabase.GetEffectByID(0).effectHandler);
сразу после добавления эффекта
Синтаксис:
Используется csharp
effectHandler.currentEffects.Add(effectToApply);
показала, что, оказывается, каким-то образом творец и жертва назначаются не у эффекта, который был повешен на игрока/врага, а а назначаются у оригинального, эталонного эффекта из базы данных. То есть если я дальше буду атаковать разных врагов, у них у всех жертва будет одна и та же - последний атакованный враг, и все потому, что как-то перезаписывается оригинал этого эффекта.

Судя по всему, проблема в методе, потому что он возвращает, как я понимаю, ссылку на эффект в базе данных, а не его копию:
Синтаксис:
Используется csharp
public static Effect GetEffectByID(int ID)
    {
        for (int i = 0; i < registeredEffects.Count; i++)
            if (registeredEffects[i].effectID == ID)
                return registeredEffects[i];
        return registeredEffects[0];
    }


Сама база данных эффектов прилагается:
Синтаксис:
Используется csharp
public class EffectsDatabase
{
    public static List<Effect> registeredEffects = new List<Effect>();
    public static string effectsIconsDirectory;

    public static void InitializeDatabase()
    {
        effectsIconsDirectory = "EffectsSprites/";

        registeredEffects.Add(new EffectPoison(0, "effect_poison"));
        registeredEffects.Add(new EffectBleeding(1, "effect_bleeding"));
    }

    public static Effect GetEffectByID(int ID)
    {
        for (int i = 0; i < registeredEffects.Count; i++)
            if (registeredEffects[i].effectID == ID)
                return registeredEffects[i];
        return registeredEffects[0];
    }
}


Вот и вопрос, что мне нужно сделать? Каким образом передавать копию эффекта?
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Что возвращает метод?

Сообщение seaman 30 май 2019, 16:17

static
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Что возвращает метод?

Сообщение samana 30 май 2019, 21:59

Heliosis писал(а):Каким образом передавать копию эффекта?

Ответ в вопросе - создавать новый экземпляр эффекта и передавать его.
А для оптимизации, лучше сделать пул эффектов, чтобы не создавать/удалять их постоянно.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Что возвращает метод?

Сообщение Heliosis 31 май 2019, 01:46

seaman писал(а):static

Спасибо, я уже понял.
Я оставил метод статичным, но у каждого эффекта теперь есть метод Clone(), который вручную создает копию, это показалось мне удобным.
Синтаксис:
Используется csharp
public virtual Effect Clone(int _id, string _name)
    {
        return new Effect(_id, _name) { effectID = _id, effectName = _name };
    }


samana писал(а):
Heliosis писал(а):Каким образом передавать копию эффекта?

Ответ в вопросе - создавать новый экземпляр эффекта и передавать его.
А для оптимизации, лучше сделать пул эффектов, чтобы не создавать/удалять их постоянно.

Мне кажется, эффекты не настолько часто создаются и удаляются, все-таки игра пошаговая. Или все же есть смысл оптимизировать даже это?
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Что возвращает метод?

Сообщение samana 31 май 2019, 01:54

Heliosis писал(а):Мне кажется, эффекты не настолько часто создаются и удаляются, все-таки игра пошаговая. Или все же есть смысл оптимизировать даже это?

Конечно не обязательно, если используется не часто и не приносит никаких тормозов.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10