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

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

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

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

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

Всем привет, не уверен что меня помнят ибо почти 4 (или больше?) года отсутствовал на форуме, возможно что-то поменялось.
Решил воскресить свой заброшенный на Blitz 3d проект и как площадку для реализации выбрал Unity, изучаю сейчас C#.

Такой вопрос, предположим в скрипте есть метод, в процессе выполнения которого анализируется некоторая ситуация и по результатам анализа выбирается одна из некоторых переменных, назовем их условно intA, intB, intC, intD. Пусть на момент окончания анализа они имеют значения 10, 20, 30, 40 соответственно.

Задача передать одну выбранную анализатором переменную в другой метод (предположим анализатор выбрал для обработки переменную intB ) и по выполнению другого метода вернуть значение выбранной переменной увеличенное на 5 (для примера).

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

Надеюсь пнете в нужном направлении ))
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 13:21   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Так? Или я не понял что ты хочешь?
public class MyIntUpdater:MonoBehaviour
{
    public 
int intA 10;
    public 
int intB 20;
    public 
int intC 30;
    public 
int intD 40;

    private 
void UpdateMyInt(ref int intVar)
    {
        
intVar+=5;
    }
 
    public 
void Update()
    {
         switch(
Random.Range(0,4))
         {
              case 
0:
                  
UpdateMyInt(ref intA);
                  break;
              case 
1:
                  
UpdateMyInt(ref intB);
                  break;
              case 
2:
                  
UpdateMyInt(ref intC);
                  break;
              case 
3:
                  
UpdateMyInt(ref intD);
                  break;
         }
    }


__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (20.02.2013)
Старый 20.02.2013, 15:20   #3
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Да, это как раз и интересовало, а как одновременно передавать в метод несколько таких параметров, есть способ?
т.е. пеердавать, скажем, intA для одной цели, а IntB для другой но ествественно за один вызов. С помощью ref есть возможность?

Я правильно понял логику:
public class MyIntUpdater:MonoBehaviour
{
    public 
int intA 10;
    public 
int intB 20;
    public 
int intC 30;
    public 
int intD 40;
    public 
int SetParam1SetParam2;
    public 
int param1param2;

    private 
void UpdateMyInt(ref int intVar1ref int ntVar2)
    {
        
intVar1+=5;
        
intVar2++;
        
SetParam1 SetParam2 0;
    }
 
    public 
void Update()
    {
         if (
SetParam == 0
         {
         
SetParam1 Random.Range(0,4);
         switch (
SetParam1)
              {
              case 
0:
                  
param1 intA;
                  break;
              case 
1:
                  
param1 intB;
                  break;
              case 
2:
                  
param1 intC;
                  break;
              case 
3:
                  
param1 intD;
                  break;
              }
         }

         
SetParam2 Random.Range(0,4);

         if (
SetParam1 != SetParam2)
         {
         switch(
SetParam2)
            {
              case 
0:
                  
param2 intA;
                  break;
              case 
1:
                  
param2 intB;
                  break;
              case 
2:
                  
param2 intC;
                  break;
              case 
3:
                  
param2 intD;
                  break;
             }
         }
         
         if (
SetParam1 != 0) & (SetParam2 !=0UpdateMyInt(ref param1ref param2);
    }


Такая конструкция будет работать? Или в синтаксисе с ref напутал?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 15:42   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Так не будет работать потому что ты значение переменных копируешь в другие переменные и передаешь уже для изменения их.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 15:59   #5
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

точно, я не учел что передаются другие переменные. Но сам синтаксис передачи - правильный?

или надо:
if (SetParam1 != 0) & (SetParam2 !=0UpdateMyInt(ref param1param2); //вот эта часть 
мне механизм передачи интересен из-за недопонимания синтаксиса

задача с возвратом переменных уже есть идеи как решить, надо просто обмозговать
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 16:03   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

про ref можно почитать тут
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (20.02.2013)
Старый 20.02.2013, 16:19   #7
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

спасибо, сегодня попробую поэксперементировать, как я понял из справки с помощью ref можно передавать не только переменную но и класс? или конкретный экземпляр класса?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 16:20   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

экземпляр, класс можно передавать через шаблон http://msdn.microsoft.com/ru-ru/library/512aeb7t.aspx
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (20.02.2013)
Старый 20.02.2013, 16:31   #9
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

здорово, мне кажется как раз то что нужно для реализации моей задачи, еще раз спасибо. Универсальный шаблон мне пока рановато, а передача экземпляра класса в связке с ref решит мою проблему.

p.s. надеюсь дело пойдет, а то пока не могу абстрагироваться от модели разработки блитца к модели ООП
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 16:44   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Собственно если передать экземпляр класса, то можно его поля менять. Т.к. это ссылочный тип. Нельзя менять поля у структур (типов значений - ValueType), их надо передавать с помощью ref.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 16:51   #11
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

значит я для передачи параметров в метод могу сделать класс в котором перечислю все возможные параметры, которые можно передавать в метод (они после этого станут полями класса, правильно?). После блока-анализатора я создаю экземпляр класса в котором заполняю поля необходимыми для передачи параметрами, остальным например проставляю метки "без изменения" (образно выражаясь), в методе обработчике обрабатываю экземпляр класса - возвращаю в исходный метод и там выполняю замещение тех параметров которые требуются используя как донор измененный экземпляр класса (игнорируя параметры с метками), после этого уничтожаю экземпляр класса и скрипт возвращается к исходной точке. Верно мыслю?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 16:55   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Ну я бы не стал создавать экземпляры каждый раз, иначе будет работать сборщик мусора. Можно сделать один такой объект и его переиспользовать.

Вообще я не смог представить задачу, в которой это все необходимо в такой форме) Вероятно есть решение проще...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 17:11   #13
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

хочу просто оптимизировать управление юнитом, у меня в зависимости от команды (управление нестандартное, стратегически ориентированное, поэтому передвижением юнита будет управлять скрипт а не банальные WSAD) передаются (разными способами) параметры "маршрута" и "действий" по которым должен передвигаться юнит. Сам скрипт передвижение унифицирован и в зависимости от поступающих команд двигает юнит определенным образом.

Я понимаю что это все прекрасно реализуется огородом if..else но не хочу, понимаю что можно сделать оптимизацию и хочу ее натйти чтобы в перспективе использовать полученный опыт для других скриптов.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 17:26   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Может для этого просто юнита унаследовать от некоего интерфейса, а скрипт передвижения будет пользоваться интерфейсом для перемещения юнита.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.02.2013, 17:35   #15
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Передача переменной в метод

универсальное решение для разного количества переменных
public int Check(params int[] inp)
{
    int ret = 0;
    foreach(int j in inp)
    {
        if(j = 0) return ret;
        ret++;
    }
    return -1;
}
используем:
int a = Check(1, 2, 0);
int b = Check(0, 5, 7, 6, 4, 9);
int c = Check(8, 5);
Получим:
a = 2
b = 0
c = -1
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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