バージョン:Unity 2019.2.11f1 (64-bit)
float型で0.01fずつ足していく以下のようなスクリプトを作りました。(addの部分)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class addforce_ctrl_src : MonoBehaviour { public float add = 0.01f; public float power = 10f; public Vector3 direction = new Vector3(1f, 1f, 1f); Rigidbody rb; bool stop_f = false; Vector3 start_pos; //初期位置 void Start() { start_pos = transform.position; rb = GetComponent<Rigidbody>(); rb.isKinematic = true; } private void Update() { if (Input.GetKeyDown("q")) { if (stop_f == false) { rb.isKinematic = false; rb.AddForce(direction * power, ForceMode.Impulse); stop_f = true; StartCoroutine("SampleCoroutine"); } else { Time.timeScale = 1f; stop_f = false; } } if (stop_f) { //一時停止中に上を押すと if (Input.GetKeyDown(KeyCode.UpArrow)) { rb.isKinematic = true; transform.position = start_pos;//初期位置に戻す direction.x += add; //X方向の力を+0.01する rb.isKinematic = false; rb.AddForce(direction * power, ForceMode.Impulse);//力を加える Time.timeScale = 1f; //再開させる StartCoroutine("SampleCoroutine"); } //一時停止中に下を押すと if (Input.GetKeyDown(KeyCode.DownArrow)) { rb.isKinematic = true; transform.position = start_pos;//初期位置に戻す direction.x -= add; //X方向の力を-0.01する rb.isKinematic = false; rb.AddForce(direction * power, ForceMode.Impulse);//力を加える Time.timeScale = 1f; //再開させる StartCoroutine("SampleCoroutine"); } } } IEnumerator SampleCoroutine() { yield return null; //1フレーム待機 これをしないと軌道の計算ができない Time.timeScale = 0f; //中断 yield break; //コルーチンを終了 } }
【問題1】
キーボードの上キーや下キーを繰り返し押していくと、
float型のため、誤差がでてしまい値が、おかしくなってしまいます。
(途中で 例 0.0199999 などと、ズレがでてきてしまう)
これを回避する書き方が、ネットで調べてみてもわからなかったため、
どういう記述をすれば、0.01ずつ値を変えることができますでしょうか。
【問題2】
transform.position = start_pos;//初期位置に戻す
上記の初期位置に戻す処理も、float型のため、繰り返していくと
最初の位置からずれてしまいます。これも、回避方法がありますでしょうか。
よろしくお願いたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/12 19:57
2020/10/12 20:35