// Copyright (c) Pixel Crushers. All rights reserved.
using UnityEngine;
namespace PixelCrushers
{
#if USE_PHYSICS2D
///
/// Provides more routines for Physics2D.
///
public static class MorePhysics2D
{
///
/// Wrapper for Physics2D.queriesStartInColliders.
///
public static bool queriesStartInColliders
{
get
{
return Physics2D.queriesStartInColliders;
}
set
{
Physics2D.queriesStartInColliders = value;
}
}
///
/// Size of the preallocated array for nonallocating raycasts.
///
public static int maxRaycastResults
{
get
{
return raycastResults.Length;
}
set
{
if (value != raycastResults.Length)
{
raycastResults = new RaycastHit2D[value];
}
}
}
private static RaycastHit2D[] raycastResults = new RaycastHit2D[20];
private static ContactFilter2D contactFilter = new ContactFilter2D();
///
/// Runs a nonallocating linecast, ignoring the source.
///
public static GameObject Raycast2DWithoutSelf(Transform source, Transform destination, LayerMask layerMask)
{
var start2D = new Vector2(source.position.x, source.position.y);
var end2D = new Vector2(destination.position.x, destination.position.y);
var originalRaycastsStartInColliders = MorePhysics2D.queriesStartInColliders;
MorePhysics2D.queriesStartInColliders = false;
contactFilter.layerMask = layerMask;
var numResults = Physics2D.Linecast(start2D, end2D, contactFilter, raycastResults);
MorePhysics2D.queriesStartInColliders = originalRaycastsStartInColliders;
for (int i = 0; i < numResults; i++)
{
var result = raycastResults[i];
if (result.transform == source) continue; // Skip source.
return result.collider.gameObject; // Array is in distance order, so return first non-source.
}
return null;
}
}
#else
///
/// Provides more routines for Physics2D.
///
public static class MorePhysics2D
{
///
/// Stub wrapper for Physics2D.queriesStartInColliders.
///
public static bool queriesStartInColliders
{
get { return false; }
set { }
}
///
/// Stub for size of the preallocated array for nonallocating raycasts.
///
public static int maxRaycastResults
{
get { return 0; }
set { }
}
///
/// Stub for running a nonallocating linecast, ignoring the source.
///
public static GameObject Raycast2DWithoutSelf(Transform source, Transform destination, LayerMask layerMask)
{
LogUsePhysics2DWarning();
return null;
}
public static void LogUsePhysics2DWarning()
{
if (Debug.isDebugBuild) Debug.LogWarning("To enable Physics2D support for a Pixel Crushers asset, add the Scripting Define Symbol 'USE_PHYSICS2D'.");
}
}
#endif
}