单独使用光线投射的激光束
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;
}
我生成了带有激光束的物体 属性。当我点击其中一个(特定对象)时,我希望它只显示它的激光束而不是其他的。
我该如何预防?我有一个静态 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;
}