вопрос поконкретнее сформулируй! а то кидает на разные стороны для ответа!
Добавлено (12.10.2013, 21:46) --------------------------------------------- если ты в RTS или в типа "симсах" смог сделать рамку для выделения 3D объкетов с проекцией на террайн, то там в механизме выделения вычисляются объекты попавшие под него. а уж занести это в массив потом эт совсем ерунда..
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
так в ЭТОМ вопрос был оказывается!! "как сделать выделение в 3D c проекцией на террайн?"
алгоритм: * нажал Lmouse на террайне - запомнил точку 1 * отпустил - точка 2 * вычислил куб с фиксированной высотой (и можешь сразу с глубиной) по простому квадрату с углами тчк1 - тчк2 дальше ветка: либо * пробежался по всем объектам в сцене определил математически попали координаты н-ного объекта списка в куб либо * создал невидимый коллайдер куба по координатам и определил все коллизии (интересно сработает?) * отфильтровываем террайн * конец.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
у тебя тчк 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) --------------------------------------------- вот сделал пример: скрипт использует префаб объект для визуального отображения точек диагонали прямоугольного выделения. я использовал узкую вытянутую сваю красного цвета - кинь в инспекторе префаб в переменную marker скрипта.
Код
using UnityEngine; using System.Collections; using System.Collections.Generic;
public class menageCamera : MonoBehaviour {
public Vector3 pnt1 = Vector3.zero; // точка выделения 1 public Vector3 pnt2 = Vector3.zero; // точка выделения 2
public GameObject[] selectedObj; // это массив выделенных объектов доступный из любого места игры public GameObject marker; // сюда кладем префаб объекта маркера ))
//-- находим все объекты с ОПРЕДЕЛЕННЫМ ТЭГОМ! и тэг Untagged не ищет!!!! GameObject[] all = (GameObject[])GameObject.FindGameObjectsWithTag("Enemy");
// простейший способ получить массив с заранее не известным количеством List<GameObject> tmp = new List<GameObject>();
foreach(GameObject gm in all){ //-- проверка на вхождение в выделенный прямоугольник. а Y нам глубоко пофиг! <img src="http://s12.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile" /> if(selectRect.Contains(new Vector2(gm.transform.position.x, gm.transform.position.z)) ){ tmp.Add(gm); // добавляем в список попавший в бокс объект gm.renderer.material.color = Color.red; // меняем цвет для наглядности } } //-- удаляем маркеры с поля try{ GameObject.Destroy(GameObject.Find("marker1"), 0.5f); }catch{ } try{ GameObject.Destroy(GameObject.Find("marker2"), 0.5f); }catch{ }
return tmp.ToArray(); // возвращаем BuilIn массив, а могли бы все организовать в List и тп. }
void Update () {
// при НАЖАТИИ л.кн. мышки в пространстве - ставим первую точку. тянем "рамку" if(Input.GetMouseButtonDown(0)){ Ray rayCam = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(rayCam, out hit, 100f)){ pnt1 = hit.point;
// при ОТПУСКАНИИ л.кн. мышки в пространстве - ставим вторую точку и производим выделение if(Input.GetMouseButtonUp(0)){ Ray rayCam = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(rayCam, out hit, 500f)){ pnt2 = hit.point;
KamiRonin, а как я могу по этому же способу выделить зону? Например есть куб который добавлен в переменную GameObject. Нажимаю мышку, появляется этот куб, потом я тяну мышку и второй угол этого куба следует за мышкой (т.е. куб увеличивается), и затем я отпускаю. Как это написать?
второй угол этого куба следует за мышкой (т.е. куб увеличивается), и затем я отпускаю. Как это написать?
ты мне еще за этот скрипт не заплатил! Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
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;
А ведь все проще. После зажатия левой кнопки, на координате курсора создаешь прямоугольник, второй угол которого рисуешь в текущей координате курсора, конвертируешь координаты всех объектов в координаты на экране, и просто смотришь, какие из них попадают в прямоугольник выделения. Подходит как для редактора, так и для самой игры. Когда-то тут будут ссылки на крутые проекты. Или нет.