Привет, я пытался найти способ создать префаб со случайным цветом. Я просмотрел много вопросов с похожими названиями, я уверен, что это хорошие ответы, но это не то, что мне нужно. Я делаю копию игры для практики, и я хочу, чтобы при создании экземпляра объекта использовались случайные цвета, вот мой код:
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
это не путь, потому что он подходит для всех сборных. Любая помощь приветствуется.
Используя sharedMaterial
, вы говорите: «Все объекты, которые используют этот материал, сделайте это изменение» и меняете ВСЕ кубики на одинаковый цвет.
Если вместо этого вы выберете .material
, Unity автоматически клонирует материал, а затем изменит цвет нового материала.
MaterialPropertyBlock
https://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html
позволяет вам указывать переопределения, когда средство визуализации переходит на рендеринг объекта без необходимости создавать новые экземпляры материалов (что медленнее из-за способа работы пакетной обработки и использует больше памяти). Они довольно просты в использовании.
Вы создаете (или повторно используете) блок свойств, устанавливаете для него цвет, а затем вызываете someRenderer.SetPropertyBlock(block)
, и вы можете получить средство визуализации, используя GetComponent<Renderer>()
, как вы уже делаете.
Вау, я отвечаю на свой вопрос. Но в основном все, что вам нужно сделать, это когда вы создаете экземпляр куба, используйте этот код (я его создал):
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";
}
}
Затем все, что вам нужно сделать, это избавиться от раскраски, использованной в первом скрипте, и поместить ее в префаб куба.
Вам следует удалить неиспользованный метод
Update()
. Это накладные расходы, которые следует свести к минимуму