Суббота, 23 Ноября 2024, 02:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Результаты поиска
polousДата: Вторник, 16 Сентября 2014, 09:24 | Сообщение # 1 | Тема: Интерфейс
частый гость
Сейчас нет на сайте
Приветствую всех!

Вот дошло дело до игрового интерфейса. Мой UI предполагает наличие как классических прямоугольных кнопок, так и сложной формы; различные бары; набор кнопок перелистываемым списком и пр. Вопрос к осведомленным. Сейчас я вижу 3 варианта, по которым можно пойти: писать свой UI стандартными средствами юнити версии ниже 4.6, писать UI с помощью NGUI и, наконец, дождаться и выкачать 4.6 (кстати, когда релиз будет, известно?) и пользоваться новым GUI новой версии юнити. И вопрос очевиден, в каком направлении идти? Почему вообще возникли эти направления? Что предпочтительней и производительней по вашему - NGUI или GUI от юнити 4.6 бета? Можно ли то, что я написал третьим предложением, замутить стандартными средствами GUI от юнити версии 4.5? Ну и последний вопрос, что из этих трех направлений работает быстрее при прочих равных условиях?


Сообщение отредактировал polous - Вторник, 16 Сентября 2014, 09:29
polousДата: Воскресенье, 07 Сентября 2014, 18:15 | Сообщение # 2 | Тема: камера драг'н'дроп
частый гость
Сейчас нет на сайте
Ты не устаешь меня радовать, MANMANA smile Благодарю)
polousДата: Воскресенье, 07 Сентября 2014, 17:00 | Сообщение # 3 | Тема: камера драг'н'дроп
частый гость
Сейчас нет на сайте
Приветствую!

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

Добавлено (07.09.2014, 17:00)
---------------------------------------------
Наверное, сложно вопрос задал smile
Проще - кто-нибудь может подсказать в общих чертах, как реализовать в игре перетаскивание камеры при зажимании кнопки мышки?

Сообщение отредактировал polous - Воскресенье, 07 Сентября 2014, 16:58
polousДата: Суббота, 06 Сентября 2014, 02:22 | Сообщение # 4 | Тема: точный плавный поворот
частый гость
Сейчас нет на сайте
Спасибо, братцы, за помощь! Этот вопрос решил чуть раньше ваших комментариев с подсказки MR_Borg об использовании RotateTodwards:

Quaternion target = Quaternion.Euler (startAngle_x, startAngle_y + AngleOfRotate, startAngle_z);
transform.rotation = Quaternion.RotateTowards (transform.rotation, target, Time.deltaTime * speed);

где startAngle_x - угол x объекта до вращения (transform.rotation.eulerAngles.x) и т.д.

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

Тем не менее, спасибо за ваши ответы, они однозначно кому-нибудь пригодятся в будущем и показывают, что даже такая простая задачка имеет кучу решений.


Сообщение отредактировал polous - Суббота, 06 Сентября 2014, 02:24
polousДата: Пятница, 05 Сентября 2014, 22:41 | Сообщение # 5 | Тема: точный плавный поворот
частый гость
Сейчас нет на сайте
Вероятно, и так можно сделать, но этот вариант не особо отличается от тех, что я написал выше - везде нужно указывать направление поворота. Из-за чего я "проскакиваю" заданное условие при нужной мне скорости поворота. Т.е. получаю то 93,123 градуса, то 88,123 и тп, т.е. не получается подобраться к 90 градусам. Я сейчас решил иначе сделать. Чтоб конечной целью были всё те же 90 градусов, но подбираться к ним, замедляя шаг, вот тогда и условие хорошо срабатывает с любой точностью:

if(goRotatePlr) {
float angle = Quaternion.Angle(selectedPlayer.transform.rotation, Quaternion.Euler(startAnglex, startAngley + AngleOfRotate, startAnglez));
print (angle);
if (angle < 0.01) {
goRotatePlr = false;
}
else {
Quaternion target = Quaternion.Euler (0, startAngley + AngleOfRotate, 0);
selectedPlayer.transform.rotation = Quaternion.Lerp (selectedPlayer.transform.rotation, target, Time.deltaTime * 15f);
}
}
polousДата: Пятница, 05 Сентября 2014, 21:41 | Сообщение # 6 | Тема: точный плавный поворот
частый гость
Сейчас нет на сайте
Спасибо, Snake174. Но все-таки хотелось бы получить подсказку в виде кода для юнити по той причине, что принцип то я итак понял и реализовал (примеры в первом посте), но у меня не получается сделать поворот точнее одного градуса. Хотелось бы иметь поворот 90 градусов +- , например, 0.01. Как мне так точно повернуться и при этом не мгновенно?

Добавлено (05.09.2014, 21:41)
---------------------------------------------
Ну же, мастера юнити, неужели вопрос настолько банален, что все молчат? если это так, то ткните хотя б в место, где искать, а то, как вы мб заметили, я в первом посте закомментировал еще 2 варианта вращения и они все работают аналогично....

polousДата: Пятница, 05 Сентября 2014, 14:29 | Сообщение # 7 | Тема: точный плавный поворот
частый гость
Сейчас нет на сайте
Ребята, эта тема поднималась здесь и не только уже 100500 раз. И тем не менее, нужно повернуть объект строго на 90 градусов относительно оси Y.
И если говорить о строгом повороте на 90 градусов, то прекрасно работает
Код

transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y - 90f, transform.rotation.eulerAngles.z);

но такой вариант мгновенно крутит объект. Мне же нужен плавный поворот и его также можно реализовать кучей способов, но тогда все решение зависит от скорости поворота (Time.deltaTime * speed) и условия выхода из вращения. Привожу пример реализации.
Код

    // кнопка поворота объекта влево (сидит в OnGUI ())
    if (GUI.Button (new Rect (10, Screen.height - 120, 80, 30), "Left")) {
     startAnglex = transform.rotation.eulerAngles.x;
     startAngley = transform.rotation.eulerAngles.y;
     startAnglez = transform.rotation.eulerAngles.z;
     AngleOfRotate = -90f;
     goRotatePlr = true;
    }

    // Плавный поворот на 90 градусов (сидит в Update ())
    if(goRotatePlr) {
     float angle = Quaternion.Angle(transform.rotation, Quaternion.Euler(startAnglex, startAngley + AngleOfRotate, startAnglez));
     if ((int)angle == 0) {
      goRotatePlr = false;
     }
     else {
      //transform.RotateAround(transform.position, Vector3.down, Time.deltaTime * rotateSpeed);
      //transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(Vector3.down), Time.deltaTime * rotateSpeed);
      transform.Rotate(Vector3.down * Time.deltaTime * rotateSpeed);
     }
    }


Все бы хорошо, но точность поворота (а именно соблюдение условия остановки поворота) нарушается, когда возрастает скорость поворота. Если использовать скорость 50, то все ок и (int)angle == 0 не нарушается, но скорость 50 для моей задачи очень мала, мне нужно 300 и выше, и в этой ситуации условие выхода из вращения нарушается практически всегда, т.е. объект вращается так долго, пока однажды не выполнится это условие. Чтобы все работало корректно, мне нужно изменять условие, например на такое angle <= 5. Но таким углом я уже не могу пренебречь, т.к. тем же способом я хочу вращать ортогональную камеру и погрешность в 5 градусов при каждом повороте однажды приведет к значительному уклону камеры и неверному ее позиционированию. Итак, как же все-таки сделать точный (как в примере с Quaternion.Euler) поворот объекта вокруг своей оси, но при этом плавный, как последнем примере, и чтобы еще точность поворота не превышала 1 градуса (лучше меньше)?


Сообщение отредактировал polous - Пятница, 05 Сентября 2014, 14:38
polousДата: Четверг, 04 Сентября 2014, 00:53 | Сообщение # 8 | Тема: Объекты на экране камеры
частый гость
Сейчас нет на сайте
Блин, как всегда всё так просто в итоге)
В очередной раз спасибо за подсказки, MANMANA)
polousДата: Среда, 03 Сентября 2014, 23:32 | Сообщение # 9 | Тема: Объекты на экране камеры
частый гость
Сейчас нет на сайте
Ребята, задача создавать/удалять на экране камеры объекты (кликабельные), а именно задача заключается в создании интерактивных объектов (или, проще, кнопок) на экране камеры, причем количество этих кнопок - это количество видимых врагов для выделенного юнита игрока. Если кто играл в X-Com или Jagget Alliance, то вспомнит аналогичную вещь - если игрок видит, например, 3 врага, то на экране возникает 3 иконки (кнопки), по нажатию на которые осуществляется движение камеры на выделенного врага. И у меня возник вопрос, чем это моделировать - это будет элементы ГУИ (я что-то не нашел, как удалять/скрывать конкретные кнопки ГУИ, нашел только как скрывать весь набор элементов ГУИ, поэтому вообще можно ли и как удалять/скрывать отдельные элементы ГУИ)...? или же это будет некая дополнительная ортографическая камера, на экране которой я буду создавать и удалять объекты в виде иконок? Наверное, есть еще варианты... посоветуйте, пожалуйста, оптимальные способы решения этой задачи.
polousДата: Среда, 03 Сентября 2014, 23:01 | Сообщение # 10 | Тема: Поиск количества true в массиве в update
частый гость
Сейчас нет на сайте
Да, все нормально теперь рассчитывает. Благодарю за помощь, Saitei.

На C#
int AmountOfEnemies() {
aoe = 0;
for (int k = 0; k < enemies.Length; k++) {
if (enemies[k].GetComponent<FindEnemies>().Visibility_plr[selectedPlayer.GetComponent<Player>().indexinmassive] == true) {
aoe++;
}
}
return noe;
}

Добавлено (03.09.2014, 22:58)
---------------------------------------------
Пока писал код, уже куча ответов написали) Спасибо, я понял, что дело было в обнулении переменной, т.к. и с for, и c foreach все прекрасно работает. Еще раз всем спасибо!

Добавлено (03.09.2014, 23:01)
---------------------------------------------
это с foreach

int AmountOfEnemies() {
noe = 0;
foreach (GameObject e in enemies) {
if (e.GetComponent<FindEnemies>().Visibility_plr[selectedPlayer.GetComponent<Player>().indexinmassive] == true) {
noe++;
}
}
return noe;
}

polousДата: Среда, 03 Сентября 2014, 22:43 | Сообщение # 11 | Тема: Поиск количества true в массиве в update
частый гость
Сейчас нет на сайте
Спасибо, сейчас попробую циклом for вместо foreach. По крайней мере в for есть понятный выход по достижению длины массива.

Сообщение отредактировал polous - Среда, 03 Сентября 2014, 22:43
polousДата: Среда, 03 Сентября 2014, 22:27 | Сообщение # 12 | Тема: Поиск количества true в массиве в update
частый гость
Сейчас нет на сайте
Ребята, чую, что очень нубский вопрос, но как-то не догоняю, как его решить smile Поможете?
Есть boolen массив с постоянным количеством элементов. В зависимости от различных условий в этом массиве в риалтайм изменяются значения элементов. Мне нужно знать в каждый момент времени сколько в этом массиве элементов с true. Я в update бегу по всем элементам массива и при условии, что элемент == true, инкрементирую переменную i, но i бесконечно растет, т.к. возврат из метода происходит только, когда все элементы == false....

void Update() {
foreach (GameObject a in array) {
if (a == true) {
i++;
}
else {
return;
}
}
}

Как правильно организовать поиск количества true в array?


Сообщение отредактировал polous - Среда, 03 Сентября 2014, 22:28
polousДата: Среда, 27 Августа 2014, 11:08 | Сообщение # 13 | Тема: Странности в связке выделение плюс перемещение
частый гость
Сейчас нет на сайте
Эх, я почти сам до этого дошел - уже начал писать все события в одном Input.GetMouseButtonDown(0). Зашел на форум, а тут твой ответ и действительно всё под одним нажатием мышки. Спасибо тебе, Lertmind! Расширил мое понимание)
polousДата: Вторник, 26 Августа 2014, 22:52 | Сообщение # 14 | Тема: Странности в связке выделение плюс перемещение
частый гость
Сейчас нет на сайте
Ну же, люди добрые!) не уж то нет решения?
polousДата: Вторник, 26 Августа 2014, 21:40 | Сообщение # 15 | Тема: Странности в связке выделение плюс перемещение
частый гость
Сейчас нет на сайте
Во-первых, по поводу "foreach (GameObject p in players) { p.GetComponent<Player>().indexinmassive = index; index = index + 1; }" - это я по клику на любой объект из массива хотел получать его индекс в массиве, вот и написал такую вещь. Но это чисто для себя и никакой нагрузки смысловой оно не несет (просто при клике на объект я вывожу print(индекс)) и будет стерто рано или поздно.

Во-вторых, по поводу "у тебя go всегда true" - это все верно и не суть важно в тех вопросах, что я описал в первом посте. А проблема именно в сквозном клике через объект, который я выделяю, на террейн, на котором в тот же миг определяется точка, куда этому только что выделенному объекту нужно переместиться. А по задумке должно быть так - я кликаю на объект, он выделяется, и уже следующий клик по террейну определяет цель для выделенного объекта. Вот прикладываю картинку.
http://s1.uploadpics.ru/images/W1SSxCVIM.jpg


При чем, если продолжать кликать по уже выделенному объекту в рамках его коллайдера, то на террейне будут возникать разные цели. Я уже выделил для террейна и объектов разные слои для рейкастов, я выделил им свои тэги - не помогает...

Добавлено (26.08.2014, 21:02)
---------------------------------------------
еще я добавил для метода выделения объекта строчку, где позиция цели переопределяется и приравнивается к позиции выделенного объекта, но это переопределение позиции срабатывает после клика по объекту (и увы одновременно по террейну), поэтому в начале происходит то, что я показал на картинке выше, и только затем угол и дистанция становятся нулевыми... хотя этого достаточно, что объект рыпнулся в ненужном направлении...

Добавлено (26.08.2014, 21:40)
---------------------------------------------
может попробовать обработать эти 2 разных события в одном Input.GetMouseButtonDown(0) .... unsure

Сообщение отредактировал polous - Вторник, 26 Августа 2014, 20:54
polousДата: Вторник, 26 Августа 2014, 14:13 | Сообщение # 16 | Тема: Странности в связке выделение плюс перемещение
частый гость
Сейчас нет на сайте
Ребята, вновь возникла непонятная для меня ситуация. Нуждаюсь в вашей подсказке.
Вот относительно простенький скрипт, в котором из массива объектов с определенным тэгом производится выделение нужного объекта либо путем нажатия мышки на объект, либо по кнопке на гуи. В Update помимо прочего сидит метод для поворота и перемещения выделенного тем или иным образом объекта из массива по клику мышки. И все вроде как замечательно, но происходит 3 такие вот неприятные вещи: 1) когда я кликаю по террейну и выделенный объект поворачивается и двигается в указанную точку, по завершению движения объект почему-то вновь поворачивается в направлении ОZ; 2) когда я делаю выделение другого объекта (по кнопке на гуи), выделяемый объект с чего-то вдруг передвигается в точку, где стоит объект ранее выделенный, хотя конечно, ничего происходить не должно, должно быть просто выделение объекта, а получается будто объект ранее выделенный становится таргетом для перемещения... при этом выделяемый объект еще и вертится в сторону от ранее выделенного игрока; 3) если выделять объект по клику мышки, то выделяемый объект отпалзает на неопределенное расстояние от ранее выделенного, а тот в свою очередь тоже на неизвестное расстояние ползет в сторону выделенного... и так же происходит хаос с поворотом выделяемого объекта. Вот такой вот непонятный процесс... поможете разобраться, что происходит?)
Код

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

      public GameObject selectedPlayer; // выделенный юнит игрока (далее кратко "игроки")
      public static GameObject[] players; // массив игроков
      public Vector3 position; // позиция клика мышки, куда будет перемещение/поворот
      bool go = false; // разрешает/запрещает двигаться/поворачиваться
      int index = 0; // индекс в массиве игроков

      void Awake () {
       players = GameObject.FindGameObjectsWithTag("Players"); // игроки - это объекты с тэгом "Players"

       // узнаем индекс для каждого из объектов в массиве players
       foreach (GameObject p in players) {
        p.GetComponent<Player>().indexinmassive = index;
        index = index + 1;
       }
            
       selectedPlayer = players [0]; // на старте выделенным игроком буд
       position = selectedPlayer.transform.position;
      }

           
      void OnGUI () {
       // создаем кнопку для перебора игроков по их индексу в массиве в одну сторону
       if (GUI.Button (new Rect (10, Screen.height - 40, 80, 30), "<<<")) {
        if (i == 0) i= players.Length;
        i--;
        selectedPlayer = players [i]; // выделенный игрок - это текущий игрок из массива
       }
       // создаем кнопку для перебора игроков по их индексу в массиве в другую сторону
       if (GUI.Button (new Rect (100, Screen.height - 40, 80, 30), ">>>")) {
        if (i == players.Length-1) i= -1;
        i++;
        selectedPlayer = players [i]; // выделенный игрок - это текущий игрок из массива
       }

      }

      void Update() {
       // клик по тиррэйну
       if (Input.GetMouseButtonDown(0) && GUIUtility.hotControl == 0) {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit_terrain;
        if (Physics.Raycast(ray, out hit_terrain, 100, 1<<10))    {
         position = hit_terrain.point; // определяем позицию клика
         go = true; // можно двигаться
        }
       }
       // поворот в сторону клика и движение туда же
       if(go) {
        Vector3 direction = new Vector3(position.x - selectedPlayer.transform.position.x, 0, position.z - selectedPlayer.transform.position.z);
        selectedPlayer.transform.rotation = Quaternion.Lerp(selectedPlayer.transform.rotation, Quaternion.LookRotation(direction), Time.deltaTime*selectedPlayer.GetComponent<Player>().rotateSpeed);
        selectedPlayer.transform.position = Vector3.MoveTowards(selectedPlayer.transform.position, position, Time.deltaTime*selectedPlayer.GetComponent<Player>().moveSpeed);
       }
       else {go=false;}

       // выделение игроков по клику мышки
       if(Input.GetMouseButtonDown(0)){      
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);      
        RaycastHit hit_player;      
             
        if(Physics.Raycast(ray, out hit_player, 1000, 1<<11)){      
         selectedPlayer = hit_player.collider.gameObject;
        }      
       }
      }


Сообщение отредактировал polous - Вторник, 26 Августа 2014, 14:20
polousДата: Вторник, 26 Августа 2014, 03:52 | Сообщение # 17 | Тема: Вопрос-[ответ] по Unity
частый гость
Сейчас нет на сайте
я спрашивал 2 постами выше про одновременный запуск двух разных методов одним "сквозным" кликом по кнопке гуи и тирэйну, располагающейся за кнопкой... так вот, похожая ситуация возникает, когда есть 2 юнита игрока (оба стоят и способны перемещаться по тиррэйну по клику мыши). Проблема возникает, когда пытаюсь сменить выделение с одного юнита на другого - вновь происходит вызов 2х методов одновременно - метод перемещения и метод выделения, т.е. клик по невыделенному юниту приводит к выделению этого юнита и перемещению ранее выделенного юнита в точку, где стоит вновь выделяемый юнит...
Точка, в которую нужно двигаться по клику, находится по рейкасту; выделение юнитов также по рейкасту (конечно, другому) и я думал, что введение уникальных слоев тиррейна и юнитов для рейкастов решит эту проблему, но, увы... Есть идеи, как с этим бороться?
polousДата: Вторник, 26 Августа 2014, 00:43 | Сообщение # 18 | Тема: Вопрос-[ответ] по Unity
частый гость
Сейчас нет на сайте
Благодарю вас за помощь, буду пробовать.

Добавлено (26.08.2014, 00:43)
---------------------------------------------
Не думаю, что стоит создавать отдельную тему для этого вопроса, поэтому задам тут. При повороте в указанную точку пространства объект наклоняется. При перемещении - уходит пот "землю". И это понятно, ведь я указываю точку на тиррэйне, т.е. y=0 при прочих x,z. А центр масс у объекта находится в y=1 при прочих x,z. Так вот, как же избавиться от этого наклона и уползания в тиррэйн? Обшарил форумы, куча примеров, как перемещать объекты, но как-то не нахожу ответа. Подскажете?)

polousДата: Вторник, 26 Августа 2014, 00:32 | Сообщение # 19 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
Да вроде бы все получилось, что хотел сделать. В твоем варианте скрипта поиска врагов я в цикл по юнитам игрока добавил одномерный массив бул переменных, который дает инфу о видимости для каждого из игроков. Т.к. в игре обнаруженные враги в любом разе будут отображаться для всех юнитов игрока, то твой вариант кода я и использовал. А добавил я массив для того, чтобы невидимым врагам (для определенных юнитов игрока) задавать уникальные свойства, например, невозможность стрелять по нему тем игроком, который его не видит.
Вроде как я со всеми вопросами разобрался, поэтому тему можно считать закрытой. Всем спасибо за оказанную помощь!


Сообщение отредактировал polous - Вторник, 26 Августа 2014, 00:32
polousДата: Понедельник, 25 Августа 2014, 21:09 | Сообщение # 20 | Тема: Вопрос-[ответ] по Unity
частый гость
Сейчас нет на сайте
Ребята, вопрос такой возник - у меня объект перемещается по клику мышки по terrain, в проекте на экране есть кнопки (OnGUI), выполняющие всякое-разное, и когда я кликаю по кнопке на экране, то выполняется сразу 2 действия - то, что должна делать кнопка и непосредственно перемещение по тиррэйну. Как бы сквозной клик через кнопку ГУИ на террейн.
Как мне избежать вызов перемещения, когда я кликаю по кнопке на экране?


Сообщение отредактировал polous - Понедельник, 25 Августа 2014, 21:12
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг