2017-05-04 75 views
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个,对象只会变成紫色。 所以我的问题是如何得到这些按钮来处理颜色?我希望你们能帮助我!

回答

1

更新TaskOnClick功能如下: -

void TaskOnClick() 
{ 
    //Change Color of the Floor Material to this button's color 
    floor.GetComponent<Renderer>().material.color = button.GetComponent<Image>().color; 
} 
+1

注意,调用'floor.GetComponent ()'和'button.GetComponent ()'内的方法是非常低效的。你应该在'Start()'中获得这些组件。您也可以将'floor'的类型更改为'Renderer',然后当您将'GameObject'拖动到脚本上时,它将自动地只拉出'Renderer',您可以对'Image'执行相同的操作。 –

+0

@Scott张伯伦 - 如果我们知道该方法只会被调用一次,是否可以使用GetComponent 来访问方法中的局部变量?我很好奇的表现 – Chad

+1

@Chad如果你知道它只会被调用一次可以调用它,但恕我直言,我认为它仍然会更好,在开始或通过类型的公共变量因此,如果您更改了代码,最终在开发过程中不止一次地调用该函数,则无需记住返回并更改名为GetComponet 的代码 –