前提・実現したいこと
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で質問させていただくため説明が下手で申し訳ありません。御助言いただけるとうれしいです.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/20 13:57