/// <summary> /// 指定した足場に接する位置までの距離を返す /// </summary> /// <returns>指定した足場に接する位置までの距離(Y座標上方向の距離)</returns> /// <param name="aEntity">Entity</param> /// <param name="aScaffold">足場</param> private static float getCorrectDistanceToScaffold(MapEntity aEntity, Collider aScaffold) { Collider tEntityCollider = aEntity.mEntityPhysicsBehaviour.mScaffoldRigideCollider; //上方向に移動させて離せる距離 ColliderEditer.CubeEndPoint tEntityEnd = tEntityCollider.minimumCircumscribedCubeEndPoint(); ColliderEditer.CubeEndPoint tHitEnd = aScaffold.minimumCircumscribedCubeEndPointWorld(); float tUpperDistance = (tHitEnd.top) - (tEntityCollider.transform.position.y + tEntityEnd.bottom); //cast RaycastHit[] tHits = scaffoldRigideCast(aEntity, tUpperDistance + kDelta, tHitEnd.top - tHitEnd.bottom + kDelta); //指定されたscaffoldのHitを探す for (int i = 0; i < tHits.Length; ++i) { RaycastHit tHit = tHits[i]; MapScaffold tScaffold = tHit.collider.gameObject.GetComponent <MapScaffold>(); if (tScaffold == null) { continue; } if (tHit.collider != aScaffold) { continue; } return(tUpperDistance - tHit.distance + kDelta); } //return tUpperDistance - (tHitEnd.top - tHitEnd.bottom); throw new System.Exception("MapHeightUpdateSystem : 衝突するはずの足場と衝突できなかった"); }
/// <summary> /// 足場までの距離を返す(負の値の場合は上方向の距離を示す) /// </summary> /// <returns>足場までの距離</returns> /// <param name="aEntity">A entity.</param> public static float getDistanceToScaffold(MapEntity aEntity) { RaycastHit[] tHits = scaffoldRigideCast(aEntity, kDelta, 2f + kDelta); //最寄りの足場を探す MapScaffold tScaffold = null; RaycastHit tHit; Collider tScaffoldCollider = null; for (int i = 0; i < tHits.Length; ++i) { tHit = tHits[i]; tScaffold = tHit.collider.gameObject.GetComponent <MapScaffold>(); if (tScaffold == null) { continue; } if (tHit.distance > 0) { return(tHit.distance - kDelta); } else { //足場と衝突している場合 tScaffoldCollider = tHit.collider; break; } } if (tScaffold == null) { Debug.LogWarning("MapHeightUpdateSystem : 足場がない"); return(0); } //足場と衝突している場合 float tUpperDistance = 0; for (; ;) { if (tScaffold == null) { break; } //上方向に移動して離せる距離 tUpperDistance = getCorrectDistanceToScaffold(aEntity, tScaffoldCollider); //移動した結果他の足場に衝突しないか確認 tHits = scaffoldRigideCast(aEntity, tUpperDistance + kDelta, 0); tScaffold = null; foreach (RaycastHit tCastHit in tHits) { tScaffold = tCastHit.collider.GetComponent <MapScaffold>(); if (tScaffold != null) //他の足場に衝突した { tScaffoldCollider = tCastHit.collider; break; } } } return(-tUpperDistance); }