在 Unity 5 中更改多个游戏对象的颜色
Change color of multiple game objects in Unity 5
我想使用单个脚本更改 Unity 中多个游戏对象的颜色。我有点迷失了如何去做。我是 Unity 的新手,这是对我的一些基本培训。
统一版本:5.3.4
观察到的行为:
将相同的脚本添加到其他游戏对象并且全部更改为相同的颜色
预期行为:
单独更改游戏对象的颜色
尝试过的事情列表:
使用-FindGameObject-
尝试使用 -GameObject-
访问材料
同时尝试了两者
在多个脚本中思考以获得我想要的结果
这是代码
C#:
using UnityEngine;
using System.Collections;
public class ChangeColor : MonoBehaviour
{
//If I change these variables to -GameObject-
//It blocks me to access the renderer
//Making the variables public doesn't work either
private Renderer cube;
private Renderer sphere;
void Start ()
{
//Tried here the -FindGameObjectWithTag-
cube = GetComponent<Renderer>();
sphere = GetComponent<Renderer>();
}
void Update ()
{
if(Input.GetKeyDown(KeyCode.A))
{
//Tried here the -FindGameObjectWithTag-
cube.material.color = Color.red;
}
if(Input.GetKeyDown(KeyCode.S))
{
//Tried here the -FindGameObjectWithTag-
sphere.material.color = Color.green;
}
}
}
也许我做错了什么,正如我所说的,我是 Unity 的新手,我很乐意接受任何帮助,如果它不友好就更好了。
谢谢
您可以通过几种不同的方式来执行此操作。
如果它们都在同一个父对象下而没有其他对象,您可以遍历子对象并更改它们的颜色
GameObject Parent = GameObject.Find("ParentObject");
for( int x = 0; x > Parent.transform.childCount; x++);
{
Parent.transform.GetChild(x).GetComponent<Renderer>().material.color = Color.red;
}
如果少于 20 个,您可以创建一个列表,然后在将列表的大小更改为您拥有的对象数量后,只需将每个变换拖放到检查器中即可。
/*Make sure you have Using "System.Collections.Generic" at the top */
//put this outside function so that the inspector can see it
public List<Transform> Objs;
// in your function put this (when changing the color)
foreach(Transform Tform in Objs){
Tform.GetComponent<Renderer>().material.color = Color.red;
}
与2类似,如果你想在代码中全部完成,你可以做到
//Outside function
public List<Transform> Objs;
//inside function
Objs.Add(GameObject.Find("FirstObject").transform);
Objs.Add(GameObject.Find("SecondObject").transform);
//... keep doing this
//now do the same foreach loop as in 2
您可以按标签搜索(如果您有很多对象)(我想这会花费更长的时间,因为它要遍历每个组件,但我没有证据支持那个)
//Outside function
public GameObject[] Objs;
//inside function
Objs = GameObject.FindGameObjectsWithTag("ATagToChangeColor");
foreach(Transform Tform in Objs){
Tform.GetComponent<Renderer>().material.color = Color.red();
}
关于这条评论:
//If I change these variables to -GameObject-
//It blocks me to access the renderer
//Making the variables public doesn't work either
如果您将它们设为 GameObject 类型,那么您应该可以通过以下方式轻松访问渲染器:
public GameObject cube;
public void Start(){
cube.GetComponent<Renderer>().material.color = Color.red();
}
并使变量 public 允许 unity 的检查器查看变量,以便您可以在 unity 编辑器中更改它们而无需打开脚本。
我想使用单个脚本更改 Unity 中多个游戏对象的颜色。我有点迷失了如何去做。我是 Unity 的新手,这是对我的一些基本培训。
统一版本:5.3.4
观察到的行为:
将相同的脚本添加到其他游戏对象并且全部更改为相同的颜色
预期行为:
单独更改游戏对象的颜色
尝试过的事情列表:
使用-FindGameObject-
尝试使用 -GameObject-
访问材料同时尝试了两者
在多个脚本中思考以获得我想要的结果
这是代码
C#:
using UnityEngine;
using System.Collections;
public class ChangeColor : MonoBehaviour
{
//If I change these variables to -GameObject-
//It blocks me to access the renderer
//Making the variables public doesn't work either
private Renderer cube;
private Renderer sphere;
void Start ()
{
//Tried here the -FindGameObjectWithTag-
cube = GetComponent<Renderer>();
sphere = GetComponent<Renderer>();
}
void Update ()
{
if(Input.GetKeyDown(KeyCode.A))
{
//Tried here the -FindGameObjectWithTag-
cube.material.color = Color.red;
}
if(Input.GetKeyDown(KeyCode.S))
{
//Tried here the -FindGameObjectWithTag-
sphere.material.color = Color.green;
}
}
}
也许我做错了什么,正如我所说的,我是 Unity 的新手,我很乐意接受任何帮助,如果它不友好就更好了。
谢谢
您可以通过几种不同的方式来执行此操作。
如果它们都在同一个父对象下而没有其他对象,您可以遍历子对象并更改它们的颜色
GameObject Parent = GameObject.Find("ParentObject"); for( int x = 0; x > Parent.transform.childCount; x++); { Parent.transform.GetChild(x).GetComponent<Renderer>().material.color = Color.red; }
如果少于 20 个,您可以创建一个列表,然后在将列表的大小更改为您拥有的对象数量后,只需将每个变换拖放到检查器中即可。
/*Make sure you have Using "System.Collections.Generic" at the top */ //put this outside function so that the inspector can see it public List<Transform> Objs; // in your function put this (when changing the color) foreach(Transform Tform in Objs){ Tform.GetComponent<Renderer>().material.color = Color.red; }
与2类似,如果你想在代码中全部完成,你可以做到
//Outside function public List<Transform> Objs; //inside function Objs.Add(GameObject.Find("FirstObject").transform); Objs.Add(GameObject.Find("SecondObject").transform); //... keep doing this //now do the same foreach loop as in 2
您可以按标签搜索(如果您有很多对象)(我想这会花费更长的时间,因为它要遍历每个组件,但我没有证据支持那个)
//Outside function public GameObject[] Objs; //inside function Objs = GameObject.FindGameObjectsWithTag("ATagToChangeColor"); foreach(Transform Tform in Objs){ Tform.GetComponent<Renderer>().material.color = Color.red(); }
关于这条评论:
//If I change these variables to -GameObject- //It blocks me to access the renderer //Making the variables public doesn't work either
如果您将它们设为 GameObject 类型,那么您应该可以通过以下方式轻松访问渲染器:
public GameObject cube;
public void Start(){
cube.GetComponent<Renderer>().material.color = Color.red();
}
并使变量 public 允许 unity 的检查器查看变量,以便您可以在 unity 编辑器中更改它们而无需打开脚本。