Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 08.06.2015, 17:44   #136
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблемы разработки от EvilOkta

yield это твои действия любые, которые делают задержку.

Action и его вариации находятся в System да. Шаблонные вариации Action можно использовать как методы с параметрами (например при вызове метода надо передать что за ловушка сработала). Есть еще готовый делегат Func, который возвращает значение TResult.

Если тебе надо выполнить цепочку действий, то можешь сделать список экшенов для выполнения List<Action<T>> к примеру, которые принимают для обработки объект типа T.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (08.06.2015)
Старый 09.06.2015, 10:12   #137
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

вроде работает, единственное вместо делегата Action поставил запуск анимации с навешанными событиями, которые делают все остальное, надеюсь такой алгоритм будет стабильным в дальнейшем )
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 09.06.2015, 22:09   #138
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Такой вопрос, может подскажете - есть у меня статический класс который управляет привязкой камеры. Все работает, но в методах в каждой строчке у меня происходит Getcomponent. Визуально видно, что проще один раз инициализировать объект, который используется для поиска элементов, а потом использовать в методах.

Встала проблема - как инициализировать статический класс? Опять могу путать терминологию, но в обычном классе наследнике от Моно есть возможность использовать Start(). Можно что-то подобное сделать в статическом классе, чтобы перед исполнением методов инициализировать поле скрипта ссылкой на объект?

using UnityEngine;
using System.Collections;

public static class 
StaticCameraMagnit {

    public static 
bool MagnitCapturebeMagnit;
    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 (!
beMagnitGameObject.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;
    }

__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 09.06.2015, 22:41   #139
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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. Вот самая медленная операция, а особенно несколько раз подряд искать одно и то же.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
EvilOkta (09.06.2015), ILonion (10.06.2015)
Старый 12.06.2015, 18:49   #140
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 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 за это полезное сообщение:
EvilOkta (14.06.2015), ILonion (12.06.2015)
Старый 12.06.2015, 19:19   #141
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от h1dd3n Посмотреть сообщение
Нахрена ему синглтон ?

Почему нельзя просто сделать property CameraNav ?

И оставить статический класс при этом.
Вероятно что бы освоить очередной паттерн программирования? В общем любой вариант подойдет. И проперти этот тот же метод. Просто обращение к нему без скобочек.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 11.07.2015, 13:25   #142
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Читаю в mdsn описание Array. Вопрос такой. Есть ли методы, которые позволят из одномерного массива получить минимальное значение (максимальное тоже) и номер элемента этих значений? Сейчас реализовано через foreach но получается приходится вызывать в методе foreach аж 6 раз для разных исходных данных.
Метод делает на самом деле простую вещь - определяет, какие значения на каких гранях кубика
NumberChild - коллекция значений на гранях кубика (от 1 до 6)

public int Unit_Up_FieldUnit_Down_FieldUnit_W_FieldUnit_S_FieldUnit_A_FieldUnit_D_Field// значения на гранях кубика - это будет преобразовано в массив для разработки дальнейшего кода

public void Analize_Dice_Orientation () {
    
// анализ значений кубика
    
MaxCordInField 0f;
        foreach(
GameObject UnitChild in NumberChild) {
            if (
UnitChild.transform.position.MaxCordInField) {
                
MaxCordInField UnitChild.transform.position.y;
                
Unit_Up_Field = (int)NumberChild.IndexOf(UnitChild);
            }
        }
        
MaxCordInField 2f;
        foreach(
GameObject UnitChild in NumberChild) {
            if (
UnitChild.transform.position.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.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.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.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.MaxCordInField) {
                
MaxCordInField UnitChild.transform.position.z;
                
Unit_D_Field = (int)NumberChild.IndexOf(UnitChild);
            }
        }
         } 
Печенкой чую, что можно оптимизировать но именно для случая с массивом, 6 параметров не оптимально
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 11.07.2015, 17:49   #143
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
EvilOkta (12.07.2015), ILonion (11.07.2015)
Старый 11.07.2015, 19:21   #144
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблемы разработки от EvilOkta

Почему нельзя? Можно.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 11.07.2015, 19:58   #146
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Проблемы разработки от EvilOkta

А зачем тогда пример синглтона с кучей кода в блоке get{}?
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 11.07.2015, 20:23   #147
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблемы разработки от EvilOkta

Подобным образом можно сделать синглтоном скрипты (new GameObject().AddComponent())
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 11.07.2015, 22:08   #148
seaman
Знающий
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Igor (12.07.2015)
Старый 12.07.2015, 12:37   #149
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 12.07.2015, 12:57   #150
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Проблемы разработки от EvilOkta

Не знаю как эквивалентное выражение Линк работало бы. Но тут же не просто перебор - тут сортировка. Сортировка по идее медленней чем просто перебор массива.
PS: нашел статью по сравнению for foreach и ForEach(из Linq). Что быстрее? foreach vs. List.ForEach vs. for-loop
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 14:47.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com