Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新创建的克隆预制件应具有与主克隆预制件相同的颜色_C#_Visual Studio_Unity3d - Fatal编程技术网

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; } }
你可以