新创建的克隆预制件应具有与主色相同的颜色

时间:2019-12-07 14:59:39

标签: c# visual-studio unity3d

首先,我要创建一个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;
        }
    }

}

先谢谢您!期待您的回音。 :)

2 个答案:

答案 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此属性影响所有预制件的颜色。