質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

4896閲覧

Unity2DでのRPGのマップシステム

ninogojo32

総合スコア18

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

5クリップ

投稿2015/08/29 13:44

Unity2DでRPGツクールみたいなマップシステム(キャラクターの最小移動単位がマップチップの大きさと等しく、二次元配列でマップの状態を表現できるようなもの)をつくろうとして、下のようなコード(一部省略、移動方向を上方向に限定)をキャラクターオブジェクトにアタッチしました

c#

1float speed=0; //awakeで0.32(マップチップひとマス分)/deltaFlameが代入される 2int deltaFlame=8; 3bool moving=false; 4 5void Update() 6{ 7 8if (!moving) 9{ 10 if (Input.GetKey(KeyCode.UpArrow) ) 11 { 12 moving = true; 13 } 14} 15 16if (moving) 17{ 18 if (charai < deltaFlame) 19 { 20 charai++; 21 transform.position = new Vector3(transform.position.x, transform.position.y + speed, 0); 22 } 23 if (charai >= deltaFlame) 24 { 25 charai = 0; 26 moving = false; 27 } 28 29} 30 31}

しかし、これだとフレームの時間的な差分が考慮されていないのでキャラクターの動きががたがたになってしまいます。
どうすればこのようなコードにtime.deltatimeを組み込めるでしょうか?

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分で試せていなくて申し訳ないのですが、AssetStoreで入手出来るiTweenという無料アセットを導入するのが一般的なようです。
参考記事

導入すると、以下の様に書くことができるかと思います。

csharp

1float delayTime = 0.5f; // 移動にかける時間(秒) 2float cellSize = 0.32f; // セル幅 3bool moving = false; // 移動中かどうか 4 5void Update() { 6 if (!moving && Input.GetKey(KeyCode.UpArrow)) { 7 moving = true; 8 Vector3 moveTarget = transform.position; 9 moveTarget.y += cellSize; 10 iTween.MoveTo(gameObject, iTween.Hash( 11 "position", moveTarget, 12 "time", delayTime, 13 "oncomplete", "moveComplete", 14 "oncompletetarget", gameObject 15 )); 16 } 17} 18 19public void moveComplete() { 20 iTween.Stop(gameObject, "move"); 21 moving = false; 22}

iTweenを使わずに自前で書く場合は、transform.position.yの目的数値を計算しておいて、そこに達するまでUpdate関数内でspeed*Time.deltaTimeを加算、という流れになるかと思います。

ただ、質問者さんもおっしゃっている通りUpdate関数の呼び出し頻度はフレームレートの影響を受けるため、場合によっては目的地を少々過ぎた位置で止まってしまう可能性はあります。
1回移動するだけであればこの誤差は非常に小さいと思いますが、単純に「現在位置+セル幅」での目的position計算を繰り返していると誤差が段々大きくなるかと思いますので注意が必要です。

投稿2015/08/31 03:35

編集2015/08/31 03:43
hy3

総合スコア594

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ninogojo32

2015/08/31 11:55

回答ありがとうございます。 今はプログラムの勉強の一環としてunityを使っているので、アセットを導入するつもりはありません。 回答者様のおっしゃったとおり、speed*Time.deltaTimeでは誤差が大きくなってしまったため、Time.deltaTimeの平均値でTime.deltaTimeを割った値をspeedに乗算し、キャラクターの移動が止まった時点で(方向キーから指を離したタイミングで)誤差を修正する方式にしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問