嗨,我一直在尝试找到一种用随机颜色实例化预制件的方法。我看过许多标题相似的问题,我相信它们是不错的答案,但我不需要。我正在制作游戏的副本,以供练习,我想在实例化对象时必须使用随机颜色,这是我的代码:
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
并非可行之路,因为它适用于所有预制件。感谢所有帮助。
答案 0 :(得分:1)
通过使用sharedMaterial
,您说的是:“所有使用此材质的对象,请进行更改”,然后将所有立方体更改为相同的颜色。
如果您改为定位.material
,则Unity将自动克隆材质,然后更改新材质的颜色。
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";
}
}
然后,您需要做的就是摆脱第一个脚本中使用的着色,并将其放到多维数据集预制件上。