单独使用光线投射的激光束

Laser beam using raycast individually

我生成了带有激光束的物体 属性。当我点击其中一个(特定对象)时,我希望它只显示它的激光束而不是其他的。

我该如何预防?我有一个静态 GameObject 变量 (touch_detect.clickedObject),通过它我可以确定单击了哪个对象。

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);
        }
    }
}

问题在于,由于此脚本附加到您的两个游戏对象,因此在鼠标位置投射了两条光线(每个脚本一条)。因为您只是想看看 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 方法的激光脚本:

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