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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

3回答

1949閲覧

float型で数字を滑らかに動かしたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

1クリップ

投稿2019/07/22 10:49

編集2019/07/22 11:08

float型の変数内で数字を滑らかに動かしたいのですが、方法を教えていただけるとありがたいです。
例: 変数xの値の上限が1.5だとして、キーを押すと0から1.5に滑らかに値が上がっていく。

追記
例2:
Vector3.Lerp (現在のポジション, ターゲットのポジション, Time.deltaTime)
の場合、現在のポジションが0で、ターゲットのポジションが1.5
これをfloat型として扱いたいということです。

0 ~ 1.5の値を割合Time.deltaTimeで数字が加算されていくようにするということです。

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

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

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

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

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

ozwk

2019/07/22 10:53

「滑らか」ってなんですか?
退会済みユーザー

退会済みユーザー

2019/07/22 10:56

ごめんなさい。「滑らかってなんですか?」とは具体的にどうわからないのでしょうか?自分の理解力の問題だとは思いますが、教えていただけるとありがたいです。
gentaro

2019/07/22 10:58

たぶん「滑らか」の意味はあなたしか理解してないので、具体例を上げたほうが良いです。
y_waiwai

2019/07/22 11:06

「数字を滑らか」って具体的にどーしたいって話なんでしょうか。
退会済みユーザー

退会済みユーザー

2019/07/22 11:08

文章を追記いたしました。
fuzzball

2019/07/23 02:43

Unityのこと知らないけど x += Time.deltaTime じゃダメなんですか?
退会済みユーザー

退会済みユーザー

2019/07/24 09:56

x += Time.deltaTime のあとにMathf.Clampなどで上限設定すればいけますね。
guest

回答3

0

すでにベストアンサーが出ていますが、世の中にはイージング関数というものがあります。せっかくなので紹介しておきたいと思います。

イージング関数の実装ではLerpを利用しますが、tに与えるパラメータを調整することで動きに表情をつけたり、滑らかにする効果があります。

以前にざっとまとめた資料を書きましたので、下記リンクをご参照ください。
https://scrapbox.io/sayachang/%E3%82%A4%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0

具体的にどうなるの?というのがわかりやすいよう、unitypackageを用意してあります。
以下のパッケージをUnity上で動かしてみると、イージング関数を直感的に理解できやすくなるかもしれません。
https://drive.google.com/file/d/1J3PeZDwWqK59NsKdd1-jGlNWqpn62SJK/view

投稿2019/07/22 12:06

sayachang_bot

総合スコア228

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

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

0

ベストアンサー

Mathf.Lerp - Unityスクリプトリファレンス

「滑らかに値を動かす」のはアニメーションとか補間とか言ったりします。

(あと上のリンクも Vector3.Lerp floatで検索したら一番に出てきたので、検索力上げていきましょう????)

投稿2019/07/22 11:10

編集2019/07/22 11:27
tor4kichi

総合スコア763

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

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

退会済みユーザー

退会済みユーザー

2019/07/22 11:36

ご回答ありがとうございました。もう一つMathf.Lerpについて、ご教授いただきたいことがあるのですが、 public class Practice : MonoBehaviour { float moveSpeed = 0; void Update() { if (Input.GetKey(KeyCode.W)) { moveSpeed = Mathf.Lerp(0, 5, Time.deltaTime); } else { moveSpeed = 0; } Debug.Log(moveSpeed); } } このようなコードで書いた場合、Wキーをずっと押していてもmoveSpeedの値がどうしても0.2以下で止まってしまうのですが、何故なのでしょうか?恐らく私のMathf.Lerpに対する勘違いだと思うのですが教えて頂けるとありがたいです。
fiveHundred

2019/07/22 11:55

横から失礼しますが、tor4kichiさん提示のリンクは確認しましたか? その内容に堂々と以下のように書かれているのですが。 > パラメーター t は [0, 1] の範囲で制限されます。 > > When t = 0 returns a. > When t = 1 return b. > When t = 0.5 returns the midpoint of a and b. 要するに、第3引数はTime.deltaTimeを入れるのは間違いで、0~1の値を入れるところです。
tor4kichi

2019/07/22 11:56

Time.deltaTimeが毎フレーム同じ値なんじゃないでしょうか。 Lerpの第三引数は0.0~1.0に収めないといけません。この値は `現在秒数 / アニメーションさせたい秒数` で出せます。 現在秒数に当たる変数を新しくクラスに追加する必要がありますので、そこから先はご自分で考えてみてください。
YAmaGNZ

2019/07/22 12:01

Lerp(float a, float b, float t)はt=0の時にaを返し、t=1の時bを返します。 t=0.5の時はaとbの中間値を返します。 なので、tを0から1に変化させてやれば、a~bの値となります。
sakura_hana

2019/07/23 01:57 編集

更に横から失礼します。 Time.deltaTimeは「1フレームに掛かった時間(秒)」なので、60fpsだったら「約0.0166」、30fpsだったら「約0.0333」の値を取ります(ちなみに毎フレーム微妙に変わります)。 ですので第3引数にTime.deltaTimeを入れても問題はありません(0〜1の数字だから)。 (もし「5秒で変更完了したい」なら寧ろTime.deltaTimeじゃないとダメです) 皆さんが言う通り、Mathf.Lerpは「第1引数から第2引数に向かう、第3引数分だけ進んだ数字」なので、 moveSpeed = Mathf.Lerp(0, 5, Time.deltaTime); は「0から5に向かう、約0.2だけ進んだ数字」を取り続けます。つまり常に「Time.deltaTime」と同じ値です(なので0.2以下で止まっているように見える)。 ここで必要なのは「moveSpeedが0から5の間を進む」ことなので、正しくは moveSpeed = Mathf.Lerp(moveSpeed, 5, Time.deltaTime); こうなります。(第3引数の値によって変更量が変わるので、もし変更速度を変えたい場合はここに「*5.0f」とかしてください。掛け算は必ずfloatで) ただこれだと最後がちょっとはみ出るかちょっと足りなくなると思います(どっちだったかうろ覚えですが)。 なので「moveSpeedが5より±0.1の範疇だったら5にする」のような処理を入れると綺麗な数字になると思います。(余幅は適宜調節してください)
退会済みユーザー

退会済みユーザー

2019/07/24 10:02

なるほど... それでいけるとはしりませんでした。丁寧なご説明ありがとうございます。
guest

0

タイマイベントかなにかで、定期的に
val+=0.1;
するってことでいいのかな?
これで荒いってことなら、
val+=0.01;
とかでどうでしょうか

投稿2019/07/22 11:10

編集2019/07/22 11:11
y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2019/07/22 11:32

ありがとうございました。参考にしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問