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
Ahttps://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";
}
}