/// <summary> /// 下にあるMapCollisionレイヤーのオブジェクトを返します。 /// </summary> /// <returns>見つけたオブジェクト。オブジェクトがなければnull</returns> public static int GetUnderMap() { Vector3 origin = ChrController.bounds.center; return(PhysicsCaster.Raycast( origin, Vector3.down, ChrController.height * 0.5f + 0.1f, PhysicsCaster.MapCollisionPlayerOnlyLayer)); }
/// <summary> /// 乗っていた岩が下にあるかを確認します。 /// </summary> /// <returns>岩がある時、trueを返します。</returns> bool CheckGetOff() { Vector3 origin = StellaMove.ChrController.bounds.center; origin.x += getOffDistance * Mathf.Sign(lastRockObject.transform.position.x - origin.x); int hitCount = PhysicsCaster.Raycast(origin, Vector3.down, float.PositiveInfinity, PhysicsCaster.MapCollisionLayer, QueryTriggerInteraction.Collide); Collider res = FindRock(hitCount); if (res.gameObject == lastRockObject) { return(true); } // 列挙が越えていたら、一番上までで再列挙 while (hitCount >= PhysicsCaster.hits.Length) { hitCount = PhysicsCaster.Raycast(origin, Vector3.down, origin.y - res.bounds.max.y, PhysicsCaster.MapCollisionLayer, QueryTriggerInteraction.Collide); res = FindRock(hitCount); if (res.gameObject == lastRockObject) { return(true); } } GetOffOutside(StellaMove.ChrController.bounds.min.y - res.bounds.max.y); return(false); }
/// <summary> /// 歩きから落下する時に、隣のブロックの中心辺りに着地できるようなX速度を設定 /// </summary> public void FallNextBlock() { // 着地目標のX座標を求める Vector3 origin = Vector3.zero; origin.x = Mathf.Round(StellaMove.instance.transform.position.x); // 着地目標のX座標と自分の足元のYから下方向にレイを飛ばして、着地点を見つける origin.y = StellaMove.ChrController.bounds.min.y; int cnt = PhysicsCaster.Raycast(origin, Vector3.down, float.PositiveInfinity, PhysicsCaster.MapCollisionPlayerOnlyLayer); if (cnt == 0) { #if UNITY_EDITOR // 本来ないはずだが念のため Debug.Log($"地面無し {cnt}"); #endif StellaMove.myVelocity.x = 0; return; } // 一番上を探す float top = PhysicsCaster.hits[0].collider.bounds.max.y; for (int i = 1; i < cnt; i++) { // 地面と水以外は対象外 if (!PhysicsCaster.hits[i].collider.CompareTag("Ground") && !PhysicsCaster.hits[i].collider.CompareTag("Water")) { continue; } if (PhysicsCaster.hits[i].collider.bounds.max.y > top) { top = PhysicsCaster.hits[i].collider.bounds.max.y; } } float h = StellaMove.ChrController.bounds.min.y - top; // 高さがないか、負の値の時は、1段分で算出 if (h <= 0f) { h = 1f; } float t = Mathf.Sqrt(2f * h / StellaMove.GravityAdd); StellaMove.myVelocity.x = (origin.x - StellaMove.instance.transform.position.x) / t; if (StellaMove.myVelocity.x * StellaMove.forwardVector.x < 0f) { StellaMove.myVelocity.x = 0; } }
/// <summary> /// ツタが手の上にあればtrueを返します。 /// </summary> /// <returns>ツタが手の上にある時、true</returns> public static bool IsIvyUp() { // 上にツタがあるか? Vector3 origin = HoldPosition; origin.x = IvyInstance.BoxColliderInstance.bounds.min.x - 0.05f; origin.z = IvyInstance.transform.position.z; int hitCount = PhysicsCaster.Raycast(origin, Vector3.right, 0.1f, PhysicsCaster.NaeLayer, QueryTriggerInteraction.Collide); for (int i = 0; i < hitCount; i++) { if (PhysicsCaster.hits[i].collider.GetComponent <Ivy>() != null) { return(true); } } return(false); }