Как найти объект по координатам unity

Не могу понять, что необходимо сделать, чтобы вывести GameObject по координатам.
Есть код к примеру:

cam = MainCamera.main;
planes = GeometryUtility.CalculateFrustumPlanes(cam);
for (int i = 0; i < planes.Length; ++i) {
    Plane p = planes[i];
}

То есть выводит объекты, которые видит камера, как видим, тут используется Plane и у него можно получить:
p.normal (Vector3)
p.distance (float).

Но как мне потом зная p.normal координаты, вывести GameObject, который находится по данным координатам?

задан 16 фев 2020 в 15:05

FixiDens's user avatar

2

Попробуйте использовать методы OnBecameInvisible() и OnBecameVisible() они определяются в наследнике MonoBehaviour так же, как и методы Start или Awake и вызываются, когда объект начинает/перестаёт рендриться хотя бы одной камерой.

Соответственно вы можете использовать их для того, чтобы объект регистрировал себя в каком-нибудь списке, либо удалялся оттуда при вызовах соответствующих методов.

ответ дан 17 фев 2020 в 4:52

M. Green's user avatar

M. GreenM. Green

5,1031 золотой знак10 серебряных знаков17 бронзовых знаков

1

Вот то, о чем писал @M. Green, повесьте первый скрипт на камеру, а второй – на потенциально видимые объекты:


public class VisibleObjectsList : MonoBehaviour {
    public List<PotentiallyVisibleObject> list = new List<PotentiallyVisibleObject>();
}

public class PotentiallyVisibleObject : MonoBehaviour{
    private VisibleObjectsList list;

    void Start () {
        list = FindObjectOfType<VisibleObjectsList>();
    }

    void OnBecameInvisible(){
        list.list.Remove(this);
    }

    void OnBecameVisible(){
        list.list.Add(this);
    }
}

ответ дан 17 фев 2020 в 8:07

Stranger in the Q's user avatar

Stranger in the QStranger in the Q

56k10 золотых знаков80 серебряных знаков134 бронзовых знака

11

Решил вопрос:
На камеру кинул BoxColliderсделал нужный размер и повесил OnTriggerEnter.
Теперь когда камера попадает на объект, он выводится в OnTriggerEnter, а по OnTriggerExit – убираю с видимости.

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

ответ дан 17 фев 2020 в 11:37

FixiDens's user avatar

Поиск объекта по координатам

Поиск объекта по координатам

Как я могу найти и удалить объект с определенным координатами через скрипт. Например у меня есть объект с координатами (1.0f, 1.0f, 0.0f). Как я могу через скрипт по этим данным найти его и удалить? Заранее спасибо

Error
UNIт
 
Сообщения: 66
Зарегистрирован: 25 авг 2015, 10:39

Re: Поиск объекта по координатам

Сообщение Pollux 06 фев 2017, 20:08

Перечислить в цикле все объекты сцены и сравнить каждый с необходимыми координатами.

Аватара пользователя
Pollux
UNITрон
 
Сообщения: 276
Зарегистрирован: 01 сен 2016, 22:31

Re: Поиск объекта по координатам

Сообщение samana 06 фев 2017, 20:08

Это странный подход к удалению объектов, но ладно, раз уж так задумано. Позиция объектов находится в векторе, а у вектора числа с плавающей запятой, поэтому проверка на равенство вроде 0,023f == 0,023f может не сработать. Поэтому берите ваш вектор и пробегитесь по всем объектам и найдите расстояние до каждого. И если это расстояние очень маленькое, то удаляйте этот объект.

Возможно поможет каст сферы в нужной точке, если у ваших объектов есть коллайдеры, чтобы проверить пересечение этой сферы с любым объектом.

Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Поиск объекта по координатам

Сообщение Error 06 фев 2017, 20:24

Хм, хорошая идея, спасибо

Error
UNIт
 
Сообщения: 66
Зарегистрирован: 25 авг 2015, 10:39


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

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

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



Определение объекта сцены по его координатам.

Megaxela Дата: Пт, 22 Фев 2013, 23:40 | Сообщение # 1
Нет аватара 

Награды: 0

Репутация: 0

Статус: Offline

Что – то вроде аналога GameObject.Find, только не по имени, а по координатам. Например в координатах по Vector3 у нас допустим 0,0,0 находится источник света, но может и не находиться. Задача проверить его расположение. Спасибо если что язык C#

 
Hunjeth Дата: Пт, 22 Фев 2013, 23:49 | Сообщение # 2
 

Награды: 1

Репутация: 112

Статус: Offline

если на объекте есть collider то пробуй
Physics.OverlapSphere : http://docs.unity3d.com/Documen….re.html
если нету то переберай по одному пока не найдещь чтобы ускорить поиск сложи все объекты в 1 transform или используй
GameObject.FindGameObjectsWithTag : http://docs.unity3d.com/Documen….ag.html

Сообщение отредактировал HunjethСр, 27 Фев 2013, 01:24

 
Левша Дата: Сб, 23 Фев 2013, 01:06 | Сообщение # 3

Черный Волк

 

Награды: 30

Репутация: 3313

Статус: Offline

Придется перебирать все трансформы определенного типа обьектов и проверять их позицию с шаблоном.
Метод – через зад… smile


X.cor.R (Prologue)

 
seaman Дата: Сб, 23 Фев 2013, 12:14 | Сообщение # 4

Гуру

 

Награды: 10

Репутация: 660

Статус: Offline

Зачем?

 
Megaxela Дата: Сб, 23 Фев 2013, 12:24 | Сообщение # 5
Нет аватара 

Награды: 0

Репутация: 0

Статус: Offline

Цитата (Левша)

Придется перебирать все трансформы определенного типа обьектов и проверять их позицию с шаблоном.
Метод – через зад…

Ну да. Я так и предполагал. Спасибо.

Цитата (Hunjeth)

если на объекте есть collider то пробуй
Physics.OverlapSphere : http://docs.unity3d.com/Documen….re.html
если нету то переберай по одному пока не найдещь чтобы ускорить поиск сложи все объекты в 1 transform или используй
GameObject.FindWithTag : http://docs.unity3d.com/Documen….re.html

Последняя ссылка – копия прошлой.

Сообщение отредактировал MegaxelaСб, 23 Фев 2013, 12:26

 
Левша Дата: Сб, 23 Фев 2013, 12:40 | Сообщение # 6

Черный Волк

 

Награды: 30

Репутация: 3313

Статус: Offline

Цитата (Megaxela)

сложи все объекты в 1 transform

Как он тогда отдельный трансформ.позицию отыщет ?
Что зачем ?
Вот и я пишу зачемsmile


X.cor.R (Prologue)

 
Megaxela Дата: Пн, 25 Фев 2013, 22:28 | Сообщение # 7
Нет аватара 

Награды: 0

Репутация: 0

Статус: Offline

А теперь вопрос на миллион… Как сделать перебор. Я уже все перепробовал. Он берет только данные с первого установленного объекта.

 
Левша Дата: Пн, 25 Фев 2013, 22:55 | Сообщение # 8

Черный Волк

 

Награды: 30

Репутация: 3313

Статус: Offline

Megaxela, понятнее старайся писать…. Я ничего не понял…


X.cor.R (Prologue)

 
seaman Дата: Вт, 26 Фев 2013, 08:16 | Сообщение # 9

Гуру

 

Награды: 10

Репутация: 660

Статус: Offline

Зачем определять есть ли светильник в этом месте? С коллайдерами могу понять. Но с ними и проще – OverlapSphere. Зачем иное?

 
Megaxela Дата: Вт, 26 Фев 2013, 21:27 | Сообщение # 10
Нет аватара 

Награды: 0

Репутация: 0

Статус: Offline

Дело в том, что при попытке перебрать все объекты с одинаковым тэгом/именем, он находит только один (тот, что в инспекторе нижний). Как сделать перебор? Ну или найти сразу все?

 
seaman Дата: Вт, 26 Фев 2013, 23:15 | Сообщение # 11

Гуру

 

Награды: 10

Репутация: 660

Статус: Offline

GameObject.FindGameObjectsWithTag не?

 
Hunjeth Дата: Ср, 27 Фев 2013, 01:35 | Сообщение # 12
 

Награды: 1

Репутация: 112

Статус: Offline

wacko
это так сложно????

Код

var _GameObjects = GameObject.FindGameObjectsWithTag(“box”);

тут 2 варианта

Код

for (var g : GameObject in _GameObjects) {
  g.name = “lol – ” + g.GetInstanceID();
}

или так

Код

for (var i = 0; i < _GameObjects.length; i++) {
  _GameObjects[i].name = “lol – ” + _GameObjects[i].GetInstanceID();
}

 
Megaxela Дата: Ср, 27 Фев 2013, 13:07 | Сообщение # 13
Нет аватара 

Награды: 0

Репутация: 0

Статус: Offline

Цитата (Hunjeth)

это так сложно????
Код
var _GameObjects = GameObject.FindGameObjectsWithTag(“box”);

тут 2 варианта
Код
for (var g : GameObject in _GameObjects) {
  g.name = “lol – ” + g.GetInstanceID();
 }

или так
Код
for (var i = 0; i < _GameObjects.length; i++) {
  _GameObjects[i].name = “lol – ” + _GameObjects[i].GetInstanceID();
 }

Спасибо большое.

 
  • Страница 1 из 1
  • 1

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Your name

Your email

Suggestion*

Cancel

Switch to Manual

Declaration

public static GameObject Find(string name);

Description

Finds a GameObject by name and returns it.

This function only returns active GameObjects. If no GameObject with name can be found, null is returned. If name contains a ‘/’ character, it traverses the hierarchy like a path name.

For performance reasons, it is recommended to not use this function every frame. Instead, cache the result in a member variable at startup. or use GameObject.FindWithTag.

Note: If you wish to find a child GameObject, it is often easier to use Transform.Find.

Note: If the game is running with multiple scenes then Find will search in all of them.

To get the position of a gameobject in the world, you can retrieve a Vector3 (x,y,z) of it’s Position from the Transform component that’s added by default to every gameobject, as seen in the inspector:

Transform component

gameObject.Transform.position returns the absolute world position.
Note that this is the same as GetComponent<Transform>().position on your gameobject.

gameObject.Transform.localPosition returns the position relative to that gameobject parent’s position – if your gameobject has a parent whose position is not 0,0,0 this will return the Vector3 value of what you see in the inspector, rather than the absolute world position.


If you’re not sure how to reference the two gameobjects in your script, the simplest and most basic way is to create two GameObject variables in your script and expose them in the editor (since they are serializable):

public GameObject OriginPosition;
[SerializeField] private GameObject _destinationPosition;

Above: Two ways of exposing a variable to the Unity Inspector

Exposed variables in inspector

Above: The result, now you can simply drag and drop GameObjects into these slots.

UnityEngine.Debug.Log(OriginalPosition.Transform.position);
UnityEngine.Debug.Log(_destinationPosition.Transform.position);

Добавить комментарий