77 * Copyright (c) 2016 by Shen, Jen-Chieh $
88 */
99using System ;
10+ using System . Linq ;
1011using UnityEngine ;
1112
1213namespace 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 ) ;
0 commit comments