为了账号安全,请及时绑定邮箱和手机立即绑定

单独使用 raycast 的激光束

单独使用 raycast 的激光束

C#
杨__羊羊 2022-07-23 09:14:56
我生成具有激光束属性的对象。当我单击其中一个(特定对象)时,我希望它只显示其激光束而不显示其他激光束。我该如何预防?我有一个静态GameObject变量 ( touch_detect.clickedObject),我可以通过它确定单击了哪个对象。https://i.stack.imgur.com/rgxk9.gifusing 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;                }            }        }
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

问题是,由于这个脚本附加到你的两个游戏对象,有两条光线投射到鼠标位置(每个脚本中的一条)。因为您只是希望看到 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;

}


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号