示例#1
0
    /// <summary>
    /// 移動先の座標計算
    /// </summary>
    /// <param name="aCollider">移動先に配置するキャラのcollider</param>
    public void calculatePositionFromPercentagePosition(Collider aCollider)
    {
        ColliderEditer.CubeEndPoint tSize = aCollider.minimumCircumscribedCubeEndPoint();
        //移動先となりうる範囲
        Vector3 tLeftFrontBottom = new Vector3(mEntranceData.mX - mEntranceData.mSize.x / 2f, mEntranceData.mY - mEntranceData.mSize.y / 2f, mEntranceData.mZ - mEntranceData.mSize.z / 2f);
        Vector3 tRightBackTop    = new Vector3(mEntranceData.mX + mEntranceData.mSize.x / 2f, mEntranceData.mY + mEntranceData.mSize.y / 2f, mEntranceData.mZ + mEntranceData.mSize.z / 2f);

        tLeftFrontBottom.x -= tSize.left + MapCharacterMoveSystem.kMaxSeparation;
        tRightBackTop.x    -= tSize.right - MapCharacterMoveSystem.kMaxSeparation;
        tLeftFrontBottom.y -= tSize.bottom - MapCharacterMoveSystem.kMaxSeparation;
        tRightBackTop.y    -= tSize.top + MapCharacterMoveSystem.kMaxSeparation;
        tLeftFrontBottom.z -= tSize.front - MapCharacterMoveSystem.kMaxSeparation;
        tRightBackTop.z    -= tSize.back + MapCharacterMoveSystem.kMaxSeparation;
        //移動先となりうる範囲のサイズが負の値になったら調整
        if (tRightBackTop.x < tLeftFrontBottom.x)
        {
            tLeftFrontBottom.x = mEntranceData.mX;
            tRightBackTop.x    = mEntranceData.mX;
        }
        if (tRightBackTop.y < tLeftFrontBottom.y)
        {
            tLeftFrontBottom.y = mEntranceData.mY;
            tRightBackTop.y    = mEntranceData.mY;
        }
        if (tRightBackTop.z < tLeftFrontBottom.z)
        {
            tLeftFrontBottom.z = mEntranceData.mZ;
            tRightBackTop.z    = mEntranceData.mZ;
        }
        //移動先の座標
        mPosition = new Vector3(tLeftFrontBottom.x + (tRightBackTop.x - tLeftFrontBottom.x) * mPercentagePosition.x, tLeftFrontBottom.y + (tRightBackTop.y - tLeftFrontBottom.y) * mPercentagePosition.y, tLeftFrontBottom.z + (tRightBackTop.z - tLeftFrontBottom.z) * mPercentagePosition.z);
    }
示例#2
0
    // Update is called once per frame
    void Update()
    {
        Collider c = GameObject.Find("map").GetComponent <BoxCollider>();

        ColliderEditer.CubeEndPoint p = c.minimumCircumscribedCubeEndPointWorld();
        Debug.Log(p.top);
    }
示例#3
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 : 衝突するはずの足場と衝突できなかった");
    }
示例#4
0
    /// <summary>
    /// このtile内部でどれだけ移動できるか(移動ベクトルに対する割合を返す)(tileが矩形であること前提)
    /// </summary>
    /// <returns>このtile内部で移動できる移動ベクトルの、引数の移動ベクトルに対する割合(0~1)</returns>
    /// <param name="aStartPoint">移動開始地点(相対座標)</param>
    /// <param name="aMovingVector">移動ベクトル</param>
    protected float calculateRateOfMovingInSelf(Vector3 aStartPoint, Vector3 aMovingVector)
    {
        ColliderEditer.CubeEndPoint tEnd = mColliderEndPoint;
        //tile外部までの距離
        float tHDistance;
        float tVDistance;
        float tSDistance;

        if (aMovingVector.x < 0)
        {
            tHDistance = aStartPoint.x - tEnd.left;
        }
        else if (aMovingVector.x > 0)
        {
            tHDistance = tEnd.right - aStartPoint.x;
        }
        else
        {
            tHDistance = float.PositiveInfinity;
        }
        if (aMovingVector.z < 0)
        {
            tVDistance = aStartPoint.z - tEnd.front;
        }
        else if (aMovingVector.z > 0)
        {
            tVDistance = tEnd.back - aStartPoint.z;
        }
        else
        {
            tVDistance = float.PositiveInfinity;
        }
        if (aMovingVector.y < 0)
        {
            tSDistance = aStartPoint.y - tEnd.bottom;
        }
        else if (aMovingVector.y > 0)
        {
            tSDistance = tEnd.top - aStartPoint.y;
        }
        else
        {
            tSDistance = float.PositiveInfinity;
        }

        //移動ベクトルに対する外部までの移動ベクトルの割合
        float tHRate = tHDistance / Mathf.Abs(aMovingVector.x);
        float tVRate = tVDistance / Mathf.Abs(aMovingVector.z);
        float tSRate = tSDistance / Mathf.Abs(aMovingVector.y);

        return(Mathf.Min(Mathf.Min(tHRate, Mathf.Min(tVRate, tSRate)), 1f));
    }
示例#5
0
    /// <summary>移動先の座標計算</summary>
    private void calculatePercentagePosition(MapEventSystem.Operator aOperator)
    {
        //triggerの矩形範囲
        ColliderEditer.CubeEndPoint tRange = aOperator.mInvokedCollider.minimumCircumscribedCubeEndPoint();
        //invokerのcolliderを考慮して矩形範囲を調整
        ColliderEditer.CubeEndPoint tSize = aOperator.mInvoker.mEntityPhysicsBehaviour.mAttriubteCollider.minimumCircumscribedCubeEndPoint();
        tRange.left   -= tSize.left;
        tRange.right  -= tSize.right;
        tRange.top    -= tSize.top;
        tRange.bottom -= tSize.bottom;
        tRange.back   -= tSize.back;
        tRange.front  -= tSize.front;


        Vector3 tRelative      = aOperator.mInvoker.mEntityPhysicsBehaviour.mAttribute.worldPosition - aOperator.mInvokedCollider.transform.position;
        Vector3 tRangePosition = new Vector3((tRelative.x - tRange.left) / (tRange.right - tRange.left), (tRelative.y - tRange.bottom) / (tRange.top - tRange.bottom), (tRelative.z - tRange.front) / (tRange.back - tRange.front));

        //座標が(0~1)の範囲になるように調整
        if (tRangePosition.x < 0)
        {
            tRangePosition.x = 0;
        }
        else if (1 < tRangePosition.x)
        {
            tRangePosition.x = 1;
        }
        if (tRangePosition.y < 0)
        {
            tRangePosition.y = 0;
        }
        else if (1 < tRangePosition.y)
        {
            tRangePosition.y = 1;
        }
        if (tRangePosition.z < 0)
        {
            tRangePosition.z = 0;
        }
        else if (1 < tRangePosition.z)
        {
            tRangePosition.z = 1;
        }

        mEndSide.mPercentagePosition = tRangePosition;
    }
    //<summary>引数の座標が傾斜に対してどの位置にいるか</summary>
    public Side getRelativeSide(MapPosition aPosition)
    {
        ColliderEditer.CubeEndPoint tPoint = mColliderEndPointMap;
        switch (mSlopeDirection)
        {
        case SlopeDirection.upHigh:
            if (aPosition.z < tPoint.front)
            {
                return(Side.lowSide);
            }
            if (tPoint.back < aPosition.z)
            {
                return(Side.highSide);
            }
            if (aPosition.x < tPoint.left)
            {
                return(Side.railSide);
            }
            if (tPoint.right < aPosition.x)
            {
                return(Side.railSide);
            }
            return(Side.inner);

        case SlopeDirection.downHigh:
            if (aPosition.z < tPoint.front)
            {
                return(Side.highSide);
            }
            if (tPoint.back < aPosition.y)
            {
                return(Side.lowSide);
            }
            if (aPosition.x < tPoint.left)
            {
                return(Side.railSide);
            }
            if (tPoint.right < aPosition.x)
            {
                return(Side.railSide);
            }
            return(Side.inner);

        case SlopeDirection.leftHigh:
            if (aPosition.x < tPoint.left)
            {
                return(Side.highSide);
            }
            if (tPoint.right < aPosition.x)
            {
                return(Side.lowSide);
            }
            if (aPosition.y < tPoint.front)
            {
                return(Side.railSide);
            }
            if (tPoint.back < aPosition.y)
            {
                return(Side.railSide);
            }
            return(Side.inner);

        case SlopeDirection.rightHigh:
            if (aPosition.x < tPoint.left)
            {
                return(Side.lowSide);
            }
            if (tPoint.right < aPosition.x)
            {
                return(Side.highSide);
            }
            if (aPosition.y < tPoint.front)
            {
                return(Side.railSide);
            }
            if (tPoint.back < aPosition.y)
            {
                return(Side.railSide);
            }
            return(Side.inner);
        }
        Debug.LogWarning("OneDirectionSlopeTilePhysicsAttribute : 傾斜方向が未設定です");
        return(Side.none);
    }