C# 新创建的克隆预制件应具有与主克隆预制件相同的颜色
首先,我要创建一个C# 新创建的克隆预制件应具有与主克隆预制件相同的颜色,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,首先,我要创建一个预置。当我按下r键时,预置的颜色为红色。 现在,我按下按钮c,prefact正在被克隆。克隆的颜色现在默认为白色。但是第一个prefact具有红色,因此克隆也应该具有相同的颜色。 我试图得到预置的颜色,然后把它交给克隆人,不幸的是没有成功 我现在的问题是,我如何才能给预制的克隆与主预制相同的颜色?例如,当我创建三个预置克隆并按下b键时,所有四个预置都应该是蓝色的 请看下面我的代码: using System.Collections; using System.Collectio
预置
。当我按下r键时,预置
的颜色为红色。
现在,我按下按钮c,prefact
正在被克隆。克隆的颜色现在默认为白色。但是第一个prefact
具有红色,因此克隆也应该具有相同的颜色。
我试图得到预置的颜色
,然后把它交给克隆人,不幸的是没有成功
我现在的问题是,我如何才能给预制的克隆与主预制相同的颜色?例如,当我创建三个预置克隆并按下b键时,所有四个预置都应该是蓝色的
请看下面我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class globalControl : MonoBehaviour
{
public GameObject prefabInstance;
List<Object> prefabInstanceClones = new List<Object>();
GameObject capsule, sphere, cylinder;
private void Start()
{
capsule = GameObject.Find("Capsule");
sphere = GameObject.Find("Sphere");
cylinder = GameObject.Find("Cylinder");
}
void Update()
{
Debug.Log(prefabInstanceClones.Count);
if (Input.GetKeyDown("c"))
{
prefabInstanceClones.Add(Instantiate(prefabInstance, transform.position, Quaternion.identity));
}
if (Input.GetKeyDown("d"))
{
var last = prefabInstanceClones[prefabInstanceClones.Count - 1];
prefabInstanceClones.Remove(last);
Destroy(last);
}
if (Input.GetKeyDown("r"))
{
capsule.GetComponent<Renderer>().material.color = Color.red;
sphere.GetComponent<Renderer>().material.color = Color.red;
cylinder.GetComponent<Renderer>().material.color = Color.red;
} else if (Input.GetKeyDown("b"))
{
capsule.GetComponent<Renderer>().material.color = Color.blue;
sphere.GetComponent<Renderer>().material.color = Color.blue;
cylinder.GetComponent<Renderer>().material.color = Color.blue;
} else if (Input.GetKeyDown("g"))
{
capsule.GetComponent<Renderer>().material.color = Color.green;
sphere.GetComponent<Renderer>().material.color = Color.green;
cylinder.GetComponent<Renderer>().material.color = Color.green;
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类全局控制:单行为
{
公共游戏对象实例;
List InstanceClones=新列表();
游戏物体胶囊、球体、圆柱体;
私有void Start()
{
胶囊=游戏对象。查找(“胶囊”);
球体=游戏对象。查找(“球体”);
圆柱体=游戏对象。查找(“圆柱体”);
}
无效更新()
{
Log(prefactInstanceClones.Count);
if(Input.GetKeyDown(“c”))
{
prefactInstanceClones.Add(实例化(prefactInstance,transform.position,Quaternion.identity));
}
if(Input.GetKeyDown(“d”))
{
var last=prefactInstanceClones[prefactInstanceClones.Count-1];
预制实例克隆。移除(最后一个);
销毁(最后);
}
if(Input.GetKeyDown(“r”))
{
capsule.GetComponent().material.color=color.red;
sphere.GetComponent().material.color=color.red;
圆柱体.GetComponent().material.color=color.red;
}else if(Input.GetKeyDown(“b”))
{
capsule.GetComponent().material.color=color.blue;
sphere.GetComponent().material.color=color.blue;
圆柱体.GetComponent().material.color=color.blue;
}else if(Input.GetKeyDown(“g”))
{
capsule.GetComponent().material.color=color.green;
sphere.GetComponent().material.color=color.green;
圆柱体.GetComponent().material.color=color.green;
}
}
}
提前谢谢你!期待您的来信。:) 当您实例化一个预置实例时,即创建预置的克隆,可以在播放时修改和更改该预置的实例,而无需更新原始预置。但是,与原始预制件的链接仍然保持不变 实例替代允许您在预设之间创建变体 实例,同时仍将这些实例链接到同一预设 资产 修改预制资源时,所做的更改将反映在所有资源中 它的实例。但是,您也可以直接修改 个别实例。这样做会在该对象上创建一个实例覆盖 具体实例 这是Unity的核心,允许您在运行时更改实例(实例覆盖) 例如: 我们有一个默认预置,它代表游戏中的一个角色,比如一个敌方机器人,它在不同的状态下改变颜色——攻击时变为红色,巡逻时变为绿色等等。我们实例化了许多副本,在运行时对每个实例的更改应该是独立的 当我按下r键时,预制件的颜色为红色。 我按下按钮c,预制正在被克隆。 克隆的颜色现在默认为白色。 但是第一个预置的颜色是红色的,所以克隆也应该有相同的颜色 鉴于上述情况,您可以看到您正在更改预置实例的值—在运行时进行实例重写。对实例所做的任何更改都不会在原始预置上进行。当您实例化新预置时,它们将是原始预置的独立实例 其次 查找所有游戏对象的调用仅在
start()
处运行,该调用仅在场景开始时运行一次GameObject.Find()
将返回一个与当时场景中存在的名称匹配的单个游戏对象。PS避免使用游戏对象。出于性能原因查找,而不是使用
这意味着更改颜色的代码仅更改场景开始时存在的实例。没有代码可以更改克隆的颜色
要更改所有新克隆的颜色,可以执行以下操作:
List<GameObject> prefabInstanceClones = new List<GameObject>();
...
if (Input.GetKeyDown("a"))
{
prefabInstanceClones.ForEach(gameObject => { gameObject.GetComponent<Renderer> ().material.color = Color.red; });
}
List prefactInstanceClones=new List();
...
if(Input.GetKeyDown(“a”))
{
PrefactInstanceClones.ForEach(gameObject=>{gameObject.GetComponent().material.color=color.red;});
}
希望有帮助。公共游戏对象实例;
public GameObject prefabInstance;
List<Object> prefabInstanceClones = new List<Object>();
//GameObject capsule, sphere, cylinder;
private void Start() {
//capsule = GameObject.Find("Capsule");
//sphere = GameObject.Find("Sphere");
//cylinder = GameObject.Find("Cylinder");
}
void Update() {
Debug.Log(prefabInstanceClones.Count);
if (Input.GetKeyDown("c")) {
prefabInstanceClones.Add(Instantiate(prefabInstance, transform.position, Quaternion.identity));
}
if (Input.GetKeyDown("d")) {
var last = prefabInstanceClones[prefabInstanceClones.Count - 1];
prefabInstanceClones.Remove(last);
Destroy(last);
}
if (Input.GetKeyDown("r")) {
prefabInstance.GetComponent<Renderer>().sharedMaterial.color = Color.red;
} else if (Input.GetKeyDown("b")) {
prefabInstance.GetComponent<Renderer>().sharedMaterial.color = Color.blue;
} else if (Input.GetKeyDown("g")) {
prefabInstance.GetComponent<Renderer>().sharedMaterial.color = Color.green;
}
}
List InstanceClones=新列表();
//游戏物体胶囊、球体、圆柱体;
私有void Start(){
//胶囊=游戏对象。查找(“胶囊”);
//球体=游戏对象。查找(“球体”);
//圆柱体=游戏对象。查找(“圆柱体”);
}
无效更新(){
Log(prefactInstanceClones.Count);
if(Input.GetKeyDown(“c”)){
prefactInstanceClones.Add(实例化(prefactInstance,transform.position,Quaternion.identity));
}
if(Input.GetKeyDown(“d”)){
var last=prefactInstanceClones[prefactInstanceClones.Count-1];
预制实例克隆。移除(最后一个);
销毁(最后);
}
if(Input.GetKeyDown(“r”)){
PrefactInstance.GetComponent().sharedMaterial.color=color.red;
}else if(Input.GetKeyDown(“b”)){
PrefactInstance.GetComponent().sharedMaterial.color=color.blue;
}else if(Input.GetKeyDown(“g”)){
PrefactInstance.GetComponent().sharedMaterial.color=color.green;
}
}
你可以