コード例 #1
0
    //重さを移すのに失敗して、移し元から共有ブロックへ光の弾が戻っていく状態
    //
    void UpdateReturnToShare()
    {
        if (mInitState == true)
        {
            mInitState = false;


            //共有ボックスの処理
            //

            ShareWeightBox lDestShare = mDest.GetComponent <ShareWeightBox>();
            mLightBallShare.Clear();

            //共有ボックスの数だけ光の弾を生成
            foreach (var s in lDestShare.GetShareAllListExceptOwn())
            {
                GameObject l = Instantiate(mLightBallPrefab, transform);
                l.GetComponent <LightBall>().InitPoint(GetMassPosition(mDest), GetMassPosition(s.gameObject));
                l.GetComponent <LightBall>().PlayEffect();
                mLightBallShare.Add(l);
            }


            //全ての光る球の到達する時間は一定だ
            //移す先の共有ボックスと、他の共有ボックスの一番近い距離を求め、その時間で到達するように速度を変更する
            //
            float lMinDistance = float.MaxValue;
            foreach (var l in mLightBallShare)
            {
                LightBall lc = l.GetComponent <LightBall>();
                lMinDistance = Mathf.Min((lc.From - lc.To).magnitude, lMinDistance);
            }

            foreach (var l in mLightBallShare)
            {
                LightBall lc = l.GetComponent <LightBall>();
                lc.mMoveSpeed = (lc.From - lc.To).magnitude / lMinDistance * mLightBallTemplate.GetComponent <LightBall>().mMoveSpeed;
            }

            SoundManager.SPlay(mShiftDestSE);
        }


        //全ての光の弾が他の共有ボックスへ到達するまで、光の弾の更新を続ける
        //

        var lShareList = mSource.GetComponent <ShareWeightBox>().GetShareAllListExceptOwn();

        bool lAllReach = true;

        for (int i = 0; i < mLightBallShare.Count; i++)
        {
            LightBall      l = mLightBallShare[i].GetComponent <LightBall>();
            ShareWeightBox s = lShareList[i].GetComponent <ShareWeightBox>();
            l.SetPoint(GetMassPosition(mDest), GetMassPosition(s.gameObject));
            l.UpdatePoint();
            if (l.IsReached == false)
            {
                lAllReach = false;
            }
        }

        //全て到達したら
        if (lAllReach == true)
        {
            //光の弾の削除
            foreach (var s in mLightBallShare)
            {
                DestroyLightBall(s);
            }

            //見かけの重さを戻す
            foreach (var s in mDest.GetComponent <ShareWeightBox>().GetShareAllListExceptOwn())
            {
                s.GetComponent <WeightManager>().WeightLvSeem += GetShiftWeight();
            }
            ChangeState(CSelectState.cFail);                //失敗状態へ
            SoundManager.SPlay(mShiftDestSE);
        }
    }
コード例 #2
0
    //共有ボックスが移し元になり、他の共有ブロックの重さが移ってくる状態
    void UpdateMoveFromShare()
    {
        if (mInitState == true)
        {
            mInitState = false;

            //カーソルを移せない表示に
            ChangeCursorState(CCursorState.cCanNotShift);

            //移す線を非表示に
            mMassShiftLine.SetActive(false);

            //選択先のハイライトを消し、移し先のハイライトを表示
            ShowModelHilight(mSelect, false, Color.white);
            ShowModelHilight(mDest, true, mDestColor * mDestColorPower);


            //共有ボックスの処理
            //

            ShareWeightBox lSourceShare = mSource.GetComponent <ShareWeightBox>();
            mLightBallShare.Clear();

            //共有ボックスの数だけ光の弾を生成
            foreach (var s in lSourceShare.GetShareAllListExceptOwn())
            {
                GameObject l = Instantiate(mLightBallPrefab, transform);
                l.GetComponent <LightBall>().InitPoint(GetMassPosition(s.gameObject), GetMassPosition(mSource));
                l.GetComponent <LightBall>().PlayEffect();
                mLightBallShare.Add(l);

                s.GetComponent <WeightManager>().WeightLvSeem -= GetShiftWeight();                      //見かけの重さを減らす
            }


            //全ての光る球の到達する時間は一定だ
            //移す元の共有ボックスと、他の共有ボックスの一番近い距離を求め、その時間で到達するように速度を変更する
            //
            float lMinDistance = float.MaxValue;
            foreach (var l in mLightBallShare)
            {
                LightBall lc = l.GetComponent <LightBall>();
                lMinDistance = Mathf.Min((lc.From - lc.To).magnitude, lMinDistance);
            }

            foreach (var l in mLightBallShare)
            {
                LightBall lc = l.GetComponent <LightBall>();
                lc.mMoveSpeed = (lc.From - lc.To).magnitude / lMinDistance * mLightBallTemplate.GetComponent <LightBall>().mMoveSpeed;
            }

            SoundManager.SPlay(mShiftSourceSE);
        }


        //全ての光の弾が移し元へ到達するまで、光の弾の更新を続ける
        //

        var lShareList = mSource.GetComponent <ShareWeightBox>().GetShareAllListExceptOwn();

        bool lAllReach = true;

        for (int i = 0; i < mLightBallShare.Count; i++)
        {
            LightBall      l = mLightBallShare[i].GetComponent <LightBall>();
            ShareWeightBox s = lShareList[i].GetComponent <ShareWeightBox>();
            l.SetPoint(GetMassPosition(s.gameObject), GetMassPosition(mSource));
            l.UpdatePoint();
            if (l.IsReached == false)
            {
                lAllReach = false;
            }
        }

        //全て届いたら
        if (lAllReach == true)
        {
            //光の弾を消去する
            foreach (var s in mLightBallShare)
            {
                DestroyLightBall(s);
            }
            ChangeState(CSelectState.cMoveSourceToDest);                //移し元から移し先へ移す状態へ
        }
    }