forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Проблемы разработки от EvilOkta (http://forum.boolean.name/showthread.php?t=17911)

pax 08.06.2015 17:44

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

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

Если тебе надо выполнить цепочку действий, то можешь сделать список экшенов для выполнения List<Action<T>> к примеру, которые принимают для обработки объект типа T.

EvilOkta 09.06.2015 10:12

Ответ: Проблемы разработки от EvilOkta
 
вроде работает, единственное вместо делегата Action поставил запуск анимации с навешанными событиями, которые делают все остальное, надеюсь такой алгоритм будет стабильным в дальнейшем )

EvilOkta 09.06.2015 22:09

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

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

PHP код:

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;
    }



pax 09.06.2015 22:41

Ответ: Проблемы разработки от EvilOkta
 
Тебе поможет синглтон
PHP код:

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. Вот самая медленная операция, а особенно несколько раз подряд искать одно и то же.

h1dd3n 12.06.2015 18:49

Ответ: Проблемы разработки от EvilOkta
 
Цитата:

Сообщение от pax (Сообщение 296539)
Тебе поможет синглтон
PHP код:

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;
        }
    }

И оставить статический класс при этом.

pax 12.06.2015 19:19

Ответ: Проблемы разработки от EvilOkta
 
Цитата:

Сообщение от h1dd3n (Сообщение 296585)
Нахрена ему синглтон ?

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

И оставить статический класс при этом.

Вероятно что бы освоить очередной паттерн программирования? В общем любой вариант подойдет. И проперти этот тот же метод. Просто обращение к нему без скобочек.

EvilOkta 11.07.2015 13:25

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

PHP код:

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 параметров не оптимально

pax 11.07.2015 17:49

Ответ: Проблемы разработки от EvilOkta
 
Ну на ум пришло не очень быстрое решение в две строчки
PHP код:

using System.Linq;

// Вариант с сортировкой
var minByZ NumberChild.OrderBy(t=>t.transform.position.z).First();
var 
index NumberChild.IndexOf(minByZ); 


Igor 11.07.2015 19:21

Ответ: Проблемы разработки от EvilOkta
 
Pax, а разве в C# нельзя понадеяться на ленивую загрузку классов и реализовать синглтон в виде: private static MyClass _instance = new MyClass();
public static MyClass intance {get{return _instance}} ?

Например, если в java писать public static final MyClass instance = new MyClass(),
то во время первого обращения к этому классу извне (т.е., только когда он понадобится, и не раньше), будет выполнена инициализация и всё ок.

pax 11.07.2015 19:51

Ответ: Проблемы разработки от EvilOkta
 
Почему нельзя? Можно.

Igor 11.07.2015 19:58

Ответ: Проблемы разработки от EvilOkta
 
А зачем тогда пример синглтона с кучей кода в блоке get{}?

pax 11.07.2015 20:23

Ответ: Проблемы разработки от EvilOkta
 
Подобным образом можно сделать синглтоном скрипты (new GameObject().AddComponent())

seaman 11.07.2015 22:08

Ответ: Проблемы разработки от EvilOkta
 
Цитата:

Сообщение от Igor (Сообщение 297659)
А зачем тогда пример синглтона с кучей кода в блоке get{}?

Не забывайте, что MonoBehaviour - специфический класс. Его экземпляр нельзя делать new MonoBehaviour(). Нужно AddComponent<MonoBehaviour>() и все что Вы делали в конструкторе - делать в Start.
Поэтому для скриптов, которые Вы хотите повесить на объект не пойдет
Код:

private static MyClass _instance = new MyClass();
public static MyClass intance {get{return _instance}}

Нужно в get проверить есть ли такой скрипт в сцене. Если нет создать обхект, на который затем повесить скрипт.

EvilOkta 12.07.2015 12:37

Ответ: Проблемы разработки от EvilOkta
 
Цитата:

Сообщение от pax (Сообщение 297644)
Ну на ум пришло не очень быстрое решение в две строчки
PHP код:

using System.Linq;

// Вариант с сортировкой
var minByZ NumberChild.OrderBy(t=>t.transform.position.z).First();
var 
index NumberChild.IndexOf(minByZ); 


получается что linq выражение хоть и выглядит короче будет работать медленнее чем вызов foreach?

seaman 12.07.2015 12:57

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot