###前提・実現したいこと
前回、こちらで質問して、FPSのアングル変更の処理をご教授いただきました。
ご回答者様、ありがとうございました。
仕様は、FPSで垂直方向に関しては-90度~90度までの制限をかけてのアングル変更、水平方向に関しては、制限なく回転できるものです。
その応用で、垂直方向にアングルを変更した際、デフォルトの角度、つまりrotX=0 に戻るようなリセットキーを作りたいと考えています。
現在、そのリセットキーの処理で、瞬時にrotX=0と変わるものは作れました。
しかし、瞬時に切り替わるのではなく、rotX = [現在の角度] から、rotX = 0 までイージング、もしくは等速運動でアングルが変わるものを作りたいと考えています。
ゲームイメージとしては、例えば、天井を見上げてた視界が、体の正面(rotX=0)まで、首を下ろすような動きで、視界が変わる処理です。(地面を見ていた場合は、顔を上げる動きで、地面から正面まで視界が変わる処理。)
コードロジックとして、FixedUpdate()の中で常にrotXが更新されているので、ここから更にrotXの値を連続的に変えていく方法が思いつきません。
どのようなコードを書いたらよいのでしょうか?
###該当のソースコード
C#
1 2 3 4public class GameObjectScript : MonoBehaviour { 5 6 GameObject camera; 7 public float rotSpeed = 5.0f; 8 float rotX = 0.0f, rotY = 0.0f; 9 10 void Start(){ 11 camera = GameObject.Find("Main Camera"); 12 } 13 14 private void FixedUpdate() 15 { 16 // Read input 17 float horizontal = Input.GetAxis("Horizontal"); 18 float vertical = Input.GetAxis("Vertical"); 19 20 rotX -= vertical * rotSpeed; 21 rotY += horizontal * rotSpeed; 22 23 rotX = Mathf.Clamp( rotX, -90.0f, 90.0f ); 24 while( rotY < 0.0f ) { rotY += 360.0f; } 25 while( rotY > 360.0f ) { rotY -= 360.0f; } 26 27 //垂直方向リセット処理。 28 //この処理だと瞬時に切り替わってしまう。 29 //現在のrotXの値から、rotX = 0 の値まで、イージングするような動き、もしくは等速運動で変化させたい。 30 if (Input.GetKeyDown (KeyCode.R)) { 31 rotX = 0; 32 } 33 34 camera.transform.eulerAngles = new Vector3(rotX, rotY, 0.0f ); 35 36 } 37}
###追記。
ご回答ありがとうございます。マイナスの場合の処理を継ぎ足してみました。
C#
1 IEnumerator ResetAngleAnimation() { 2 float speed = 3.0f; //メンバで定義してもよい。 3 if (rotX > 0) 4 { 5 while(rotX > 0) 6 { 7 rotX -= speed; 8 camera.transform.eulerAngles = new Vector3(rotX, rotY, 0.0f ); 9 yield return null; 10 } 11 } 12 else if (rotX < 0) 13 { 14 while(rotX < 0) 15 { 16 rotX += speed; 17 camera.transform.eulerAngles = new Vector3(rotX, rotY, 0.0f ); 18 yield return null; 19 } 20 } 21 22 // 最後はぴったり0になるようにする。 23 rotX = 0; 24 25 camera.transform.eulerAngles = new Vector3(rotX, rotY, 0.0f ); 26 yield return null; 27 }
###追記②。
ご回答ありがとうございます。末尾の「yield return null」は書かなくても問題ないですか?
C#
1 IEnumerator ResetAngleAnimation() { 2 float speed = 3.0f; //メンバで定義してもよい。 3 if (rotX > 0) 4 { 5 (省略) 6 } 7 else if (rotX < 0) 8 { 9 (省略) 10 } 11 12 // 最後はぴったり0になるようにする。 13 rotX = 0; 14 15 camera.transform.eulerAngles = new Vector3(rotX, rotY, 0.0f ); 16 //yield return null; //コメントアウト可? 17 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/12 16:00
2016/09/13 01:36 編集
2016/09/13 09:50
2016/09/13 09:54
2016/09/13 11:12