unity Raycast UI 按钮并调用其点击事件
Unity Raycast UI button and call its on click event
有没有办法从光线投射中调用 onclick 事件?
我将世界比例 canvas 附加到一个对象,该对象具有带按钮的图像。
当我 select 鼠标按钮时,我的事件函数被调用。
但是现在我正在尝试调整代码,这样我就可以避免一起使用鼠标。
[SerializeField]
private Image cursor;
[SerializeField]
private LayerMask uI;
if (Input.GetButtonDown("Fire1"))
{
Ray ray = Camera.main.ScreenPointToRay(cursor.transform.position);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100,uI))
{
Debug.Log(hit.collider);
}
}
这是我用来将光线投射到世界 space canvas 的代码,它有效 returns 图像,但我不确定现在如何调用 onclick 事件,因为我没有使用鼠标而是使用图像
有没有办法调用附加到我光线投射到的图像的 onclick 事件,或者我是否必须重做我的整个脚本而不使用点击事件?
我相信 Button 组件也能满足您的需求。
但是要回答你关于光线投射的问题。
Is there way to call the onclick event from a raycast?
//Example raycast code
//Variables
public RayCastHit _Hit;
public LayerMask _RaycastCollidableLayers; //Set this in inspector, makes you able to say which layers should be collided with and which not.
public float _CheckDistance = 100f;
//Method
void PerformRaycast(){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out _Hit, _CheckDistance + 0.1f, _RaycastCollidableLayers);
if (_Hit.collider == null)
{
Debug.Log("Raycast hit nothing");
return null;
}
GameObject go = _Hit.collider.gameObject;
}
您的光线投射到一个对象并存储对该对象的引用。正如您在我的示例中所见,您可以通过 RaycastHit 获取游戏对象。
当您拥有游戏对象时,您可以通过 GetComponent<>() 访问其上的任何脚本,这意味着您可以说。
GameObject go = _Hit.collider.gameObject;
OnClickScript ocs = go.GetComponent<OnClickScript>();
ocs.OnClick();
如果我误解了您的查询,请告诉我。
当你点击一个游戏对象时,获取其实现 OnPointerClick 事件的组件列表
IPointerClickHandler clickHandler=collider.gameObject.GetComponent<IPointerClickHandler>();
一旦你有了那个引用(它不是空的)你就可以调用
PointerEventData pointerEventData=new PointerEventData(EventSystem.current);
clickHandler.OnPointerClick(pointerEventData)
这应该可以完成工作
有没有办法从光线投射中调用 onclick 事件? 我将世界比例 canvas 附加到一个对象,该对象具有带按钮的图像。 当我 select 鼠标按钮时,我的事件函数被调用。 但是现在我正在尝试调整代码,这样我就可以避免一起使用鼠标。
[SerializeField]
private Image cursor;
[SerializeField]
private LayerMask uI;
if (Input.GetButtonDown("Fire1"))
{
Ray ray = Camera.main.ScreenPointToRay(cursor.transform.position);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100,uI))
{
Debug.Log(hit.collider);
}
}
这是我用来将光线投射到世界 space canvas 的代码,它有效 returns 图像,但我不确定现在如何调用 onclick 事件,因为我没有使用鼠标而是使用图像
有没有办法调用附加到我光线投射到的图像的 onclick 事件,或者我是否必须重做我的整个脚本而不使用点击事件?
我相信 Button 组件也能满足您的需求。
但是要回答你关于光线投射的问题。
Is there way to call the onclick event from a raycast?
//Example raycast code
//Variables
public RayCastHit _Hit;
public LayerMask _RaycastCollidableLayers; //Set this in inspector, makes you able to say which layers should be collided with and which not.
public float _CheckDistance = 100f;
//Method
void PerformRaycast(){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out _Hit, _CheckDistance + 0.1f, _RaycastCollidableLayers);
if (_Hit.collider == null)
{
Debug.Log("Raycast hit nothing");
return null;
}
GameObject go = _Hit.collider.gameObject;
}
您的光线投射到一个对象并存储对该对象的引用。正如您在我的示例中所见,您可以通过 RaycastHit 获取游戏对象。
当您拥有游戏对象时,您可以通过 GetComponent<>() 访问其上的任何脚本,这意味着您可以说。
GameObject go = _Hit.collider.gameObject;
OnClickScript ocs = go.GetComponent<OnClickScript>();
ocs.OnClick();
如果我误解了您的查询,请告诉我。
当你点击一个游戏对象时,获取其实现 OnPointerClick 事件的组件列表
IPointerClickHandler clickHandler=collider.gameObject.GetComponent<IPointerClickHandler>();
一旦你有了那个引用(它不是空的)你就可以调用
PointerEventData pointerEventData=new PointerEventData(EventSystem.current);
clickHandler.OnPointerClick(pointerEventData)
这应该可以完成工作