Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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;
            }
        }
Exemplo n.º 4
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);
        }