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

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

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

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

Unity3D

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

Unity

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

Q&A

1回答

2779閲覧

UnityでSlerp関数が一部うまく動きません

ioroku

総合スコア4

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/02/19 11:59

前提・実現したいこと

Unityで三人称視点の簡単な3Dゲームを作ろうとしているのですが,会話を行うときにカメラがズームイン,会話が終わればズームをやめたいのですがうまくいきません.
なめらかにズームするためにSlerp関数を用いてカメラを特定の位置に移動させ,会話が終わればもとの位置にSlerp関数で移動させようとしています.

発生している問題

ズームを行うときはなめらかに移動してくれるのですが,何故か会話が終わり保存しておいた元の位置に戻るためのSlerp関数がうまく働きません.

該当のソースコード

c#

1void Update() 2 { 3 if (zoom) 4 { 5 transform.position = Vector3.Slerp(transform.position, conversationPos.position, SmoothFactor); 6 transform.rotation = Quaternion.Slerp(transform.rotation, conversationPos.rotation, SmoothFactor); 7 Debug.Log("zoom移動中"); 8 } 9 if (Vector3.Distance(transform.position, conversationPos.position) < 0.1f) zoom = false; 10 11 if (reset) 12 { 13 transform.position = Vector3.Slerp(transform.position, pos, SmoothFactor); 14 transform.rotation = Quaternion.Slerp(transform.rotation, rot, SmoothFactor); 15 Debug.Log("reset移動中"); 16 } 17 if (Vector3.Distance(transform.position, pos) < 0.1f) reset = false; 18 } 19 20 public void ZoomConversation() 21 { 22 pos = transform.position; 23 rot = transform.rotation; 24 canControl = false; 25 zoom = true; 26 } 27 28 public void ResetPos() 29 { 30 reset = true; 31 canControl = true; 32 }

コードの説明

ZoomConversation()は会話を行うときに呼び出され,ResetPos()は会話が終了されたときに呼び出されます.conversationPosはプレイヤーの子オブジェクトの位置が格納されています.zoomやresetはこの処理のためだけに使用しているbool型の変数です.SmoothFactorはfloat型の変数で0.08fが代入されています.

Console

実行時の写真

発生してる問題(画像参照)

画像のようにズームをやめたときの処理が1度しか呼び出されていないようで,ズームをしたときはなめらかに近づいてくれるのですが,カメラが離れるときは瞬間的に移動してしまいます.

試したこと

  • resetをfalseにするif文の問題かと思いDistanceの条件を"<0.001f"としてみると,実行すると会話が終了したあと何百回も"reset移動中"となるだけでカメラの位置はパッと変わってしまいました.
  • 途中でSmoothFactorが変化しているのかと思いSmoothFactorがかいてあるところに直接0.08fと書いてみても処理は変わりませんでした.

補足情報

はじめてteratailで質問させていただくため説明が下手で申し訳ありません。御助言いただけるとうれしいです.

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

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

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

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

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

guest

回答1

0

Slerp(Lerp)はこのようにして使います

void Start(){ srcpos = new Vector(0, 0, 0); dstpos = new Vector(10,10,10); time = 0f; } void Update(){ time += Time.deltaTime; transform.position = Vector3.Slerp(srcpos, dstpos, time); }

基本的にSmoothFactor に当たる部分に経過時間を足していくという使い方をします

今の使い方だと、1フレームで0.08移動ということなので、
10m離れた位置を指定すると、1フレームで0.8m、60fpsなら、秒速48mという速度で移動し始めます

あと、Zoomで一定距離以下で打ち切っていますが、そのせいで、指定した座標と少しずれた位置でとまるようになっています

あと、ZoomとResetは変数が違うだけで本質的に同じ処理ですね
もし、ZoomもResetもONになると変な動きを始めると思います

投稿2020/02/20 02:46

izmktr

総合スコア2856

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

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

ioroku

2020/02/20 13:57

返答ありがとうございます. zoomは会話を開始するとき,resetは会話が終了するときに制御するため今のところは,同時に処理が行われることはないのですが,答えていただいたように秒速48mで移動するとしたら,zoomの時は一瞬で移動することなく54フレーム実行されているのに,resetの場合では同じ処理をしているはずなのに一瞬で移動してしまい,1フレームで距離が1以下になってしまうのでしょうか? それぞれカメラが移動する経路は,会話中動かないので開始地点と終了地点が入れ替わっているだけです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問