Unity3D on Click 忽略所有对撞机接受特定层上的对撞机
Unity3D on Click ignore all colliders accept the one on specific layer
我正在尝试制作一个简单的拖放游戏,其中有可以拾取的对象,如果留在屏幕高度的 1/2 以上,那么它会掉落到高处,如果你放手,它们就会掉落他们走到屏幕的一半以下,他们将留在那里。这是一款 2D 游戏,给人一种深度的错觉。
这是我想做的东西的图片
目前我可以从底部移动蓝色桶。如果我将桶举到 PolygonCollider 上方,它会掉落到 Edge Collider 4。当我把它放在 Polygone Collider 的某个地方时,我将物体设置为动能,这样它就不会掉落,它会给人一种你把它放在地上的错觉。
我的问题是我用来检测点击的桶的碰撞器将与多边形碰撞器重叠。有时物体在顶部,有时是多边形碰撞器,如果多边形碰撞器在顶部,我无法抬起物体。
有没有一种方法可以在单击时忽略除我用来识别可以拾取的对象的 PickebleObject 层之外的所有层?
编辑:这是我的 ObjectController 脚本
public LayerMask interactLayers;
public LayerMask ignoredColliders;
public Action<GameObject> OnDrag;
public Action<GameObject> OnLand;
private Rigidbody2D objRB2D;
private Vector2 MousePos;
private bool IsOnFloor = false;
private void Start()
{
transform.position = new Vector3 (transform.position.x, transform.position.y, transform.position.z - 0.1f);
ignoredColliders = ~ignoredColliders;
objRB2D = transform.GetComponent<Rigidbody2D>();
objRB2D.gravityScale = GameManager.Instance.GlobalFallingSpeed;
}
private void OnMouseDown()
{
objRB2D.isKinematic = true;
}
private void OnMouseDrag()
{
MousePos = Camera.main.ScreenToWorldPoint (new Vector2 (Input.mousePosition.x, Input.mousePosition.y ));
//Limit So elements cant be moved out of the scene.
float HorizontalClamp = Mathf.Clamp (MousePos.x, CameraControll.Instance.CamTopLeft.x, CameraControll.Instance.CamBottomRight.x);
transform.position = new Vector3 (HorizontalClamp, MousePos.y, transform.position.z);
//Check what is under the mouse.
RaycastHit2D IsHoveringOver = Physics2D.Raycast(transform.position, transform.TransformDirection (Vector3.down), 0 , ignoredColliders);
if (IsHoveringOver.transform != null) {
if (GameManager.Instance.GroundColliders.value == LayerMask.GetMask (LayerMask.LayerToName (IsHoveringOver.transform.gameObject.layer)))
IsOnFloor = true;
}else IsOnFloor = false;
RaycastHit2D HitColider = Physics2D.Raycast(transform.position, transform.TransformDirection (Vector3.down), Mathf.Infinity , ~ignoredColliders);
#if UNITY_EDITOR
if (HitColider.collider != null) {
Debug.DrawLine( HitColider.point, transform.position, Color.magenta);
}
#endif
}
void OnMouseUp()
{
if (!IsOnFloor) objRB2D.isKinematic = false;
}
void OnCollisionEnter2D(Collision2D coll) {
//Debug.Log(coll.gameObject.transform.name);
}
如果您在拖放逻辑中使用物理光线投射,请查看此 documentation,您会在其中找到有关 LayerMask 和光线投射的主题。
我通过使用 Z 轴定义哪个碰撞器位于顶部来解决问题。
我正在尝试制作一个简单的拖放游戏,其中有可以拾取的对象,如果留在屏幕高度的 1/2 以上,那么它会掉落到高处,如果你放手,它们就会掉落他们走到屏幕的一半以下,他们将留在那里。这是一款 2D 游戏,给人一种深度的错觉。
这是我想做的东西的图片
目前我可以从底部移动蓝色桶。如果我将桶举到 PolygonCollider 上方,它会掉落到 Edge Collider 4。当我把它放在 Polygone Collider 的某个地方时,我将物体设置为动能,这样它就不会掉落,它会给人一种你把它放在地上的错觉。
我的问题是我用来检测点击的桶的碰撞器将与多边形碰撞器重叠。有时物体在顶部,有时是多边形碰撞器,如果多边形碰撞器在顶部,我无法抬起物体。 有没有一种方法可以在单击时忽略除我用来识别可以拾取的对象的 PickebleObject 层之外的所有层?
编辑:这是我的 ObjectController 脚本
public LayerMask interactLayers;
public LayerMask ignoredColliders;
public Action<GameObject> OnDrag;
public Action<GameObject> OnLand;
private Rigidbody2D objRB2D;
private Vector2 MousePos;
private bool IsOnFloor = false;
private void Start()
{
transform.position = new Vector3 (transform.position.x, transform.position.y, transform.position.z - 0.1f);
ignoredColliders = ~ignoredColliders;
objRB2D = transform.GetComponent<Rigidbody2D>();
objRB2D.gravityScale = GameManager.Instance.GlobalFallingSpeed;
}
private void OnMouseDown()
{
objRB2D.isKinematic = true;
}
private void OnMouseDrag()
{
MousePos = Camera.main.ScreenToWorldPoint (new Vector2 (Input.mousePosition.x, Input.mousePosition.y ));
//Limit So elements cant be moved out of the scene.
float HorizontalClamp = Mathf.Clamp (MousePos.x, CameraControll.Instance.CamTopLeft.x, CameraControll.Instance.CamBottomRight.x);
transform.position = new Vector3 (HorizontalClamp, MousePos.y, transform.position.z);
//Check what is under the mouse.
RaycastHit2D IsHoveringOver = Physics2D.Raycast(transform.position, transform.TransformDirection (Vector3.down), 0 , ignoredColliders);
if (IsHoveringOver.transform != null) {
if (GameManager.Instance.GroundColliders.value == LayerMask.GetMask (LayerMask.LayerToName (IsHoveringOver.transform.gameObject.layer)))
IsOnFloor = true;
}else IsOnFloor = false;
RaycastHit2D HitColider = Physics2D.Raycast(transform.position, transform.TransformDirection (Vector3.down), Mathf.Infinity , ~ignoredColliders);
#if UNITY_EDITOR
if (HitColider.collider != null) {
Debug.DrawLine( HitColider.point, transform.position, Color.magenta);
}
#endif
}
void OnMouseUp()
{
if (!IsOnFloor) objRB2D.isKinematic = false;
}
void OnCollisionEnter2D(Collision2D coll) {
//Debug.Log(coll.gameObject.transform.name);
}
如果您在拖放逻辑中使用物理光线投射,请查看此 documentation,您会在其中找到有关 LayerMask 和光线投射的主题。
我通过使用 Z 轴定义哪个碰撞器位于顶部来解决问题。