我生成具有激光束属性的对象。当我单击其中一个(特定对象)时,我希望它仅显示其激光束,而不显示其他激光束。
如何预防?我有一个静态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);
}
}
}
答案 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
}