onmousedown事件()只要求最重要的游戏对象

onmousedown事件()只要求最重要的游戏对象

我有一个BoxCollider2D组件和连接到黑色和红色方框的脚本。每个脚本在OnMouseDown()函数中发生一些事情。问题是如果我点击与黑色框重叠的橙色框的部分,黑色框的OnMouseDown()将被调用,但我只需要调用橙色框函数。

你是如何做到这一点的?

回答:

我不认为OnMouseDown是一个很好的方法。您可以使用2D RayCast来获得最顶级的对撞机。用这种方法你将不得不自己对排序​​层和排序顺序进行说明。

诀窍检查2D单个点到不给光线投射方向与如下所示:

Physics2D.Raycast(touchPostion, Vector2.zero); 

这里是我扔在一起的例子,不考虑使用排序的层,只排序顺序。

using UnityEngine; 

public class RayCastMultiple : MonoBehaviour

{

//Current active camera

public Camera MainCamera;

// Use this for initialization

void Start()

{

if(MainCamera == null)

Debug.LogError("No MainCamera");

}

// Update is called once per frame

void FixedUpdate()

{

if(Input.GetMouseButtonDown(0))

{

var mouseSelection = CheckForObjectUnderMouse();

if(mouseSelection == null)

Debug.Log("nothing selected by mouse");

else

Debug.Log(mouseSelection.gameObject);

}

}

private GameObject CheckForObjectUnderMouse()

{

Vector2 touchPostion = MainCamera.ScreenToWorldPoint(Input.mousePosition);

RaycastHit2D[] allCollidersAtTouchPosition = Physics2D.RaycastAll(touchPostion, Vector2.zero);

SpriteRenderer closest = null; //Cache closest sprite reneder so we can assess sorting order

foreach(RaycastHit2D hit in allCollidersAtTouchPosition)

{

if(closest == null) // if there is no closest assigned, this must be the closest

{

closest = hit.collider.gameObject.GetComponent<SpriteRenderer>();

continue;

}

var hitSprite = hit.collider.gameObject.GetComponent<SpriteRenderer>();

if(hitSprite == null)

continue; //If the object has no sprite go on to the next hitobject

if(hitSprite.sortingOrder > closest.sortingOrder)

closest = hitSprite;

}

return closest != null ? closest.gameObject : null;

}

}

这是非常简单,只是我的回答重复的位置:Game Dev Question

以上是 onmousedown事件()只要求最重要的游戏对象 的全部内容, 来源链接: utcz.com/qa/264054.html

回到顶部