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)

EvilOkta 14.04.2015 18:38

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

Andvrok 14.04.2015 18:46

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от EvilOkta (Сообщение 294982)
такой вопрос, принципиально важно где объявлять делегат и событие - в теле класса или вне его? Задача чтобы делегатами и событиями могли пользоваться все объекты. Проблем с видимостью не будет?

Евенты в классе объявляй (иначе и не получится), делегаты вне, чтобы обращатся просто по имени а не еще и класс указывать.

EvilOkta 14.04.2015 19:14

Ответ: Передача переменной в метод
 
а как выделить эвенты в отдельный класс? чтобы доступ к ним получать с разных объектов? Сделал класс
PHP код:

public class Event_List MonoBehaviour {
public 
event On_SelectUnit_Event Event_Select_Unit;    


повесил его на объект, у которого через getcomponent получил этот эвент, но при попытке его запустить в коде
PHP код:

Event_Select_Unit(); 

появляется ошибка, что нельзя брать эвент другого класса.
делегат объявил отдельно вне класса вот так:
PHP код:

public delegate void On_SelectUnit_Event(); 

error CS0428: Cannot convert method group `GetComponent' to non-delegate type `Event_List'. Consider using parentheses to invoke the method
error CS0070: The event `Event_List.Event_Select_Unit' can only appear on the left hand side of += or -= when used outside of the type `Event_List'

пните в нужном направлении.. ))

Andvrok 14.04.2015 19:44

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

http://habrahabr.ru/post/213809/
http://habrahabr.ru/post/245219/

EvilOkta 14.04.2015 20:38

Ответ: Передача переменной в метод
 
мне важно понимать как они работают, так как логически в голове алгоритмы под них выстраиваются. Я осознаю что мое понимание делегатов и событий весьма поверхностно.

Переделал код таким образом:
PHP код:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public 
delegate void On_SelectUnit_Event();
public class 
Delegate_for_Event MonoBehaviour {
    public 
int i;
    public List<
GameObjectUnitList = new List<GameObject>(); // список юнитов
    
public MoveGamer UnitDelegate;
    public 
event On_SelectUnit_Event Event_Select_Unit;
        
    
void Awake()    {
        
UnitList.AddRange(GameObject.FindGameObjectsWithTag("Unit Player"));
        for (
int i=0i<UnitList.Counti++) {
            
UnitDelegate UnitList[i].GetComponent<MoveGamer>();
            
Event_Select_Unit += UnitDelegate.Deselect_If_Not_Active;
        }
    }
    public 
void Event_Select_Unit_Start() {
    
Event_Select_Unit();    
    }


Объявлен делегат, создано событие, осуществлена подписка объектов на него.

В этом коде (другой скрипт) осуществляется вызов события:
PHP код:

public void OnMouseDown() {
    if (
Mark_Unit)    {
        
Event_Aggregator.Event_Select_Unit_Start();
    }
}
    public 
void Deselect_If_Not_Active () {
        
Debug.Log(this.name);
    } 

код работает, подписчики исправно реагируют на событие, событие отвязано от объектов (в одном отдельном скрипте).
Теперь я правильно понял логику применения событий и делегатов? Хотя бы на базовом уровне?))

Andvrok 14.04.2015 20:46

Ответ: Передача переменной в метод
 
В общем да. Главное сразу приучи себя или делать проверку на null или делегат объявлять с пустышкой (по первой ссылке в комментах есть варианты, как это делать), или потом офигеешь искать, откуда эксцепшены валятся.

EvilOkta 06.05.2015 11:28

Ответ: Передача переменной в метод
 
Снова вопрос для размышлений. Думаю над реализацией поршневого механизма, но интересует какой подход выбрать. В чем суть:

Зеленым показан объект, который нужно толкнуть поршнем. Поршень обозначен серым и синим. Синяя часть анимирована. Постарался изобразить начало и конец анимации.
Теперь вопрос: как мне привязать перемещение объекта к анимации таким образом, чтобы стенка поршня не проходила через объект и двигалась вместе с объектом? Просто пока не понятно как с помощью анимации одного объекта синхронизировать перемещение другого. или только на глаз подгонкой скорости анимации?
Сам объект у меня перемещается с помощью собственной анимации, как раз была идея как-то это совместить с анимацией поршня, чтобы смотрелось адекватно.

PS. Можно тему переименовать в что-то типа "Проблемы разработки от EvilOkta"? А то название темы уже не актуально )

PPS. предвидя вопросы, сразу отвечу - нет, не майнкрафт )) даже близко ))

Nex 06.05.2015 13:47

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от EvilOkta (Сообщение 295621)
Снова вопрос для размышлений. Думаю над реализацией поршневого механизма, но интересует какой подход выбрать. В чем суть:

Зеленым показан объект, который нужно толкнуть поршнем. Поршень обозначен серым и синим. Синяя часть анимирована. Постарался изобразить начало и конец анимации.
Теперь вопрос: как мне привязать перемещение объекта к анимации таким образом, чтобы стенка поршня не проходила через объект и двигалась вместе с объектом? Просто пока не понятно как с помощью анимации одного объекта синхронизировать перемещение другого. или только на глаз подгонкой скорости анимации?
Сам объект у меня перемещается с помощью собственной анимации, как раз была идея как-то это совместить с анимацией поршня, чтобы смотрелось адекватно.

PS. Можно тему переименовать в что-то типа "Проблемы разработки от EvilOkta"? А то название темы уже не актуально )

PPS. предвидя вопросы, сразу отвечу - нет, не майнкрафт )) даже близко ))

Используй Bounds - http://docs.unity3d.com/ScriptReference/Bounds.html
Проверяй есть ли пересечение через "объект.bounds.Contains" и дальше двигай как тебе надо. :) Можно даже без коллайдеров использовать. Проблема будет только с тем, что надо учитывать повороты объектов.

Я этот момент учел при помощи такого говнокода:
Код:

                _Point[0] = new Vector3(_colliderTr.bounds.center.x + _colliderTr.bounds.size.x/2, _transform.position.y, _colliderTr.bounds.center.z + _colliderTr.bounds.size.z/2);
                _Point[1] = new Vector3(_colliderTr.bounds.center.x - _colliderTr.bounds.size.x/2, _transform.position.y, _colliderTr.bounds.center.z + _colliderTr.bounds.size.z/2);
                _Point[2] = new Vector3(_colliderTr.bounds.center.x - _colliderTr.bounds.size.x/2, _transform.position.y, _colliderTr.bounds.center.z - _colliderTr.bounds.size.z/2);
                _Point[3] = new Vector3(_colliderTr.bounds.center.x + _colliderTr.bounds.size.x/2, _transform.position.y, _colliderTr.bounds.center.z - _colliderTr.bounds.size.z/2);
                       
                if( _collider.bounds.Contains(_Point[0])&&_collider.bounds.Contains(_Point[1])&&_collider.bounds.Contains(_Point[2])&&_collider.bounds.Contains(_Point[3]) ){
                        //есть пересечение
                }else{
                        //нет пересечения
                }

Провека пересечения MeshRender и BoxCollider.
_collider был BoxCollider объекта на котором висит скрипт.
_colliderTr был MeshRenderer проверяемого объекта.

EvilOkta 06.05.2015 14:44

Ответ: Передача переменной в метод
 
отлично, сегодня вечером попробую применить на практике )) уже придумал как, главное что-бы сработало )

pax 06.05.2015 16:09

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от EvilOkta (Сообщение 295621)
PS. Можно тему переименовать в что-то типа "Проблемы разработки от EvilOkta"? А то название темы уже не актуально )

Переименована

EvilOkta 19.05.2015 11:25

Ответ: Передача переменной в метод
 
Цитата:

Сообщение от Nex (Сообщение 295631)

Немного запутался, сориентируйте Bounds.size родительского объекта будет изменяться если дочерний объекта выходит за его пределы? Или он описывает только размеры родительского объекта? Есть какие-то способы получить Bounds полной модели вместе с дочерними?

pax 19.05.2015 13:27

Ответ: Проблемы разработки от EvilOkta
 
Складывай боундсы всех моделей, чтобы получить общий
http://docs.unity3d.com/ScriptRefere...capsulate.html

EvilOkta 08.06.2015 13:37

Ответ: Проблемы разработки от EvilOkta
 
что можно почитать про отложенное выполнение методов? Не знаю как сформулировать, даже не знаю термин. Рылся в справках. Мне нужно что-то типа пула (очереди) выполнения методов с последовательным выполнением, т.е. при выполнении одного метода активируется очередь других методов, которые начинают исполняться один за другим.
Немного топорно объяснил, попробую на примере:
Есть условная ловушка - при попадании в нее с объектом производятся определеннные манипуляции. Задача завершить выполнение предыдущего метода (который обеспечил попадание в ловушку) при этом не начиная следующего, пока не сработает ловушка.
Ловушка срабатывает через корутину - сначала она определяет, что объект в ее зоне действия, после этого ожидает секунду (для завершения предыдущего метода) и запускает собственный механизм ловушки (объекту отправляется сообщение что он в ловушке, чтобы он заблокировал свои методы перемещения). При этом косяк в том, что во время этой секунды методы не заблокированы и объект спокойно может уйти из ловушки, а она затем сработает естественно вызвав баги в логике кода.
Если жестко зафиксировать отлов события срабатывания ловушки как только (!) объект оказывается в его зоне действия, то еще веселее: ловушка срабатывает до того, как объект попал в зону действия (на самом краю срабатывания триггера - объект не вошел целиком в триггер, это важно!) - как результат ломается логика кода, объект начинает колбасить
Как я вижу ситуацию: объект попадает в ловушку, скрипт должен дозавершить текущий метод, которым он попал в ловушку, но при этом зная, что следующим должен сработать метод ловушки, а не перемещения дальше. Своего рода предзнание.
Куда копать?

pax 08.06.2015 16:06

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

// завершающий метод
void CallbackMethod(){

   
// сделать что-то при завершении
}

// Action  это делегат (ссылка на метод)
IEnumerator MyCoroutine(Action callback){

yield... yield... yield; 
// выполнение долгого действия

// вызов делегата по завершении
if(callback!= nullcallback();

}

// использование

// передача делегата
StartCoroutine(MyCoroutine(CallbackMethod));

или 

// передача лямбда функции
StartCoroutine(MyCoroutine(() =>{
    
// сделать что-то при завершении
})); 


EvilOkta 08.06.2015 17:03

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

Сообщение от pax (Сообщение 296486)
PHP код:

// завершающий метод
void CallbackMethod(){
   
// сделать что-то при завершении
}
// Action  это делегат (ссылка на метод)
IEnumerator MyCoroutine(Action callback){
yield... yield... yield; 
// выполнение долгого действия
// вызов делегата по завершении
if(callback!= nullcallback();
}
// использование
// передача делегата
StartCoroutine(MyCoroutine(CallbackMethod));
или 
// передача лямбда функции
StartCoroutine(MyCoroutine(() =>{
    
// сделать что-то при завершении
})); 


Спасибо интересно, правда немного непонятно как правильно использовать Yield - что именно здесь описать для моей реализации? Условие выполнение первого метода (перемещение в ловушку) или условие когда начать метод ловушки?

и еще - Action - это делегат, который не нужно явно объявлять, он как бы доступен по умолчанию, я правильно понял - это он? https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx


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

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