This question was
closed 3 days ago by
Karma_XX for the following reason:
The question is answered, right answer was accepted
(solved) How to stop a void
(I'm new to coding and to Unity) The following code keeps on repeating the PasteClicked void even tho I clicked the button to start CopyClicked void. I would like that my code start the PasteClicked or CopyClicked void only once and if the button is reclicked it re-start it only once.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AddorCopy : MonoBehaviour
{
public Button paste;
public Button copy;
public Material presets1;
public Material presets2;
public Material presets3;
public Material presets4;
public Material presets5;
public Material presets6;
public Material Base_material;
public Button button1;
public Button button2;
public Button button3;
public Button button4;
public Button button5;
public Button button6;
public void Start()
{
paste.onClick.AddListener(PasteClicked);
copy.onClick.AddListener(CopyClicked);
void PasteClicked()
{
button1.onClick.AddListener(one);
button2.onClick.AddListener(two);
button3.onClick.AddListener(three);
button4.onClick.AddListener(four);
button5.onClick.AddListener(five);
button6.onClick.AddListener(six);
void one()
{
presets1.CopyPropertiesFromMaterial(Base_material);
}
void two()
{
presets2.CopyPropertiesFromMaterial(Base_material);
}
void three()
{
presets3.CopyPropertiesFromMaterial(Base_material);
}
void four()
{
presets4.CopyPropertiesFromMaterial(Base_material);
}
void five()
{
presets5.CopyPropertiesFromMaterial(Base_material);
}
void six()
{
presets6.CopyPropertiesFromMaterial(Base_material);
}
}
void CopyClicked()
{
button1.onClick.AddListener(one);
button2.onClick.AddListener(two);
button3.onClick.AddListener(three);
button4.onClick.AddListener(four);
button5.onClick.AddListener(five);
button6.onClick.AddListener(six);
void one()
{
Base_material.CopyPropertiesFromMaterial(presets1);
}
void two()
{
Base_material.CopyPropertiesFromMaterial(presets2);
}
void three()
{
Base_material.CopyPropertiesFromMaterial(presets3);
}
void four()
{
Base_material.CopyPropertiesFromMaterial(presets4);
}
void five()
{
Base_material.CopyPropertiesFromMaterial(presets5);
}
void six()
{
Base_material.CopyPropertiesFromMaterial(presets6);
}
}
}
}
Comment
Best Answer
Answer by Hellium · Jun 05 at 09:32 PM
ADDING a listener, as its name suggests, ADDS a listener. It does not remove the previous callbacks.
I also recommend you taking advantage of arrays and classes to tidy your code up.
CODE NOT TESTED
public class AddorCopy : MonoBehaviour
{
public Button paste;
public Button copy;
public Material baseMaterial;
public MaterialPresetButton[] materialPresetButtons;
void Start()
{
paste.onClick.AddListener(PasteClicked);
copy.onClick.AddListener(CopyClicked);
for(int i = 0 ; i < materialPresetButtons.Length ; ++i)
{
materialPresetButtons[i].Setup(baseMaterial);
}
}
void PasteClicked()
{
for(int i = 0 ; i < materialPresetButtons.Length ; ++i)
{
materialPresetButtons[i].SwitchToPasteMode();
}
}
void CopyClicked()
{
for(int i = 0 ; i < materialPresetButtons.Length ; ++i)
{
materialPresetButtons[i].SwitchToCopyMode();
}
}
}
[System.Serializable]
public class MaterialPresetButton
{
[SerializeField] private Button button;
[SerializeField] private Material preset;
private Material baseMaterial;
private Material source;
private Material target;
public void Setup(Material baseMaterial)
{
this.baseMaterial = baseMaterial;
button.onClick.AddListener(CopyMaterialProperties);
SwitchToCopyMode();
}
public void SwitchToCopyMode()
{
source = baseMaterial;
target = preset;
}
public void SwitchToPasteMode()
{
source = preset;
target = baseMaterial;
}
private void CopyMaterialProperties()
{
target.CopyPropertiesFromMaterial(source);
}
}
Thank you a lot it works! you saved me :D (the line 56-57 and 62-63 are inverted but I fixed it)