猿问

单独使用 raycast 的激光束

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

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

https://i.stack.imgur.com/rgxk9.gif

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;

                }

            }

        }


杨__羊羊
浏览 153回答 1
1回答

慕姐8265434

问题是,由于这个脚本附加到你的两个游戏对象,有两条光线投射到鼠标位置(每个脚本中的一条)。因为您只是希望看到 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)){&nbsp; &nbsp; // add a tag to all objects with the laser script&nbsp; &nbsp; if (rh.collider.gameObject.tag == "hasLaser") //verify object has laser script via tag&nbsp; &nbsp; &nbsp; &nbsp; rh.collider.GetComponent<laser>().activateLaser(); // call public method in collider script}然后立方体将具有带有公共方法的激光脚本:public void activateLaser(){&nbsp; &nbsp; lr.enabled = true;}
随时随地看视频慕课网APP
我要回答