more functions for IsoPhysics

This commit is contained in:
2016-11-27 11:18:17 +07:00
parent 0746be1275
commit b3922d5cfe
3 changed files with 289 additions and 91 deletions

View File

@@ -13,7 +13,7 @@ namespace IsoTools.Physics {
IsoFakeCollider _fakeCollider;
Collider _realCollider = null;
protected Collider realCollider {
public Collider realCollider {
get { return _realCollider; }
}

View File

@@ -4,117 +4,313 @@ using IsoTools.Physics.Internal;
namespace IsoTools.Physics {
public static class IsoPhysics {
//
// Ignore collision helpers
//
public static bool GetIgnoreLayerCollision(int layer1, int layer2) {
return UnityEngine.Physics.GetIgnoreLayerCollision(layer1, layer2);
}
public static void IgnoreCollision(IsoCollider iso_collider1, IsoCollider iso_collider2,
bool ignore = true)
{
UnityEngine.Physics.IgnoreCollision(
iso_collider1.realCollider, iso_collider2.realCollider, ignore);
}
public static void IgnoreLayerCollision(int layer1, int layer2,
bool ignore = true)
{
UnityEngine.Physics.IgnoreLayerCollision(layer1, layer2, ignore);
}
//
// Raycast
//
public static bool Raycast(Ray ray, out IsoRaycastHit iso_hit_info) {
return Raycast(ray, out iso_hit_info,
Mathf.Infinity, UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction.UseGlobal);
}
public static bool Raycast(Ray ray, out IsoRaycastHit iso_hit_info,
float max_distance)
{
return Raycast(ray, out iso_hit_info,
max_distance, UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction.UseGlobal);
}
public static bool Raycast(Ray ray, out IsoRaycastHit iso_hit_info,
float max_distance, int layer_mask)
{
return Raycast(ray, out iso_hit_info,
max_distance, layer_mask,
QueryTriggerInteraction.UseGlobal);
}
public static bool Raycast(Ray ray, out IsoRaycastHit iso_hit_info,
float max_distance, int layer_mask,
QueryTriggerInteraction query_trigger_interaction)
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_info = new RaycastHit();
var result = UnityEngine.Physics.Raycast(ray, out hit_info,
max_distance, layer_mask, query_trigger_interaction);
max_distance,
layer_mask,
query_trigger_interaction);
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
//
// RaycastAll
//
public static IsoRaycastHit[] RaycastAll(Ray ray) {
return RaycastAll(ray,
Mathf.Infinity, UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction.UseGlobal);
}
public static IsoRaycastHit[] RaycastAll(Ray ray,
float max_distance)
{
return RaycastAll(ray,
max_distance, UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction.UseGlobal);
}
public static IsoRaycastHit[] RaycastAll(Ray ray,
float max_distance, int layer_mask)
{
return RaycastAll(ray,
max_distance, layer_mask,
QueryTriggerInteraction.UseGlobal);
}
public static IsoRaycastHit[] RaycastAll(Ray ray,
float max_distance, int layer_mask,
QueryTriggerInteraction query_trigger_interaction)
{
var hits_info = UnityEngine.Physics.RaycastAll(ray,
max_distance, layer_mask, query_trigger_interaction);
return IsoPhysicsUtils.IsoConvertRaycastHits(hits_info);
}
//
// RaycastNonAlloc
//
public static int RaycastNonAlloc(Ray ray, IsoRaycastHit[] results) {
return RaycastNonAlloc(ray, results,
Mathf.Infinity, UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction.UseGlobal);
}
public static int RaycastNonAlloc(Ray ray, IsoRaycastHit[] results,
float max_distance)
{
return RaycastNonAlloc(ray, results,
max_distance, UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction.UseGlobal);
}
public static int RaycastNonAlloc(Ray ray, IsoRaycastHit[] results,
float max_distance, int layer_mask)
{
return RaycastNonAlloc(ray, results,
max_distance, layer_mask,
QueryTriggerInteraction.UseGlobal);
}
static RaycastHit[] _raycastNonAllocBuffer = new RaycastHit[128];
public static int RaycastNonAlloc(Ray ray, IsoRaycastHit[] results,
float max_distance, int layer_mask,
QueryTriggerInteraction query_trigger_interaction)
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_count = UnityEngine.Physics.RaycastNonAlloc(ray, _raycastNonAllocBuffer,
max_distance, layer_mask, query_trigger_interaction);
max_distance,
layer_mask,
query_trigger_interaction);
return RaycastBufferToIsoRaycastHits(hit_count, results);
}
//
// Linecast
//
public static bool Linecast(
Vector3 start, Vector3 end, out IsoRaycastHit iso_hit_info,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_info = new RaycastHit();
var result = UnityEngine.Physics.Linecast(start, end, out hit_info,
layer_mask,
query_trigger_interaction);
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
//
// CheckBox
//
public static bool CheckBox(
Vector3 center, Vector3 half_extents,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
return UnityEngine.Physics.CheckBox(
center, half_extents,
Quaternion.identity,
layer_mask,
query_trigger_interaction);
}
//
// CheckCapsule
//
public static bool CheckCapsule(
Vector3 start, Vector3 end, float radius,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
return UnityEngine.Physics.CheckCapsule(
start, end, radius,
layer_mask,
query_trigger_interaction);
}
//
// CheckSphere
//
public static bool CheckSphere(
Vector3 position, float radius,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
return UnityEngine.Physics.CheckSphere(
position, radius,
layer_mask,
query_trigger_interaction);
}
//
// BoxCast
//
public static bool BoxCast(
Vector3 center, Vector3 half_extents, Vector3 direction, out IsoRaycastHit iso_hit_info,
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_info = new RaycastHit();
var result = UnityEngine.Physics.BoxCast(
center, half_extents, direction, out hit_info,
Quaternion.identity,
max_distance,
layer_mask,
query_trigger_interaction);
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
//
// BoxCastNonAlloc
//
public static int BoxCastNonAlloc(
Vector3 center, Vector3 half_extents, Vector3 direction, IsoRaycastHit[] results,
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_count = UnityEngine.Physics.BoxCastNonAlloc(
center, half_extents, direction, _raycastNonAllocBuffer,
Quaternion.identity,
max_distance,
layer_mask,
query_trigger_interaction);
return RaycastBufferToIsoRaycastHits(hit_count, results);
}
//
// CapsuleCast
//
public static bool CapsuleCast(
Vector3 point1, Vector3 point2, float radius, Vector3 direction, out IsoRaycastHit iso_hit_info,
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_info = new RaycastHit();
var result = UnityEngine.Physics.CapsuleCast(
point1, point2, radius, direction, out hit_info,
max_distance,
layer_mask,
query_trigger_interaction);
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
//
// CapsuleCastNonAlloc
//
public static int CapsuleCastNonAlloc(
Vector3 point1, Vector3 point2, float radius, Vector3 direction, IsoRaycastHit[] results,
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_count = UnityEngine.Physics.CapsuleCastNonAlloc(
point1, point2, radius, direction, _raycastNonAllocBuffer,
max_distance,
layer_mask,
query_trigger_interaction);
return RaycastBufferToIsoRaycastHits(hit_count, results);
}
//
// SphereCast
//
public static bool SphereCast(
Vector3 origin, float radius, Vector3 direction, out IsoRaycastHit iso_hit_info,
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_info = new RaycastHit();
var result = UnityEngine.Physics.SphereCast(
origin, radius, direction, out hit_info,
max_distance,
layer_mask,
query_trigger_interaction);
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
//
// SphereCastNonAlloc
//
public static int SphereCastNonAlloc(
Vector3 origin, float radius, Vector3 direction, IsoRaycastHit[] results,
float max_distance = Mathf.Infinity,
int layer_mask = UnityEngine.Physics.DefaultRaycastLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var hit_count = UnityEngine.Physics.SphereCastNonAlloc(
origin, radius, direction, _raycastNonAllocBuffer,
max_distance,
layer_mask,
query_trigger_interaction);
return RaycastBufferToIsoRaycastHits(hit_count, results);
}
//
// OverlapBoxNonAlloc
//
public static int OverlapBoxNonAlloc(
Vector3 center, Vector3 half_extents, IsoCollider[] results,
int layer_mask = UnityEngine.Physics.AllLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var collider_count = UnityEngine.Physics.OverlapBoxNonAlloc(
center, half_extents, _overlapNonAllocBuffer,
Quaternion.identity,
layer_mask,
query_trigger_interaction);
return OverlapBufferToIsoColliders(collider_count, results);
}
//
// OverlapCapsuleNonAlloc
//
public static int OverlapCapsuleNonAlloc(
Vector3 point0, Vector3 point1, float radius, IsoCollider[] results,
int layer_mask = UnityEngine.Physics.AllLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var collider_count = UnityEngine.Physics.OverlapCapsuleNonAlloc(
point0, point1, radius, _overlapNonAllocBuffer,
layer_mask,
query_trigger_interaction);
return OverlapBufferToIsoColliders(collider_count, results);
}
//
// OverlapSphereNonAlloc
//
public static int OverlapSphereNonAlloc(
Vector3 position, float radius, IsoCollider[] results,
int layer_mask = UnityEngine.Physics.AllLayers,
QueryTriggerInteraction query_trigger_interaction = QueryTriggerInteraction.UseGlobal)
{
var collider_count = UnityEngine.Physics.OverlapSphereNonAlloc(
position, radius, _overlapNonAllocBuffer,
layer_mask,
query_trigger_interaction);
return OverlapBufferToIsoColliders(collider_count, results);
}
// ---------------------------------------------------------------------
//
// Private
//
// ---------------------------------------------------------------------
static RaycastHit[] _raycastNonAllocBuffer = new RaycastHit[128];
static int RaycastBufferToIsoRaycastHits(int hit_count, IsoRaycastHit[] results) {
var min_hit_count = Mathf.Min(hit_count, results.Length);
for ( var i = 0; i < min_hit_count; ++i ) {
results[i] = new IsoRaycastHit(_raycastNonAllocBuffer[i]);
}
System.Array.Clear(_raycastNonAllocBuffer, 0, _raycastNonAllocBuffer.Length);
System.Array.Clear(_raycastNonAllocBuffer, 0, hit_count);
return min_hit_count;
}
static Collider[] _overlapNonAllocBuffer = new Collider[128];
static int OverlapBufferToIsoColliders(int collider_count, IsoCollider[] results) {
var min_collider_count = Mathf.Min(collider_count, results.Length);
for ( var i = 0; i < min_collider_count; ++i ) {
results[i] = IsoPhysicsUtils.IsoConvertCollider(_overlapNonAllocBuffer[i]);
}
System.Array.Clear(_overlapNonAllocBuffer, 0, collider_count);
return min_collider_count;
}
}
}

View File

@@ -4,14 +4,16 @@ using System.Collections;
namespace IsoTools.Examples.Kenney {
public class AlienDestroyer : MonoBehaviour {
static IsoRaycastHit[] _raycastBuffer = new IsoRaycastHit[16];
void Update () {
var iso_world = IsoWorld.Instance;
if ( iso_world && Input.GetMouseButtonDown(0) ) {
var iso_mouse_pos = iso_world.MouseIsoPosition();
var ray_from_iso_camera = iso_world.RayFromIsoCameraToIsoPoint(iso_mouse_pos);
var hits = IsoPhysics.RaycastAll(ray_from_iso_camera);
for ( var i = 0; i < hits.Length; ++i ) {
var alien_go = hits[i].collider.gameObject;
var hit_count = IsoPhysics.RaycastNonAlloc(ray_from_iso_camera, _raycastBuffer);
for ( var i = 0; i < hit_count; ++i ) {
var alien_go = _raycastBuffer[i].collider.gameObject;
if ( alien_go.GetComponent<AlienBallController>() ) {
Destroy(alien_go);
}