Unity有一个新的输入系统,旧的OnMouseDown() {}
不再起作用。
在migration guide中,他们提到将其替换为Mouse.current.leftButton.isPressed
。
在其他论坛帖子中,他们提到使用InputAction
。
问题在于这些选项可以检测场景中任意位置的鼠标点击,而不仅仅是在对象上
public InputAction clickAction;
void Awake() {
clickAction.performed += ctx => OnClickedTest();
}
void OnClickedTest(){
Debug.Log("You clicked anywhere on the screen!");
}
// this doesn't work anymore in the new system
void OnMouseDown(){
Debug.Log("You clicked on this specific object!");
}
如何使用Unity中的新输入系统检测特定游戏对象上的鼠标单击 ?
答案 0 :(得分:2)
在您的场景中使用此代码:
using UnityEngine.InputSystem;
using UnityEngine;
public class MouseClicks : MonoBehaviour
{
[SerializeField]
private Camera gameCamera;
private InputAction click;
void Awake()
{
click = new InputAction(binding: "<Mouse>/leftButton");
click.performed += ctx => {
RaycastHit hit;
Vector3 coor = Mouse.current.position.ReadValue();
if (Physics.Raycast(gameCamera.ScreenPointToRay(coor), out hit))
{
hit.collider.GetComponent<IClickable>()?.OnClick();
}
};
click.Enable();
}
}
您可以向所有想要响应点击的游戏对象添加 IClickable
接口:
public interface IClickable
{
void OnClick();
}
和
using UnityEngine;
public class ClickableObject : MonoBehaviour, IClickable
{
public void OnClick()
{
Debug.Log("somebody clicked me");
}
}
答案 1 :(得分:1)
确保场景中有一个EventSystem
和一个InputSystemUIInputModule
且您的PhysicsRaycaster
上有一个Physics2DRaycaster
或Camera
,然后使用{ {1}}与对象或其子对象相撞的接口:
IPointerClickHandler