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

时间:2019-01-14 20:45:19

标签: c# unity3d raycasting

我生成具有激光束属性的对象。当我单击其中一个(特定对象)时,我希望它仅显示其激光束,而不显示其他激光束。

如何预防?我有一个静态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 :(得分:2)

问题在于,由于此脚本已附加到两个游戏对象上,因此在鼠标位置投射了两条光线(每个脚本中都有一条光线)。因为您只是想查看raycollider与静态对象匹配,所以无论您单击哪个,这句话对于两个脚本都是正确的:

MyRouteComponent

要立即修复,您应该将上面的语句更改为类似这样的内容,以检查光线是否与脚本附加到的同一游戏对象相交:

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
}