2016-06-23 25 views
1

私はバウンスボールをプログラムしたいと思います。実際のバウンスは実際の物理法則に従うべきではなく、むしろ絶対サイン波を作り上げるべきです。同様に、これまで非常に簡単です。このイメージ正弦波を遅くするには?

enter image description here

インチ添付のコードを参照してください。

しかし、私はボタンを押すとすぐにボールの動きを遅くしたいと思います。

移動速度が遅くなり、x軸の変換が遅くなります。しかし、正弦波の周波数も振幅も変化していないので、ボールはかなり速く上下に跳ね返っています。しかし、一方または両方を変更すると、これは奇妙な動作で終了します。

ボールが上から下の距離の20%でダウンモーブにいるとします。正弦波のパラメータを変更すると、ボールは即座にy軸上を移動し、実際には奇妙で滑らかに見えません。

私の実際の質問はどのようにして不安定な動きがない絶対正弦波(x/y軸変換)を遅くすることができますか? ( - 、より青い下FREQ - もっと赤い高い)

float _movementSpeed = 10.0f; 
float _sineFrequency = 5.0f; 
float _sineMagnitude = 2.5f; 

Vector3 _axis; 
Vector3 _direction; 
Vector3 _position; 

void Awake() 
{ 
    _position = transform.position; 
    _axis = transform.up; 
    _direction = transform.right; 
} 

void Update() 
{ 
    _position += _direction * Time.deltaTime * _movementSpeed; 
    // Time.time is the time since the start of the game 
    transform.position = _position + _axis * Mathf.Abs(Mathf.Sin(Time.time * _sineFrequency)) * _sineMagnitude; 
} 
+0

y方向の速度は、x方向の速度に完全に依存しませんか? – Dziugas

答えて

0

私はあなたがこれをしたいと思います:

A graph of a sine wave in time with changing frequency これを達成する最も簡単な方法は、これを用いて生成された例えば、deltatimeスケールすることです。

using UnityEngine; 
using System.Collections; 

public class Bounce : MonoBehaviour { 

    // for visualisation of results 
    public Graph graph; 

    [Range(0, 10)] 
    public float frequency = 1; 

    float t; 

    void Update() 
    { 
     t += Time.deltaTime * frequency; 

     float y = Mathf.Abs(Mathf.Sin(t)); 
     float time = Time.realtimeSinceStartup; 

     graph.AddPoint(time, y, Color.Lerp(Color.red, Color.blue, frequency/10)); 
    } 

} 

万全を期すために

Graphクラス:

using UnityEngine; 
using System.Collections.Generic; 

public class Graph : MonoBehaviour { 

    struct PosAndColor 
    { 
     public Vector3 pos; 
     public Color color; 
    } 


    List<PosAndColor> values=new List<PosAndColor>(); 


    public void AddPoint(float x, float y, Color c) 
    { 
     values.Add(new PosAndColor() { pos = new Vector3(x, y, 0), color = c }); 
    } 


    void OnDrawGizmos() 
    { 
     for (int i = 1; i < values.Count; i++) 
     { 
      Gizmos.color = values[i - 1].color; 
      Gizmos.DrawLine(values[i - 1].pos, values[i].pos); 
     } 
    } 

} 

もう1つの方法は、現在の振幅と一致するようにサインのオフセットを使って周波数を変更することです。私はあなたがここにこれを必要としているとは思わないが、もしあなたがしたいのであれば、私はそのテーマについてもう少し投稿することができる。

関連する問題