У меня в момент запуска хром все 4 ядра 4GHz под 100% жрет (1-2 сек), иногда аж курсор залипает). Может потому что плагинами обвешал. Но все равно им доволен)
В некоторых местах можно же обойтись без foreach и for и сделать на делегатах?
private readonly List<MyClass> myList = new List<MyClass>();
private Action InvokeMyFunc = delegate { };
public void Add(MyClass entity)
{
myList.Add(entity);
InvokeMyFunc += entity.MyFunc;
}
public void Remove(MyClass entity)
{
myList.Remove(entity);
InvokeMyFunc -= entity.MyFunc;
}
public void InvokeAllMyFunc()
{
InvokeMyFunc();//Вместо foreach цикла
}
public class MyClass
{
public void MyFunc() { }
}
И мне очень интересен вопрос инициализации делегата чтоб в коде не проверять его на нулл. Почему так не делают? Инвокнуть пустой делегат дольше проверки на нулл?
В том и дело что ничем. Больше места чем толку. Полимерная купюра хорошая штука. Вместо этих «кэпсов» думаю можно было бы несколько таких выпустить.
Я вообще мелочь не ношу, мешает, в кошелек не положишь- выпадет, звенит, телефон царапает. Правда евро монеты как исключение, на них хоть купить можно что-то)
Не могу найти тот проект, всё обыскал.
С кода там в основном положение камер (зеркальная позиция от глаз (камеры) игрока) с обратной стороны порталов, изображение с которых накладывается по маске шейдером через Graphics.Blit при постобработке.
Сначала снимал одной камерой ч/б маску накладывания, потом само изображение, далее в шейдере в альфу изображения ложил маску и накладывал на экран при постобработке. Шейдер вручную писался.
Первое с чем я столкнулся — как реализовать выпадающий список в редакторе. Находя первые темы на форумах в интернете, казалось, что это не так то просто, но терпение привело меня к использованию обычного перечисления
Вы можете овверайдить отрисовку проперти атрибутами, т. е. использовать CustomPropertyDrawer.
Код:
Scripts/TestCompAttribute.cs
using System;
using UnityEngine;
[AttributeUsage(AttributeTargets.Field)]
public class TestCompAttribute : PropertyAttribute
{
//Запишем значения здесь чтоб было в одном месте
//Но эти значения можно черпать от куда угодно
public static string[] AttributeValues = new string[]
{
"None",
"First",
"Second"
};
}
Scripts/TestComponent.cs
using UnityEngine;
public class TestComponent : MonoBehaviour
{
[TestComp] //Атрибутом указываем, что у нас кастомная отрисовка этой проперти. (PS. TestComp вышло от TestCompAttribute без слова Attribute)
public string componentName;
public int variableComponentFirst;
public int variableComponentSecond;
}
Scripts/Editor/TestComponentEditor.cs:
using UnityEditor;
using UnityEngine;
//Указываем что будем оверрайдить стандартые отрисовки проперти помеченных TestComp атрибутом
[CustomPropertyDrawer(typeof(TestCompAttribute))]
public class TestCompAttribute_Drawer : PropertyDrawer
{
//Храним значение
private int _selected = -1;
//Оверрайдим стандартную отрисовку проперти
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
//Запускаем для будущей проверки изменений редактирования проперти
EditorGUI.BeginChangeCheck();
//Ищем значение в списке вариантов
_selected = GetItemIndex(property.stringValue);
//Выпадающий список
_selected = EditorGUI.Popup(position, label.text.Replace("Component Name", "Select component type:"), _selected, TestCompAttribute.AttributeValues);
//Проверяем был ли изменено проперти
if (EditorGUI.EndChangeCheck())
{
//Устанавливаем в переменную скрипта componentName новое значение
property.stringValue = TestCompAttribute.AttributeValues[_selected];
property.serializedObject.ApplyModifiedProperties();
//EditorUtility.SetDirty(property.serializedObject.targetObject);
}
}
private int GetItemIndex(string id)
{
for (int i = 0; i < TestCompAttribute.AttributeValues.Length; ++i)
{
if (Equals(TestCompAttribute.AttributeValues[i], id))
return i;
}
return 0;
}
}
//Этим атрибутом мы объявляем какой компонент подвергнется редактированию
[CustomEditor(typeof(TestComponent))]
[CanEditMultipleObjects]
public class TestComponentEditor : Editor
{
TestComponent subject;
SerializedProperty compName;
SerializedProperty varCompFirst;
SerializedProperty varCompSecond;
//Передаём этому скрипту компонент и необходимые в редакторе поля
void OnEnable()
{
subject = target as TestComponent;
compName = serializedObject.FindProperty("componentName");
varCompFirst = serializedObject.FindProperty("variableComponentFirst");
varCompSecond = serializedObject.FindProperty("variableComponentSecond");
}
//Переопределяем событие отрисовки компонента
public override void OnInspectorGUI()
{
//Метод обязателен в начале. После него редактор компонента станет пустым и
//далее мы с нуля отрисовываем его интерфейс.
serializedObject.Update();
//Вывод в редактор текстового поля (который при отрисовке будет оверрайдится нашим TestCompAttribute_Drawer
EditorGUILayout.PropertyField(compName);
//Проверка выбранного пункта в выпадающем меню,
if (subject.componentName == TestCompAttribute.AttributeValues[1])
{
//Вывод в редактор слайдера
EditorGUILayout.IntSlider(varCompFirst, 0, 100, new GUIContent("Variable First"));
}
else if (subject.componentName == TestCompAttribute.AttributeValues[2])
{
EditorGUILayout.IntSlider(varCompSecond, 0, 100, new GUIContent("Variable Second"));
}
//Метод обязателен в конце
serializedObject.ApplyModifiedProperties();
}
}
Получится такой же выпадающий список, только его значения можно брать от куда угодно без модификации кода
Запускал я этот DS1307 на ардуино… Как-то глючно работает, то выдает восьмерки… то вообще не понятные даты.
Долго разбирался в чем дело. В результате пришел к выводу, что DS1307 нужно подключать к питанию 3.3v, а не к 5v. Тогда заработало всё отлично.
И мне очень интересен вопрос инициализации делегата чтоб в коде не проверять его на нулл. Почему так не делают? Инвокнуть пустой делегат дольше проверки на нулл?
Я вообще мелочь не ношу, мешает, в кошелек не положишь- выпадет, звенит, телефон царапает. Правда евро монеты как исключение, на них хоть купить можно что-то)
Но зато ими можно будет в кэпсы играть.
UPD. «Google и TinEye ничего не нашли» только увидел…
С кода там в основном положение камер (зеркальная позиция от глаз (камеры) игрока) с обратной стороны порталов, изображение с которых накладывается по маске шейдером через Graphics.Blit при постобработке.
Сначала снимал одной камерой ч/б маску накладывания, потом само изображение, далее в шейдере в альфу изображения ложил маску и накладывал на экран при постобработке. Шейдер вручную писался.
deletedШейдеры, камеры + постобработка (накладывание результата))
Вы можете овверайдить отрисовку проперти атрибутами, т. е. использовать CustomPropertyDrawer.
Scripts/TestComponent.cs
Scripts/Editor/TestComponentEditor.cs:
Получится такой же выпадающий список, только его значения можно брать от куда угодно без модификации кода
Правда производитель RTC обещает 10 лет работы от батарейки… типа скорее батарейка накроется чем модуль ее разрядит…
Долго разбирался в чем дело. В результате пришел к выводу, что DS1307 нужно подключать к питанию 3.3v, а не к 5v. Тогда заработало всё отлично.