기본 콘텐츠로 건너뛰기

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間の数になります。




댓글

이 블로그의 인기 게시물

백준 3053번 택시기하학 문제에서 배운것들-택시기하학, 원주율값(π: 파이) M_PI, double과 float의 차이

https://www.acmicpc.net/problem/3053 3053번: 택시 기하학 문제 19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + |y1-y2| 두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다. 따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다. 원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합 www.acmicpc.net 단계별로 풀어보기 수학2의 관문 3053번 택시기하학과 마주했습니다. 일단 문제를 이해를 하지 못했습니다. 유클리드 기하학, 비유클리드 기하학인 택시 기하학.. 각각의 원의 넓이를 구하라고?!?! https://m.blog.naver.com/alwaysneoi/100172516753 [택시 기하학] 유클리드 기하학과 택시 기하학의 차이 지금까지 우리가 배운 것은 유클리드 기하학이다 우리가 초등학교를 시작으로 중학교를 거쳐 고등학교까지 ... blog.naver.com 유클리드 기하학에서의 원과 택시 기하학에서의 원이 다르다는것을 이해해야했습니다. 한점에서 같은 거리에 있는 점들의 집합이 원이고 유클리드 기하학에서는 중간의 방해물을 고려하지 않기 때문에 일반적으로 생각하는 구형의 원이됩니다만 택시 기하학에서는 중간의 방해물(건물)을 피해서 길로만 거리계산을 하면 다이아몬드형태의 원이됩니다. 원주율값(π: 파이) 은  반지름을 R이라고 했을때 유 클리드 기하학은 π*R*R 택시 기하학은 2*R*R 이 됩니다. 이제 계산만 하면 됩니다. "정답과의 오차는 0.0001까지 허용한다"라는 문구가 있습니다. 단영히  원주율값(π: 파이) 을 산수계산하듯이 3.14로 하면

Xcodeのc++プロジェクトでofstreamでファイル作成ができない場合の処理

macOS SieraのXcode 9.2でc++でテキストファイルを生成するプログラムを作成しました。実行するとエラーもなく、問題はなさそうですが実際にファイルが作成されません。 ----------------------- #include <fstream> using namespace std; int main(void) {     ofstream myText("Hello.txt");     myText << "Hello Text!" << endl;     myText.close();     return 0; } ----------------------- プロジェクトのソースファイルと同じパスを予想して確認してますがありません。 ファイルを検索してみても見つかりませんでした。 ----------------------- ofstream myText("Hello.txt"); ----------------------- 部分を ----------------------- ofstream myText("/Users/xxxxxx/Documents/Hello.txt"); ----------------------- の絶対パスにすると作成されました。 現在の作動パスを認識してないようでした。 stackoverflowで解決法を見つけたので整理します。 C++ Program in Xcode not outputting simple text file using outFile XcodeプロジェクトのSchemeで作業ディレクトリの設定が必要でした。 1)実行ボタン(RUN)の右側のプロジェクト名部分をクリック>>Edit Scheme 2)Run>>Options>>Working Directory   Use custom working directoryをチェックしてパス選択、設定 ちゃんと生成されました! Xcode의 c++프로젝트에서 ofstream으로 파일작성이 안