Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单独使用光线投射的激光束_C#_Unity3d_Raycasting - Fatal编程技术网

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

C# 单独使用光线投射的激光束,c#,unity3d,raycasting,C#,Unity3d,Raycasting,我生成具有激光束属性的对象。当我单击其中一个(特定对象)时,我希望它只显示其激光束,而不显示其他光束 我怎样才能预防它?我有一个静态的GameObject变量(touch\u detect.clickedObject),通过它我可以确定单击了哪个对象 使用UnityEngine; 使用系统集合; 公共级激光器:单一行为 { 专用线路; private bool clicked=false; 雷卡斯特; //用于初始化 void Start() { lr=GetComponent(); } //

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

我怎样才能预防它?我有一个静态的
GameObject
变量(
touch\u detect.clickedObject
),通过它我可以确定单击了哪个对象

使用UnityEngine;
使用系统集合;
公共级激光器:单一行为
{
专用线路;
private bool clicked=false;
雷卡斯特;
//用于初始化
void Start()
{
lr=GetComponent();
}
//每帧调用一次更新
无效更新()
{
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
if(Input.GetMouseButtonDown(0))
{
if(物理学.光线投射(光线,右外,数学无限))
{
if(rh.collider.gameObject.name==touch\u detect.clickedObject.name)
{
Log(rh.collider.gameObject.name+“单击”);
Log(“static object name”+touch_detect.clickedObject.name+“clicked”);
单击=真;
lr.enabled=true;
}
}
}
if(Input.GetMouseButtonUp(0))
{
if(物理学.光线投射(光线,右外,数学无限))
{
if(rh.collider.gameObject.name==touch\u detect.clickedObject.name)
{
Log(rh.collider.gameObject.name+“单击”);
Log(“static object name”+touch_detect.clickedObject.name+“clicked”);
单击=假;
lr.enabled=false;
}
}
}
如果(单击)
{
lr.SetPosition(0,transform.position+新向量3(0,0,0));
雷卡斯特击中;
if(Physics.Raycast(transform.position+newvector3(0,0,0),-transform.up,out-hit))
{
if(命中对撞机)
{
lr.设定位置(1,命中点);
}
}
else lr.设置位置(1,-transform.up*5000);
}
}
}

问题在于,由于此脚本连接到两个游戏对象,因此在鼠标位置有两条光线投射(每个脚本一条)。因为您只是希望看到光线碰撞器与静态对象匹配,所以无论您单击哪个脚本,此语句对这两个脚本都适用:

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
}

为了清楚起见-在你的debug.log中,即使你只点击了一个,你是否会同时获得两个游戏对象的名称?@ryeMoss是的,我可以。请浏览->非常感谢您的帮助当我将if语句更改为
if(rh.collider.gameObject.name==gameObject.name)
时,激光束效果没有显示。我的意思是不满足条件。脚本是否与碰撞器连接到同一对象?如果在if语句之前执行Debug.Log(gameObject.name),您会得到什么?它会附加到多维数据集资产下的Laser。调试打印激光。你能看一下->看起来激光脚本在对象的子对象上。也许可以试试
(rh.collider.gameObject.name==transform.parent.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;
}