forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

Nex 26.03.2016 03:25

Ответ: Вопросы от новичка
 
Научите, пожалуйста, как делать методы подобно Start() или Update(), которые уже где то в Юнити объявлены, но при этом их можно использовать/не использовать без override.
Я пробовал несколько способов, но не удачно.
1) Интерфейс требует что бы было объявлено и обязательно public.
2) Если объявлено выше по иерархии, то надо перезаписать.
3) Абстрактный метод как и интерфейс - нужно объявлять.
Какие еще способы есть? :)

RegIon 26.03.2016 08:03

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Nex (Сообщение 305000)
Научите, пожалуйста, как делать методы подобно Start() или Update(), которые уже где то в Юнити объявлены, но при этом их можно использовать/не использовать без override.
Я пробовал несколько способов, но не удачно.
1) Интерфейс требует что бы было объявлено и обязательно public.
2) Если объявлено выше по иерархии, то надо перезаписать.
3) Абстрактный метод как и интерфейс - нужно объявлять.
Какие еще способы есть? :)

:4to: тоже интересно, погуглил, и все же везде нужен overide.

pax 26.03.2016 09:41

Ответ: Вопросы от новичка
 
Все просто, это рефлексия
PHP код:

obj.GetType().GetMethod("MyMethod").Invoke(objarguments[]) 

Пара ссылок
https://msdn.microsoft.com/ru-ru/lib...eflection.aspx
https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx
https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx

Правда в Unity не просто рефлексия, а там несколько сложнее. Но принцип один, в Unity ничего не объявлено, все ищется по по именам.

Вот вам пример:
PHP код:

using UnityEngine;
using System.Reflection;

/// <summary>
/// Аналог SendMessage с более продвинутыми функциями.
/// Посылает сообщения даже выключенным объектам.
/// </summary>
public static class Message
{

    public static 
void InvokeMethod(this GameObject gameObjectstring methodName)
    {
        foreach (
Component c in gameObject.GetComponents<Component>())
        {
            
MethodInfo m c.GetType().GetMethod(methodName);
            if (
!= null)
                
m.Invoke(cnull);
        }
    }

    public static 
void InvokeMethod(this GameObject gameObjectstring methodNameparams object[] parameters)
    {
        foreach (
Component c in gameObject.GetComponents<Component>())
        {
            
MethodInfo m c.GetType().GetMethod(methodName);
            if (
!= null)
                
m.Invoke(cparameters);
        }
    }
    
    public static 
void InvokeMethodUpwards(this GameObject gameObjectstring methodName)
    {
        
Transform t gameObject.transform;
        while (
t)
        {
            foreach (
Component c in t.gameObject.GetComponents<Component>())
            {
                
MethodInfo m c.GetType().GetMethod(methodName);
                if (
!= null)
                    
m.Invoke(cnull);
            }
            
t.parent;
        }
    }

    public static 
void InvokeMethodUpwards(this GameObject gameObjectstring methodNameparams object[] parameters)
    {
        
Transform t gameObject.transform;
        while (
t)
        {
            foreach (
Component c in t.gameObject.GetComponents<Component>())
            {
                
MethodInfo m c.GetType().GetMethod(methodName);
                if (
!= null)
                    
m.Invoke(cparameters);
            }
            
t.parent;
        }
    }

    public static 
void BroadcastMethod(this GameObject gameObjectstring methodName)
    {
        foreach (
Component c in gameObject.GetComponentsInChildren<Component>())
        {
            
MethodInfo m c.GetType().GetMethod(methodName);
            if (
!= null)
                
m.Invoke(cnull);
        }
    }

    public static 
void BroadcastMethod(this GameObject gameObjectstring methodNameparams object[] parameters)
    {
        foreach (
Component c in gameObject.GetComponentsInChildren<Component>())
        {
            
MethodInfo m c.GetType().GetMethod(methodName);
            if (
!= null)
                
m.Invoke(cparameters);
        }
    }




RegIon 26.03.2016 11:46

Ответ: Вопросы от новичка
 
Рефлексия же сама по себе медленная штука. Т.е советовали избегать использование SendMessange так как он слоупочный, а тут весь MonoBech один большой слоупок?

http://www.manuelabadia.com/blog/Per...dcd8e6b5d.aspx

Nex 26.03.2016 14:56

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от RegIon (Сообщение 305005)
Рефлексия же сама по себе медленная штука. Т.е советовали избегать использование SendMessange так как он слоупочный, а тут весь MonoBech один большой слоупок?

http://www.manuelabadia.com/blog/Per...dcd8e6b5d.aspx

Все будет медленным если не кешировать.
При старте проги запустил функцию с поиском методов через рефлексию, нашел, сохранил в переменную/массив/лист и далее дергаешь их если не null или снова ищешь если все же null.

Нынче все настолько закешировано, что я как то раз зашел в VK app с мобилки, нет сообщений и новых новостей, дернул пальцем для обновления, все равно ничего нового и вышел из приложения. А оказывается, что на мобилке закончился интернет и VK app нужно ~30-60 сек работать дабы понять что доступа к интернету нет и сообщить об этом и даже принудительное обновление контента не помогает.

pax 26.03.2016 15:12

Ответ: Вопросы от новичка
 
Я не говорил что в Unity просто рефлексия. Из MethodInfo можно сделать делегат для быстрого вызова.

https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx

Естественно все не так просто. Читайте подробнее как оно в Unity работает: http://blogs.unity3d.com/2015/12/23/1k-update-calls/

RegIon 28.03.2016 15:37

Ответ: Вопросы от новичка
 
Никто не знает, работает ли Unity ADS вне GP, а то у меня просмотры есть, а eCPM = 0. Просто там что-то сказано, что если нету GooglePlay, то и не оплачивается реклама, т.е обязательно что бы установка с него произвелась?

St_AnGer 29.03.2016 09:40

Ответ: Вопросы от новичка
 
Вложений: 3
Долго ломал голову, как сделать подобную обводку вокруг зданий без мам, пап и кредитов проекторов и шейдеров (вариант с шейдерами и проекторами нашёл очень быстро, там реализуется вообще всё что мне нужно от данного "курсора", но я же русский человек, без велосипедов - жизнь скучна:-D ):
Вложение 22321

Сделал спрайтом, вот так оно выглядело на моих псевдоюнитах:
Вложение 22322

Но, вполне логично, что когда мне понадобилось применить эту же обводку к зданиям (соответственнно, программно увеличив в размерах спрайт), то получилась вот такая радость:
Вложение 22323

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

Мне пока что приходит в голову только одна идея - на этапе загрузки уровня для каждого нужного размера отрисовывать в виртуальную текстуру эту "обводку" с нужной толщиной линии, а потом её просто назначать на спрайт. Шойдеров не хочу лишний раз касаться - пока ещё не решил сколько объектов можно будет выделять одновременно, потому не знаю как к большому количеству таких обводок мобилки будут относиться (а игрулину хочется очень мультиплатформенную сделать). Данная "обводка" должна лежать на земле строго под требуемым юнитом и зданием (в идеале, конечно, огибать всё её выпуклости и впуклостивпадины, но это я сделаю своими силами), по слоям она отрисовывается выше чем земля, потому видно её будет всегда (если, конечно, она не перекрыта более большим юнитом или зданием.)

RegIon 29.03.2016 11:00

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от St_AnGer (Сообщение 305071)
Долго ломал голову, как сделать подобную обводку вокруг зданий без мам, пап и кредитов проекторов и шейдеров (вариант с шейдерами и проекторами нашёл очень быстро, там реализуется вообще всё что мне нужно от данного "курсора", но я же русский человек, без велосипедов - жизнь скучна:-D ):
Вложение 22321

Сделал спрайтом, вот так оно выглядело на моих псевдоюнитах:
Вложение 22322

Но, вполне логично, что когда мне понадобилось применить эту же обводку к зданиям (соответственнно, программно увеличив в размерах спрайт), то получилась вот такая радость:
Вложение 22323

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

Мне пока что приходит в голову только одна идея - на этапе загрузки уровня для каждого нужного размера отрисовывать в виртуальную текстуру эту "обводку" с нужной толщиной линии, а потом её просто назначать на спрайт. Шойдеров не хочу лишний раз касаться - пока ещё не решил сколько объектов можно будет выделять одновременно, потому не знаю как к большому количеству таких обводок мобилки будут относиться (а игрулину хочется очень мультиплатформенную сделать). Данная "обводка" должна лежать на земле строго под требуемым юнитом и зданием (в идеале, конечно, огибать всё её выпуклости и впуклостивпадины, но это я сделаю своими силами), по слоям она отрисовывается выше чем земля, потому видно её будет всегда (если, конечно, она не перекрыта более большим юнитом или зданием.)

а чем не нравится lineRenderer с 32 секторами? я бы его заюзал. Ну или генерировал меш-колечко динамически и накладывал self-illuminte шейдер.
На самом деле я как-то так делал, необходимо было рисовать колечки разного диаметра, но одной толщины.
У меня где-то есть скрипт, который генерить всякие bezie-кривые, спокойной можоно научить генерировать и колечки. Толщина сохраняется, UV накладывается.

St_AnGer 29.03.2016 14:28

Ответ: Вопросы от новичка
 
Вложений: 1
Цитата:

Сообщение от RegIon (Сообщение 305072)
а чем не нравится lineRenderer с 32 секторами? я бы его заюзал. Ну или генерировал меш-колечко динамически и накладывал self-illuminte шейдер.
На самом деле я как-то так делал, необходимо было рисовать колечки разного диаметра, но одной толщины.
У меня где-то есть скрипт, который генерить всякие bezie-кривые, спокойной можоно научить генерировать и колечки. Толщина сохраняется, UV накладывается.

Собственно, lineRenderer пока что и заюзал (с изменяемым количеством секторов).
Вложение 22324
Вопрос только что будет с мобилкой если одновременно штук 30 этих lineRenderer будет на экране, помимо прочей геометрии. Наверно, версия с пререндеренными кругами в текстуру натянутую на спрайты будет немного легче для gpu, но я пока что не умею рендерить в текстуру в Unity :).

pax 29.03.2016 16:41

Ответ: Вопросы от новичка
 
Легче будет сгенерировать меши для этих кругов вручную. Зачем тебе делать кучу текстур? Достаточно материала без текстуры и сгенерированного меша.

Nex 29.03.2016 16:49

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от St_AnGer (Сообщение 305077)
Собственно, lineRenderer пока что и заюзал (с изменяемым количеством секторов).
Вложение 22324
Вопрос только что будет с мобилкой если одновременно штук 30 этих lineRenderer будет на экране, помимо прочей геометрии. Наверно, версия с пререндеренными кругами в текстуру натянутую на спрайты будет немного легче для gpu, но я пока что не умею рендерить в текстуру в Unity :).

Это же генерированные меши вроде как. Если не изменять количество сегментов, то все должно быть норм. Другое дело как я помню LineRenderer в любом случае дает 1dc так что у тебя будет +30dc, что будет не лучше простого шейдера. :-)

RegIon 31.03.2016 18:01

Ответ: Вопросы от новичка
 
Ситуация, есть куча (~100-150) объектов с одной анимацией и аниматором, но большую часть времени они за кадром, объекты статичны в определенной небольшой зоне (не выходят за нее), меньше чем один экран. Будет ли приростом в скорости, если у объектов, которые не в зоне полезной работы отключать аниматор? Или только лаги будут из-за его включения/выключения?
(задачка из раздела выключать или не выключать лампочку, если постоянно бегаешь из комнаты в комнату )
Померить профайлером пытался, не особо заметил разницы, правда что иногда пики появлялись, но сложно сделать чистый тест, всегда рандомно раскидываются объекты.

Антихрист 31.03.2016 20:31

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от RegIon (Сообщение 305131)
Ситуация, есть куча (~100-150) объектов с одной анимацией и аниматором, но большую часть времени они за кадром, объекты статичны в определенной небольшой зоне (не выходят за нее), меньше чем один экран. Будет ли приростом в скорости, если у объектов, которые не в зоне полезной работы отключать аниматор? Или только лаги будут из-за его включения/выключения?
(задачка из раздела выключать или не выключать лампочку, если постоянно бегаешь из комнаты в комнату )
Померить профайлером пытался, не особо заметил разницы, правда что иногда пики появлялись, но сложно сделать чистый тест, всегда рандомно раскидываются объекты.

http://docs.unity3d.com/ScriptRefere...llingMode.html
Не подойдёт?

RegIon 31.03.2016 21:24

Ответ: Вопросы от новичка
 
Ща проверю. Если не будет дрыгаться - как доктор прописал, не нужен будет кастыль. Не знал о такой хрени.

UPD. Хорошая штука, но анимация встает на паузу , а так как на всех она одна, то все выглядит как под копирку.

Как задать рандомное смещение по времени в аниматоре? Костыль:
  • после старта отключить аниматор,
  • запустить на рандомное (небольшое) время корутину
  • Включить в корутине аниматор
  • Профит. Инстансы аниматора запустятся в разное время.
А можно как-то иначе?


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

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