Лазерный луч с использованием raycast индивидуально - PullRequest
0 голосов
/ 14 января 2019

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

Как я могу предотвратить это? У меня есть статическая переменная GameObject (touch_detect.clickedObject), по которой я могу определить, на каком объекте щелкнули.

enter image description here

using UnityEngine;
using System.Collections;

public class Laser : MonoBehaviour
{

    private LineRenderer lr;
    private bool clicked = false;
    RaycastHit rh;

    // Use this for initialization
    void Start()
    {
        lr = GetComponent<LineRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Input.GetMouseButtonDown(0))
        {
            if (Physics.Raycast(ray, out rh, Mathf.Infinity))
            {
                if (rh.collider.gameObject.name == touch_detect.clickedObject.name)
                {
                    Debug.Log(rh.collider.gameObject.name + " clicked.");
                    Debug.Log("static object name" + touch_detect.clickedObject.name + " clicked.");
                    clicked = true;
                    lr.enabled = true;
                }
            }
        }

        if (Input.GetMouseButtonUp(0))
        {
            if (Physics.Raycast(ray, out rh, Mathf.Infinity))
            {
                if (rh.collider.gameObject.name == touch_detect.clickedObject.name)
                {
                    Debug.Log(rh.collider.gameObject.name + " clicked.");
                    Debug.Log("static object name" + touch_detect.clickedObject.name + " clicked.");
                    clicked = false;
                    lr.enabled = false;
                }
            }
        }

        if (clicked)
        {
            lr.SetPosition(0, transform.position + new Vector3(0, 0, 0));
            RaycastHit hit;

            if (Physics.Raycast(transform.position + new Vector3(0, 0, 0), -transform.up, out hit))
            {
                if (hit.collider)
                {
                    lr.SetPosition(1, hit.point);
                }
            }
            else lr.SetPosition(1, -transform.up * 5000);
        }
    }
}

1 Ответ

0 голосов
/ 15 января 2019

Проблема в том, что, поскольку этот скрипт прикреплен к обоим игровым объектам, в позиции мыши наведено два луча (по одному от каждого скрипта). Поскольку вы просто видите, что raycollider соответствует статическому объекту, это утверждение верно для обоих сценариев, независимо от того, на каком вы нажали:

if (rh.collider.gameObject.name == touch_detect.clickedObject.name) // always true

Чтобы получить немедленное исправление, вы должны изменить приведенное выше утверждение на что-то вроде этого, чтобы проверить, что луч пересекает тот же игровой объект, к которому прикреплен скрипт:

if (rh.collider.gameObject.name == gameObject.name)

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

на главном объекте у вас будет:

if (Physics.Raycast(ray, out rh, Mathf.Infinity))
{
    // add a tag to all objects with the laser script
    if (rh.collider.gameObject.tag == "hasLaser") //verify object has laser script via tag
        rh.collider.GetComponent<laser>().activateLaser(); // call public method in collider script
}

и тогда у куба будет лазерный скрипт с открытым методом:

public void activateLaser()
{
    lr.enabled = true;
}
...