1
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
namespace BITKit
|
||||
{
|
||||
public interface IClosePoint
|
||||
{
|
||||
Collider Collider { get; }
|
||||
bool TryGetClosePoint(out Vector3 vector3);
|
||||
}
|
||||
[System.Serializable]
|
||||
@@ -14,12 +17,15 @@ namespace BITKit
|
||||
public Transform root;
|
||||
public LayerMask layerMask;
|
||||
public float distance;
|
||||
public Collider Collider { get; set; }
|
||||
|
||||
public bool TryGetClosePoint(out Vector3 vector3)
|
||||
{
|
||||
vector3 = default;
|
||||
if (UnityEngine.Physics.Raycast(root.position, root.forward, out var raycastHit, distance, layerMask))
|
||||
{
|
||||
var collider = raycastHit.collider;
|
||||
if (collider.isTrigger) return false;
|
||||
switch (collider)
|
||||
{
|
||||
case MeshCollider meshCollider:
|
||||
@@ -42,6 +48,8 @@ namespace BITKit
|
||||
if(hit!= collider)
|
||||
return false;
|
||||
}
|
||||
|
||||
Collider = collider;
|
||||
return true;
|
||||
//return vector3.y >= collider.bounds.center.y + collider.bounds.extents.y;
|
||||
//return true;
|
||||
@@ -65,14 +73,31 @@ namespace BITKit
|
||||
|
||||
public Vector3 StartPosition;
|
||||
public Vector3 EndPosition;
|
||||
|
||||
public Collider Collider { get; set; }
|
||||
private Rigidbody rigidbody;
|
||||
|
||||
private bool isInitialized;
|
||||
|
||||
public bool TryGetClosePoint(out Vector3 vector3)
|
||||
{
|
||||
if (isInitialized is false)
|
||||
{
|
||||
rigidbody = groundReference.GetComponent<Rigidbody>();
|
||||
isInitialized = true;
|
||||
}
|
||||
if (rigidbody)
|
||||
{
|
||||
vector3 = default;
|
||||
if (rigidbody.velocity.GetLength() < 0.1f) return false;
|
||||
}
|
||||
|
||||
var reportBuilder = new System.Text.StringBuilder();
|
||||
|
||||
var forward = root.forward;
|
||||
var startPosition = groundReference.position;
|
||||
startPosition.y = root.position.y;
|
||||
var sourceStartPosition = groundReference.position;
|
||||
sourceStartPosition.y = root.position.y;
|
||||
var startPosition = sourceStartPosition;
|
||||
|
||||
var collider = UnityEngine.Physics.OverlapSphere(startPosition, radius, layerMask);
|
||||
|
||||
@@ -80,17 +105,23 @@ namespace BITKit
|
||||
|
||||
foreach (var hit in collider)
|
||||
{
|
||||
reportBuilder.AppendLine();
|
||||
|
||||
var top = hit.bounds.center + hit.bounds.extents;
|
||||
|
||||
if(top.y<sourceStartPosition.y)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
reportBuilder.AppendLine();
|
||||
reportBuilder.AppendLine($">{hit.name}");
|
||||
|
||||
if(top.y>groundReference.transform.position.y+maxHeight)
|
||||
{
|
||||
reportBuilder.AppendLine("高度超出可翻越高度");
|
||||
continue;
|
||||
}
|
||||
|
||||
var start = startPosition+forward*distance;
|
||||
var start = sourceStartPosition+forward*8;
|
||||
//start.y = hit.bounds.center.y;
|
||||
|
||||
var ray = new Ray(start, -forward);
|
||||
@@ -105,16 +136,35 @@ namespace BITKit
|
||||
|
||||
EndPosition = colliderHit.point + colliderHit.normal*0.4f;
|
||||
EndPosition.y = top.y;
|
||||
|
||||
Debug.DrawLine(ray.origin, colliderHit.point, Color.green, 8);
|
||||
var lineDistance = Vector3.Distance(start, colliderHit.point);
|
||||
if(lineDistance > maxVaultDistance)
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
reportBuilder.AppendLine("长度超出可翻越距离");
|
||||
|
||||
BIT4Log.Log<GetVaultPointFromCollider>(reportBuilder.ToString());
|
||||
foreach (var x in UnityEngine
|
||||
.Physics
|
||||
.OverlapSphere(EndPosition, 0.1f, layerMask))
|
||||
{
|
||||
if(Equals(x, hit))
|
||||
continue;
|
||||
throw new OperationCanceledException($"终点有其他碰撞体{x.name}");
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException e)
|
||||
{
|
||||
reportBuilder.AppendLine(e.Message);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if(UnityEngine.Physics.Raycast(EndPosition,Vector3.down,out _,1.6f,layerMask) is false)
|
||||
{
|
||||
Debug.DrawRay(EndPosition, Vector3.down*1.6f, Color.red, 8);
|
||||
reportBuilder.AppendLine("未检测到地面,跳过");
|
||||
continue;
|
||||
//Debug.DrawRay(EndPosition, Vector3.down, Color.red, 8);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var fixdPosition = colliderHit.point;
|
||||
fixdPosition.y=hit.bounds.center.y;
|
||||
@@ -126,7 +176,7 @@ namespace BITKit
|
||||
{
|
||||
reportBuilder.AppendLine($"检测到了障碍物{downHit.collider.name}");
|
||||
|
||||
BIT4Log.Log<GetVaultPointFromCollider>(reportBuilder.ToString());
|
||||
//BIT4Log.Log<GetVaultPointFromCollider>(reportBuilder.ToString());
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -144,6 +194,19 @@ namespace BITKit
|
||||
StartPosition = colliderHit.point;
|
||||
StartPosition.y = top.y;
|
||||
StartPosition += colliderHit.normal * 0.4f;
|
||||
|
||||
var closeStart = hit.ClosestPoint(StartPosition);
|
||||
var closeEnd = hit.ClosestPoint(EndPosition);
|
||||
var lineDistance = Vector3.Distance(closeStart, closeEnd);
|
||||
if(lineDistance > maxVaultDistance)
|
||||
{
|
||||
reportBuilder.AppendLine($"长度{lineDistance}超出可翻越距离{maxVaultDistance}");
|
||||
|
||||
Debug.DrawLine(closeStart,closeEnd, Color.yellow, 4);
|
||||
|
||||
//BIT4Log.Log<GetVaultPointFromCollider>(reportBuilder.ToString());
|
||||
continue;
|
||||
}
|
||||
|
||||
vector3 = colliderHit.point;
|
||||
|
||||
|
@@ -4,7 +4,7 @@ using System.Collections.Generic;
|
||||
using BITKit.Core.Tuple;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BITKit.Physics
|
||||
namespace BITKit
|
||||
{
|
||||
[Serializable]
|
||||
public class JointConfigure
|
||||
|
@@ -1,10 +1,9 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using BITKit.Events;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BITKit.Physics
|
||||
namespace BITKit
|
||||
{
|
||||
public class Prop_Physics : MonoBehaviour
|
||||
{
|
||||
|
Reference in New Issue
Block a user