Гексагональная карта

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Re: Гексагональная карта

Сообщение WhiteDevil 29 авг 2012, 16:18

Не важно куда ты положешь код - в Update или в LateUpdate. Количество выполняемого кода остается тоже самое, а значит и нагрузка не меняется.
Просто непонятно зачем тебе вообще в апдейт чтото ложить, если обновление сцены происходит с кликом мыши
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Гексагональная карта

Сообщение PAX 29 авг 2012, 19:26

_3D_ писал(а):Пожже ещё код подсветки пути перенесу в FixUpdate (который после Update вызывается - забыл точное название, ещё не пользовал), чтобы не нагружать Update.

Не переноси в FixedUpdate, он для физики. Лучше сделай бесконечную корутину например или на крайний случай используй InvokeRepeating

Синтаксис:
Используется csharp
IEnumerator MyUpdate()
{

   // тут действие 10 раз в секунду

   yield return new WaitForSeconds(0.1f);
   StartCoroutine(MyUpdate());
}


Запустить можно так:

Синтаксис:
Используется csharp
void Start()
{
   StartCoroutine(MyUpdate());
}
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Гексагональная карта

Сообщение Syberex 29 авг 2012, 21:13

PAX писал(а):Лучше сделай бесконечную корутину например или на крайний случай используй InvokeRepeating

Чел первый раз встал на коньки, а вы ему "лучше сделай тройной тулуп" =))
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Гексагональная карта

Сообщение PAX 29 авг 2012, 22:28

Syberex писал(а):
PAX писал(а):Лучше сделай бесконечную корутину например или на крайний случай используй InvokeRepeating

Чел первый раз встал на коньки, а вы ему "лучше сделай тройной тулуп" =))


По примеру все понятно ИМХО. Всего несколько строчек кода. Если не понятно, то можете почитать мою статью Сопрограммы_(Coroutone)
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Гексагональная карта

Сообщение Syberex 29 авг 2012, 23:07

PAX писал(а):По примеру все понятно ИМХО. Всего несколько строчек кода. Если не понятно, то можете почитать мою статью Сопрограммы_(Coroutone)

Не вижу смысла браться за корутины с 2х недельным опытом в Юнити, какая бы хорошая статья не была, не с корутин надо начинать ее изучение ... про "не оптимальность" подхода я оговорился, а вы подталкиваете к ранней оптимизации [-x
Ссылка не работает ...
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Гексагональная карта

Сообщение _3D_ 30 авг 2012, 07:54

Так, хорошо. У меня на сцене нет динамики и не планируется! За всю анимацию спрайтов отвечает RagePixel и я на неё не отвлекаюсь. На мне лишь задача обработки кликов мышью и курсоров клавиатуры. И всё. Все изменения на сцене - это, по большей части, выделение юнита мышью и перемещение его на новую клетку, или перемещение курсорами селектора текущей ячейки поля. Всё.

Сейчас всю логику контроля за действиями пользователя я разместил в контроллере карты (MapController), чтобы она сама следила что происходит на карте и отображала текущую ситуацию, а я всегда могу обратиться к её публичному классу Map и не отвлекаться на визуальную часть. Вот я и предполагал по многочисленным примерам делать проверки в Update MapController'а на Input.GetMouseButtonDown(0), Input.GetKeyUp(KeyCode.DownArrow) и т.д.

Как вариант, в Update по необходимым событиям я могу только менять состояние карты, а обновление поля вынести в корутины (работа с такими аналогами тредов меня нисколько не пугает). Но также предположу, что делать это стоит начинать не ранее чем приложение начнёт тормозить (в чём я сомневаюсь, если честно, там не такая уж и большая нагрузка на смену спрайтов). В любом случае, спасибо за советы и отметку вешками моего дальнейшего пути развития. :)
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение PAX 30 авг 2012, 08:36

Syberex писал(а):
PAX писал(а):Не вижу смысла браться за корутины с 2х недельным опытом в Юнити, какая бы хорошая статья не была, не с корутин надо начинать ее изучение ... про "не оптимальность" подхода я оговорился, а вы подталкиваете к ранней оптимизации [-x
Ссылка не работает ...


Можно в первый день поставить задачу скачивания файла через WWW и столкнуться с корутинами ;)

ссылка работает, если проще, то можно найти статью про сопрограммы на главной странице http://shgames.ru/
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Гексагональная карта

Сообщение _3D_ 03 сен 2012, 13:55

Подошёл к вопросу получения данных с сервера и использования coroutine.

Предполагал в OnGUI поступить просто:
Синтаксис:
Используется csharp
        if (GUI.Button(_rectangles[2], "Войти"))
        {
            var authorized = LoginClass.LoginSend("user", "pass");

            if (authorized)
                Debug.Log("GUI: [+] авторизован.");
            else
                Debug.Log("GUI: [-] пароль не верен!");

        }

где LoginClass - некий класс, отвечающий за текущий логин и через него всегда можно получить информацию по текущему коннекту.

Методы класса LoginClass:
Синтаксис:
Используется csharp
    public bool LoginSend(string user, string password)
    {
        var w_form = new WWWForm();
        w_form.AddField("action", "LoginUser");
        w_form.AddField("user", user);
        w_form.AddField("pass", password);
        StartCoroutine(WaitingForResponse(new WWW(urlLogin, w_form), ServerAnsweredCallback));
        return Authorized;
    }

    private bool ServerAnsweredCallback(string str)
    {
        Debug.Log("LoginСommunication: [*] ответ от сервера - " + str);

        // здесь состояние будет взято из ответа сервера (позже, как серверную часть допишу)
        Authorized = true;
        User = "test";

        return true;
    }

    public IEnumerator WaitingForResponse(WWW www, Func<string, bool> callback)
    {
        // ожидаем пока получим с сервера данные
        yield return www;

        if (http://www.error == null)
            Debug.Log("LoginСommunication: [+] ответ от сервера получен.");
        else
            Debug.Log("LoginСommunication: [-] нет ответа от сервера.");

        if (callback != null) {
            callback(http://www.text);
        }

        http://www.Dispose();
    }
 


В методе ServerAnsweredCallback(string str) этого же класса LoginClass я разбираю ответ сервера и инициализирую внутреннее состояние (фиксирую идентификатор сессии, имя пользвоателя и прочие параметры).

Так вот по логике, при нажатии на кнопке "Войти" в OnGUI вызывается метод LoginClass.LoginSend(), который в свою очередь запускает корутину. Как правильно отрисовать сообщение ожидания, чтобы ничего больше не жали и ждали ответа сервера или истечения таймаута?

Я опасаюсь вставлять в методы циклы ожидания в виде while (!www.isDone) { ... }, т.к. не знаю как оно нагружает процессор. Вот пример того что пока придумал вместо вызова корутины в методе LoginSend():
var www = new WWW(urlLogin, w_form)
while (!www.isDone) { }
return www.error == null ? ParseAnswer(www.data) : false

Правильно ли это?
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение seaman 03 сен 2012, 14:30

Неправильно.
Лучше проверяйте например isDone в Update и по результатам проверки там и действуйте.
Или все же изучите корутины.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Гексагональная карта

Сообщение _3D_ 04 сен 2012, 13:07

Реализовал через корутины.

Но столкнулся с необъяснимым для себя феноменом.

Синтаксис:
Используется csharp
private string user = "login";
private string pass = "password";

OnGUI() {
   user = GUI.TextField(_rectangles[0], user, 32);
   pass = GUI.PasswordField(_rectangles[1], pass, '*', 32);
}


По всем примерам этот код должен вывести GUI-текстовое поле и дать возможность пользователю ввести строку. В моём же случае как только жмёшь любую клавишу в поле заносится пробел + нажатая клавиша (если нажимать не печатные клавиши, например, Alt, то просто добавляется один пробел). Эта фигня наблюдается в обоих полях - логина и пароля..

Грешу уже на UTF, где каждый символ в 2 байта, но доказать не могу. Других догадок не имею..

Пробовал и так (два варианта с подменой до вывода интерфейса и после):
Синтаксис:
Используется csharp
        user = GUI.TextField(_rectangles[0], user, 32);
        user = user.Replace(" ", "");

        pass = pass.Replace(" ", "");
        pass = GUI.PasswordField(_rectangles[1], pass, '*', 32);

Результат не меняется..

П.С. А вообще работа с GUI в unity меня уже расстраивает... :)
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение _3D_ 04 сен 2012, 14:02

8-} Решил проблему следующим образом:

user = GUI.TextField(_rectangles[0], user, 32);
user = user.Replace("\x0", "").Replace("\r", "").Replace("\n", "");

pass = GUI.PasswordField(_rectangles[1], pass, '*', 32);
pass = pass.Replace("\x0", "").Replace("\r", "").Replace("\n", "");

Это корректное решение или можно иначе решить вопрос?..


П.С. Кстати, а ничего, что я все вопросы касательно своей разработки задаю в одной и той же теме? Или всё-таки следует под каждый вопрос заводить новую тему? Так-то, конечно, я предполагаю в будущем переплетения своих вопросов в рамках задуманного проекта..
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Пред.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Saltant, Yandex [Bot] и гости: 24