2016-05-13 2 views
1

私は一定の期間にわたって正確に90度にゆっくりと変化する関数を書いています。これまでのところすべてがうまくいきました。変換センターを中心に回転するのではなく、ポイントを中心に回転させる方法を理解するだけです。Unity3d時間の経過とともに特定の点を中心に回転する

protected bool _isRotating = false; 
public IEnumerator RotateWithEasing(GameHelper.Axis axis, Vector3 isolatedAxisPoint, float inTime) 
{ 
    if(_isRotating) 
    { 
     yield break; 
    } 

    _isRotating = true; 

    var degrees = this.GetDegreesFromAxis(axis); 

    Quaternion fromAngle = transform.rotation; 
    Quaternion toAngle = Quaternion.Euler(transform.eulerAngles + degrees); 
    for (float t = 0f; t < 1f; t += Time.deltaTime/inTime) 
    { 
     transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t); 
     yield return null; 
    } 

    _isRotating = false; 
} 

誰もが、それは指定されたisolatedAxisPointの周りを回転するので、どのように私はこれを変更することができ、正しい方向に私を指す助けることができますか?

+0

点の周りに円を描き、その円に沿って移動しますか? – Master117

+0

それはうまくいくように聞こえますが、私は「quaternion.Lerp」または「Quaternion.Slerp」を使用しています。これは –

+1

のためにあなたは非常にうまくいくかもしれません(http:// docs。 unity3d.com/ScriptReference/Transform.RotateAround.html)を「速度*デルタタイム」と組み合わせれば、簡単にタイミングを追加することができます –

答えて

5

ここに実際の例があります。Unity Tweenはテキストエディタで別のウィンドウを表示していました。

あなたが何かを回転させたい場合は、それだけのIEnumeratorのループでdeltaTimeを使用し、オイラー角を調整するか、単に回しを呼び出す簡単です。 (Unityでは何らかの理由で四元数を使用しないでください)。この例では、Rotateを呼び出します。

これはUnityの非常に基本的なパターンです。です。

ユニティののトゥイーンの基本パターンは以下の通りです:Unityでこれを1000回実行します!

  1. は、適切な画分によってその時間は、各フレーム
  2. に到達するまで、whileループを行うスライド(または任意の)終了時刻を算出します。

注もちろん、あなたループ内

yield return null; 

こと、それは「次のフレームまで待つ」という意味。

(あなたはそれが完璧であることを知っているので、任意のトゥイーンと同じように、それは力・セット終わりに最終値に良い習慣だということに注意してください。ループがあるときに、この例では、通知は私が単に最後に、オイラー角を設定します{実際のコード例では、 "delta"は1つの軸だけであることに注意してください。これを心配しないでください、それはコルーチンを使用するトゥイーンの単なる例です。

注 - もちろん、"2つの方法"がループ内に入ることがあります。の額をと計算すると、そのフレームを移動する必要があります。または、新しいポジションがその時になるべきものを計算することができます。それはあなた次第です。多くのプログラマーは後者がもっと論理的だと思っています。特定の時間が経過するまでwhileループを実行することも、目的地に達するまでwhileループを実行することもできます。 (フロートの平等については非常に注意してください。)あなたの選択はあなたのものです。非常に非常に多くの場合、あなたがそのようなトゥイーンでLerpまたはより良いSmoothStepを使用

注意。ユニティではどこにでもあります。基本パターンをマスターしたら、そのパターンを試してみてください。

私の例では、コードはUnityEventを使用してアニメーションの開始と終了にフラグを立てています。これは非常に一般的です。結局のところ、いくつかの動きが終わると、あなたは何か別のことをしなければならないのです。もう1つの良い例は、何かがアニメーション化している間に、ユーザーはステアリングやゲームの中の何かを言うことからブロックされています。 UnityEventへ

優秀なイントロhttps://stackoverflow.com/a/36249404/294884のplsは記録のために:)


をそれを投票します。

ユニティのTweeng。ユニティでトゥイーンする

真に高度な方法がtweengにある:

Basic Tweeng code base appears in this question.

それはそれのこつを取得するにはしばらく時間がかかりますが、それは信じられないほど強力です。 tweengの拡張はほんの数行のコードにすぎないことは気になります。

+0

ありがとうございますこれは私が探していたものです、私は家に帰るときにこれをテストします、ただrollCompleteがデリゲートに組み込まれているのだろうか?あるいは、それが完全になるまで何度も何度も呼ばれるのを防ぐある種のイベントシステム? –

+0

ありがとう、終わりのオイラーの角度を設定するヒントについては、アングルの前に浮動小数点の小数点エラーを丸めるためにわずかな違いがあることが気付いた。 –

+0

こんにちはJohnny、これはまさにUnityの正しいパターンです。それは最も基本的なもののようなものですが、時にはUnityで今までプログラムしてきたような感じです。 "rollComplete"は "unityEvent"です。完全な説明が含まれています。このようなコルーチンのトゥイーンは、UnityEventを使用する場所の素晴らしい例です。 – Fattie

0

使用するもののような、90度1秒で回転すると仮定すると:のstartTime + 0の

int rotatedDegrees; 
int desiredRotation = 90; 
float startTime = null; 
float rotationDuration = 1f; 

public void rotate() 
{  
    if(startTime == null) 
    startTime = time.Now; 

    while((time.Now - starttime)/rotationDuration > (((float) rotatedDegrees)/desiredRotation)) 
    { 
    transform.RotateAround (isolatedAxisPoint, Vector3.up, 1); 
    rotatedDegrees++; 
    } 
} 

それが0度回転しています。

ここでtime.NowはstartTime + 0.1(+ 100ms)のようなものです。それからtime.Now - startTimeは0.1です。(rotateDegrees/desiredRotation)が0.1、すなわち9、つまり全回転の1/10になるまで回転します。

+0

興味深いですが、time.NowはrotateDegrees/desiredRotationに関連していますが、time.nowは常に増加していません。これは変数が変更されないようにコルーチン内にあるべきではありませんか? –

+0

@ johnny5編集、time.Now - 開始時間=回転が開始されてからの時間。 – Master117

+0

ありがとう、これは私が家に帰ったときに病気をテストします。それが動作すれば私は完全なものとしてそれをマークします –

関連する問題