2018년 4월 24일 화요일

Unity(ユニティ)整理:04.左右移動 無限反復 Time.deltaTime, Time.time, Mathf.Sin()

スーパーマリオのような横スクロールケームによくでる地形があります。
空中に浮かんで左右無限反復するので
ちゃんとタイミングを合わせて乗る必要がある地形です。

基本決定
----------
2D プロジェット作成
1.GameObject >>2D Object >> Sprite追加
2.Googleイメージ検索で”minecraft stone”キーワード、アイコンサイズのイメージを1つダウンロード
3.1で追加したSpriteに2でダウンロードしたイメージを設定
4.HierarchyのSpriteをドラックしてAssetsにドロップ(Prefabs作成)、名前を”Stone”に変更
5.HierarchyのSpriteを削除、Assetsの”Stone”をSceneにドラック&ドロップ
6.C# Scriptを”StoneMove”作成、”Stone”に追加
----------


具現1
----------
float rightMax = 2.0f;   //左へ移動可能 (x)最大値
float leftMax = -2.0f;    //右へ移動可能 (x)最大値
float currentPosition;    //現在の位置(x)保存
float direction = 3.0f;   //移動速度+方向

void Start() 
     currentPosition = transform.position.x; 

void Update() 
     currentPosition += Time.deltaTime * direction; 
     if (currentPosition >= rightMax) 
     { 
              direction *= -1; 
              currentPosition = rightMax; 
     } 
     //現在の位置(x) 右へ移動可能 (x)最大値より大きい、もしくは同じの場合
     //移動速度+方向-1を掛けて反転、現在の位置を右へ移動可能 (x)最大値に設定
     else if (currentPosition <= leftMax) 
     { 
              direction *= -1; 
              currentPosition = leftMax; 
     } 
     //現在の位置(x) へ移動可能 (x)最大値より大きい、もしくは同じの場合
     //移動速度+方向-1を掛けて反転、現在の位置をへ移動可能 (x)最大値に設定

     transform.position = new Vector3(currentPosition, 0, 0); 
     //"Stone"の位置を計算された現在の位置に処理
}
----------
Time.deltaTimeは以前プレームが完了されるまで所要された時間です。
1プレームに1ずつ移動するようにすると作動環境によって実際感じる移動速度が変わります。
1秒に1プレーム(Time.deltaTime=1)の環境もあるし
1秒に10プレーム(Time.deltaTime=10)の環境もあるので
その場合Time.deltaTimeを利用すると時間当処理の量を同じく調整可能です。

具現1でも素晴らしいと思います。。が。。
同じ速度で動くので固い感じです。
他の方を調べてみました。

具現2
----------
Vector3 pos;             //現在の位置
float delta = 2.0f;     //左(右)へ移動可能 (x)最大値
float speed = 3.0f;   //移動速度

void Start () { 
         pos = transform.position; 

void Update () { 
         Vector3 v = pos; 
         v.x += delta * Mathf.Sin(Time.time * speed); 
         //左右へ移動可能最大値と反転処理をこんなに一行で素晴らしく処理しますね。
         transform.position = v; 
}
----------
中間では早い、両サイトでは遅くなる加速度まで処理されて、スムーズに動きます。

delta * Mathf.Sin(Time.time * speed); 
を100%理解はできませんでした。(数学が。。)。。
Mathf.Sin()は調べたらf(ラジアンの角度)を入力、-1と1間のfloat値をリターンする関数です。
Time.timeはゲーム開始後から各プレームがスタートした時間です。

Time.timeは続いて増加する数で。。これがラジアン式での角度でSin値が計算され連続の増加、減少の反復が発生されると大体。。理解しました。
-1と1間のfloat値なのでdelta値を掛けても-deltaと+delta間の数になります。




댓글 없음:

댓글 쓰기

1、2、QWER! in OSAKA (大阪 2025/4/10(木) Yogibo META VALLEY)

https://www.creativeman.co.jp/event/qwer-osaka/ QWER - CREATIVEMAN PRODUCTIONS 主催:LIVET 企画:ソニー・ミュージックソリューションズ 招聘:クリエイティブマンプロダクション 制作協力:クリエイテ...