前提
UnityでUFOキャッチャーゲームを開発中です。
その中でクレーンを下に下ろし、物を掴み、所定の位置まで移動して、物を落とすという処理が出来なくて困っております。
具体的な処理は以下の通りです。
実現したいこと
1.クレーンが静止中
2.ダウンボタンを押す
→このダウンボタンを一度押した後は、
9が終わるまで、ダウンボタンは再度
押せなくする
3.クレーンが下に移動する
4.ダウンボタンから手を離す
5.クレーンが静止する
6.クレーンがゆっくりと開く
7.クレーンがゆっくりと閉まり、物を掴む
8.物を掴んだクレーンが上にゆっくり移動する(Y列の所定の位置まで)
9.クレーンが横にゆっくり移動する(X列の所定の位置まで)
10.クレーンがゆっくりと開き、物を落とす
11.クレーンがゆっくりと閉まる
発生している問題・エラーメッセージ
・1でクレーンが静止せず、クレーンの開閉が開始してしまいます
・2のダウンボタンが何度も押せてしまいます
・6と7で、クレーンがすごいスピードで震えながら、開閉してしまいます
・8と9でクレーンがすごいスピードで移動してしまいます
・10と11で、クレーンがすごいスピードで震えながら、開閉してしまいます
該当のソースコード
C#
ソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class MoveDown1 : MonoBehaviour { bool down = false; [SerializeField] Button button; public GameObject catcher; private Vector3 pos; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if(down) { bool down = true; godown();//下にクレーンが移動する } else if (!down){ bool down = false; StartCoroutine("catching"); button.interactable = false;//ダウンボタンの無効化 } } IEnumerator catching() { yield return new WaitForSeconds(2); for (int turn = 0 ; turn > -45 ; turn--) { catcher.transform.Rotate(new Vector3(0, 0, -1));//ゆっくりとクレーンが開く yield return new WaitForSeconds(0.01f); } yield return new WaitForSeconds(1);//1秒後 for (int turn = 0 ; turn < 45 ; turn++) { catcher.transform.Rotate(new Vector3(0, 0, 1));////ゆっくりとクレーンが閉まる yield return new WaitForSeconds(0.01f); } yield return new WaitForSeconds(2);//2秒後 while(pos.y < 3.0f) //Y軸の所定の位置までクレーンがゆっくりと移動する { pos = transform.position; transform.Translate(0, 0.01f, 0); yield return new WaitForSeconds(0.01f); } yield return new WaitForSeconds(2); while(pos.x < 3.0f) //X軸の所定の位置までクレーンがゆっくりと移動する { pos = transform.position; transform.Translate(0, 0.01f, 0); yield return new WaitForSeconds(0.01f); } yield return new WaitForSeconds(2); for (int turn = 0 ; turn > -45 ; turn--) { catcher.transform.Rotate(new Vector3(0, 0, -1)); yield return new WaitForSeconds(0.01f);//ゆっくりとクレーンが開く } yield return new WaitForSeconds(1);//1秒後 for (int turn = 0 ; turn < 45 ; turn++) { catcher.transform.Rotate(new Vector3(0, 0, 1)); yield return new WaitForSeconds(0.01f);//ゆっくりとクレーンが閉まる } } public void dPushDown(){ down = true; } public void dPushUp(){ down = false; } public void godown(){//クレーンが下に移動する if(transform.position.y >= 1.0f){ transform.position += new Vector3(0, -5.0f * Time.deltaTime, 0); // transform.rotation = Quaternion.Euler(0, 0, 0); } } }