Similar function for each in array
I haven't worked with arrays much and I'm hoping someone can point me in the right direction. I'm trying to learn a way to save duplicating the following slider listeners and functions for each slider in the array.
public Slider[] slider;
public SkinnedMeshRenderer Model;
void Start()
{
slider[0].onValueChanged.AddListener(delegate { SetSlider0(); });
slider[1].onValueChanged.AddListener(delegate { SetSlider1(); });
//etc....
}
public void SetSlider0()
{
float value0 = slider[0].value;
Model.SetBlendShapeWeight(0, value0);
}
public void SetSlider1()
{
float value1 = slider[1].value;
Model.SetBlendShapeWeight(1, value1);
}
//etc...
Comment
Best Answer
Answer by Vega4Life · Aug 05, 2019 at 02:30 AM
I would just do it like this - seems to work fine by matching the slider index to the blend shape weight index:
[SerializeField] Slider[] sliders;
[SerializeField] SkinnedMeshRenderer model;
private void Awake()
{
for (int i = 0; i < sliders.Length; i++)
{
// Copy the value of i
// If you were to send i directly, the delegate uses the i - but it gets incremented via the loop (its a reference)
// Getting a value you dont want. So we just create a local int that the delegate can reference that wont change
int index = i;
sliders[i].onValueChanged.AddListener(delegate { SetSlider(index); });
}
}
private void SetSlider(int index)
{
float value = sliders[index].value;
model.SetBlendShapeWeight(index, value);
}
Your answer
Follow this Question
Related Questions
Storing a Gameobject from array into a Gameobject variable giving NullReferenceException 3 Answers
Fields not populated during OnValidate on Editor startup 2 Answers
Cannot convert UnityEngine.GameObject to UnityEngine.GameObject 1 Answer
Trying to spawn enemies on only one path 1 Answer
How to do 2d tile room assignments? 0 Answers