Как вызвать функцию передавая ей не все параметры?
Есть функция которая принимает максимум 4 параметра. При этом в разных слуаях я буду вызывать ее и передавать только 3, 2, или 1 параметр. Unity выдает ошибку что еслипараметр задан в ункции то он должен быть передан обязательно. Есть ли способ указать параметры как опциональные, или лучше использовать другое решение (какое)?
Пример:
void example(Texture texture1, Texture texture2, Texture texture3, Texture texture4) {
renderer1.material.mainTexture = texture1;
if (texture2 != null) {
renderer2.material.mainTexture = texture2;
}
if (texture3 != null) {
renderer3.material.mainTexture = texture3;
}
if (texture4 != null) {
renderer4.material.mainTexture = texture4;
}
}
public void callExample(){
example(texture1, texture2);
};
Ответы (3 шт):
В моем случае как я понял мне нужно было задать дефолтное значение для параметров вот так:
void example(Texture texture1, Texture texture2 = null, Texture texture3 = null, Texture texture4 = null)
{
}
Вы можете использовать дефолтные значения у параметров:
private void example(Texture texture1, Texture texture2 = null, Texture texture3 = null, Texture texture4 = null)
Кроме этого, можно использовать ключевое слово params:
private void example(params Texture[] textures)
Теперь вы можете вызвать метод example с произвольным количеством аргументов типа Texture. Все элементы будут помещены в массив textures
Поскольку количество параметров фиксировано, используйте дефолтные значения вместо params - кроме первого.
Также проверьте первый для null.
Может использоваться локальная функция для упрощения кода.
Ваши renderers определены вне scope функции, поэтому они должны быть member variables так что назовите их, начиная с "_", например: _renderer1.
private void SetTexture(Texture texture1, Texture texture2 = null, Texture texture3 = null, Texture texture4 = null)
{
if (texture1 == null)
throw new ArgumentNullException(nameof(texture1));
void SetTexture(Renderer renderer, Texture texture) =>
if (texture != null)
renderer.material.mainTexture = texture;
SetTexture(_renderer1, texture1);
SetTexture(_renderer2, texture2);
SetTexture(_renderer3, texture3);
SetTexture(_renderer4, texture4);
}
У вас также может быть extension method в вашем рендерере, например:
public static void class RendererExtensions
{
public static void SetTexture(this Renderer renderer, Texture texture = null) =>
if (texture != null)
renderer.material.mainTexture = texture;
}