Как переместить выбранный GameObject в локацию с помощью мыши - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужна помощь с использованием raycast, чтобы выбрать объект и переместить его в другое место, где игрок щелкает левой кнопкой мыши. Пока у меня все хорошо, но я не могу заставить Цилиндр, который выбран, двигаться. Вот код, который у меня есть:

public class ClicknDrag : MonoBehaviour {

private GameObject selected;
private bool unselected = true;

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

    if (Physics.Raycast(ray, out hit) && Input.GetMouseButtonDown(0) && hit.transform.tag == "Cylinder" && unselected == true)
    {
        selected = hit.transform.gameObject;
        unselected = false;
    }

    if (Physics.Raycast(ray, out hit) && unselected == false && Input.GetMouseButtonDown(0))
    {
        selected.transform.position = hit.transform.position;
        unselected = true;
    }
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вы должны сделать это Physics.Raycast только один раз ... это довольно дорого! Также проверка для Input.GetMouseButtonDown является избыточной. И сохраните результат Camera.main, что также довольно дорого (на самом деле, под капотом используется нечто похожее на GameObjevt.FindWithTag("MainCamera"))

Также обратите внимание: GetMouseButtonDown(0) возвращает true только один раз вкадр, когда кнопка нажата в первый раз. Позже для перемещения вы, скорее всего, захотите использовать GetMouseButton(0), то есть true , пока кнопка остается нажатой.

И, наконец, если вы хотите плавное движение к точной позиции ударавместо позиции попадания объектов вы можете использовать hit.point вместо hit.transform.position

Флаг unselected отчасти избыточен: вы можете напрямую использовать if(selected) и позже сбросить его на selected = null

Так что-то вроде

[SerializeField] private Camera _camera;

private void Awake ()
{
    if(!_camera) _camera = Camera.main;
}

private void Update()
{
    Ray ray = _camera.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit) && hit.gameObject.CompareTag("Cylinder"))
    {
        // First click -> select object
        if(Input.GetMouseButtonDown(0) && !selected)
        {
            selected = hit.transform.gameObject;
        }
        // button stays pressed > move object
        else if (selected && Input.GetMouseButton(0))
        {
            selected.transform.position = hit.point;
        }
        // Second click release object
        else if(selected && Input.GetMouseButtonDown(0))
        {
            selected = null;
        }
    }
    // ToDo: What if the Raycast doesn't hit? Then you can't release object?
}
0 голосов
/ 04 ноября 2019

Если вы хотите, чтобы позиция попадания в Raycast, вам нужно использовать hit.point вместо hit.transform.position. hit.TRANSFORM.position вернет позицию попадания объекта.

Кроме того, в вашем случае, даже после выделения, вы по-прежнему ударяетесь по цилиндру с помощью радиопередачи, так что вы можете отключить коллайдер выбранного объекта, когда он выбран. Таким образом, он игнорируется радиопередачей, которая поражает следующий найденный объект (например, пол).

https://docs.unity3d.com/ScriptReference/RaycastHit.html https://docs.unity3d.com/ScriptReference/RaycastHit-point.html https://docs.unity3d.com/ScriptReference/RaycastHit-transform.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...