Создание префаба со случайным цветом

Привет, я пытался найти способ создать префаб со случайным цветом. Я просмотрел много вопросов с похожими названиями, я уверен, что это хорошие ответы, но это не то, что мне нужно. Я делаю копию игры для практики, и я хочу, чтобы при создании экземпляра объекта использовались случайные цвета, вот мой код:

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

это не путь, потому что он подходит для всех сборных. Любая помощь приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 372
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас есть два варианта:

Вариант 1: используйте несколько материалов

Используя sharedMaterial, вы говорите: «Все объекты, которые используют этот материал, сделайте это изменение» и меняете ВСЕ кубики на одинаковый цвет.

Если вместо этого вы выберете .material, Unity автоматически клонирует материал, а затем изменит цвет нового материала.

Вариант 2: используйте 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(). Это накладные расходы, которые следует свести к минимуму

Draco18s no longer trusts SE 28.10.2018 19:16

Другие вопросы по теме