Поиск объекта
Добрый день.
Подскажите, плиз, кто в курсе как узнать(найти) какой GameObject расположен по заданным координатам?
В процессе игры на сцене создаются различные игровые объекты. Как в определенный момент игры можно узнать какой же объект находится по заданным координатам в пространстве?
Спасибо.

Лучший ответ:
Тут зависит от конкретных обстоятельств.
Например, пусть у тебя высота самого высокого объекта n и ты делаешь рейкаст с такими параметрами:
ray.origin = position;
ray.direction = Vector3.up;
Но у тебя в RaycastHit не попадает коллайдер, внутри которого начинается луч. Ну так никто нам не мешает изменить направление на обратное:
ray.origin = position;
ray.direction = Vector3.up;
ray.origin = ray.GetPoint(n+100);
ray.direction = -Vector3.up;
из той точки, в которой точно не будет объектов. Потолки и прочее можно игнорировать, добавив в отдельный слой или как там это делается.



Просмотров: 908

XGM Bot #1 - 1 год назад 0
Похожие вопросы:

» ответ
Если я правильно понял, ты хочешь добавить в какой-либо массив юнита, который находится в триггере и соответствует некоторым условиям ( в данном случае tag = "Tag" и lvl = 5) ? Я тут использовал лист, т.к. с ним удобнее работать, но при желании ты можешь юзать статический массив.
» код
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test : MonoBehaviour {

    public List<GameObject> Units = new List<GameObject>();
    void OnTriggerStay2D(Collider2D col)
    {
        if (col.tag == "Tag" || col.GetComponent<MyComponent>().lvl == 5)
        {
            Units.Add(col.gameObject);
        }
    }

GeneralElConsul #2 - 1 год назад (отредактировано ) 0
Например, использовать docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
Пример:
Collider[] colliders;
if((colliders = Physics.OverlapShere(transform.position, 1f)).Length > 1)
   {
        foreach(var collider in colliders)
        {
             //Твои действия с найденными объектами через collider.gameObject
        }
   }
Проверить времени нет, но вроде бы должно работать.
ZZBase #3 - 1 год назад 0
Да, согласен, можно использовать данный алгоритм. Но данный метод, как и RayCast, имеет погрешность, которая зависит от радиуса сферы или от длины луча. Например если сфера целиком оказалась внутри объекта и коллайдеры не пересекаются, в данном случае если увеличивать радиус сферы, то в эту сферу могут попасть другие объекты. Или же лучом проверять RayCastHit, то от начала луча до проверяемого объекта может находится другой, меньший объект, и RayCast вернет именно мелкий объект, т.к. он первый "встретится" на пути луча.
В идеале было бы здорово если бы радиус сферы или длину луча можно было бы сделать равными нулю, но при этом функция вернула бы объект (или массив объектов) внутри которого находится проверяемся точка.
В любом случае, спасибо, буду пробовать данный метод.
GeneralElConsul #4 - 1 год назад (отредактировано ) 0

Тут зависит от конкретных обстоятельств.
Например, пусть у тебя высота самого высокого объекта n и ты делаешь рейкаст с такими параметрами:
ray.origin = position;
ray.direction = Vector3.up;
Но у тебя в RaycastHit не попадает коллайдер, внутри которого начинается луч. Ну так никто нам не мешает изменить направление на обратное:
ray.origin = position;
ray.direction = Vector3.up;
ray.origin = ray.GetPoint(n+100);
ray.direction = -Vector3.up;
из той точки, в которой точно не будет объектов. Потолки и прочее можно игнорировать, добавив в отдельный слой или как там это делается.
ZZBase #5 - 1 год назад 0
Да, похоже придется сдвигать начало луча на n, чтобы потом по направлению получить искомый коллайдер.
Буду копать в этом направлении.
Спасибо.
alexprey #6 - 1 год назад 0
ZZBase, что-то мне подсказывает задача у тебя решается как-то не верное...