C # — Unity — проблема с передачей параметров

#c# #unity3d #parameters

#c# #unity3d #параметры

Вопрос:

Я пытаюсь извлечь много кода в своей программе, и я столкнулся с проблемой.

Это моя функция для извлечения процесса плавки:

 public IEnumerator Smelting(Button button, Image bar, BigDouble material, BigDouble output)
    {
        button.interactable = false;

        float t = 0f;
        while (t <= 1f)
        {
            bar.fillAmount = t;
            t  = Time.deltaTime / 4;
            yield return null;
        }

        bar.fillAmount = 0;
        //saveLoadHandler.data.copperBar  = smeltingHandler.smeltCopperOreOutput;
        material  = output;
        button.interactable = true;
    }
 

Теперь моя проблема в том, что я хочу добавить выходные данные в материал с помощью: material = output .
Приведенная выше команда показывает, как выглядят эти параметры.

Похоже, что в этом случае material неправильно назначается.

Я не хочу идти по этому пути if(type = copper){copper = output } else if(type = iron)...

Есть ли обходной путь для этого?

Заранее спасибо!

Комментарии:

1. Не хватает нескольких ключевых моментов. Это функция с a yield return . Как вы это называете? Как именно это = реализовано для BigDouble ?

2. Я называю это так StartCoroutine(smeltingCore.Smelting(smeltCopperOreButton, smeltCopperOreBar, saveLoadHandler.data.copperBar, smeltingHandler.smeltCopperOreOutput)); Самая большая проблема — это » github.com/Razenpok/BreakInfinity.cs » это в основном то же самое, что и обычный дубль

3. Но проблема не в возврате yield или чем-то еще. Я думаю, что это основная проблема c #. Я не могу добавить выходное значение к значению материала.

Ответ №1:

если BigDouble это так же, как обычный double , это тип значения, и поэтому передается по значению вашему методу. Вы можете добавить ref ключевое слово, чтобы передать его по ссылке:

 public IEnumerator Smelting(Button button, Image bar, ref BigDouble material, BigDouble output)
 

Однако итераторы не могут иметь аргументов ref, поэтому другим обходным путем может быть передача делегата методу, задача которого заключается в увеличении чего-либо

 public IEnumerator Smelting(Button button, Image bar, Action<BigDouble> incrementMaterial, BigDouble output) {
    ....
    incrementMaterial(output); // instead of material  = output
    ....
}
 

и затем вызывающий:

 StartCoroutine(smeltingCore.Smelting(
     smeltCopperOreButton, 
     smeltCopperOreBar, 
     amount => saveLoadHandler.data.copperBar  = amount, 
     smeltingHandler.smeltCopperOreOutput));
 

Конечно, на данный момент вы передаете его только output для использования в делегате, чтобы упростить оба:

 public IEnumerator Smelting(Button button, Image bar, Action incrementMaterial) {
    ....
    incrementMaterial(); 
    ....
}
 

и

 StartCoroutine(smeltingCore.Smelting(
     smeltCopperOreButton, 
     smeltCopperOreBar, 
     () => saveLoadHandler.data.copperBar  = smeltingHandler.smeltCopperOreOutput 
     ));
 

Комментарии:

1. Если я использую его, он говорит: «Итераторы не могут иметь никаких параметров ссылки». Есть идеи?

2. @Timebreaker900 конечно, нет, глупый я. См. Обновление.