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

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

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

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

Q&A

解決済

2回答

540閲覧

1減るはずが0または-1になる

ichigo_0308

総合スコア41

Unity

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

0グッド

0クリップ

投稿2020/06/07 02:32

編集2020/06/08 07:50

<実現したいこと>
Unityで戦闘ゲーム的なものを作っています。
タップした場所に応じてダメージが入るようにしています。
-1減るはずなのですが、100減ってしまいます。
<ソースコード>

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class fightManagear : MonoBehaviour 8{ 9 bool mopen = true; 10 bool seikai = false; 11 public Sprite sprite; 12 public Sprite sprite1; 13 public Sprite Item; 14 public Sprite Item1; 15 public Sprite Item2; 16 public Sprite Item3; 17 public Sprite Item4; 18 public Sprite Item5; 19 public Text Lifetext; 20 public Text Text; 21 public int heart = 100; 22 public int heart2 = 900; 23 public AudioClip damageSE; 24 public AudioClip AttackSE; 25 AudioSource aud; 26 float fo = 0; 27 int i; 28 bool tap = false; 29 int color; 30 int color2; 31 // Start is called before the first frame update 32 void Start() 33 { 34 Text.text = "HP: " + 900; 35 heart2 = PlayerPrefs.GetInt("level"); 36 aud = GetComponent<AudioSource>(); 37 i = Random.Range(1, 6); 38 if (i == 1) 39 { 40 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item; 41 } 42 else if (i == 2) 43 { 44 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item1; 45 } 46 else if (i == 3) 47 { 48 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item2; 49 } 50 else if (i == 4) 51 { 52 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item3; 53 } 54 else if (i == 5) 55 { 56 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item4; 57 } 58 else if (i == 6) 59 { 60 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item5; 61 } 62 63 } 64 65 // Update is called once per frame 66 void Update() 67 { 68 fo += Time.deltaTime; 69 if (fo >= 1) 70 { 71 Attack(); 72 fo = 0; 73 if (mopen) 74 { 75 GameObject.Find("monster07").GetComponent<SpriteRenderer>().sprite = sprite1; 76 mopen = false; 77 } 78 else 79 { 80 GameObject.Find("monster07").GetComponent<SpriteRenderer>().sprite = sprite; 81 mopen = true; 82 } 83 84 } 85 if (heart <= 0) 86 { 87 SceneManager.LoadScene("GameOverScene"); 88 } 89 if (Input.GetMouseButtonDown(0) || Input.GetTouch(0).phase == TouchPhase.Began) 90 91 { 92 // クリック・タップした瞬間の座標 93 var pos = Camera.main.ScreenToWorldPoint(Input.mousePosition + Camera.main.transform.forward); 94 if (pos.x <= -1.2) 95 { 96 //Debug.Log("R"); 97 tap = true; 98 color = 1; 99 } 100 else if (pos.x > 1.0) 101 { 102 //Debug.Log("B"); 103 tap = true; 104 color = 2; 105 } 106 else if (pos.y > 0.5) 107 { 108 //Debug.Log("G"); 109 tap = true; 110 color = 3; 111 } 112 i = Random.Range(1, 6); 113 if (tap) 114 { 115 if (i == 1) 116 { 117 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item; 118 color2 = 1; 119 120 } 121 else if (i == 2) 122 { 123 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item1; 124 color2 = 2; 125 } 126 else if (i == 3) 127 { 128 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item2; 129 color2 = 1; 130 } 131 else if (i == 4) 132 { 133 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item3; 134 color2 = 3; 135 } 136 else if (i == 5) 137 { 138 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item4; 139 color = 2; 140 } 141 else if (i == 6) 142 { 143 GameObject.Find("Item").GetComponent<SpriteRenderer>().sprite = Item5; 144 color2 = 3; 145 } 146 clickd(); 147 } 148 149 } 150 } 151 public void Attack() 152 { 153 aud.PlayOneShot(damageSE); 154 heart -= PlayerPrefs.GetInt("level")*2; 155 Lifetext.text = "HP: " + heart; 156 } 157 public void clickd() 158 { 159 if(color==color2) 160 { 161 Debug.Log("Attack"); 162 seikai = false; 163 aud.PlayOneShot(AttackSE); 164 heart2 = heart2 - PlayerPrefs.GetInt("level"); 165 Text.text = "HP: " + heart2; 166 167 } 168 } 169}

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

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

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

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

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

guest

回答2

0

ベストアンサー

100減ってしまうのではなく、そもそもheart2が100になってないのでは?
というかheart2の存在意義がわかりません。
全てheartに統一してしまえばいいのでは。

修正された+勘違いだったので取り消し線

追記に対する回答

Start()のコードにある、
heart2 = PlayerPrefs.GetInt("level");
が原因でしょう。

heart2は最初は900ですが、Start()した時点でPlayerPrefs.GetInt("level")に置き換えられ、クリックするとそこからPlayerPrefs.GetInt("level")が引かれるのですから、0になるのは当然と言えます。

また、Text.text = "HP: " + 900;という表記がありますが、違和感が2点。
・両方固定なら普通に"HP: 900"でいい
・そもそも、数値決め打ちは良くない
前者はわかると思います。
後者についてですが、以下の点から望ましくないです。
・publicなことから、Editor側で変更するのも想定されてるのでしょうが、Editor側で数値が変更されても表示が変わらない
・今回のようにミスで実際と違う数値が表示されてしまうことがある

私の使う対処法を例としてあげると、changeHeartなどの関数を作り、そこでGUIと変数の書き換えを両方行います。
変数を書き換える時必ず使うようにすることで、変数だけ変えてGUIを更新してなかった!などを防げます。
また、表示を"HP: "ではなくしたい!とか、一緒にこっちの表示も変えたい!などとなった場合に簡単に変更が可能です。
この方法が処理的に軽いかは知りませんが...

C#

1public void changeHeart2(int value) { //動作未確認 2 heart2 = value; 3 Text.text = "HP: "+value; 4}

投稿2020/06/07 03:56

編集2020/06/08 13:51
ozraru

総合スコア150

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

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

ozraru

2020/06/07 04:12

質問には関係ないですが、他の回答の返信を読んでて色々気になってきたのでここに書きます 変数seikaiってそもそも必要ありますかね trueにしてすぐにfalseに戻すのなら存在意義がなく、単純にif文でいいよねと思いました これから使用予定があるならいいんですが 変数iも似たような感じで、使われないのに乱数を生成したりするのは無駄で、 if (tap)の中で生成して直接color2に代入すればいいと思いました。 その後、else ifが連続していますが、この場面ではswitch文がきれいだと思います
ichigo_0308

2020/06/07 06:33

heartは敵のHPで、heart2は自分のHPです。
ichigo_0308

2020/06/07 06:35

あと、最初はUIでちゃんと100と表示されます。
ichigo_0308

2020/06/07 06:41

すみません!もう一度確認してみるとやっぱりheart2が0だったようです。UIの仮の文字が100になっていたので最初は100と表示されていました????
ichigo_0308

2020/06/07 06:44

すみません もう1度やるとやはりだめでした どうすればいいのでしょうか
ichigo_0308

2020/06/07 06:46

どうやら-1になっているようです。敵のHPを900にしてやってみましたが、同じようにその現象が起きました。
ozraru

2020/06/07 09:29

えと、解決してなかったってことですかね? 何か変更したのであれば、質問を編集して新しいものに置き換えるか追加で貼ってください どのように直したのかわからないので
ichigo_0308

2020/06/08 07:43

返信遅れてすみません。okです
ozraru

2020/06/08 13:55

回答を編集しました。 >heartは敵のHPで、heart2は自分のHPです。 と過去の返信にありましたが、その後の敵のHPを900にした旨の返信とコードから察するに、 heartが自分でheart2が敵ということであってますか?
ozraru

2020/06/08 14:04

これも質問と関係ない話ですが、heartやheart2などという変数名は(他人にとっても後の自分にとっても)わかりにくいので、player_heartとenemy_heartなどとするとわかりやすいかなーと思います。 また、else ifが多用されているようですが、switch文を使うときれいに見えますし、高速化にもなるらしい?ですよ
ichigo_0308

2020/06/09 07:44

すみません????回答を見たところそうでした 細かいところを見るのが苦手なので優しく教えてくださって大変勉強になりました。ありがとうございました!
ichigo_0308

2020/06/09 07:45

>heartが自分で、heart2が敵ということであってますか? 逆ですね
guest

0

seikai = true;

if (seikai) {

これだとif文のナカミは必ず実行されてしまいますが

投稿2020/06/07 02:40

y_waiwai

総合スコア87774

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

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

ichigo_0308

2020/06/07 03:03

直しましたが、まだ100減ってしまいます。
y_waiwai

2020/06/07 03:05

直し方が間違ってますね #どう直したのかわからんのでこれだけ
ichigo_0308

2020/06/07 03:05

public void clickd() { if(color==color2) { seikai = true; } if (seikai) { Debug.Log("Attack"); seikai = false; aud.PlayOneShot(AttackSE); heart2 =- 1; Text.text = "HP: " + heart2; } } このように直しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問