#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 конечно, нет, глупый я. См. Обновление.