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

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

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

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

Unity

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

Q&A

解決済

2回答

1461閲覧

1を加算しているはずが加算されない原因の究明(Unity、C#)

hiroxtuchi

総合スコア7

C#

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

Unity

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

0グッド

0クリップ

投稿2021/01/20 11:23

表題の通りです。
下記コードで、101行目で
this.destroyedBlocks += 1;
と加算しているのですが、関数が呼び出されるたびに、1とデバッグログに表示されます。
デバッグログは102行目です。
そのため、次の処理であるif文に到達せずに困っております。

なぜ1と表示され続け、加算をされないのか教えてください。
宜しくお願い致します。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5/// <summary> 6/// ブロックの制御。 7/// </summary> 8[RequireComponent(typeof(Rigidbody2D))] 9[RequireComponent(typeof(BoxCollider2D))] 10public class Block : MonoBehaviour { 11 12 /// <summary> 13 /// ボールがぶつかったときの効果音です。 14 /// 壊れるときは別の効果音です。 15 /// </summary> 16 public AudioClip seHit; 17 18 /// <summary> 19 /// ボールがぶつかって壊れるときの効果音です。 20 /// </summary> 21 public AudioClip seDestroy; 22 23 /// <summary> 24 /// ブロックの耐久力の初期値です。 25 /// </summary> 26 public int hpMax = 1; 27 /// <summary> 28 /// ブロックの耐久力です。最初に this.hpMax が代入されます。 29 /// 0 以下になるとブロックは壊れます。 30 /// </summary> 31 public int hp = 0; 32 33 public int destroyedBlocks = 0; 34 35 // Use this for initialization 36 void Start () { 37 // ブロックの耐久力を初期化します。 38 this.hp = hpMax; 39 40 this.destroyedBlocks = 0; 41 42 //CreateBlockObject(); 43 44 } 45 46 // Update is called once per frame 47 void Update () { 48 49 } 50 51 /// <Summary> 52 /// Prefabからブロックとして使うオブジェクトを生成します。 53 /// </Summary> 54 void CreateBlockObject() 55 { 56 GameObject obj = (GameObject)Resources.Load("Prefab/BlockLv1"); 57 for (float i = -2.5f; i <= 2.5f; i = i + 0.625f) 58 { 59 Instantiate((GameObject)Resources.Load("Prefab/BlockLv1"), new Vector3(i, 2.5f, 0.0f), Quaternion.identity); 60 } 61 62 //GameObject obj = (GameObject)Resources.Load("Prefab/BlockLv1"); 63 //Instantiate(obj, new Vector3(-2.5f, 2.5f, 0.0f), Quaternion.identity); 64 //Instantiate(obj, new Vector3(-1.875f, 2.5f, 0.0f), Quaternion.identity); 65 //Instantiate(obj, new Vector3(-1.25f, 2.5f, 0.0f), Quaternion.identity); 66 //Instantiate(obj, new Vector3(-0.625f, 2.5f, 0.0f), Quaternion.identity); 67 //Instantiate(obj, new Vector3(0.0f, 2.5f, 0.0f), Quaternion.identity); 68 //Instantiate(obj, new Vector3(0.625f, 2.5f, 0.0f), Quaternion.identity); 69 //Instantiate(obj, new Vector3(1.25f, 2.5f, 0.0f), Quaternion.identity); 70 //Instantiate(obj, new Vector3(1.875f, 2.5f, 0.0f), Quaternion.identity); 71 //Instantiate(obj, new Vector3(2.5f, 2.5f, 0.0f), Quaternion.identity); 72 73 74 } 75 76 /// <summary> 77 /// ボールがぶつかったときのイベント処理です。 78 /// </summary> 79 /// <param name="collision"></param> 80 private void OnCollisionEnter2D(Collision2D collision) 81 { 82 // 衝突したオブジェクトがボールの場合 83 if (collision.gameObject.layer == LayerMask.NameToLayer("Ball")) 84 { 85 // 耐久力を減らします。 86 this.hp -= 1; 87 88 Debug.Log(this.hp); 89 90 // 壊れる場合 91 if (this.hp <= 0) 92 { 93 // 壊されたときの効果音を再生 94 Util.PlayAudioClip(this.seDestroy, Camera.main.transform.position, 1.0f); 95 // スコア処理を追加 96 FindObjectOfType<Score>().AddPoint(10); 97 // このオブジェクトを破棄します。 98 GameObject.Destroy(this.gameObject); 99 100 // 破棄したオブジェクトを加算します。 101 this.destroyedBlocks += 1; 102 103 Debug.Log(this.destroyedBlocks); 104 105 // 破棄したオブジェクトが9の倍数の時 106 if (this.destroyedBlocks % 9 == 0) 107 { 108 // ブロックをサイズ分下にずらす そして ブロックを一列出現させる 109 //if (LayerMask.NameToLayer("Block")) 110 //{ 111 Debug.Log("test1"); 112 113 GameObject[] blocksTransform = GameObject.FindGameObjectsWithTag("Block"); 114 //GameObject[] blocksTransform = FindGameObjectsWithLayerMask(LayerMask.NameToLayer("Block")); 115 foreach (GameObject blockTransform in blocksTransform) 116 { 117 //全てのオブジェクトの座標を(0,-0.3125f,0)に移動する 118 blockTransform.transform.Translate(0, -0.3125f, 0); 119 120 } 121 //} 122 123 GameObject obj = (GameObject)Resources.Load("Prefab/BlockLv1"); 124 125 for (float i = -2.5f; i <= 2.5f; i = i + 0.625f) 126 { 127 Instantiate(obj, new Vector3(i, 2.5f, 0.0f), Quaternion.identity); 128 } 129 //0.625 130 //Instantiate(obj, new Vector3(0.625f, 2.5f, 0.0f), Quaternion.identity); 131 //Instantiate(obj, new Vector3(-0.625f, 2.5f, 0.0f), Quaternion.identity); 132 133 } 134 } 135 // まだ壊れない場合 136 else 137 { 138 // 跳ね返す効果音を再生 139 Util.PlayAudioClip(this.seHit, Camera.main.transform.position, 1.0f); 140 } 141 } 142 } 143} 144

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

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

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

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

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

guest

回答2

0

ベストアンサー

破棄するオブジェクトに代入していることになっています。
再度生成しても、それは別のオブジェクトなので、this.destroyedBlocksの値はリセットされます。

対応策としては、破棄しない別のスクリプトを用意するか、static変数を使えばよろしいかと。

投稿2021/01/20 11:47

fiveHundred

総合スコア9803

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

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

hiroxtuchi

2021/01/20 11:52

staticを追加して解決しました。ありがとうございました。
guest

0

その1を加算するところにブレークポイントを設定して、その前後で変数の値を見てみればどうでしょう

#ついでに、0を代入してるとこにもブレークポイント仕込んでおこう

投稿2021/01/20 11:30

編集2021/01/20 11:33
y_waiwai

総合スコア87774

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

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

hiroxtuchi

2021/01/20 11:52

デバッグ環境を構築する機会となりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問