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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

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

Unity

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

Q&A

解決済

3回答

1377閲覧

if文のカウントアップ計算がうまくいかない

tyunsan

総合スコア5

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

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

Unity

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

0グッド

0クリップ

投稿2022/07/21 15:31

前提

C#で十字キーが入力されると、カウントアップなシステムを作っています。
エラーメッセージは発生しないのですが、

実現したいこと

  • 十字キーで入力された回数分Aに+1し、合計が10になれば(十字キーが合計10回入力されたら)"ContinueScene"に遷移する機能を動作するようにする

発生している問題・エラーメッセージ

カウントアップ(A++)がされない

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6public class Move : MonoBehaviour 7{ 8 void Update() 9 { 10 int A = 0; 11 if (Input.GetKeyDown(KeyCode.UpArrow)) 12 { 13 A++; 14 this.transform.Translate(0, 0, 1); 15 } 16 if (Input.GetKeyDown(KeyCode.DownArrow)) 17 { 18 this.transform.Translate(0, 0, -1); 19 A++; 20 } 21 if (Input.GetKeyDown(KeyCode.RightArrow)) 22 { 23 this.transform.Translate(1, 0, 0); 24 A++; 25 } 26 if (Input.GetKeyDown(KeyCode.LeftArrow)) 27 { 28 this.transform.Translate(-1, 0, 0); 29 A++; 30 } 31 if (A >= 10) 32 { 33 SceneManager.LoadScene("ContinueScene"); 34 } 35 } 36}

試したこと

・if文の外でグローバル変数としてA=0と宣言しているため、十字キーがいくら入力されてもif文の外に出ると、A=0となっているためSceneManagerが実行されないかと考え
int A = 0;をint A ;に変えたがerror CS0165: Use of unassigned local variable 'A'と出て実行出来ませんでした。

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

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

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

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

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

guest

回答3

0

まずは基礎からやりましょう

グローバル変数ってのは関数(C#で言えばメソッドに近い)の外にある変数のことです。
というか、C#はグローバル変数はできなかったはずです。

Updateメソッドっていうメソッドの中にあるので強いて言えばローカル変数です。

そして、関数(メソッド)の中で宣言している変数は関数が終了するとデータが破棄されます。(一部例外あり)

質問にあるコードだと、
まずUpdateメソッドが呼ばれ、int A = 0;が実行される。
そしてif (Input.GetKeyDown(KeyCode.UpArrow)) が実行される。この条件式を満たすなら、A++;this.transform.Translate(0, 0, 1); が実行され次のステップへ。(次のif文へ)

…とやっていき、if (A >= 10)まで同じようにやる。

そしてUpdateメソッドの終わりにint Aは破棄され、再度Updateメソッドが呼ばれても同じAではありません。
なので毎回0からスタートになります。

依頼するたびに毎回新しくコップを用意したりするようなものでしょうか。

とにかく、毎回別の変数なので値は0から開始することになる。

仮に0で初期化せず、int A;とだけやると、A++;とかで「何も入っていないものを追加する」的なものになりますからエラーになります。

C言語だと初期化しない場合は「不定値」がはいります。3321 とかみたいな出鱈目な値になる可能性があるのです。そのまま使うと3322 とかみたいな意図しない値になり、意図しない動作になる可能性があります。それを防ぐためなのか、C#とかでは『おーーーい、初期化されてねーぞぉ?』とエラーを吐くのです。

ローカル変数だとUpdateメソッドが呼ばれるたびに毎回新しく確保されるのが原因なのだから、「同じ変数」にすればいい。

方法としては、自分がそのメソッドを呼び出すなら引数や戻り値を使う。でも確かUnityでのUpdateメソッドってMainメソッドみたいな扱いだったはずなので引数や戻り値は勝手に増やせませんので候補から外す。

もうひとつの方法は他の方が仰っているようにフィールドとして保持する。
int A = 0;をメソッドの外に切り出してprivateをつける。
そしてこのAを使う場合はフィールドの方を使えばいい。

あとは基礎ができているのなら簡単に対応できるはずです。

投稿2022/07/21 23:05

BeatStar

総合スコア4958

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

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

fana

2022/07/22 01:28 編集

内容としては ・まず最低限の基礎を学べ. ・C# にはグローバル変数は無いし,「それっぽい」記述も質問者のコードにはないぞ. ・そのAはローカル変数だぞ.→フィールドにでもすればいいんじゃないの. という話ですよね. 本件は明らかにC#の話なのですから,これを言うのに別の言語の話を混ぜ込む必要はないのでは. 例えば,あえて「関数」という言葉をねじ込む必要はなく,単に「メソッド」と書けばよいのでは. (書き出しの辺りでは「関数」で途中からは「メソッド」となっていて記述が揺らいだ感じになっていますし) ※質問者はちゃんと A=0; としているのですから,未割当てのローカル変数の話も不要かと.
guest

0

ベストアンサー

ここでの A はローカル変数なので Update 関数が実行されるたびに毎回初期化されてしまい決して 10 を超えることはありません。
今回のような場合はクラスのインスタンス変数を定義して、そちらを利用するようにすると意図した挙動になると思います。

public class Move : MonoBehaviour { // インスタンス変数として定義 private int _A = 0; void Update() { if (Input.GetKeyDown(KeyCode.UpArrow)) { _A++; this.transform.Translate(0, 0, 1); } // ... 以下略 }

投稿2022/07/21 15:44

edo_m18

総合スコア2283

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

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

tyunsan

2022/07/22 02:27

自分の学習の至らなさにより、回答者様を煩わせてしまい申し訳ありませんでした。これからC#の基礎の勉強も加えてもっと精進していこうと思います・ 最後に、皆様分かりやすい回答だったのですが、分かりやすさを基準に選ばせて頂きました。回答された皆様ご回答有難うございました。
guest

0

int A = 0;

Aはローカル変数なので、update関数を抜けると消滅し、次の関数の実行時に再生成されます
ってことで、Aはその都度0にされてしまうので、そいつが10になることはありません

ってことで、Aにstaticをつける、あるいはグローバル変数にする、とすればいいかと

投稿2022/07/21 21:53

y_waiwai

総合スコア87749

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

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

Zuishin

2022/07/21 22:30

C# です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問