Color random в лего

Обновлено: 15.05.2024

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformGenerator : MonoBehaviour

public GameObject thePlatform;
public Transform generationPoint;
public float distanceBettween;
public Color[] colors = new Color[2];
Random ranCol = new Random();

private float platformWidth;


// Use this for initialization
void Start () platformWidth = thePlatform.GetComponent().size.x;

colors[0] = GetComponent().material.color = Color.red;
colors[1] = GetComponent().material.color = Color.green;

// Update is called once per frame
void Update () if(transform.position.x < generationPoint.position.x)
transform.position = new Vector3(transform.position.x + platformWidth + distanceBettween, transform.position.y, transform.position.z);

Instantiate(thePlatform, transform.position, transform.rotation);

for (int i = 0; i < colors.Length; i++)
GetComponent().material.color = colors[Random.Range(0, colors.Length)];
>

var plaform = Instantiate(thePlatform, transform.position, transform.rotation);

for (int i = 0; i < colors.Length; i++)
plaform.GetComponent().material.color = colors[Random.Range(0, colors.Length)];
>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformDestroyer : MonoBehaviour

public GameObject platformDestructionPoint;
public Color[] colors = new Color[2];
//Random ran = new Random;

// Use this for initialization
void Start () colors[0] = Color.red;
colors[1] = Color.green;
platformDestructionPoint = GameObject.Find("PlatformDestructionPoint");

// Update is called once per frame
void Update () for (int i = 0; i < colors.Length; i++)
gameObject.GetComponent().material.color = colors[Random.Range(0, colors.Length)];
>

Ты меняешь цвет на рандомный каждый проход два раза, хрень.
Если хочешь один раз сменить юзай старт.

Вот держи, скопируешь что нужно.

using System.Collections;
using UnityEngine;

public class ColorChanger : MonoBehaviour
[SerializeField]
float timeDelay = .5f;

[SerializeField]
bool loop = false;

[SerializeField]
Color[] colors;

private Renderer _renderer;

void Start()
_renderer = gameObject.GetComponent();
StartCoroutine(ChangeColor(timeDelay));
>

IEnumerator ChangeColor(float delay)
_renderer.material.color = colors[Random.Range(0, colors.Length)];

yield return new WaitForSeconds(delay);

public class Character : MonoBehaviour

[SerializeField]
public int lives = 1;
[SerializeField]
public float speed = 3.0f;
[SerializeField]
public float jumpForce = 2.5f;
[SerializeField]
public bool isGrounded=false;
public bool fastRun = false;

private CharState State
get < return (CharState)animator.GetInteger("State"); >
set < animator.SetInteger("state", (int)value); >
>
new private Rigidbody2D rigidbody;
private Animator animator;
private SpriteRenderer sprite;

private void Start()

>
private void Awake()
rigidbody = GetComponent ();
animator = GetComponent ();
sprite = GetComponentInChildren ();

private void FixedUpdate()
CheckGround();
>

private void Update()
if (fastRun == true) speed = 7;
// if (Input.GetKeyDown(KeyCode.Escape)) SceneManager.LoadScene("menu");
if (isGrounded) State = CharState.idle;
if (Input.GetButton("Horizontal")) Run();
if (isGrounded && Input.GetButton("Jump")) Jump();
// if (Input.GetButtonDown("LShift")) fastRun = !true;

private void Run()

private void Jump()

rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
if(isGrounded) State = CharState.jump;

>
private void CheckGround()
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 0.3f);



Лет эдак в 10-11, после долгих и беззаботных лет игры с контрукторами Lego, я узнал о существовании великолепного набора Mindstorms, который позволял создавать самых настоящих роботов без специализованных знаний электроники, электротехники и даже программирования. Я сразу же заинтересовался данной серией, но тогда моим мечтам обладать Mindstorms по различным (в основном — финансовым) причинам не суждено было сбыться.
Сейчас мне 20 и в честь юбилея друзья (спасибо им!) решили окунуть меня назад в детство и таки дать возможность полепить собственных роботов. Правда, в этот раз всё будет серьёзнее, чем в моих детских мыслях — мы будем действительно программировать Mindstorms под Debian GNU/Linux.

Неплохо, да?
Собственно, данный робот и будет нашей основной тестовой моделью. Но мы попробуем немного усовершенствовать его навыки. И для этого мы напишем небольшой кусочек кода.


Действительно. Идущее в комплекте ПО работает только в Windows и Mac OS. А у нас, внезапно, Debian Squeeze. К счастью, Mindstorms обладает огромным сообществом фанатов, которые придумали решение данной проблемы — использование альтернативного ПО для программирования роботов, в частности Bricxcc (здесь выложен полнейший мануал по настройке всего и вся).
А теперь немного теории — в программировании Mindstorms, как правило, помимо визуального среды ROBOLAB для Windows и Mac OS используется язык RCX, однако среди фанатов одним из наиболее популярных языков является достаточно простой NXC (Not eXactly C). Простая программа на NXC выглядит примерно так:

  1. task music()
  2. int lastTone=5000;
  3. while ( true )
  4. int tone= Random (5000)+500;
  5. int duration= Random (500);
  6. PlayTone(tone,duration);
  7. Wait(duration);
  8. >
  9. >
  10. task main()
  11. start music;
  12. while ( true )
  13. /* Determine Next Action */
  14. unsigned int duration= Random (5000);
  15. unsigned int motorSpeed= Random (100);
  16. unsigned int syncMode= Random (3);
  17. /* Display Next Action */
  18. ClearScreen();
  19. NumOut(0,LCD_LINE1,duration);
  20. NumOut(0,LCD_LINE2,motorSpeed);
  21. NumOut(0,LCD_LINE3,syncMode);
  22. /* Perform Next Action */
  23. switch (syncMode)
  24. case 0:
  25. OnFwdReg(OUT_AC,motorSpeed,OUT_REGMODE_SYNC);
  26. break ;
  27. case 1:
  28. OnRevReg(OUT_AC,motorSpeed,OUT_REGMODE_SYNC);
  29. break ;
  30. case 2:
  31. OnFwdSync(OUT_AC,motorSpeed,-100);
  32. break ;
  33. case 3:
  34. OnRevSync(OUT_AC,motorSpeed,-100);
  35. break ;
  36. >
  37. Wait(duration);
  38. >
  39. >

Для справки — данная программа заставляет «танцевать» нашего робота под нечто, напоминающее музыку.

Не буду спорить, программа совсем не сложна для понимания, но достаточно громоздка. И её можно заметно упросить, используя вместо написания кода на NXC специальный конвертер PyNXC. Иначе говоря, мы будем писать код на Python'е, а PyNXC будет преобразовывать его в NXC-код и загружать на устройство, избавив нас от необходимости писать громоздкий код на подобии Си.


Ну, а теперь, собственно, напишем на Python'е программу для путешествия нашего робота среди прозрачных чашек, но используя более грамотный алгоритм разворота:

Теперь наш робот научился разворачиваться на месте и, как только мешающий объект пропадет с поля его зрения, продолжать движение вперед.

Как вы уже, наверное, заметили, программировать Mindstorms очень просто. Стоит также сказать, что помимо NXC и Python с использованием PyNXC, можно писать код на Java, Lua, Ruby, Ассемблере, а также, что логично, использовать ассемблерные вставки в других языках.
Благодаря всему этому Mindstorms из детской игрушки превращается в весьма мощную штуку, позволяющую создавать сложные и «умные» механизмы, как например вот эта гитара:

Всех с наступающим! Меня зовут Гриша, и я основатель CGDevs. Уже не за горами праздники, кто-то уже нарядил ёлку, поел мандаринов и во всю заряжается новогодним настроением. Но сегодня речь пойдёт не об этом. Сегодня мы поговорим про замечательный формат под названием LDraw и про плагин для Unity, который я реализовал и выложил в OpenSource. Ссылка на проект и исходники к статье, как всегда, прилагаются. Если вы так же, как и я любите лего – добро пожаловать под кат.




Формат LDraw

Начнём с того, что такое LDraw? LDraw – это открытый стандарт для LEGO CAD программ, позволяющий пользователям создавать модели и сцены LEGO. В целом существую разные программы и плагины, с помощью которых можно визуализировать LDraw (к примеру, есть плагин для Blender).

Сам формат хорошо задокументирован, и мы поговорим про его последнюю версию, а точнее про 1.0.2.

LDraw – это текстовый формат, файлы которого должны быть созданы с кодировкой UTF-8. Файлы, поддерживаемые форматом, должны иметь расширение ldr, dat или mdp. Каждая строка файла – это отдельная команда, отвечающая за определённую функцию.

Важной деталью формата является правосторонняя система координат (Y направлен вверх) – подробнее обсудим позже в контексте юнити, а также то, что формат является рекурсивным (большая часть файлов содержит указание на другие файлы).


Команды LDraw

В целом с этой информацией можно ознакомиться в официальной документации, но рассмотрим немного в контексте Unity. Всего формат LDraw поддерживает 6 типов команд.

0. Комментарий или мета команда – это специальные команды, которых мы почти не будем касаться в плагине. Пример: 0 !META command additional parameters

1. Ссылка на файл. По сути, самая сложная в интеграции и интересная команда. Выглядит она как — 1 colour x y z a b c d e f g h i file , где параметры являются TRS матрицей (подробнее про TRS можно прочитать в этой статье). В контексте юнити в форме


2. Линия – не используется в случае Unity, нужно чтобы подчеркнуть грани определённым цветом в CAD системах.

3,4. Треугольник и квадрат. Команды достаточно простые, но есть один важный нюанс, так как формат LDraw не рассчитан на 3д моделирование, то обход треугольников и квадратов в нём не стандартизирован. Это важно, так как юнити в зависимости от обхода треугольника определяет направление calculated нормали, а также какая сторона треугольника является задней, а какая передней (что так же важно для отрисовки и куллинга)

Пример команд:
Треугольник — 3 colour x1 y1 z1 x2 y2 z2 x3 y3 z3
Квадрат — 4 colour x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4

5. Опциональная линия – тоже не используется.


Цвета в LDraw

DAT – по сути это базовые элементы из которых уже собираются детали, либо какие-то базовые детали. Если не рендерить отдельные детали – указанный в них цвет не важен. Чаще всего там стоят стандартные цвета официального стандарта.

LDR – это самое интересное, с точки зрения цветов, и где Scope играет роль. Правило довольно простое, хотя на сайте описано сложным языков. Если вы из одного ldr ссылаетесь на другой – игнорируйте цвет указанный в корневом.

Для примера часть файла 30051-1 — X-wing Fighter — Mini.mpd (X-wing на картинке выше):

Во всех dat файлах мы учитываем указанный цвет, а в команде 1 72 0 -8 -70 1 0 0 0 1 0 0 0 1 30051 — Nose.ldr – игнорируем 72, и используем значения из файла 30051 — Nose.ldr.

MDP – это файл модели, чаще всего содержит в себе описание нескольких ldr файлов. С точки зрения цвета так же не особо важен. Единственное, что мы учитываем при парсинге — это мета-команду FILE.


Модели в LDraw

Про формат поговорили, теперь пора поговорить немного про плагин для Unity.


Плагин для Unity

Плагин предоставляет возможность генерировать 3д модели на основе файлов LDraw. Результаты вы можете увидеть в картинках из статьи. Важно: если у вас слабое устройство, лучше открывайте только сцены mini в папке Demo. Модели не оптимизированы и всегда генерируют backface.

А теперь поговорим немного про реализацию. На данный момент поддержана большая часть описанного выше.

Одной из, пожалуй, самых главных особенностей являются разные системы координат. Проблема в том, что в формате правосторонняя система координат, а в Unity – левосторонняя. Что это, по сути, означает, что все повороты и TRS матрица будут работать неверно. Отрицательный Y обыграть просто – отражаем все координаты относительно Vector3.up и получаем нужные (умножаем на -1). Но вот в случае с TRS матрицей всё сложнее. Так как формат рекурсивный, то просто отражать матрицу – нельзя, так как Matrix.Identity везде превратится в матрицу отражения и каждая вложенность будет отражать нашу модель по оси Y, что приведёт к неправильному отображению (если сохранять положительный scale). Пока я пришёл к не совсем верному решению в виде того, что разрешил отрицательный scale, что нужно будет переделать в будущих версиях.

Вторая особенность, это ориентация треугольников. Для квадов реализовано то, чтобы треугольники смотрели в одну сторону:

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

Кроме того, из-за того, что формат рекурсивный, иерархическая система Unity пришлась как никогда кстати.

С помощью рекурсии в двух методах, мы генерируем нужные нам меши и применяем TRS (реализацию можно прочитать в прошлой статье), и таким образом получаем в удобном формате все необходимые для нас смещения:

И по итогу мы получаем такие красивые визуализации:



Подробнее можно посмотреть в репозитории на Github.

В целом по развитию плагина очень много идей, хочется ввести такие функциональности, как:

  1. Сглаживание некоторых форм
  2. Генерация только front face
  3. Конструктор и выгрузка моделей обратно в формат LDraw
  4. По круче шейдер для пластика с subsurface scattering (и правильный набор материалов в целом)
  5. Unwrap UV для лайтмапов
  6. Оптимизация моделей (сейчас большинство состоят из 500к+, а к примеру модель эйфелевой башни 2.8 миллона полигонов)

Спасибо за внимание, надеюсь вы узнали для себя что-то новое, и вас заинтересовал формат и плагин! Если будет время – буду продолжать его развивать и буду рад помощи в этом нелёгком деле.

Год назад мы перешли с графического программирование нашего робота LEGO Mindstorms EV3 на текстовое и первым языком программирования, который мы освоили, стал EV3 BASIC. Нам очень понравились его простота, отзывчивость к первым, зачастую неумелым попыткам выжать из него что-то большее, то, что мы могли получить на графическом "леговском" EV3-G. За этот год мы создали с использование BASICа целый ряд проектов (NAVIDOZ3R, Music Station, Телеграф, НУ ПОГОДИ, Саймон сказал), которые, как нам кажется, неплохо раскрыли возможности этого языка. Программы, написанные не нем работают существенно быстрее программ на "языке из кубиков". Бейсик не навязывает "хороший стиль" программирования, он дает свободу программисту - в этом его основная фишка.


Однако чем более сложными становились наши проекты с использованием EV3 BASIC, тем все более отчетливо мы ощущали его ограничения:

  • все переменные - глобальные
  • так же как и в EV3-G нет возможности работать с многомерными массивами без использования костылей
  • нельзя создать функцию с передачей в нее параметров и возвратом из нее результата
  • проблемы с поддержкой датчиков сторонних производителей


Мы решили начать с ev3dev и языка Python, так как ходили слухи что язык этот имеет достаточно низкий порог вхождения подобно Бейсику, при этом не имея присущих ему недостатков. Еще на летних каникулах мы проштудировали замечательную детскую книгу по Python под названием "Hello World! Занимательное программирование" (Картер Сэнд, Уоррен Сэнд, 2016). На примере создания простейших игр книга действительно занимательно погружает читателя в основы языка Python.



В процессе прохождения первого курса, в попытках решения учебных задач с Python на EV3 пришло понимание того, что базовые навыки работы в ОС Linux пришлись бы юным робототехникам как нельзя кстати. Курс на том же Stepic под названием Введение в Linux оставил только положительные эмоции и дал массу полезной информации, в том числе и для размышления.


Очень полезным источником информации для нас стал сайт по EV3 Python. Его автор, Nigel Ward, уже помогал нам год назад в адаптации EV3 BASIC для русскоязычных робототехников. Его материалы мы взяли за основу и в этот раз. Мы подготовили русскоязычное руководство по Python для EV3, которое состоит из двух частей:

Кроме этого, так же как и в прошлом году мы решили несколько учебных задачек, некоторые из которых встречаются в нашем онлайн-задачнике по робототехнике.


Исходные кода всех программ, а также инструкцию к роботу, способному их решить вы можете скачать по ссылке.

1. Робот, поворачиваясь вокруг своей оси сканирует пространство, после чего выводит на экран "карту-радар" в виде лепестковой диаграммы.


2. Плавное изменение цветов и яркости подсветки по нажатию кнопок на блоке, например вверх-вниз изменяют яркость, влево-вправо изменяет цвет, нажатие в центр запускает автоматические переливы. Голосом озвучивается изменения режимов.

3. Робот должен проехать полный круг по линии и остановиться, определив и произнеся вслух диаметр круга, который на момент старта ему неизвестен. Гироскоп использовать нельзя.


4. Робот, имеющий в своей конструкции гироскоп, должен описать круг вокруг кегли и, вернувшись на место старта, остановиться.

5. Робот, двигаясь по линии круга, после прохождения полной окружности должен закрутить траекторию движения правильной спиралью к центру круга. Достигнув центра круга робот должен остановиться. В программе должно быть предусмотрена возможность указания количества витков спирали, которое сделает робот до того, как остановится в центре круга.

if (mA.position*(56*pi/360)+mD.position*(56*pi/360))/2 > pi*(D*2) and time.time() > 3:
break

mA.stop(stop_action="hold")
mD.stop(stop_action="hold")
Sound.beep()


LEGO features a wide array of attractive pastel colours, applicable to anything from bricks to minifigures.

The original palette included colours such as bright red, bright blue, bright yellow, dark green, white, and black. Today, LEGO offers a much wider range.

Contents

List of colours

Solid colours

Transparent colours

Colour ID Name Sample
40 Transparent (clear)
41 Transparent Red
42 Transparent Light Blue
43 Transparent Blue
44 Transparent Yellow
47 Transparent Fluorescent Reddish-Orange (Transparent Dark Orange)
48 Transparent Green
49 Transparent Fluorescent Green (Transparent Neon Green)
111 Transparent Brown (Smoke)
113 Transparent Medium Reddish-Violet
126 Transparent Bright Bluish-Violet
143 Transparent Fluorescent Blue
182 Transparent Bright Orange
311 Transparent Bright Green

Special colours

Colour ID Name Sample
131 Silver
148 Metallic Dark Grey
294 Phosphorescent Green
297 Warm Gold
309 Metalized Silver
310 Metalized Gold
315 Silver Metallic
316 Titanium Metallic

Incomplete list of phased out colours

colour ID Name Sample
2 Grey
153 Sand Red
25 Earth Orange
139 Copper
219 Brown
105 Bright Yellowish Orange
3 Light Yellow
195 Royal Blue
11 Pastel Blue
27 Dark Grey
9 Light Reddish Violet
147 Metallic Sand Yellow
145 Metallic Sand Blue
50 Phosphorescent White
136 Sand Violet
104 Bright Violet

Greyscale

Before 2003, the greyscale colours of the LEGO Palette were entirely grey. After 2004, LEGO added a noticeably blue tint to their greys.

LEGO Digital Designer colour palette

As of version 4.3, LEGO Digital Designer currently has a palette of 41 solid colours, 15 transparent colours (including Phosphorescent Green), 5 metallic colours, and 17 legacy colours.

Earlier versions

Earlier versions had 26 main colours, some of which were divided into sections for easier colour reach. In LDD 4.1.6, the colours were reduced to 52, out of the 121 originally available.

The main colour groupings were White, Bright Red, Reddish Brown, Bright Orange, Bright Yellow, Dark Green, Bright Bluish Green, Bright Blue, Bright Reddish Violet, Medium Reddish Violet, Metallic White, Metallic Bright Red, Reddish Gold, Gold, Lemon Metallic, Metallic Bright Blue, Transparent, Transparent Red, Transparent Brown, Transparent Bright Orange, Transparent Yellow, Transparent Green, Transparent Blue, Transparent Bright Bluish Violet, and Transparent Medium Reddish Violet.

There were ten colours under this main colour including Phosphorescent White †, White, Light Stone Grey, Light Grey †, Grey †, Medium Stone Grey, Dark Stone Grey, Dark Grey †, PC Black IR †, and Black.

There were ten colours under this main colour including New Dark Red, Rust †, Flip/Flop Red †, Sand Red †, Bright Red, Bright Reddish Orange †, Flame Reddish Orange †, Neon Orange †, Medium Red †, and Light Red †.

Reddish Brown

There were 13 colours under this main colour including Dark Brown, Earth Orange †, Reddish Brown, Earth Yellow †, Brown †, Sand Yellow †, Brick-Yellow, Dark Orange, Yellow Flip/flop †, Nougat, Dark Curry †, Medium Nougat †, and Dark Nougat †.

Bright Orange

There were nine colours under this main colour including Light Orange †, Warm Yellowish orange †, flame yellowish orange †, Medium Yellowish Orange †, Bright Yellowish Orange †, Bright Orange, Light Orange Brown †, Medium Orange †, and Curry †.

Bright Yellow

There were seven colours under this main colour including Light Brick Yellow †, Light Yellowish Orange †, Light Nougat, Bright Yellow, Fire Yellow †, Light Yellow †, and Cool Yellow †.

There were 13 colours under this main colour including Dark Green †, Sand Green †, Faded Green †, Earth Green †, Bright Green, Light Faded Green †, Medium Green †, Light Green †, Bright Yellowish-Green, Medium-Yellowish green †, Neon Green †, Spring Yellowish Green †, and Light Yellowish Green †.

Bright Bluish Green

There were four colours under this main colour including Medium Bluish Green †, Bright Bluish Green †, Turquoise †, and Light Bluish Green †.

Bright Blue

There were 16 colours under this main colour including Medium Bluish Violet, Medium Blue, Sand Blue †, Medium Royal Blue †, Tiny-Medium Blue †, Royal Blue †, Tiny-Blue †, Bright Blue, Light Bluish Violet †, Dark Royal Blue †, Dove Blue †, Bright Bluish Violet †, Light Blue †, Earth Blue, Light Royal Blue †, and Aqua †.

Bright Reddish Violet

There were nine colours under this main colour including Bright Lilac †, Medium Lilac †, Lilac †, Reddish Lilac †, Bright Reddish Lilac †, Bright Reddish Violet †, Light Lilac †, Bright Violet †, and Sand Violet †.

Medium Reddish Violet

There were six colours under this main colour including Medium Reddish Violet †, Bright Purple †, Light Purple †, Light Reddish Violet †, and Light Pink †.

Metallic White

There were 11 colours under this main colour including Metallic Sand Violet †, Metallic White †, Metallic Light Grey †, Silver Metallic †, Gun Metallic †, Titanium Metallic †, Metallic Dark Grey †, Metallic Black †, Silver †, Cool silver †, and Silver flip/flop †.

Reddish Gold

There were four colours under this main colour including Metallic Earth-Orange †, Copper †, Reddish Gold †, and Metallic Sand Yellow †.

Lemon Metallic

There were two colours under this main colour including Lemon Metallic †, and Metallic Dark Green †.

Metallic Bright Blue

There were two colours under this main colour including Metallic Bright Blue †, and Metallic Sand Blue †.

Transparent

There were three colours under this main colour including Transparent, Nature †, and Phosphorescent Green.

Читайте также: