Skip to content

Commit f989c1c

Browse files
committed
feat: Improve physics module
1 parent 628c150 commit f989c1c

File tree

2 files changed

+83
-40
lines changed

2 files changed

+83
-40
lines changed

Assets/JCSUnity/Scripts/Util/JCS_Physics.cs

Lines changed: 82 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* Copyright (c) 2016 by Shen, Jen-Chieh $
88
*/
99
using System;
10+
using System.Linq;
1011
using UnityEngine;
1112

1213
namespace JCSUnity
@@ -60,6 +61,51 @@ public void MeasureBounding()
6061
/// </summary>
6162
public static class JCS_Physics
6263
{
64+
/* Variables */
65+
66+
// Distance to look in direction to get the point.
67+
public const float LOOK_DISTANCE = 10.0f;
68+
69+
// Default ray distance.
70+
public const float RAY_DISTANCE = 100.0f;
71+
72+
/* Setter & Getter */
73+
74+
/* Functions */
75+
76+
/// <summary>
77+
/// Sort the raycast hits by distance.
78+
///
79+
/// The order is from the nearest to the furthest.
80+
/// </summary>
81+
/// <param name="point"> Point to calculate the distance. </param>
82+
/// <param name="hits"> A list of raycast hits. </param>
83+
public static RaycastHit[] SortHitsByDistance(Vector3 point, RaycastHit[] hits)
84+
{
85+
hits.OrderBy((hit) => Vector3.Distance(point, hit.point));
86+
return hits;
87+
}
88+
89+
/// <summary>
90+
/// Find the nearest raycast hit.
91+
/// </summary>
92+
/// <param name="point"> Point to calculate the distance. </param>
93+
/// <param name="hits"> A list of raycast hits. </param>
94+
public static RaycastHit FindNeareastHit(Vector3 point, RaycastHit[] hits)
95+
{
96+
return SortHitsByDistance(point, hits).First();
97+
}
98+
99+
/// <summary>
100+
/// Find the furthest raycast hit.
101+
/// </summary>
102+
/// <param name="point"> Point to calculate the distance. </param>
103+
/// <param name="hits"> A list of raycast hits. </param>
104+
public static RaycastHit FindFurthestHit(Vector3 point, RaycastHit[] hits)
105+
{
106+
return SortHitsByDistance(point, hits).Last();
107+
}
108+
63109
/// <summary>
64110
/// Return Character controller's collider's width and height.
65111
/// </summary>
@@ -233,8 +279,8 @@ public static Vector2 GetColliderInfo(BoxCollider2D rect2d)
233279
/// <param name="cap"></param>
234280
/// <param name="maxDistance"></param>
235281
public static bool SetOnTopOfClosestBoxWithRay(
236-
CharacterController cap,
237-
float maxDistance,
282+
CharacterController cap,
283+
float maxDistance,
238284
JCS_Vector3Direction inDirection)
239285
{
240286
Vector3 direction = cap.transform.TransformDirection(JCS_Vector.Direction(inDirection));
@@ -332,12 +378,12 @@ public static Vector3 SetOnTopOfBox(CharacterController cap, BoxCollider rect, f
332378
capScale = JCS_Mathf.AbsoluteValue(capScale);
333379

334380
// 取得Collider的中心"相對位置".
335-
Vector3 rectCenter = new Vector3(
381+
var rectCenter = new Vector3(
336382
rect.center.x * rectScale.x,
337383
rect.center.y * rectScale.y,
338384
rect.center.z * rectScale.z);
339385

340-
Vector3 cCenter = new Vector3(
386+
var cCenter = new Vector3(
341387
cap.center.x * capScale.x,
342388
cap.center.y * capScale.y,
343389
cap.center.z * capScale.z);
@@ -367,8 +413,8 @@ public static Vector3 SetOnTopOfBox(CharacterController cap, BoxCollider rect, f
367413
/// Faild : Vector.zero
368414
/// </returns>
369415
public static Vector3 SetOnTopOfBoxWithSlope(
370-
CharacterController cap,
371-
BoxCollider rect,
416+
CharacterController cap,
417+
BoxCollider rect,
372418
float offset = 0)
373419
{
374420
float innerAngle = rect.transform.localEulerAngles.z;
@@ -383,7 +429,7 @@ public static Vector3 SetOnTopOfBoxWithSlope(
383429

384430
capScale = JCS_Mathf.AbsoluteValue(capScale);
385431

386-
Vector3 cCenter = new Vector3(
432+
var cCenter = new Vector3(
387433
cap.center.x * capScale.x,
388434
cap.center.y * capScale.y,
389435
cap.center.z * capScale.z);
@@ -398,7 +444,7 @@ public static Vector3 SetOnTopOfBoxWithSlope(
398444
float rectWidth = rect.size.x * rectScale.x;
399445
float rectHeight = rect.size.y * rectScale.y;
400446

401-
Vector3 rectCenter = new Vector3(
447+
var rectCenter = new Vector3(
402448
rect.center.x * rectScale.x,
403449
rect.center.y * rectScale.y,
404450
rect.center.z * rectScale.z);
@@ -480,12 +526,12 @@ public static Vector3 SetOnTopOfBox(BoxCollider topBox, BoxCollider botBox, floa
480526
botBoxScale = JCS_Mathf.AbsoluteValue(botBoxScale);
481527

482528
// 取得Collider的中心"相對位置".
483-
Vector3 topBoxCenter = new Vector3(
529+
var topBoxCenter = new Vector3(
484530
topBox.center.x * topBoxScale.x,
485531
topBox.center.y * topBoxScale.y,
486532
topBox.center.z * topBoxScale.z);
487533

488-
Vector3 botBoxCenter = new Vector3(
534+
var botBoxCenter = new Vector3(
489535
botBox.center.x * botBoxScale.x,
490536
botBox.center.y * botBoxScale.y,
491537
botBox.center.z * botBoxScale.z);
@@ -524,7 +570,7 @@ public static Vector3 SetOnTopOfBoxWithSlope(BoxCollider topBox, BoxCollider bot
524570

525571
Vector2 topBoxWH = GetColliderWidthHeight(topBox);
526572

527-
Vector3 topBoxCenter = new Vector3(
573+
var topBoxCenter = new Vector3(
528574
topBox.center.x * topBoxScale.x,
529575
topBox.center.y * topBoxScale.y,
530576
topBox.center.z * topBoxScale.z);
@@ -539,7 +585,7 @@ public static Vector3 SetOnTopOfBoxWithSlope(BoxCollider topBox, BoxCollider bot
539585
float rectWidth = botBox.size.x * rectScale.x;
540586
float rectHeight = botBox.size.y * rectScale.y;
541587

542-
Vector3 rectCenter = new Vector3(
588+
var rectCenter = new Vector3(
543589
botBox.center.x * rectScale.x,
544590
botBox.center.y * rectScale.y,
545591
botBox.center.z * rectScale.z);
@@ -623,18 +669,18 @@ public static Vector2 SetOnTopOfBox(BoxCollider2D topBox, BoxCollider2D botBox,
623669
botBoxScale = JCS_Mathf.AbsoluteValue(botBoxScale);
624670

625671
// 取得Collider的中心"相對位置".
626-
Vector2 topBoxCenter = new Vector2(
672+
var topBoxCenter = new Vector2(
627673
topBox.offset.x * topBoxScale.x,
628674
topBox.offset.y * topBoxScale.y);
629675

630-
Vector2 botBoxCenter = new Vector2(
676+
var botBoxCenter = new Vector2(
631677
botBox.offset.x * botBoxScale.x,
632678
botBox.offset.y * botBoxScale.y);
633679

634680
// * rectCenter 跟 rect.transfrom.position 是"相對位置',
635681
// 所以要相加才能得到正確的"世界位置"!
636682
// * cCenter + cap.transform.position 同理.
637-
Vector2 newPos = new Vector2(
683+
var newPos = new Vector2(
638684
topBoxCenter.x + topBox.transform.position.x,
639685
topBoxCenter.y + topBox.transform.position.y);
640686

@@ -667,11 +713,11 @@ public static Vector2 SetOnBottomOfBox(BoxCollider2D botBox, BoxCollider2D topBo
667713
topBoxScale = JCS_Mathf.AbsoluteValue(topBoxScale);
668714

669715
// 取得Collider的中心"相對位置".
670-
Vector2 botBoxCenter = new Vector2(
716+
var botBoxCenter = new Vector2(
671717
botBox.offset.x * botBoxScale.x,
672718
botBox.offset.y * botBoxScale.y);
673719

674-
Vector2 topBoxCenter = new Vector2(
720+
var topBoxCenter = new Vector2(
675721
topBox.offset.x * topBoxScale.x,
676722
topBox.offset.y * topBoxScale.y);
677723

@@ -711,18 +757,18 @@ public static Vector2 SetOnRightOfBox(BoxCollider2D leftBox, BoxCollider2D right
711757
rightBoxScale = JCS_Mathf.AbsoluteValue(rightBoxScale);
712758

713759
// 取得Collider的中心"相對位置".
714-
Vector2 leftBoxCenter = new Vector2(
760+
var leftBoxCenter = new Vector2(
715761
leftBox.offset.x * leftBoxScale.x,
716762
leftBox.offset.y * leftBoxScale.y);
717763

718-
Vector2 rightBoxCenter = new Vector2(
764+
var rightBoxCenter = new Vector2(
719765
rightBox.offset.x * rightBoxScale.x,
720766
rightBox.offset.y * rightBoxScale.y);
721767

722768
// * rectCenter 跟 rect.transfrom.position 是"相對位置',
723769
// 所以要相加才能得到正確的"世界位置"!
724770
// * cCenter + cap.transform.position 同理.
725-
Vector2 newPos = new Vector2(
771+
var newPos = new Vector2(
726772
leftBoxCenter.x + leftBox.transform.position.x,
727773
leftBoxCenter.y + leftBox.transform.position.y);
728774

@@ -755,18 +801,18 @@ public static Vector2 SetOnLeftOfBox(BoxCollider2D rightBox, BoxCollider2D leftB
755801
leftBoxScale = JCS_Mathf.AbsoluteValue(leftBoxScale);
756802

757803
// 取得Collider的中心"相對位置".
758-
Vector2 rightBoxCenter = new Vector2(
804+
var rightBoxCenter = new Vector2(
759805
rightBox.offset.x * rightBoxScale.x,
760806
rightBox.offset.y * rightBoxScale.y);
761807

762-
Vector2 leftBoxCenter = new Vector2(
808+
var leftBoxCenter = new Vector2(
763809
leftBox.offset.x * leftBoxScale.x,
764810
leftBox.offset.y * leftBoxScale.y);
765811

766812
// * rectCenter 跟 rect.transfrom.position 是"相對位置',
767813
// 所以要相加才能得到正確的"世界位置"!
768814
// * cCenter + cap.transform.position 同理.
769-
Vector2 newPos = new Vector2(
815+
var newPos = new Vector2(
770816
rightBoxCenter.x + rightBox.transform.position.x,
771817
rightBoxCenter.y + rightBox.transform.position.y);
772818

@@ -800,12 +846,12 @@ public static bool TopOfBox(CharacterController cap, BoxCollider rect)
800846
//float rWidth = rect.size.x * rectScale.x;
801847
float rHeight = rect.size.y * rectScale.y;
802848

803-
Vector3 rectCenter = new Vector3(
849+
var rectCenter = new Vector3(
804850
rect.center.x * rectScale.x,
805851
rect.center.y * rectScale.y,
806852
rect.center.z * rectScale.z);
807853

808-
Vector3 cCenter = new Vector3(
854+
var cCenter = new Vector3(
809855
cap.center.x * capScale.x,
810856
cap.center.y * capScale.y,
811857
cap.center.z * capScale.z);
@@ -820,7 +866,7 @@ public static bool TopOfBox(CharacterController cap, BoxCollider rect)
820866
float cBotBound = cap.transform.position.y + cCenter.y - (cH / 2.0f) - cR;
821867

822868
#if UNITY_EDITOR
823-
Debug.DrawLine(rect.transform.position + rectCenter,
869+
Debug.DrawLine(rect.transform.position + rectCenter,
824870
new Vector3(
825871
rect.transform.position.x,
826872
rTopBound,
@@ -863,7 +909,7 @@ public static bool TopOfBoxWithSlope(CharacterController cap, BoxCollider rect)
863909

864910
capScale = JCS_Mathf.AbsoluteValue(capScale);
865911

866-
Vector3 cCenter = new Vector3(
912+
var cCenter = new Vector3(
867913
cap.center.x * capScale.x,
868914
cap.center.y * capScale.y,
869915
cap.center.z * capScale.z);
@@ -884,7 +930,7 @@ public static bool TopOfBoxWithSlope(CharacterController cap, BoxCollider rect)
884930
float rectWidth = rect.size.x * rectScale.x;
885931
float rectHeight = rect.size.y * rectScale.y;
886932

887-
Vector3 rectCenter = new Vector3(
933+
var rectCenter = new Vector3(
888934
rect.center.x * rectScale.x,
889935
rect.center.y * rectScale.y,
890936
rect.center.z * rectScale.z);
@@ -920,8 +966,8 @@ public static bool TopOfBoxWithSlope(CharacterController cap, BoxCollider rect)
920966
}
921967

922968
float heightToCapBot = JCS_Mathf.CrossMultiply(
923-
rectLeftToRight,
924-
distRectLeftToCapCenter,
969+
rectLeftToRight,
970+
distRectLeftToCapCenter,
925971
rectTopAndBot);
926972

927973
#if UNITY_EDITOR
@@ -963,12 +1009,12 @@ public static bool BottomOfBox(CharacterController cap, BoxCollider rect)
9631009
//float rWidth = rect.size.x * rectScale.x;
9641010
float rHeight = rect.size.y * rectScale.y;
9651011

966-
Vector3 rectCenter = new Vector3(
1012+
var rectCenter = new Vector3(
9671013
rect.center.x * rectScale.x,
9681014
rect.center.y * rectScale.y,
9691015
rect.center.z * rectScale.z);
9701016

971-
Vector3 cCenter = new Vector3(
1017+
var cCenter = new Vector3(
9721018
cap.center.x * capScale.x,
9731019
cap.center.y * capScale.y,
9741020
cap.center.z * capScale.z);
@@ -1011,12 +1057,12 @@ public static bool OnTriggerCheck(CharacterController cap, BoxCollider rect)
10111057
rWidth = JCS_Mathf.AbsoluteValue(rWidth);
10121058
rHeight = JCS_Mathf.AbsoluteValue(rHeight);
10131059

1014-
Vector3 rectCenter = new Vector3(
1060+
var rectCenter = new Vector3(
10151061
rect.center.x * rectScale.x,
10161062
rect.center.y * rectScale.y,
10171063
rect.center.z * rectScale.z);
10181064

1019-
Vector3 cCenter = new Vector3(
1065+
var cCenter = new Vector3(
10201066
cap.center.x * capScale.x,
10211067
cap.center.y * capScale.y,
10221068
cap.center.z * capScale.z);
@@ -1030,11 +1076,11 @@ public static bool OnTriggerCheck(CharacterController cap, BoxCollider rect)
10301076
if (cH < 0)
10311077
cH = 0;
10321078

1033-
Vector3 topCirclePoint = new Vector3(
1079+
var topCirclePoint = new Vector3(
10341080
cap.transform.position.x + cCenter.x,
10351081
cap.transform.position.y + cHalfHeight + offsetY,
10361082
cap.transform.position.z + cCenter.z);
1037-
Vector3 botCirclePoint = new Vector3(
1083+
var botCirclePoint = new Vector3(
10381084
cap.transform.position.x + cCenter.x,
10391085
cap.transform.position.y - cHalfHeight + offsetY,
10401086
cap.transform.position.z + cCenter.z);

Assets/JCSUnity/Scripts/Util/JCS_Vector.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ public static class JCS_Vector
1717
{
1818
/* Variables */
1919

20-
// Distance to look in direction to get the point.
21-
public const float LOOK_DISTANCE = 10.0f;
22-
2320
/* Setter & Getter */
2421

2522
/* Functions */
@@ -384,7 +381,7 @@ public static bool InDistance(Vector3 pos1, Vector3 pos2, float threshold)
384381
/// </summary>
385382
public static Vector3 PointInDirection(JCS_Vector3Direction direction, Transform trans)
386383
{
387-
return PointInDirection(direction, trans, LOOK_DISTANCE);
384+
return PointInDirection(direction, trans, JCS_Physics.LOOK_DISTANCE);
388385
}
389386
public static Vector3 PointInDirection(JCS_Vector3Direction direction, Transform trans, float distance)
390387
{

0 commit comments

Comments
 (0)