/// <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); }
// Update is called once per frame void Update() { Collider c = GameObject.Find("map").GetComponent <BoxCollider>(); ColliderEditer.CubeEndPoint p = c.minimumCircumscribedCubeEndPointWorld(); Debug.Log(p.top); }
/// <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> /// この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)); }
/// <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); }