コード例 #1
0
    /// <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 : 衝突するはずの足場と衝突できなかった");
    }
コード例 #2
0
    /// <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);
    }