|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
14.04.2015, 18:38
|
#121
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
такой вопрос, принципиально важно где объявлять делегат - в теле класса или вне его? Задача чтобы делегатами могли пользоваться все объекты. Проблем с видимостью не будет?
Еще момент, если одно и то же событие объявляется в скрипте, который висит на нескольких объектах - ничего страшного? или лучше создать отдельный класс где описывать события?
|
(Offline)
|
|
14.04.2015, 18:46
|
#122
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от EvilOkta
такой вопрос, принципиально важно где объявлять делегат и событие - в теле класса или вне его? Задача чтобы делегатами и событиями могли пользоваться все объекты. Проблем с видимостью не будет?
|
Евенты в классе объявляй (иначе и не получится), делегаты вне, чтобы обращатся просто по имени а не еще и класс указывать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.04.2015, 19:14
|
#123
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
а как выделить эвенты в отдельный класс? чтобы доступ к ним получать с разных объектов? Сделал класс
public class Event_List : MonoBehaviour { public event On_SelectUnit_Event Event_Select_Unit; }
повесил его на объект, у которого через getcomponent получил этот эвент, но при попытке его запустить в коде
появляется ошибка, что нельзя брать эвент другого класса.
делегат объявил отдельно вне класса вот так:
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'
пните в нужном направлении.. ))
|
(Offline)
|
|
14.04.2015, 19:44
|
#124
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Передача переменной в метод
У меня такое ощущение, что ты не совсем понимаешь, как евенты работают, и что это вообще. Плюс ошибки, которые ты скинул, вполне ясно говорят, в чём трабла. Логично, что ты не можешь получить евент геткомпонентом. Логично, что ты не можешь его вызвать. Это не так работает. Тебе точно евенты нужны?
http://habrahabr.ru/post/213809/
http://habrahabr.ru/post/245219/
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.04.2015, 20:38
|
#125
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
мне важно понимать как они работают, так как логически в голове алгоритмы под них выстраиваются. Я осознаю что мое понимание делегатов и событий весьма поверхностно.
Переделал код таким образом:
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<GameObject> UnitList = 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=0; i<UnitList.Count; i++) { UnitDelegate = UnitList[i].GetComponent<MoveGamer>(); Event_Select_Unit += UnitDelegate.Deselect_If_Not_Active; } } public void Event_Select_Unit_Start() { Event_Select_Unit(); } }
Объявлен делегат, создано событие, осуществлена подписка объектов на него.
В этом коде (другой скрипт) осуществляется вызов события:
public void OnMouseDown() { if (Mark_Unit) { Event_Aggregator.Event_Select_Unit_Start(); } } public void Deselect_If_Not_Active () { Debug.Log(this.name); }
код работает, подписчики исправно реагируют на событие, событие отвязано от объектов (в одном отдельном скрипте).
Теперь я правильно понял логику применения событий и делегатов? Хотя бы на базовом уровне?))
|
(Offline)
|
|
14.04.2015, 20:46
|
#126
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Передача переменной в метод
В общем да. Главное сразу приучи себя или делать проверку на null или делегат объявлять с пустышкой (по первой ссылке в комментах есть варианты, как это делать), или потом офигеешь искать, откуда эксцепшены валятся.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.05.2015, 11:28
|
#127
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Снова вопрос для размышлений. Думаю над реализацией поршневого механизма, но интересует какой подход выбрать. В чем суть:
Зеленым показан объект, который нужно толкнуть поршнем. Поршень обозначен серым и синим. Синяя часть анимирована. Постарался изобразить начало и конец анимации.
Теперь вопрос: как мне привязать перемещение объекта к анимации таким образом, чтобы стенка поршня не проходила через объект и двигалась вместе с объектом? Просто пока не понятно как с помощью анимации одного объекта синхронизировать перемещение другого. или только на глаз подгонкой скорости анимации?
Сам объект у меня перемещается с помощью собственной анимации, как раз была идея как-то это совместить с анимацией поршня, чтобы смотрелось адекватно.
PS. Можно тему переименовать в что-то типа "Проблемы разработки от EvilOkta"? А то название темы уже не актуально )
PPS. предвидя вопросы, сразу отвечу - нет, не майнкрафт )) даже близко ))
|
(Offline)
|
|
06.05.2015, 13:47
|
#128
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от EvilOkta
Снова вопрос для размышлений. Думаю над реализацией поршневого механизма, но интересует какой подход выбрать. В чем суть:
Зеленым показан объект, который нужно толкнуть поршнем. Поршень обозначен серым и синим. Синяя часть анимирована. Постарался изобразить начало и конец анимации.
Теперь вопрос: как мне привязать перемещение объекта к анимации таким образом, чтобы стенка поршня не проходила через объект и двигалась вместе с объектом? Просто пока не понятно как с помощью анимации одного объекта синхронизировать перемещение другого. или только на глаз подгонкой скорости анимации?
Сам объект у меня перемещается с помощью собственной анимации, как раз была идея как-то это совместить с анимацией поршня, чтобы смотрелось адекватно.
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 проверяемого объекта.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.05.2015, 14:44
|
#129
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
отлично, сегодня вечером попробую применить на практике )) уже придумал как, главное что-бы сработало )
|
(Offline)
|
|
06.05.2015, 16:09
|
#130
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от EvilOkta
PS. Можно тему переименовать в что-то типа "Проблемы разработки от EvilOkta"? А то название темы уже не актуально )
|
Переименована
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.05.2015, 11:25
|
#131
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от Nex
|
Немного запутался, сориентируйте Bounds.size родительского объекта будет изменяться если дочерний объекта выходит за его пределы? Или он описывает только размеры родительского объекта? Есть какие-то способы получить Bounds полной модели вместе с дочерними?
|
(Offline)
|
|
19.05.2015, 13:27
|
#132
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Складывай боундсы всех моделей, чтобы получить общий
http://docs.unity3d.com/ScriptRefere...capsulate.html
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.06.2015, 13:37
|
#133
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
что можно почитать про отложенное выполнение методов? Не знаю как сформулировать, даже не знаю термин. Рылся в справках. Мне нужно что-то типа пула (очереди) выполнения методов с последовательным выполнением, т.е. при выполнении одного метода активируется очередь других методов, которые начинают исполняться один за другим.
Немного топорно объяснил, попробую на примере:
Есть условная ловушка - при попадании в нее с объектом производятся определеннные манипуляции. Задача завершить выполнение предыдущего метода (который обеспечил попадание в ловушку) при этом не начиная следующего, пока не сработает ловушка.
Ловушка срабатывает через корутину - сначала она определяет, что объект в ее зоне действия, после этого ожидает секунду (для завершения предыдущего метода) и запускает собственный механизм ловушки (объекту отправляется сообщение что он в ловушке, чтобы он заблокировал свои методы перемещения). При этом косяк в том, что во время этой секунды методы не заблокированы и объект спокойно может уйти из ловушки, а она затем сработает естественно вызвав баги в логике кода.
Если жестко зафиксировать отлов события срабатывания ловушки как только (!) объект оказывается в его зоне действия, то еще веселее: ловушка срабатывает до того, как объект попал в зону действия (на самом краю срабатывания триггера - объект не вошел целиком в триггер, это важно!) - как результат ломается логика кода, объект начинает колбасить
Как я вижу ситуацию: объект попадает в ловушку, скрипт должен дозавершить текущий метод, которым он попал в ловушку, но при этом зная, что следующим должен сработать метод ловушки, а не перемещения дальше. Своего рода предзнание.
Куда копать?
|
(Offline)
|
|
08.06.2015, 16:06
|
#134
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
// завершающий метод void CallbackMethod(){
// сделать что-то при завершении }
// Action это делегат (ссылка на метод) IEnumerator MyCoroutine(Action callback){
yield... yield... yield; // выполнение долгого действия
// вызов делегата по завершении if(callback!= null) callback();
}
// использование
// передача делегата StartCoroutine(MyCoroutine(CallbackMethod));
или
// передача лямбда функции StartCoroutine(MyCoroutine(() =>{ // сделать что-то при завершении }));
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.06.2015, 17:03
|
#135
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от pax
// завершающий метод void CallbackMethod(){ // сделать что-то при завершении } // Action это делегат (ссылка на метод) IEnumerator MyCoroutine(Action callback){ yield... yield... yield; // выполнение долгого действия // вызов делегата по завершении if(callback!= null) callback(); } // использование // передача делегата StartCoroutine(MyCoroutine(CallbackMethod)); или // передача лямбда функции StartCoroutine(MyCoroutine(() =>{ // сделать что-то при завершении }));
|
Спасибо интересно, правда немного непонятно как правильно использовать Yield - что именно здесь описать для моей реализации? Условие выполнение первого метода (перемещение в ловушку) или условие когда начать метод ловушки?
и еще - Action - это делегат, который не нужно явно объявлять, он как бы доступен по умолчанию, я правильно понял - это он? https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:54.
|