Пятница, 29 Марта 2024, 17:07

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как сделать инструмент выделения?
Как сделать инструмент выделения?
robertonoДата: Суббота, 12 Октября 2013, 20:24 | Сообщение # 1
Чокнутый Кот
Сейчас нет на сайте
Как в 3д редакторах. Выделяешь область мышкой и потом заносится всё в массив. Как сделать?

Добавлено (12.10.2013, 20:24)
---------------------------------------------
знает кто нибудь? Очень нужно! sad

KamiRoninДата: Суббота, 12 Октября 2013, 21:46 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
вопрос поконкретнее сформулируй! а то кидает на разные стороны для ответа! smile

Добавлено (12.10.2013, 21:46)
---------------------------------------------
если ты в RTS или в типа "симсах" смог сделать рамку для выделения 3D объкетов с проекцией на террайн, то там в механизме выделения вычисляются объекты попавшие под него.
а уж занести это в массив потом эт совсем ерунда..


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
robertonoДата: Суббота, 12 Октября 2013, 21:51 | Сообщение # 3
Чокнутый Кот
Сейчас нет на сайте
Цитата KamiRonin ()
то там в механизме выделения вычисляются объекты попавшие под него.

как?
KamiRoninДата: Суббота, 12 Октября 2013, 22:14 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата robertono ()
как?

так в ЭТОМ вопрос был оказывается!! smile
"как сделать выделение в 3D c проекцией на террайн?" smile

алгоритм:
* нажал Lmouse на террайне - запомнил точку 1
* отпустил - точка 2
* вычислил куб с фиксированной высотой (и можешь сразу с глубиной) по простому квадрату с углами тчк1 - тчк2
дальше ветка:
либо
* пробежался по всем объектам в сцене определил математически попали координаты н-ного объекта списка в куб
либо
* создал невидимый коллайдер куба по координатам и определил все коллизии (интересно сработает?)
* отфильтровываем террайн
* конец.

smile


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
robertonoДата: Суббота, 12 Октября 2013, 22:26 | Сообщение # 5
Чокнутый Кот
Сейчас нет на сайте
Цитата KamiRonin ()
вычислил куб с фиксированной высотой (и можешь сразу с глубиной) по простому квадрату с углами тчк1 - тчк2

можно об этом пункте подробнее? Как это сделать?
KamiRoninДата: Воскресенье, 13 Октября 2013, 02:00 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата robertono ()
можно об этом пункте подробнее? Как это сделать?


у тебя тчк 1 и тчк 2 СЧИТАЮТСЯ точками диагонали квадрата (пока кв) лежащего в любой плоскости по высоте (хоть у первой точки возьми Y хоть у 2ой).
он расположен без наклонов - т.е. все его углы лежат на одной координате Y.
отсюда: точки квадрата это
1) Х1, Z1 ,Y1;
2) Х2, Z2 ,Y1 (например берем У от первой точки, строим в ее плоскости)
3) X2, Z1 ,Y1
4) X1, Z2 ,Y1
есть конечно формула.. но так нагляднее - простая комбинация всех X и Z (1-2) между собой.
все. квадрат построен.
остается добавить от него вниз (вглубь террайна) и вверх (до максимально необходимой точки расчета) фиксированные величины и просто получить нижнюю и верхнюю четверку координат (отсчитав от Y1 нужный размер)
все.

Добавлено (13.10.2013, 02:00)
---------------------------------------------
вот сделал пример:
скрипт использует префаб объект для визуального отображения точек диагонали прямоугольного выделения.
я использовал узкую вытянутую сваю красного цвета smile - кинь в инспекторе префаб в переменную marker скрипта.


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Воскресенье, 13 Октября 2013, 02:10
robertonoДата: Воскресенье, 13 Октября 2013, 13:47 | Сообщение # 7
Чокнутый Кот
Сейчас нет на сайте
KamiRonin, а как я могу по этому же способу выделить зону? Например есть куб который добавлен в переменную GameObject. Нажимаю мышку, появляется этот куб, потом я тяну мышку и второй угол этого куба следует за мышкой (т.е. куб увеличивается), и затем я отпускаю. Как это написать?
KamiRoninДата: Воскресенье, 13 Октября 2013, 15:58 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата robertono ()
второй угол этого куба следует за мышкой (т.е. куб увеличивается), и затем я отпускаю. Как это написать?

ты мне еще за этот скрипт не заплатил! smile


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
robertonoДата: Понедельник, 14 Октября 2013, 16:25 | Сообщение # 9
Чокнутый Кот
Сейчас нет на сайте
KamiRonin, я пока забил на эту функцию, сейчас делаю другую , но возникли проблемы тоже.
Вот можно так сменить цвет
gm.renderer.material.color = Color.red;
но если допустим мой объект имеет материал стандартной воды юнити? Я и пробовал и потом ставить старый шейдер, и материал, и не трогать цвет, но всё равно не удаётся спасти объект и он становится розовый (как бы совсем без текстуры).
Вот код если нужно:
Код

using UnityEngine;
using System.Collections;

public class ScalingTool : MonoBehaviour
{
  //Этот скрипт позволяет изменять размеры объектов в редакторе
   
  public static bool ScalingToolWindow = false;
  GameObject selectedObj;
  Color oldColor;
  Shader oldShader;
  Material oldMaterial;
  public Material mat;
   
  string selectedObjName = "";
   
  void Update ()
  {
   if (selectedObj == null)
    selectedObjName = "Объект не выбран";
   if (ScalingToolWindow) {
    MainGUI.canOpenWindow = false;
     
    if (Input.GetKeyDown (KeyCode.Mouse0)) {
     Ray rayCam = Camera.main.ScreenPointToRay (Input.mousePosition);
     RaycastHit hit = new RaycastHit ();
     if (Physics.Raycast (rayCam, out hit)) {
      GameObject hitObject;
      hitObject = hit.collider.gameObject;
      if (hitObject.tag == "Cube") {
       if(selectedObj == null) {
        if(hitObject.renderer.material.HasProperty("_Color"))
         oldColor = hitObject.renderer.material.color;
        oldShader = hitObject.renderer.material.shader;
        oldMaterial = hitObject.renderer.material;
        selectedObj = hitObject;
        if(selectedObj.renderer.material.HasProperty("_Color")){
         selectedObj.renderer.material.color = Color.red;
        }
        else {
         selectedObj.renderer.material.shader = Shader.Find("Difuse");
         selectedObj.renderer.material.color = Color.red;
        }
        selectedObjName = selectedObj.GetComponent<BlockInfo> ().BlockName;
       }
      }
     }
    }
   }
  }
   
  void OnGUI ()
  {
   if (ScalingToolWindow) {
    GUI.Box (new Rect (Screen.width / 2 - 150, Screen.height / 2 + 100, 300, 200), "");
    GUI.Box (new Rect (Screen.width / 2 - 150, Screen.height / 2 + 100, 300, 200), "");
    GUI.Label (new Rect (Screen.width / 2 - 140, Screen.height / 2 + 105, 295, 20), "Нажмите на объект который хотите изменить");
    GUI.Label (new Rect (Screen.width / 2 - 140, Screen.height / 2 + 125, 295, 20), "Выбранный объект: " + selectedObjName);
     
    if(selectedObj != null){
     GUI.Box (new Rect (Screen.width / 2 - 140, Screen.height / 2 + 155, 280, 140), "");
     if(GUI.Button(new Rect(Screen.width / 2 - 130,Screen.height / 2 + 165,270,20),"Снять выделение с объекта")){
      if(selectedObj.renderer.material.HasProperty("_Color")){
       selectedObj.renderer.material.color = oldColor;
      }
      else {
       selectedObj.renderer.material.shader = oldShader;
       selectedObj.renderer.material = oldMaterial;
      }
      selectedObj = null;
     }
    }
   }
  }
}

Добавлено (14.10.2013, 16:25)
---------------------------------------------
KamiRonin, эм, спасибо.

lentinantДата: Понедельник, 14 Октября 2013, 17:08 | Сообщение # 10
ленивый программист
Сейчас нет на сайте
А ведь все проще. После зажатия левой кнопки, на координате курсора создаешь прямоугольник, второй угол которого рисуешь в текущей координате курсора, конвертируешь координаты всех объектов в координаты на экране, и просто смотришь, какие из них попадают в прямоугольник выделения. Подходит как для редактора, так и для самой игры.

Когда-то тут будут ссылки на крутые проекты. Или нет.
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как сделать инструмент выделения?
  • Страница 1 из 1
  • 1
Поиск:

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