前提・実現したいこと
Rigidbodyで目的ポイントまで、上下に永続的に動く床(上と下で2秒停止付)
(コルーチンで制御する方法を一個前の質問で教えていただきました。その流れでの質問です。)
発生している問題・エラーメッセージ
上下にPingPongするものや、目的のポイントまで動くのまでは機能しましたが 床を一定時間止めて、また逆方向に動いたりをどう 書けばいいかというところで詰まってます。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class coltin : MonoBehaviour 6{ 7 8 private Rigidbody rb; 9 public float speed = 1.0f; 10 public Vector3 direction = new Vector3(0f, 5f, 0f); 11 12 void Start() 13 { 14 rb = GetComponent<Rigidbody>(); 15 // コルーチン開始 16 StartCoroutine("ChangePsition"); 17 } 18 19 20 // ポジション変更 21 IEnumerator ChangePsition() 22 { 23 yield return new WaitForSeconds(2); 24 Debug.Log("2秒"); 25 26 while (true) 27 { 28 float step = speed * Time.deltaTime; 29 rb.MovePosition(Vector3.MoveTowards(transform.position, direction, step)); 30 yield return null; 31 //1フレーム待つ 32 } 33 } 34}
現状だと上にあがったままなので、元の位置にもどり
上と下それぞれ2秒停止しエレベータのように
動かせないかコードを考えています。
試したこと
C#
1using UnityEngine; 2using System.Collections; 3 4public class rigiido : MonoBehaviour 5{ 6 7 private Rigidbody rigid; 8 private Vector3 defaultPos; 9 10 void Start() 11 { 12 rigid = GetComponent<Rigidbody>(); 13 defaultPos = transform.position; 14 } 15 16 void FixedUpdate() 17 { 18 rigid.MovePosition(new Vector3(defaultPos.x, defaultPos.y + Mathf.PingPong(Time.time,5), defaultPos.z)); 19 } 20}
これだと上下し続けてくれますが、任意の場所で
任意の秒数を止めたりができない感じです。
###自己進展があったので追記します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class coltin : MonoBehaviour { private Rigidbody rb; public float speed = 1.0f; public Vector3 direction = new Vector3(0f, 5f, 0f); void Start() { rb = GetComponent<Rigidbody>(); // コルーチン開始 StartCoroutine("ChangePsition"); } // ポジション変更 IEnumerator ChangePsition() { yield return new WaitForSeconds(2); Debug.Log("2秒"); while (transform.position.y < 5) { float step = speed * Time.deltaTime; rb.MovePosition(Vector3.MoveTowards(transform.position, direction, step)); yield return null; //1フレーム待つ } //もう一つのコルーチンを実行する StartCoroutine("ChangePsition2"); } IEnumerator ChangePsition2() { yield return new WaitForSeconds(2); Debug.Log("2秒"); while (transform.position.y > 0.5) { float step = speed * Time.deltaTime; rb.MovePosition(Vector3.MoveTowards(transform.position, -direction, step)); yield return null; } //もう一つのコルーチンを実行する StartCoroutine("ChangePsition"); } }
これでとりあえず目的の動きがしてる感じがしますが、動作をランニングテストしてます。
while 条件の数値を手入力してるので、public Vector3 direction = new Vector3(0f, 5f, 0f);を自動で入るようにしたほうがいいのか検討中。
もっといい方法や何かアドバイスあればよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Unity2019.2.9f1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/08 06:52
2020/06/08 06:59
2020/06/08 11:56
2020/06/08 20:45