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