C # Unity - Sprite превращается в белый вместо желаемого цвета [дубликат]

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

Некоторые люди предположили, что владельцы данных, которые являются изменяемыми, не должны быть структурами. Я категорически не согласен. Сущности, которые существуют для хранения данных, во многих случаях должны быть структурами, особенно если они изменяемы. Эрик Липперт неоднократно публиковал, что он считает изменчивые типы значений злыми (поиск по меткам «изменчивый» и «struct»). Конечно, верно, что .net позволяет делать определенные вещи с помощью изменяемых структур, которые он не должен, и не позволяет удобно некоторым вещам, которые он должен, но структурам POD («Обычные старые данные»), которые не имеют мутирующих методов, но вместо этого выставляют все свое состояние через общедоступные поля, имеют очень полезную согласованность в своем поведении, которое не используется ни с каким другим типом данных. Использование структуры POD может смутить кого-то, кто не знаком с тем, как они работают, но сделает программу более читаемой для всех, кто это делает.

Рассмотрим, например, следующий код, если EmployeeInfoStruct не содержит ничего но типы значений и неизменные типы классов, такие как String:

[employeeInfoStruct is a struct containing the following field]
public Decimal YearlyBonus;

[someEmployeeContainer is an instance of a class which includes the following method]
EmployeeInfoStruct GetEmployeeInfo(String id);  // Just the signature--code is immaterial

[some other method uses the following code]
EmployeeInfoStruct anEmployee = someEmployeeContainer.GetEmployeeInfo("123-45-6789");
anEmployee.YearlyBonus += 100;

Эрик Липперт жалуется, что вышеуказанный код изменит значение в anEmployee, но это изменение не повлияет на контейнер. Я бы предположил, что это хорошо - любой, кто знает, как работают структуры, может смотреть на вышеуказанный код и знать, что запись в структурную переменную затронет эту переменную, но не повлияет ни на что другое, если программа позже не использует какой-либо другой метод (возможно, SetEmployeeInfo), чтобы сохранить эту переменную где-то.

Теперь замените EmployeeInfoStruct на EmployeeInfoClass, который имеет свойство read / write типа YearlyBonus. Используя только вышеприведенную информацию, что можно сказать о взаимосвязи между написанием для какого-либо рабочего сервера и anEmployee? В зависимости от реализации класса anEmployee (который, за исключением случаев, когда EmployeeInfoClass запечатан, может быть или не быть фактически EmployeeInfoClass) и someEmployeeContainer, отношения между объектами могут быть любыми. Можно записать:

  1. Не влияют на другие
  2. Обновить другое в естественном режиме
  3. Повреждение другого каким-либо образом

С structs, содержащим только поля любых типов значений или неизменяемых классов, семантика всегда будет # 1. Не нужно смотреть на код самой структуры или код контейнера, чтобы знать это. В отличие от этого, если anEmployee.Salary или someEmployeeContainer.GetEmployee является виртуальным, невозможно понять, что такое семантика.

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

1
задан Programmer 15 March 2018 в 20:06
поделиться

1 ответ

Вот ваша проблема:

new Color(0f, 0f, 0f, **255f**);

Параметр конструктора Color принимает значения от 0f до 1f, но вы передаете 0f в 255f.

Это должно быть:

colorToFadeTo = new Color(0f, 0f, 0f, 1f);

Если вы хотите использовать диапазон 0 - 255, вы должны разделить его 255.

colorToFadeTo = new Color(0f, 0f, 0f, 255f/255f);

Также есть Color32 , который может принимать значения между 0 и 255. Вы можете использовать это, а затем скрывать его до цвета.

Color32 color32 = new Color32(0f, 0f, 0f, 255f));
Color color = color32;
6
ответ дан Programmer 16 August 2018 в 10:52
поделиться
  • 1
    Тогда почему 255f отлично работает , когда я даю изображению цвет для начала? – RnRoger 19 February 2017 в 13:05
  • 2
    И я пробовал 1f перед тем, как перейти к 255f, 1f тоже не работал. – RnRoger 19 February 2017 в 13:06
  • 3
    И теперь я не могу даже получить 255f или любое другое значение, чтобы работать, даже когда я даю картинке цвет, чтобы начать; он просто прыгает на черный или вообще не меняется. – RnRoger 19 February 2017 в 13:34
  • 4
    Прочтите doc , если у вас все еще есть сомнения. В нем четко сказано, что он ожидает диапазон от 0f до 1f. Посмотрите на все статические переменные в этой ссылке. Они используют 0 для 1. Ни один из них не использует 255 или что-либо выше 1. Если он меняется так быстро, передайте false в параметр ignoreTimeScale. screen.CrossFadeColor(colorToFadeTo, fadeTime, false, true); – Programmer 19 February 2017 в 16:26
  • 5
    Как я уже сказал ... Я попробовал 1f. Просто говоря, что единство не ведет себя иначе, когда я чередую между 1f и 255f. Они работают или не работают, хотя, очевидно, не так, как я хочу их. В конце я исправил проблему, поставив изображение a на 1 из 255. Я не знаю, почему это работает, но начиная с 0 нет, но он работает, тем не менее. Я не сомневаюсь в вашем ответе, и я знаю, что вы говорите, это полная истина, просто говоря, что это не одна вещь, вызывающая эту проблему. – RnRoger 19 February 2017 в 17:03
Другие вопросы по тегам:

Похожие вопросы: