私はびっくりアニメーションがほしいと思っています。ちょっと早く前後に振ってから元に戻って元の位置に戻ります。ちょうど揺れ続けているのにはたくさんの答えがありますが、どうすれば揺れを減らすことができますか? Lerp
は本当に速いですか?遅くなる機能を持つPingPong
を使用しますか?最後にイージングでオブジェクトを前後に振ってみましょうか?
答えて
あなたは、単に単純に一定時間whileループでYourObjTransform.position = defaultPos + UnityEngine.Random.insideUnitSphere * shakeAmount;
を行い、コルーチン機能で、元の位置を取得することによってでゲームオブジェクトを振ることができます。 GameObjectを振った後、値をデフォルトの位置に戻します。
震えを減らすのは、whileループでshakeAmount += Time.deltaTime;
です。これにより、whileループのシェイク速度が低下します。
以下の機能は、上記の文の完全な例です。 3つのパラメータ、振るGameObject、GameObjectを振るまでの時間、振る舞い始めの時間。例えば
あなたが関数にmyGameOBject
、5f
、3f
に渡した場合、それは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);
}
うわー、これは素晴らしいです!私はこれをできるだけ早くチェックして、それが動作するかどうかを知らせます。再度、感謝します。 – GMR516
振れが大きすぎる場合、 'speed'と' angleRot'変数を減らすことができます。それは、オブジェクトを少し回転させることにより、より現実的なものにする回転も含みます。これはキューブ(3D)でテストされています。スプライトのような2Dオブジェクトを使用する場合は、少し修正してz軸が変更されていないことを確認する必要があります。それはとても簡単です。また、2Dオブジェクトで回転コードを必要としないので、回転コードにコメントする必要があります。 – Programmer
ええ、私は間違いなく私の2Dプロジェクトで作業するためにそれを少し編集します。あなたがカスタマイズできるようになったのは素晴らしいことです。 – GMR516
減衰効果でcos/sin関数を調べます。
A*Pow(e, -bt/2)*cos(f*t)
- 1. 最後に緩やかになっているイージングjQueryエフェクトは何ですか?
- 2. 子オブジェクトは、次のクラスを考えてみましょ親クラスとの間で前後に
- 3. C#最後にリソースを解放するブールなしで試してみましょう。
- 4. は、サブビューを前面に持ってくるでしょうか?
- 5. 最初と最後と最後の名前を使って検索する
- 6. viewpagerは最初のページを最初に読み込まなかったが、スワイプして最後のページに移動した後に読み込む
- 7. 連鎖後の最後にオブジェクトを返します
- 8. 最後のエントリの後ではなく、最後のエントリの前に、csvファイルにデータを追加します。 C++
- 9. 最初のアルファベットと最後のアルファベットを読み取った後にC#で文字列を解析します。
- 10. Powershell Try、Catch:なぜ我々は最後に必要なのでしょうか?
- 11. 最後のアンダースコアの前に
- 12. noobプログラマーが最初に試してみましょう
- 13. UISplitViewControllerの詳細ビューで最後のオブジェクトを削除するとどうなるでしょうか
- 14. JSONオブジェクトのみが最後のレコード
- 15. Html5キャンバスメソッドisPointInPathは最後のオブジェクトのみを決定します
- 16. SaveChangesの前にAddObjectの後にオブジェクトを照会していますか?
- 17. Autodesk Forge:fitToView()によってオブジェクトにフォーカスした後にプログラムでズームアウト
- 18. 最後の項目の前に "and"という単語をカンマで区切って表示します。
- 19. 最後のMercurialチェンジセットとのファイルの相違点は違うでしょうか?
- 20. pdf.jsを1.5にしてrequire.jsを一緒に使ってみましょう
- 21. X秒後に最後のアイテムのみを取ります
- 22. 最後に例外にネストされた振る舞い
- 23. "、" phpのテキストの最後にどうやって削除しますか?
- 24. 最後の行を選択して、前の行の最後の列に移動します
- 25. コードの後ろのアニメーションにイージング機能を適用
- 26. Javascript - オブジェクトの配列をループして、最後のオブジェクトのみを表示
- 27. React - 最後に訪問したページデータを読み込みます
- 28. TaskListタスクリストから最後のタスクを追加した後に空になった
- 29. 最後のオブジェクトが
- 30. 最後にセッションにアクセスしますか?
どのタイプのゲームオブジェクトですか? UIコンポーネント、メッシュレンダラー、またはスプライトレンダラー? – Programmer
スプライトレンダラーは具体的ですが、ゲームオブジェクト全体を移動することはできますか? – GMR516
はいできます。私はすぐに答えを出すでしょう – Programmer