【问题标题】:Instantiate A Prefab With A Random Color使用随机颜色实例化预制件
【发布时间】:2019-04-01 15:29:35
【问题描述】:

您好,我一直在尝试找到一种方法来实例化具有随机颜色的预制件。我看过许多标题相似的问题,我确信它们是很好的答案,但它们不是我需要的。我正在制作游戏的副本,以进行练习,并且我希望在实例化对象时必须使用随机颜色,这是我的代码:

private Vector3 spawnPos = new Vector3(0, 0.75f, 0);
[SerializeField]
private GameObject hitCube;
private Color color1;
private Color color2;
private string lastColor;

// Use this for initialization
void Start () {
    color1 = Random.ColorHSV(0f, 1f, 0f, 0f);
    color2 = Random.ColorHSV(0f, 1f, 0f, 0f);
    for (int i = 0; i < 21; i++)
    {
        if (lastColor == "color1")
        {
            hitCube.GetComponent<Renderer>().sharedMaterial.color = color2;
            lastColor = "color2";
        }
        else
        {
            hitCube.GetComponent<Renderer>().sharedMaterial.color = color1;
            lastColor = "color1";
        }
        Instantiate(hitCube, spawnPos, Quaternion.identity);
        spawnPos.y += 0.50f;
    }

}

那么有谁知道我怎样才能做到这一点?当我使用它时,地面变成了一种颜色,所有的立方体也是如此。

我的另一个问题是为什么地面会改变颜色但发射器没有(看起来会改变但实际上它已经设置为更深的灰色阴影),以及为什么地面会改变颜色第一名?我明白了

sharedMaterial

不是要走的路,因为它适用于所有预制件。感谢所有帮助。

【问题讨论】:

    标签: c# unity3d random colors


    【解决方案1】:

    您有两种选择:

    选项 1:使用多种材料

    通过使用sharedMaterial,您是在说:“所有使用这种材料的对象,进行这种改变”并将所有立方体更改为相同的颜色。

    如果您改为以.material 为目标,Unity 将自动克隆材质,然后更改新材质的颜色。

    选项 2:使用MaterialPropertyBlock

    https://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html 允许您在渲染器去渲染对象时指定覆盖,而不必创建新的材质实例(由于批处理的工作方式,这更慢,并且使用更多内存)。它们非常易于使用。

    您创建(或重用)一个属性块,在其上设置颜色,然后调用someRenderer.SetPropertyBlock(block),您可以使用GetComponent&lt;Renderer&gt;() 获取渲染器,就像您已经在做的那样。

    【讨论】:

      【解决方案2】:

      哇,我正在回答我自己的问题。但基本上您需要做的就是在实例化多维数据集时使用以下代码(我创建了它):

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class Cube : MonoBehaviour {
      
           private static Color color1;
           private static Color color2;
           private static bool hasColorsAssigned = false;
           private static string lastColor;
      
           // Use this for initialization
           void Start () {
               if (hasColorsAssigned == false)
               {
                   color1 = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f));
                   color2 = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f));
                   hasColorsAssigned = true;
               }
               if (lastColor == "color1")
               {
                   GetComponent<Renderer>().material.color = color2;
                   lastColor = "color2";
               }
               else
               {
                   GetComponent<Renderer>().material.color = color1;
                   lastColor = "color1";
               }
       }
      

      然后你需要做的就是去掉第一个脚本中使用的颜色并将它放到立方体预制件上。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多