实例化具有随机颜色的预制件

时间:2018-10-28 15:11:08

标签: c# unity3d random colors

嗨,我一直在尝试找到一种用随机颜色实例化预制件的方法。我看过许多标题相似的问题,我相信它们是不错的答案,但我不需要。我正在制作游戏的副本,以供练习,我想在实例化对象时必须使用随机颜色,这是我的代码:

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;
    }

}

那么有人知道我该如何做吗?当我使用它时,地面变成一种颜色,所有立方体也一样。

enter image description here

我的另一个问题是,为什么地面会改变颜色,但启动器却没有(看起来确实如此,但实际上已经将其设置为更深的灰色阴影),为什么地面会改变颜色?第一名?我明白

sharedMaterial

并非可行之路,因为它适用于所有预制件。感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

您在这里有两个选择:

选项1:使用多种材料

通过使用sharedMaterial,您说的是:“所有使用此材质的对象,请进行更改”,然后将所有立方体更改为相同的颜色。

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

选项2:使用MaterialPropertyBlock

https://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html使您可以在渲染器渲染对象时指定替代,而不必创建新的材质实例(由于批处理的方式,它会较慢,并且会占用更多内存)。它们非常易于使用。

您创建(或重用)属性块,在其上设置颜色,然后调用someRenderer.SetPropertyBlock(block),就可以通过使用GetComponent<Renderer>()来获得渲染器。

答案 1 :(得分:0)

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

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";
         }
 }

然后,您需要做的就是摆脱第一个脚本中使用的着色,并将其放到多维数据集预制件上。