首先,我要创建一个prefab
。当我按r时,prefab
的颜色为红色。
现在,我按下按钮c,prefab
被克隆。现在,克隆的颜色默认为白色。但是第一个prefab
具有红色,因此克隆也应具有相同的颜色。
我试图获取prefab
的颜色,然后将其提供给克隆,但不幸的是未成功。
我的问题是,现在如何为预制件的克隆提供与主预制件相同的颜色?例如,当我创建三个预制件的克隆并按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;
}
}
}
先谢谢您!期待您的回音。 :)
答案 0 :(得分:0)
当实例化一个预制实例时,即创建该预制实例的副本时,可以在播放时修改和更改该预制实例,而无需更新原始预制实例。但是,仍然保留了与原始预制件的链接。
实例替代允许您在Prefab之间创建变体 实例,同时仍将这些实例链接到相同的Prefab 资产。
修改“预制资产”时,更改会反映在所有 它的实例。但是,您也可以直接对 个体实例。这样做会创建一个实例覆盖 特定实例。
这是Unity的核心,可让您在运行时更改实例(实例替代)。
例如: 我们有一个默认的预制件,代表您游戏中的一个角色,例如敌人的机器人,它会在不同的状态下改变颜色-攻击时为红色,巡逻时为绿色等。我们实例化许多副本,并且在运行时对每个实例的更改应独立。 / p>
按r时,预制件的颜色为红色。 我按按钮c,然后就可以复制预制件。 现在,克隆的颜色默认为白色。 但是第一个预制件的颜色是红色,因此克隆也应该具有相同的颜色。
因此,鉴于以上所述,您可以看到您正在更改预制实例的值-运行时实例重写。您对实例所做的任何更改都不会在原始预制件上进行。实例化新的预制件时,它们将是原始预制件的独立实例。
第二
查找所有游戏对象的调用仅在start()
上运行-仅在场景开始时运行一次。 GameObject.Find()
将返回与当时场景中存在的名称相匹配的单个游戏对象。 PS出于性能原因,避免使用GameObject.Find
-而是使用FindWithTag
这意味着您更改颜色的代码仅更改了场景开始时存在的那些实例。没有代码可以更改克隆的颜色。
要更改所有新克隆的颜色,可以执行以下操作:
List<GameObject> prefabInstanceClones = new List<GameObject>();
...
if (Input.GetKeyDown("a"))
{
prefabInstanceClones.ForEach(gameObject => { gameObject.GetComponent<Renderer> ().material.color = Color.red; });
}
希望有帮助。
答案 1 :(得分:0)
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;
}
}
您可以使用().sharedMaterial此属性影响所有预制件的颜色。