Unity3d Raycast на позиции сетки

Я хочу поразить сетку с помощью raycast и получить координаты мыши/экрана, где произошло попадание.

public class GetCoordinates: MonoBehaviour {

    private GameObject _objectToHit;

    private RaycastHit hit;
    private Collider coll;
    private Ray ray;
    private float hitDistance = 200f;

    void Start()
    {
        coll = GetComponent<Collider>();
        _objectToHit = GameObject.Find("Street");
    }

    void Update()
    {
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (coll.Raycast(ray, out hit, hitDistance))
        {
              Debug.Log(hit.point);
        }
    }
}

Также я не уверен, куда добавить скрипт, к объекту удара или к камере?


person Silent Ace    schedule 19.01.2016    source источник
comment
Я не знаю, где вы взяли этот скрипт, но он выглядит нормально, почему вы не пробовали добавить его к объекту или камере? (я знаю, в какой из них вам следует его добавить, но я думаю, вы должны попытаться разобраться сами, учитывая, что у вас уже есть скрипт)   -  person EmilioPelaez    schedule 19.01.2016
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это требует ЧРЕЗВЫЧАЙНО БАЗОВОГО РУКОВОДСТВА ПО ТЕМЕ (обратите внимание, например, я не знаю, куда поместить сценарий), а не фактический вопрос-ответ. Здесь нет ответа, кроме длинного учебника.   -  person Fattie    schedule 19.01.2016
comment
возможно, вы ищете RAYCASTALL. Вы можете очень легко найти ОГРОМНОЕ количество QA и руководств по этому вопросу.   -  person Fattie    schedule 19.01.2016
comment
привет @silentace, ты там?   -  person Fattie    schedule 17.02.2016


Ответы (1)


Вы хотите использовать Camera.WorldToScreenPoint для преобразования положения точки попадания в мире в положение на экране. . Также вам нужно иметь только один экземпляр этого скрипта в вашей игре, иначе у вас будет несколько ray casts. Вы должны учитывать это, прежде чем выбирать, куда поместить этот скрипт. Мы не можем помочь вам сделать этот выбор без дополнительной информации о том, для чего он используется, сколько объектов и т. д.

РЕДАКТИРОВАТЬ об использовании скрипта:

Одно можно сказать наверняка: скрипт raycast должен иметь уникальный экземпляр. Если вы хотите взаимодействовать с другими объектами через этот скрипт, вам следует использовать GameObject.GetComponent для объекта hit.collider.gameobject, чтобы получить доступ к скрипту, который сделает то, что вы хотите.

Например, если на вашей улице есть ворота, щелчок по ним вызовет функцию toggleOpen(), содержащуюся в сценарии GateBehaviour для объекта Gate, например:

if (coll.Raycast(ray, out hit, hitDistance))
{
    if(hit.collider.tag == "Gate")
    {
        GateBehaviour gate = hit.collider.gameobject.GetComponent<GateBehaviour>()
        if(gate)
            gate.toggleOpen();
    }
    Debug.Log(hit.point);
}

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

person Stud    schedule 19.01.2016
comment
У меня есть несколько объектов, которые нужно поразить с помощью raycast, и я получаю их позиции попадания. Было бы наиболее эффективно иметь только скрипт, прикрепленный к камере. Но мне также нужно выделить эти объекты, поэтому я не совсем уверен, куда добавить скрипт. Что произойдет, если у меня есть 30 игровых объектов. Могу ли я отдельно добавить сценарий ко всем из них? - person Silent Ace; 19.01.2016
comment
Не могли бы вы описать, что вы хотите сделать? Если вы хотите отображать эффект при попадании, у вас может быть только один скрипт на камеру. Если вы хотите что-то сделать с объектом при ударе (например, применить к нему силу), вам нужно будет написать еще один скрипт и прикрепить его к каждому объекту. - person Stud; 19.01.2016
comment
У меня есть уличная сетка, которая должна быть точкой появления. Позиция щелчка не имеет большого значения, если она находится на улице. Также на улице есть несколько объектов, таких как кубы, шары и т. д. Наиболее важными вещами являются позиция, на которую нажимают на улице, а также тот же скрипт должен также подсвечивать другие объекты, когда я навожу на них указатель мыши. Позже я планирую добавить другие взаимодействия с объектами, которые по-прежнему остаются теми же, что и их позиция попадания, только на этом объекте. - person Silent Ace; 19.01.2016
comment
Быстро печатаю и смотрю скрипты. Виноват. Координаты важны, когда вы нажимаете на улицу для точки возрождения. - person Silent Ace; 19.01.2016
comment
привет @stud, хотя ваш ответ превосходно объясняет одну концепцию, на самом деле вам следует просто проголосовать, чтобы закрыть этот вопрос. вопрос теперь включает как минимум 7 совершенно отдельных вопросов (каждый из которых невероятно легко найти). OP этот сайт ПРИВЕТСТВУЕТ ваши ВОПРОСЫ, но они должны быть реальными вопросами с одним ответом. Вы можете найти потрясающие учебные пособия для начинающих по такого рода вещам. - person Fattie; 19.01.2016