Beispiel #1
0
 // Use this for initialization
 void Start()
 {
     rigidbody          = GameSystemManager.Instance.InitRigidbodyAndGameLevel(this.gameObject);
     startFlickStatus   = new FlickStatus(this.transform.localRotation, FlickType.None);
     presentFlickStatus = new FlickStatus(startFlickStatus.Quater, FlickType.None);
     StartCoroutine(GameSystemManager.Instance.StartCountDown());
 }
 // Use this for initialization
 void Start()
 {
     rigidbody = GameSystemManager.Instance.InitRigidbodyAndGameLevel(this.gameObject);
     startFlickStatus = new FlickStatus(this.transform.localRotation, FlickType.None);
     presentFlickStatus = new FlickStatus(startFlickStatus.Quater, FlickType.None);
     StartCoroutine(GameSystemManager.Instance.StartCountDown());
 }
    /// <summary>
    /// ビューポートから差分のVector3を算出. ターゲットのRigidbodyに回転のトルクを与える.
    /// </summary>
    /// <returns>The rotation torque speed.</returns>
    /// <param name="camera">Camera.</param>
    /// <param name="vectorStart">Vector start.</param>
    /// <param name="vectorPresent">Vector present.</param>
    public void AddTargetGameObjectTorque(Camera camera, FlickStatus startViewportFlick, FlickStatus presentViewportFlick, Rigidbody targetRigidBody, float addSpeed = 1000)
    {
        //タップした初期の座標と現在の座標からビューボードを導き指す.
        Vector3 viewportVectorStart   = startViewportFlick.TouchViewportVector;
        Vector3 viewportVectorPresent = presentViewportFlick.TouchViewportVector;

        //初期値と現在の座標から差分を出す.
        Vector3 viewportVectorDiff = viewportVectorStart - viewportVectorPresent;

        //xとyの座標(値)を入れ替える.
        float viewportDiffY = viewportVectorDiff.y;

        viewportVectorDiff.y = viewportVectorDiff.x;
        viewportVectorDiff.x = viewportDiffY;

        //距離と時間から指の移動速度を求める(きはじの法則). *加算速度.
        viewportVectorDiff.y *= (addSpeed * Time.deltaTime);
        targetRigidBody.AddTorque(viewportVectorDiff);
    }
    /// <summary>
    /// スコアを算出するメソッド.
    /// </summary>
    /// <param name="startFlickStatus">回転を開始したFlickStatus.</param>
    /// <param name="presentFlickStatus">現在のFlickStatus.</param>
    /// <param name="presentDiffEuler">現在の差分.</param>
    private void AddScore(FlickStatus startFlickStatus, FlickStatus presentFlickStatus, float presentDiffEuler)
    {
        //ターゲットが逆回転したら、現在のスコアと円の値をかけて合計回転数の内容を書き換える.
        if (startFlickStatus.Type != presentFlickStatus.Type)
        {
            sumDiffEuler = VariableUtility.angleOf360DegreesFloat * TargetRotationCount;
            return;
        }

        sumDiffEuler += Mathf.Abs(presentDiffEuler);
        int count = Mathf.FloorToInt(sumDiffEuler) / VariableUtility.angleOf360DegreesInt;

        //割った値つまり回転数が現在の回転数よりも多かったら1加算する.
        if (count <= TargetRotationCount)
        {
            return;
        }

        TargetRotationCount++;
    }
    /// <summary>
    /// ターゲットが左右のどちらかを回転しているかを確認、それに合わせてスコアの管理を行うメソッド.
    /// </summary>
    /// <param name="startFlickStatus">回転を開始した時のFlickStatus.</param>
    /// <param name="presentFlickStatus">現在のFlickStatus.</param>
    public void ConfirmationTargetRotation(ref FlickStatus startFlickStatus, ref FlickStatus presentFlickStatus, Rigidbody targetRigidbody)
    {
        //50fps前のFlickStatusを初期化
        if (beforeFlickStatus == null)
        {
            Debug.Log("defore init");
            beforeFlickStatus = new FlickStatus();
        }

        //Y軸の差分を算出.
        float beforeEulerY  = beforeFlickStatus.Quater.eulerAngles.y;
        float presentEulerY = presentFlickStatus.Quater.eulerAngles.y;
        float diffEulerY    = Mathf.DeltaAngle(beforeEulerY, presentEulerY);

        //差分の値から見回転方向を求める(右左).
        presentFlickStatus.Type = SetPresentFlickType(targetRigidbody);

        //ターゲットが回転していないところから処理する.
        if (startFlickStatus.Type == FlickType.None)
        {
            startFlickStatus.Type = SetPresentFlickType(targetRigidbody);
        }

        //ターゲットの現在の回転方向が別の回転を行った時にスタートのFlickStatusを更新する.
        if (startFlickStatus.Type != presentFlickStatus.Type)
        {
            startFlickStatus.RenewalStatus(
                presentFlickStatus.Quater,
                presentFlickStatus.TouchViewportVector,
                presentFlickStatus.Type);
        }

        //スコア加算の処理.
        AddScore(startFlickStatus, presentFlickStatus, diffEulerY);

        //前のフレームのステータスを更新.
        beforeFlickStatus.RenewalStatus(
            presentFlickStatus.Quater,
            presentFlickStatus.TouchViewportVector,
            presentFlickStatus.Type);
    }