gpt4 book ai didi

c# - 单独使用光线转换的激光束

转载 作者:行者123 更新时间:2023-11-30 22:56:43 25 4
gpt4 key购买 nike

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

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

enter image description here

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;
}

关于c# - 单独使用光线转换的激光束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54188907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com