|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
08.06.2015, 17:44
|
#136
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
yield это твои действия любые, которые делают задержку.
Action и его вариации находятся в System да. Шаблонные вариации Action можно использовать как методы с параметрами (например при вызове метода надо передать что за ловушка сработала). Есть еще готовый делегат Func, который возвращает значение TResult.
Если тебе надо выполнить цепочку действий, то можешь сделать список экшенов для выполнения List<Action<T>> к примеру, которые принимают для обработки объект типа T.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.06.2015, 10:12
|
#137
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
вроде работает, единственное вместо делегата Action поставил запуск анимации с навешанными событиями, которые делают все остальное, надеюсь такой алгоритм будет стабильным в дальнейшем )
|
(Offline)
|
|
09.06.2015, 22:09
|
#138
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Такой вопрос, может подскажете - есть у меня статический класс который управляет привязкой камеры. Все работает, но в методах в каждой строчке у меня происходит Getcomponent. Визуально видно, что проще один раз инициализировать объект, который используется для поиска элементов, а потом использовать в методах.
Встала проблема - как инициализировать статический класс? Опять могу путать терминологию, но в обычном классе наследнике от Моно есть возможность использовать Start(). Можно что-то подобное сделать в статическом классе, чтобы перед исполнением методов инициализировать поле скрипта ссылкой на объект?
using UnityEngine; using System.Collections;
public static class StaticCameraMagnit {
public static bool MagnitCapture, beMagnit; public static GameObject FromMagnited; private static CameraNavigation CameraNav;
CameraNav = GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>(); // вот это действие где нужно прописать для выполнения? Потом методы будут использовать эту ссылку вместо постоянного GetComponent
public static void MagnitedCamera(GameObject FocusTarget) { if (!MagnitCapture) { if (GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().Magnit_Unit!=null) { if (GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().Magnit_Unit.tag=="Unit Player") { FromMagnited = GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().Magnit_Unit; } } GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().Magnit_Unit = FocusTarget; beMagnit = GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().isMagnit; if (!beMagnit) GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().isMagnit = true; } MagnitCapture = true; } public static void UnMagnitedCamera() { GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().Magnit_Unit = FromMagnited; GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>().isMagnit = beMagnit; MagnitCapture = false; } }
|
(Offline)
|
|
09.06.2015, 22:41
|
#139
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Тебе поможет синглтон
public class MyClass {
private static MyClass _instance; public static MyClass instance { get { if(_instance == null) { _instance = new MyClass(); } return _instance; } }
private MyClass() { // инициализация
} }
Использование: MyClass.instance.MethodOrProperty
PS: у тебя проблема не в GetComponent, а в Find. Вот самая медленная операция, а особенно несколько раз подряд искать одно и то же.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
12.06.2015, 18:49
|
#140
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от pax
Тебе поможет синглтон
public class MyClass { private static MyClass _instance; public static MyClass instance { get { if(_instance == null) { _instance = new MyClass(); } return _instance; } } private MyClass() { // инициализация } }
Использование: MyClass.instance.MethodOrProperty
PS: у тебя проблема не в GetComponent, а в Find. Вот самая медленная операция, а особенно несколько раз подряд искать одно и то же.
|
Нахрена ему синглтон ?
Почему нельзя просто сделать property CameraNav ?
public static CameraNavigation CameraNav
{
get
{
if(_cameraNav == null)
{
_cameraNav = GameObject.Find("CameraNavigate").GetComponent<CameraNavigation>();
}
return _instance;
}
}
И оставить статический класс при этом.
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо h1dd3n за это полезное сообщение:
|
|
12.06.2015, 19:19
|
#141
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от h1dd3n
Нахрена ему синглтон ?
Почему нельзя просто сделать property CameraNav ?
И оставить статический класс при этом.
|
Вероятно что бы освоить очередной паттерн программирования? В общем любой вариант подойдет. И проперти этот тот же метод. Просто обращение к нему без скобочек.
|
(Offline)
|
|
11.07.2015, 13:25
|
#142
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Читаю в mdsn описание Array. Вопрос такой. Есть ли методы, которые позволят из одномерного массива получить минимальное значение (максимальное тоже) и номер элемента этих значений? Сейчас реализовано через foreach но получается приходится вызывать в методе foreach аж 6 раз для разных исходных данных.
Метод делает на самом деле простую вещь - определяет, какие значения на каких гранях кубика
NumberChild - коллекция значений на гранях кубика (от 1 до 6)
public int Unit_Up_Field, Unit_Down_Field, Unit_W_Field, Unit_S_Field, Unit_A_Field, Unit_D_Field; // значения на гранях кубика - это будет преобразовано в массив для разработки дальнейшего кода
public void Analize_Dice_Orientation () { // анализ значений кубика MaxCordInField = 0f; foreach(GameObject UnitChild in NumberChild) { if (UnitChild.transform.position.y > MaxCordInField) { MaxCordInField = UnitChild.transform.position.y; Unit_Up_Field = (int)NumberChild.IndexOf(UnitChild); } } MaxCordInField = 2f; foreach(GameObject UnitChild in NumberChild) { if (UnitChild.transform.position.y < MaxCordInField) { MaxCordInField = UnitChild.transform.position.y; Unit_Down_Field = (int)NumberChild.IndexOf(UnitChild); } } MaxCordInField = this.transform.position.x-2f; foreach(GameObject UnitChild in NumberChild) { if (UnitChild.transform.position.x > MaxCordInField) { MaxCordInField = UnitChild.transform.position.x; Unit_W_Field = (int)NumberChild.IndexOf(UnitChild); } } MaxCordInField = this.transform.position.x+2f; foreach(GameObject UnitChild in NumberChild) { if (UnitChild.transform.position.x < MaxCordInField) { MaxCordInField = UnitChild.transform.position.x; Unit_S_Field = (int)NumberChild.IndexOf(UnitChild); } } MaxCordInField = this.transform.position.z-2f; foreach(GameObject UnitChild in NumberChild) { if (UnitChild.transform.position.z > MaxCordInField) { MaxCordInField = UnitChild.transform.position.z; Unit_A_Field = (int)NumberChild.IndexOf(UnitChild); } } MaxCordInField = this.transform.position.z+2f; foreach(GameObject UnitChild in NumberChild) { if (UnitChild.transform.position.z < MaxCordInField) { MaxCordInField = UnitChild.transform.position.z; Unit_D_Field = (int)NumberChild.IndexOf(UnitChild); } } }
Печенкой чую, что можно оптимизировать но именно для случая с массивом, 6 параметров не оптимально
|
(Offline)
|
|
11.07.2015, 17:49
|
#143
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Ну на ум пришло не очень быстрое решение в две строчки
using System.Linq;
// Вариант с сортировкой var minByZ = NumberChild.OrderBy(t=>t.transform.position.z).First(); var index = NumberChild.IndexOf(minByZ);
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
11.07.2015, 19:21
|
#144
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Pax, а разве в C# нельзя понадеяться на ленивую загрузку классов и реализовать синглтон в виде: private static MyClass _instance = new MyClass();
public static MyClass intance {get{return _instance}} ?
Например, если в java писать public static final MyClass instance = new MyClass(),
то во время первого обращения к этому классу извне (т.е., только когда он понадобится, и не раньше), будет выполнена инициализация и всё ок.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
11.07.2015, 19:51
|
#145
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Почему нельзя? Можно.
|
(Offline)
|
|
11.07.2015, 19:58
|
#146
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
А зачем тогда пример синглтона с кучей кода в блоке get{}?
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
11.07.2015, 20:23
|
#147
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Подобным образом можно сделать синглтоном скрипты (new GameObject().AddComponent())
|
(Offline)
|
|
11.07.2015, 22:08
|
#148
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от Igor
А зачем тогда пример синглтона с кучей кода в блоке get{}?
|
Не забывайте, что MonoBehaviour - специфический класс. Его экземпляр нельзя делать new MonoBehaviour(). Нужно AddComponent<MonoBehaviour>() и все что Вы делали в конструкторе - делать в Start.
Поэтому для скриптов, которые Вы хотите повесить на объект не пойдет
private static MyClass _instance = new MyClass();
public static MyClass intance {get{return _instance}}
Нужно в get проверить есть ли такой скрипт в сцене. Если нет создать обхект, на который затем повесить скрипт.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.07.2015, 12:37
|
#149
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от pax
Ну на ум пришло не очень быстрое решение в две строчки
using System.Linq; // Вариант с сортировкой var minByZ = NumberChild.OrderBy(t=>t.transform.position.z).First(); var index = NumberChild.IndexOf(minByZ);
|
получается что linq выражение хоть и выглядит короче будет работать медленнее чем вызов foreach?
|
(Offline)
|
|
12.07.2015, 12:57
|
#150
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Не знаю как эквивалентное выражение Линк работало бы. Но тут же не просто перебор - тут сортировка. Сортировка по идее медленней чем просто перебор массива.
PS: нашел статью по сравнению for foreach и ForEach(из Linq). Что быстрее? foreach vs. List.ForEach vs. for-loop
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:05.
|