0
对于我正在处理的Unity项目,我需要能够更改当前所选对象的颜色。无论如何,我用脚本产生了按钮预制件。该脚本还包含一个带有颜色的列表。这些颜色需要绑定到一个按钮。所以当我按下红色按钮时,对象变成红色。Unity5 UI按钮; List with Colors
public GameObject button
public List<Color> ColorOptions;
// Use this for initialization
void Start() {
foreach(Color color in ColorOptions){
GameObject newButton = Instantiate(button) as GameObject;
ButtonController controller = newButton.GetComponent<ButtonController>();
newButton.GetComponent<Image>().color = color;
newButton.transform.SetParent(ContentPanel.transform);
newButton.transform.localScale = Vector3.one;
}
}
这些按钮有一个onclick函数来改变对象的颜色。在TaskOnClick函数中,我为颜色列表添加了一个foreach循环。在foreach循环中,我从列表中为对象提供颜色。然而,按钮只给出列表中的最后一个颜色。脚本按钮
public Text Name;
public Button button; // Prefab Button
GameObject floor;
GameObject floorHolder;
ListController colorList;
void Start()
{
Button btn = button.GetComponent<Button>();
btn.onClick.AddListener(TaskOnClick);
// Find floorHolder
floorHolder = GameObject.Find("FloorHolder");
//Get ListController from grandparent
colorList = transform.parent.parent.GetComponent<ListController>();
}
// Update is called once per frame
void Update() {
//Get FloorHolders Child Object
floor = floorHolder.transform.GetChild(0).gameObject;
}
// Called when Button is Pressed
void TaskOnClick()
{
//Change Color of the Material
foreach(Color color in colorList.ColorOptions){
floor.GetComponent<Renderer>().material.color = color;
}
}
因此,例如,列表中包含的颜色:红色,蓝色,绿色,黄色,紫色。而且我已经产生了5个按钮,如果我按下这些按钮中的1个,对象只会变成紫色。 所以我的问题是如何得到这些按钮来处理颜色?我希望你们能帮助我!
注意,调用'floor.GetComponent()'和'button.GetComponent ()'内的方法是非常低效的。你应该在'Start()'中获得这些组件。您也可以将'floor'的类型更改为'Renderer',然后当您将'GameObject'拖动到脚本上时,它将自动地只拉出'Renderer',您可以对'Image'执行相同的操作。 –
@Scott张伯伦 - 如果我们知道该方法只会被调用一次,是否可以使用GetComponent来访问方法中的局部变量?我很好奇的表现 –
Chad
@Chad如果你知道它只会被调用一次可以调用它,但恕我直言,我认为它仍然会更好,在开始或通过类型的公共变量因此,如果您更改了代码,最终在开发过程中不止一次地调用该函数,则无需记住返回并更改名为GetComponet的代码 –