質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

525閲覧

UnityでUFOキャッチャーゲームを開発中ですが、クレーンを下に下ろし、物を掴み、所定の位置まで移動して、物を落とすという処理が出来なくて困っております。

koichiii58

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/08/08 04:35

編集2022/08/08 10:52

前提

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); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/08/08 06:56

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
koichiii58

2022/08/08 10:53

ご確認頂きましてありがとうございます。修正いたしました。お手数ですが、引き続きどうぞよろしくお願いいたします。
guest

回答1

0

あまりにもバグだらけで全部読む気にはなりませんが、とりあえず1番だけ。

・1でクレーンが静止せず、クレーンの開閉が開始してしまいます

Updateでelse if (!down){の時にcatchingコルーチンを開始してる訳ですが、そもそもdownは最初からfalseなので
Updateが呼ばれたら最初から条件が成立してコルーチンが開始するのは当然です。
あと、Updateは毎フレーム呼ばれるのにdownの判定も毎フレーム行い、しかもfalse時には

bool down = false;

とかやってる訳ですが、bool宣言している以上ローカル変数になってるので条件判定のdownには何も影響を与えていない上に、そもそもfalse時にfalseを入れても何の意味もありません。

投稿2022/08/09 01:50

drednote

総合スコア336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koichiii58

2022/08/12 04:16

コメント頂きましてありがとうございました。 ご指摘の通りかと思いますので、再度確認しつつ、 バグを無くしていきたいと思います。 どうぞ宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問