Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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#_Unity3d_Random_Colors - Fatal编程技术网

C# 用随机颜色实例化预设

C# 用随机颜色实例化预设,c#,unity3d,random,colors,C#,Unity3d,Random,Colors,嗨,我一直在想办法用随机颜色实例化一个预置。我看过很多题目相似的问题,我相信它们是很好的答案,但它们不是我需要的。为了练习,我正在制作一个游戏的复制品,我想在实例化一个对象时使用随机颜色。这是我的代码: private Vector3 spawnPos = new Vector3(0, 0.75f, 0); [SerializeField] private GameObject hitCube; private Color color1; private Color color2; privat

嗨,我一直在想办法用随机颜色实例化一个预置。我看过很多题目相似的问题,我相信它们是很好的答案,但它们不是我需要的。为了练习,我正在制作一个游戏的复制品,我想在实例化一个对象时使用随机颜色。这是我的代码:

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

}
这不是一条路要走,因为它适用于所有的预制件。非常感谢您的帮助。

您有两个选择: 选项1:使用多种材质 通过使用
sharedMaterial
您可以说:“所有使用此材质的对象,进行此更改”,并将所有立方体更改为具有相同的颜色

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

选项2:使用
MaterialPropertyBlock
A
https://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html
允许您在渲染器渲染对象时指定覆盖,而无需创建新的材质实例(由于批处理的工作方式,该操作速度较慢,并且占用更多内存)。它们很容易使用


您可以创建(或重用)一个属性块,在其上设置一种颜色,然后调用,您可以使用
GetComponent()
获得一个渲染器,就像您已经做的那样。

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

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类多维数据集:单行为{
专用静态颜色1;
专用静态颜色2;
私有静态布尔hasColorsAssigned=false;
私有静态字符串lastColor;
//用于初始化
无效开始(){
if(hasColorsAssigned==false)
{
颜色1=新颜色(随机范围(0.0f,1.0f)、随机范围(0.0f,1.0f)、随机范围(0.0f,1.0f));
颜色2=新颜色(随机范围(0.0f,1.0f)、随机范围(0.0f,1.0f)、随机范围(0.0f,1.0f));
hasColorsAssigned=true;
}
如果(lastColor==“color1”)
{
GetComponent().material.color=color2;
lastColor=“color2”;
}
其他的
{
GetComponent().material.color=color1;
lastColor=“color1”;
}
}

然后,您需要做的就是去掉第一个脚本中使用的颜色,并将其放到多维数据集预置中。

您应该删除未使用的
Update()
方法。
sharedMaterial
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";
         }
 }