我已经研究了几个小时,我正在尝试做到这一点,以便在拍摄光线投射并且它与带有特定标签的对象碰撞时,启用十字准线,如果没有击中带有标签的对象,它消失了。这似乎比我预期的要困难得多,而且我得到了奇怪的结果。
如果我先单击,十字准线就会出现,或者它确实有效,并且十字准线不会再次禁用。这是对象交互脚本的代码。请告诉我我做错了什么,谢谢!
public Collider clickObject;
public Animator m_Animator;
[SerializeField] public GameObject Crosshair;
private Ray _ray;
private RaycastHit _hit;
private bool _opened;
void Start()
{
m_Animator = gameObject.GetComponent<Animator>();
Crosshair.SetActive(false);
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
Click();
}
}
private void Click()
{
if (!clickObject) return;
if (!m_Animator) return;
_ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(_ray, out _hit))
{
if (_hit.collider.CompareTag("InteractObject"))
{
Crosshair.SetActive(true);
}
else
{
Crosshair.SetActive(false);
}
if (_hit.collider == clickObject)
{
if (_opened)
{
m_Animator.SetBool("isOpen", true);
_opened = false;
}
else
{
m_Animator.SetBool("isOpen", false);
_opened = true;
}
}
}
}
}
嗯,看来你只在
Click()
函数中进行光线投射和更新十字准线,只有在按下鼠标左键时才会调用该函数:
private void Update()
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
Click();
}
}
我认为如果您希望十字准线在没有任何用户输入的情况下出现和消失,您应该在每一帧都调用它。