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

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

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

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

Ответ
 
Опции темы
Старый 14.04.2015, 18:38   #121
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

такой вопрос, принципиально важно где объявлять делегат - в теле класса или вне его? Задача чтобы делегатами могли пользоваться все объекты. Проблем с видимостью не будет?
Еще момент, если одно и то же событие объявляется в скрипте, который висит на нескольких объектах - ничего страшного? или лучше создать отдельный класс где описывать события?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 14.04.2015, 18:46   #122
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 776
Написано 360 полезных сообщений
(для 990 пользователей)
Ответ: Передача переменной в метод

Сообщение от EvilOkta Посмотреть сообщение
такой вопрос, принципиально важно где объявлять делегат и событие - в теле класса или вне его? Задача чтобы делегатами и событиями могли пользоваться все объекты. Проблем с видимостью не будет?
Евенты в классе объявляй (иначе и не получится), делегаты вне, чтобы обращатся просто по имени а не еще и класс указывать.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (14.04.2015)
Старый 14.04.2015, 19:14   #123
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

а как выделить эвенты в отдельный класс? чтобы доступ к ним получать с разных объектов? Сделал класс
public class Event_List MonoBehaviour {
public 
event On_SelectUnit_Event Event_Select_Unit;    

повесил его на объект, у которого через getcomponent получил этот эвент, но при попытке его запустить в коде
Event_Select_Unit(); 
появляется ошибка, что нельзя брать эвент другого класса.
делегат объявил отдельно вне класса вот так:
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'

пните в нужном направлении.. ))
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 14.04.2015, 19:44   #124
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 776
Написано 360 полезных сообщений
(для 990 пользователей)
Ответ: Передача переменной в метод

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

http://habrahabr.ru/post/213809/
http://habrahabr.ru/post/245219/
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (14.04.2015)
Старый 14.04.2015, 20:38   #125
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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<
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();    
    }

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

В этом коде (другой скрипт) осуществляется вызов события:
public void OnMouseDown() {
    if (
Mark_Unit)    {
        
Event_Aggregator.Event_Select_Unit_Start();
    }
}
    public 
void Deselect_If_Not_Active () {
        
Debug.Log(this.name);
    } 
код работает, подписчики исправно реагируют на событие, событие отвязано от объектов (в одном отдельном скрипте).
Теперь я правильно понял логику применения событий и делегатов? Хотя бы на базовом уровне?))
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 14.04.2015, 20:46   #126
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 776
Написано 360 полезных сообщений
(для 990 пользователей)
Ответ: Передача переменной в метод

В общем да. Главное сразу приучи себя или делать проверку на null или делегат объявлять с пустышкой (по первой ссылке в комментах есть варианты, как это делать), или потом офигеешь искать, откуда эксцепшены валятся.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (14.04.2015)
Старый 06.05.2015, 11:28   #127
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

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

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

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

PPS. предвидя вопросы, сразу отвечу - нет, не майнкрафт )) даже близко ))
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 06.05.2015, 13:47   #128
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,892
Написано 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (06.05.2015)
Старый 06.05.2015, 14:44   #129
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

отлично, сегодня вечером попробую применить на практике )) уже придумал как, главное что-бы сработало )
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 06.05.2015, 16:09   #130
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

Сообщение от EvilOkta Посмотреть сообщение
PS. Можно тему переименовать в что-то типа "Проблемы разработки от EvilOkta"? А то название темы уже не актуально )
Переименована
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (06.05.2015)
Старый 19.05.2015, 11:25   #131
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Сообщение от Nex Посмотреть сообщение
Немного запутался, сориентируйте Bounds.size родительского объекта будет изменяться если дочерний объекта выходит за его пределы? Или он описывает только размеры родительского объекта? Есть какие-то способы получить Bounds полной модели вместе с дочерними?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 19.05.2015, 13:27   #132
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Проблемы разработки от EvilOkta

Складывай боундсы всех моделей, чтобы получить общий
http://docs.unity3d.com/ScriptRefere...capsulate.html
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (19.05.2015)
Старый 08.06.2015, 13:37   #133
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

что можно почитать про отложенное выполнение методов? Не знаю как сформулировать, даже не знаю термин. Рылся в справках. Мне нужно что-то типа пула (очереди) выполнения методов с последовательным выполнением, т.е. при выполнении одного метода активируется очередь других методов, которые начинают исполняться один за другим.
Немного топорно объяснил, попробую на примере:
Есть условная ловушка - при попадании в нее с объектом производятся определеннные манипуляции. Задача завершить выполнение предыдущего метода (который обеспечил попадание в ловушку) при этом не начиная следующего, пока не сработает ловушка.
Ловушка срабатывает через корутину - сначала она определяет, что объект в ее зоне действия, после этого ожидает секунду (для завершения предыдущего метода) и запускает собственный механизм ловушки (объекту отправляется сообщение что он в ловушке, чтобы он заблокировал свои методы перемещения). При этом косяк в том, что во время этой секунды методы не заблокированы и объект спокойно может уйти из ловушки, а она затем сработает естественно вызвав баги в логике кода.
Если жестко зафиксировать отлов события срабатывания ловушки как только (!) объект оказывается в его зоне действия, то еще веселее: ловушка срабатывает до того, как объект попал в зону действия (на самом краю срабатывания триггера - объект не вошел целиком в триггер, это важно!) - как результат ломается логика кода, объект начинает колбасить
Как я вижу ситуацию: объект попадает в ловушку, скрипт должен дозавершить текущий метод, которым он попал в ловушку, но при этом зная, что следующим должен сработать метод ловушки, а не перемещения дальше. Своего рода предзнание.
Куда копать?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 08.06.2015, 16:06   #134
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Проблемы разработки от EvilOkta

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

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

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

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

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

}

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

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

или 

// передача лямбда функции
StartCoroutine(MyCoroutine(() =>{
    
// сделать что-то при завершении
})); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (08.06.2015)
Старый 08.06.2015, 17:03   #135
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от pax Посмотреть сообщение
// завершающий метод
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
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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