Unity3d 如何检测单击了哪个游戏对象
我想知道在2D项目上用鼠标点击哪个游戏对象 我曾经Unity3d 如何检测单击了哪个游戏对象,unity3d,gameobject,Unity3d,Gameobject,我想知道在2D项目上用鼠标点击哪个游戏对象 我曾经 void Update() { if (Input.GetMouseButtonDown(0)) { clickTime = DateTime.Now; mousePosition = Input.mousePosition; Ray ray = Camera.main.ScreenPointToRay(Input.mousePo
void Update()
{
if (Input.GetMouseButtonDown(0))
{
clickTime = DateTime.Now;
mousePosition = Input.mousePosition;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);
if (hit != null && hit.collider != null)
{
}
}
}
但在第二种情况下,它永远不会去
编辑:我正在处理一个脚本,并使用gameobject.FindGameObjectWithTag()从那里访问所有gameobject,据我所知,这就是为什么主脚本中的碰撞器代码没有触发。
我添加了一个截图,我的代码在GameObject中
使用光线投射时,应在精灵上设置一个碰撞器
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);
if (hit.collider != null) {
Debug.Log ("CLICKED " + hit.collider.name);
}
}
}
这在unity 5.6中对我有效
注意:“LeftClick”只是一个“GameObject”而已,我这样称呼它是为了更好地识别:)
已编辑 我为UI按钮测试了这个方法,但它不起作用;所以我用了不同的方法。对于UI按钮,您可以添加如下侦听器:
GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {
});
public class MyObject : MonoBehaviour, IPointerDownHandler
{
private void Start()
{
AddPhysics2DRaycaster();
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
private void AddPhysics2DRaycaster()
{
Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
}
}
GameObject.Find(“YourButtonName”).GetComponent().onClick.AddListener(()=>{
});
使用光线投射时,应在精灵上设置一个碰撞器
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);
if (hit.collider != null) {
Debug.Log ("CLICKED " + hit.collider.name);
}
}
}
这在unity 5.6中对我有效
注意:“LeftClick”只是一个“GameObject”而已,我这样称呼它是为了更好地识别:)
已编辑 我为UI按钮测试了这个方法,但它不起作用;所以我用了不同的方法。对于UI按钮,您可以添加如下侦听器:
GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {
});
public class MyObject : MonoBehaviour, IPointerDownHandler
{
private void Start()
{
AddPhysics2DRaycaster();
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
private void AddPhysics2DRaycaster()
{
Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
}
}
GameObject.Find(“YourButtonName”).GetComponent().onClick.AddListener(()=>{
});
考虑使用OnMouseOver()
方法():
此方法仅适用于连接到gameobject的碰撞器,就像Raycast一样
因为没有多个Update()。如果你有几十个或几百个可点击的对象,一定要记住这一点
(尽管有报道称此方法不适用于多个摄像头,其中一个摄像头是ortographic one,在这种情况下,您不能选择此方法。)考虑使用OnMouseOver()
方法():
此方法仅适用于连接到gameobject的碰撞器,就像Raycast一样
因为没有多个Update()。如果你有几十个或几百个可点击的对象,一定要记住这一点
(尽管有报道称此方法不适用于多个摄像头,其中一个是ortographic one,在这种情况下,此方法不适用于您。)此方法在桌面和移动应用程序上都非常有效:
向要检测其单击事件的每个对象添加碰撞器组件
将脚本添加到项目中(将其命名为MyObject.cs)。
此脚本必须实现IPInterDownHandler接口及其方法。此脚本必须将Physics2DRaycaster添加到相机。这个脚本的整体可能是这样的:
GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {
});
public class MyObject : MonoBehaviour, IPointerDownHandler
{
private void Start()
{
AddPhysics2DRaycaster();
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
private void AddPhysics2DRaycaster()
{
Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
}
}
公共类MyObject:MonoBehavior,IPInterDownHandler
{
私有void Start()
{
AddPhysics2DRaycaster();
}
POINTERDOWN上的公共无效(PointerEventData事件数据)
{
Log(“单击:”+eventData.pointercurrentrycast.gameObject.name);
}
私有void AddPhysics2DRaycaster()
{
Physics2DRaycaster physicraycaster=FindObjectOfType();
如果(physicsRaycaster==null)
{
Camera.main.gameObject.AddComponent();
}
}
}
将MyObject.cs脚本添加到要检测的每个对象,然后单击它。之后,当您单击这些对象时,它们的名称将显示在控制台上
确保项目层次结构中存在EventSystem。如果没有,请右键单击添加
p.S.MyObject.cs脚本现在具有IPInterDownHandler。这会在您触摸对象时立即检测单击。您还可以出于不同的目的使用IPInterUpHandler和IDragHandler
很抱歉我的英语不好。此方法在桌面和移动应用程序上都非常有效:
向要检测其单击事件的每个对象添加碰撞器组件
将脚本添加到项目中(将其命名为MyObject.cs)。
此脚本必须实现IPInterDownHandler接口及其方法。此脚本必须将Physics2DRaycaster添加到相机。这个脚本的整体可能是这样的:
GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {
});
public class MyObject : MonoBehaviour, IPointerDownHandler
{
private void Start()
{
AddPhysics2DRaycaster();
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
private void AddPhysics2DRaycaster()
{
Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
}
}
公共类MyObject:MonoBehavior,IPInterDownHandler
{
私有void Start()
{
AddPhysics2DRaycaster();
}
POINTERDOWN上的公共无效(PointerEventData事件数据)
{
Log(“单击:”+eventData.pointercurrentrycast.gameObject.name);
}
私有void AddPhysics2DRaycaster()
{
Physics2DRaycaster physicraycaster=FindObjectOfType();
如果(physicsRaycaster==null)
{
Camera.main.gameObject.AddComponent();
}
}
}
将MyObject.cs脚本添加到要检测的每个对象,然后单击它。之后,当您单击这些对象时,它们的名称将显示在控制台上
确保项目层次结构中存在EventSystem。如果没有,请右键单击添加
p.S.MyObject.cs脚本现在具有IPInterDownHandler。这会在您触摸对象时立即检测单击。您还可以出于不同的目的使用IPInterUpHandler和IDragHandler
很抱歉我的英语不好。因此,请使用调试工具绘制光线,并查看光线线的位置going@BugFinder是的。无论是按钮还是图像,都无法从HIT获取有关已单击游戏对象的任何信息。是否在游戏对象上设置了碰撞器