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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

4回答

4410閲覧

C# 何度も実行してしまうものを一度だけ実行したい

mikichom_1229

総合スコア5

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/10/17 10:25

編集2021/10/17 11:33

何度も実行してしまうものを一度だけ実行したいです。

ImageのFillAmountが1以上なら、Daimahouboolをtrueにすると書き込めば、一度だけ実行されると思ったのですがtrueの内容が何度も実行されてしまいます。
1以上なら常に実行されるようになっているために、何度も実行してしまうと思うのですが、1度だけ実行する方法を教えていただきたいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Playables; 5using UnityEngine.UI; 6 7public class DaimahouScript : MonoBehaviour 8{ 9 private bool Daimahoubool; 10 11 public PlayableDirector director; 12 public Image DaimahouGage; 13 14 public GameObject DaimahouUI; 15 16 public GameObject Book; 17 18 public GameObject MovieBook; 19 public GameObject Touroku; 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 DaimahouGage = DaimahouGage.GetComponent<Image>(); 25 Daimahoubool = false; 26 } 27 28 // Update is called once per frame 29 void Update() 30 { 31 if (DaimahouGage.fillAmount >= 1) 32 { 33 Daimahoubool = true; 34 } 35 36 if(Daimahoubool == true) 37 { 38 Book.GetComponent<bookaction>().enabled = false; 39 director.Play(); 40 Touroku.SetActive(true); 41 MovieBook.SetActive(true); 42 DaimahouUI.SetActive(false); 43 } 44 } 45 46}

スクリプトを以下のように修正しました。
実行は一度だけになったのですが、DaimahouUIが非アクティブになってくれません。
ImageがDaimahouUIの中にあるからでしょうか?
この場合どうすればよいのか教えていただきたいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Playables; 5using UnityEngine.UI; 6 7public class DaimahouScript : MonoBehaviour 8{ 9 private bool Daimahoubool = false; 10 11 public PlayableDirector director; 12 public Image DaimahouGage; 13 14 public GameObject DaimahouUI; 15 16 public GameObject Book; 17 18 public GameObject MovieBook; 19 public GameObject Touroku; 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 DaimahouGage = DaimahouGage.GetComponent<Image>(); 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 if (DaimahouGage.fillAmount == 1) 31 { 32 if (!Daimahoubool) 33 { 34 Daimahoubool = true; 35 36 Book.GetComponent<bookaction>().enabled = false; 37 director.Play(); 38 Touroku.SetActive(true); 39 MovieBook.SetActive(true); 40 DaimahouUI.SetActive(false); 41 } 42 } 43 } 44 45}

また、スクリプトを以下のように変更すると非アクティブ化はするのですが点滅しながら非アクティブになってしまいます。

C#

1 void Update() 2 { 3 if (DaimahouGage.fillAmount == 1) 4 { 5       DaimahouUI.SetActive(false); 6 if (!Daimahoubool) 7 { 8 Daimahoubool = true; 9 10 Book.GetComponent<bookaction>().enabled = false; 11 director.Play(); 12 Touroku.SetActive(true); 13 MovieBook.SetActive(true); 14 } 15 } 16 }

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

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

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

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

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

guest

回答4

0

しょーもない回答ですが、気になったので。

まず、命名規則がよくわかりません。

private bool Daimahoubool; とありますが、これはどういう意味でしょうか。

読み方によっては『大魔法を使うことが出来る(状態)』とも読めますし、『大魔法を使った(ため、ゲージが溜まるまで使えない状態)』とも読めます。

今回はそこまで問題はありませんが、たとえば一か月後、デバッグしたり機能を追加したりすると、自分だけで開発する場合でも混乱してしまいます。

なので、AlreadyUsedDaimahou のように『使った(という状態)』なのか CanUseDaimahouのように『使える状態』なのかをはっきりさせた方が無難ですよ。

それと、今回の質問についてですが、ざっと読んだ感じでは、「フラグを折る作業」がありません。

StartメソッドでDaimahouboolをfalseに → Updateメソッドの最初でDaimahouboolをtrueに → (Daimahouboolが立っているかどうか) ...

のようになっているようですが、「フラグを折る作業」がStartメソッドの一回限りなので、常にtrueの状態です。

ロジックを追ってみるとわかるはずです。

1. 最初にStartメソッドで初期化。つまりDaimahoubool = falseに。 2. Updateメソッドで「ゲージが溜まったら」系で条件分岐 2.1. (溜まっていたら)Daimahouboolをtrueに 3. Daimahouboolがtrueなら 3.1. (= 溜まっていたら) ごにょごにょする 4. (2)に戻って処理する ...

となっています。

ではいつ、Daimahouboolがfalseになるのでしょうか。

文脈的に Daimahoubool は 「現在、大魔法が使える(状態)」をtrueと見なすタイプだと仮定して考えると、多分、「大魔法を放った(後)」になるかなと。

なので、

// Update is called once per frame void Update() { if (DaimahouGage.fillAmount >= 1) { Daimahoubool = true; } if(Daimahoubool == true) { Book.GetComponent<bookaction>().enabled = false; director.Play(); Touroku.SetActive(true); MovieBook.SetActive(true); DaimahouUI.SetActive(false); // <- この辺にDaimahouBoolをfalseにする処理を入れる } }

とかになるのではないかなと。

投稿2021/10/18 10:51

BeatStar

総合スコア4958

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

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

mikichom_1229

2021/10/18 12:21

回答ありがとうございます! Daimahouboolはバトル内で一度しか使用しないので、boolの名前はこのままでいこうと判断しました。 今後は名前をそのように設定していこうと思います。アドバイスありがとうございます!
guest

0

自己解決

すべての動作を一度に行うのではなく、動作を分けることでうまく動作をすることができました。
回答してくださった方々誠にありがとうございました。

C#

1public class DaimahouScript : MonoBehaviour 2{ 3 private bool Daimahoubool = false; 4 private bool ZukanTourokubool = false; 5 6 public PlayableDirector director; 7 public Image DaimahouGage; 8 9 public GameObject DaimahouUI; 10 11 public GameObject Book; 12 13 public GameObject MovieBook; 14 public GameObject Touroku; 15 16 public GameObject Daimahoutext; 17 18 public GameObject DeguSpawn; 19 public GameObject GageUI; 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 DaimahouGage = DaimahouGage.GetComponent<Image>(); 25 } 26 27 void Update() 28 { 29 if (DaimahouGage.fillAmount == 1) 30 { 31 if (!Daimahoubool) 32 { 33 Invoke("Daimahoutextmethod",0.5f); 34 Book.GetComponent<bookaction>().enabled = false; 35 } 36 } 37 38 if (Daimahoutext.activeSelf == true) 39 { 40 if (!ZukanTourokubool) 41 { 42 if (Input.GetKeyDown("joystick button 6")) 43 { 44 DaimahouUI.SetActive(false); 45 director.Play(); 46 Touroku.SetActive(true); 47 MovieBook.SetActive(true); 48 } 49 } 50 } 51 } 52 53 void Daimahoutextmethod() 54 { 55 Daimahoutext.SetActive(true); 56 } 57 58} 59

投稿2021/10/18 12:19

mikichom_1229

総合スコア5

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

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

0

Daimahouboolがfalseの時だけ実行するとしておけば良いかと思いました。

if (!Daimahoubool) { if (DaimahouGage.fillAmount >= 1) { Daimahoubool = true; } }

が、似たようなコードで実行してうまくいっていないようですね。

実行は一度だけになったのですが、DaimahouUIが非アクティブになってくれません。

下記のその他の部分は実行されているのでしょうか。

Book.GetComponent<bookaction>().enabled = false; director.Play(); Touroku.SetActive(true); MovieBook.SetActive(true);

また、

スクリプトを以下のように変更すると非アクティブ化はするのですが点滅しながら非アクティブになってしまいます。

とのことですが、記載のコードと点滅との関連がわかりません。activeと非activeを繰り返しているわけではないですよね。

ImageがDaimahouUIの中にあるからでしょうか?

可能性をつぶすためにもImageを別オブジェクトに対応させてみてはいかがでしょうか。

投稿2021/10/18 03:55

編集2021/10/18 03:56
YOshim

総合スコア1085

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

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

mikichom_1229

2021/10/18 06:31

回答ありがとうございます! アクティブと非アクティブを繰り返し、点滅していました。 DaimahouUIの子オブジェクトにImageを置いている状況です。 また、DaimahouUIの非アクティブ化以外はすべて実行されています。
YOshim

2021/10/18 07:26

>アクティブと非アクティブを繰り返し、点滅していました。 DaimahouUIがアクティブと非アクティブを繰り返しているということでしょうか。 コードを見る限りDaimahouUIをアクティブにするコードはないように見受けられます。 そうであれば、他のコードでDaimahouUIを操作しており、それが影響を与えているのではないでしょうか。
mikichom_1229

2021/10/18 07:45

Book.GetComponent<bookaction>().enabled = false; この部分で、アクティブ化する部分のスクリプトを非アクティブにしているのですが、それがうまく作用していないのでしょうか。
YOshim

2021/10/18 08:55

Book.GetComponent<bookaction>()とDaimahouUIの関係がわかっていません。 >>アクティブと非アクティブを繰り返し、点滅していました。 >DaimahouUIがアクティブと非アクティブを繰り返しているということでしょうか。 アクティブ・非アクティブを繰り返しているのは何のオブジェクトでしょうか。
mikichom_1229

2021/10/18 12:22

何度もご回答誠にありがとうございます。 大変参考になりました。 無事に解決いたしました!
guest

0

DaimahouGage.fillAmount1なら条件が正となるので
どうやってこのゲージが増えているのか分かりませんが、値を1以下にすればよいかと思います。

cs

1 if (DaimahouGage.fillAmount >= 1) 2 { 3 Daimahoubool = true; 4 DaimahouGage.fillAmount = 0; 5 }

投稿2021/10/18 01:27

hogefugapiyo

総合スコア3302

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

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

mikichom_1229

2021/10/18 01:57

回答ありがとうございます。 その方法ですと、やはり何度も実行されてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問