2016-09-08 4 views
1

私はびっくりアニメーションがほしいと思っています。ちょっと早く前後に振ってから元に戻って元の位置に戻ります。ちょうど揺れ続けているのにはたくさんの答えがありますが、どうすれば揺れを減らすことができますか? Lerpは本当に速いですか?遅くなる機能を持つPingPongを使用しますか?最後にイージングでオブジェクトを前後に振ってみましょうか?

+0

どのタイプのゲームオブジェクトですか? UIコンポーネント、メッシュレンダラー、またはスプライトレンダラー? – Programmer

+0

スプライトレンダラーは具体的ですが、ゲームオブジェクト全体を移動することはできますか? – GMR516

+0

はいできます。私はすぐに答えを出すでしょう – Programmer

答えて

3

あなたは、単に単純に一定時間whileループでYourObjTransform.position = defaultPos + UnityEngine.Random.insideUnitSphere * shakeAmount;を行い、コルーチン機能で、元の位置を取得することによってでゲームオブジェクトを振ることができます。 GameObjectを振った後、値をデフォルトの位置に戻します。

震えを減らすのは、whileループでshakeAmount += Time.deltaTime;です。これにより、whileループのシェイク速度が低下します。

以下の機能は、上記の文の完全な例です。 3つのパラメータ、振るGameObject、GameObjectを振るまでの時間、振る舞い始めの時間。例えば

あなたが関数にmyGameOBject5f3fに渡した場合、それは5秒の合計時間のためmyGameOBjectを振るだろう。 myGameOBjectを振ってカウンタが3に達すると、タイマが5に達するまで、振れの速度(shakeAmount)が減少し始めます。

振るゲームオブジェクトがSpriteRenderの場合は最後のパラメータに渡します。その結果、z軸は動かず、振るとZ軸だけ回転します。

public GameObject GameObjectToShake; 
bool shaking = false; 

IEnumerator shakeGameObjectCOR(GameObject objectToShake, float totalShakeDuration, float decreasePoint, bool objectIs2D = false) 
{ 
    if (decreasePoint >= totalShakeDuration) 
    { 
     Debug.LogError("decreasePoint must be less than totalShakeDuration...Exiting"); 
     yield break; //Exit! 
    } 

    //Get Original Pos and rot 
    Transform objTransform = objectToShake.transform; 
    Vector3 defaultPos = objTransform.position; 
    Quaternion defaultRot = objTransform.rotation; 

    float counter = 0f; 

    //Shake Speed 
    const float speed = 0.1f; 

    //Angle Rotation(Optional) 
    const float angleRot = 4; 

    //Do the actual shaking 
    while (counter < totalShakeDuration) 
    { 
     counter += Time.deltaTime; 
     float decreaseSpeed = speed; 
     float decreaseAngle = angleRot; 

     //Shake GameObject 
     if (objectIs2D) 
     { 
      //Don't Translate the Z Axis if 2D Object 
      Vector3 tempPos = defaultPos + UnityEngine.Random.insideUnitSphere * decreaseSpeed; 
      tempPos.z = defaultPos.z; 
      objTransform.position = tempPos; 

      //Only Rotate the Z axis if 2D 
      objTransform.rotation = defaultRot * Quaternion.AngleAxis(UnityEngine.Random.Range(-angleRot, angleRot), new Vector3(0f, 0f, 1f)); 
     } 
     else 
     { 
      objTransform.position = defaultPos + UnityEngine.Random.insideUnitSphere * decreaseSpeed; 
      objTransform.rotation = defaultRot * Quaternion.AngleAxis(UnityEngine.Random.Range(-angleRot, angleRot), new Vector3(1f, 1f, 1f)); 
     } 
     yield return null; 


     //Check if we have reached the decreasePoint then start decreasing decreaseSpeed value 
     if (counter >= decreasePoint) 
     { 
      Debug.Log("Decreasing shake"); 

      //Reset counter to 0 
      counter = 0f; 
      while (counter <= decreasePoint) 
      { 
       counter += Time.deltaTime; 
       decreaseSpeed = Mathf.Lerp(speed, 0, counter/decreasePoint); 
       decreaseAngle = Mathf.Lerp(angleRot, 0, counter/decreasePoint); 

       Debug.Log("Decrease Value: " + decreaseSpeed); 

       //Shake GameObject 
       if (objectIs2D) 
       { 
        //Don't Translate the Z Axis if 2D Object 
        Vector3 tempPos = defaultPos + UnityEngine.Random.insideUnitSphere * decreaseSpeed; 
        tempPos.z = defaultPos.z; 
        objTransform.position = tempPos; 

        //Only Rotate the Z axis if 2D 
        objTransform.rotation = defaultRot * Quaternion.AngleAxis(UnityEngine.Random.Range(-decreaseAngle, decreaseAngle), new Vector3(0f, 0f, 1f)); 
       } 
       else 
       { 
        objTransform.position = defaultPos + UnityEngine.Random.insideUnitSphere * decreaseSpeed; 
        objTransform.rotation = defaultRot * Quaternion.AngleAxis(UnityEngine.Random.Range(-decreaseAngle, decreaseAngle), new Vector3(1f, 1f, 1f)); 
       } 
       yield return null; 
      } 

      //Break from the outer loop 
      break; 
     } 
    } 
    objTransform.position = defaultPos; //Reset to original postion 
    objTransform.rotation = defaultRot;//Reset to original rotation 

    shaking = false; //So that we can call this function next time 
    Debug.Log("Done!"); 
} 


void shakeGameObject(GameObject objectToShake, float shakeDuration, float decreasePoint, bool objectIs2D = false) 
{ 
    if (shaking) 
    { 
     return; 
    } 
    shaking = true; 
    StartCoroutine(shakeGameObjectCOR(objectToShake, shakeDuration, decreasePoint, objectIs2D)); 
} 

void Start() 
{ 
    shakeGameObject(GameObjectToShake, 5, 3f, false); 
} 
+0

うわー、これは素晴らしいです!私はこれをできるだけ早くチェックして、それが動作するかどうかを知らせます。再度、感謝します。 – GMR516

+0

振れが大きすぎる場合、 'speed'と' angleRot'変数を減らすことができます。それは、オブジェクトを少し回転させることにより、より現実的なものにする回転も含みます。これはキューブ(3D)でテストされています。スプライトのような2Dオブジェクトを使用する場合は、少し修正してz軸が変更されていないことを確認する必要があります。それはとても簡単です。また、2Dオブジェクトで回転コードを必要としないので、回転コードにコメントする必要があります。 – Programmer

+0

ええ、私は間違いなく私の2Dプロジェクトで作業するためにそれを少し編集します。あなたがカスタマイズできるようになったのは素晴らしいことです。 – GMR516

0

減衰効果でcos/sin関数を調べます。

A*Pow(e, -bt/2)*cos(f*t) 
関連する問題