2017-08-01 17 views
2

以下のカメラは、2Dキャラクターをたどることになっている、ここでコードカメラがないスムーズ

void LateUpdate() 
{ 
    var to = target.position; 
    to.z = transform.position.z; 
    var newPos = Vector3.Lerp(transform.position, to, speed * Time.deltaTime); 
    transform.position = newPos; 
    newPos.z = to.z; 
    Debug.DrawRay(newPos, Vector3.up, Color.green, 5); 
} 

は、私はまた、文字やカメラの位置を描くです。私は間違って何をしますか

レッドラインは、文字の位置である、と緑の線は

enter image description here

カメラの位置ですか?

UPDATE:

私が何か面白いものを考え出しました。下の写真の緑の線は、LateUpdateメソッド内でVector3.Lerpによって移動されるカメラの位置です。黄色の線は、FixedUpdateメソッド内でキャラクタのRigidbody2Dに設定したキャラクタの位置で、赤い線はカメラのLateUpdateから見たキャラクタのトランスフォームの位置です。

enter image description here

私が言いたいことは文字の実際の位置は、そのRigidbody2Dコンポーネントによって駆動されていることです。 Rigidbody2Dの "Interpolate"オプションを変更することで、異なる結果を得ることができます。

問題は、Rigidbody2Dの位置にFixedUpdateごとに同じ値を追加しても結果が一貫していないことです。新しい位置と古い位置との距離が、あるべき位置よりも大きい場合があります。

これに加えて、FixedUpdateとは異なる更新レートを持つLateUpdateメソッドでカメラの位置を設定します。したがって、Rigidbody2Dではなく、キャラクタの変換に新しい位置を設定しても、キャラクターのスピードがフレームごとに異なるため、camereは滑らかではありません。

今のところ私には1つの解決策があります。その変換にはなく、そのFixedUpdateではなく、LateUpdateで部屋のRigidbody2D

  • 変更位置にある文字の位置を新しく設定

    その後の位置は次のようになります。このenter image description here

    しかし、カメラの位置がFixedUpdateに設定されているので、それはあるかもしれないほどスムーズではありません、また、i」は

    キャラクタの衝突検出がうまくいくかどうかは確かではありません。キャラクタの位置を変換に直接設定しているからです。

  • +0

    あなただけの2Dフォロー(ちょうどセットポジションをサポートするために変更を加える必要があり、UnityWikiからSmoothCameraスクリプトを試してみてくださいz軸に沿って一定)。ここにリンクがあります: [UnityWiki](http://wiki.unity3d.com/index.php?title=SmoothFollow2&oldid=13960) または [UnityWikiCached](http://webcache.googleusercontent.com/search?q=キャッシュ:iYKRX3r1TwUJ:wiki.unity3d.com/index.php/SmoothFollow2+&cd=1&hl=en&ct=clnk&gl=in&client=firefox-b-ab) –

    +0

    私はシンプルなスクリプトと改良されたものを試しましたが、まだ問題があります。問題はコード内ではなく何かにあります –

    +0

    デバイスのみ、またはエディタとデバイスの両方でスムーズではありませんか? また、これをAwakeのスクリプト 'Application.targetFrameRate = 60; –

    答えて

    1

    補間を使ってどのくらいカメラを移動するかを決定する方法から問題が発生する可能性があります。

    Vector3.Lerpの動作は、第3パラメータ(その割合)が1.0より大きい場合には外挿することになりますが、これは問題である可能性があります(具体的には、 speed * Time.DeltaTimeは1よりも大きくなります。0)

    より良い方法(lerpを排除する)は、スピードと時間以上の距離の補間を行うことができます。

    void LateUpdate() 
    { 
        var to = target.position; 
        to.z = transform.position.z; 
        //you can just multiply a Vector3 with a float 
        //so we can do the interpolation maths ourselves like this : 
        var distanceToMove = (to - transform.position) * speed * Time.deltaTime; 
        var newPos = transform.position + distanceToMove; 
        transform.position = newPos; 
        newPos.z = to.z; 
        Debug.DrawRay(newPos, Vector3.up, Color.green, 5); 
    } 
    

    (それが混乱し得た場合、ここでそれをより簡潔にするバージョンをクリーンアップされる)

    void LateUpdate() 
    { 
        var to = target.position; 
        to.z = transform.position.z; 
        transform.position += (to - transform.position) * speed * Time.deltaTime; ; 
        Debug.DrawRay(transform.position, Vector3.up, Color.green, 5); 
    } 
    
    +0

    +1、これはlerpの使用方法ではありません。 3番目のパラメータはパーセンテージです。ここではデルタ時間を使用しないでください。 この例は、おそらくMoveTowardsに置き換えることができますが、より良いカメラエフェクトのために私はSmoothDampを好む:線形補間は "退屈な"感情を持っています。 – FLX

    +0

    @FLXねえ、私はSmoothDampを知らなかった。ありがとう。 –

    +0

    welp、私は皆さんの提案した両方の変種を試しましたが、何かが変わったようには見えません。私はVector3.Lerp関数(0.1程度の値)で0と1の間の値も使用しています。Time.deltaTimeを使用するとカメラの動きの速度がフレームレートから独立していると考えられました –

    関連する問題