🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

4819閲覧

GameOverシーンへの移行

Neet-Saikou

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2019/12/19 03:05

編集2020/01/18 05:37

前提・実現したいこと

PlayerのHP(fillAmount)が0になった瞬間にPlayerのgameObjectを破壊し、GameOverシーンに移行させたい。

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

Playerの体力(fillAmount)が0になってもGameOverシーンに移行せず、体力0のままゲームが続行された。
エラーメッセージ
表示されない

該当のソースコード

C#

1ソースコード 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using UnityEngine.SceneManagement; 7 8public class GameDirector : MonoBehaviour 9{ 10 public GameObject hpGauge; 11 float fillAmount; 12 void Start() 13 { 14 this.hpGauge = GameObject.Find("hpGauge"); 15 fillAmount = 1.0f; 16 } 17 18 public void DecreaseHp() 19 { 20 this.hpGauge.GetComponent<Image>().fillAmount -= 0.1f; 21 if(fillAmount <= 0) 22 { 23 Destroy(gameObject); 24 Invoke("GoToGameOver", 1.0f); 25 } 26 } 27 void GoToGameOver() 28 { 29 SceneManager.LoadScene("GameOver"); 30 } 31}

試したこと

GameOverシーンを作成して、ネットの指示通りにBuildsettingsにて2つのシーンを設定した。しかしGameOverシーンに移行することはなかった。

補足情報(FW/ツールのバージョンなど)

Unity 2019.2.14f1 Personal

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

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

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

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

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

yutampp

2019/12/19 03:21

アメリカでは、あなたがネットに指示を出す。 ソビエトロシアでは、ネットがあなたを指示する! 言いたかっただけです。 this.hpGauge.GetComponent<Image>().fillAmount -= 0.1f; if(fillAmount <= 0) この2行が気になりました。 すぐ上の行ではthis.hpGauge.GetComponent<Image>().fillAmountとしていて、 その一行下で、fillAmountとしている理由はなに?
Neet-Saikou

2019/12/19 08:12

すいません、初心者なもので自分でも曖昧なんです 自分の解釈としましてはこのhpGaugeのfillAmountをGetComponentにて数値化させた、と考えているのですが… もし間違っていましたら、ご教授していただけると幸いです。
simapiko

2019/12/19 09:23 編集

横から失礼します。あくまでGetComponentで参照しているのは、"ImageコンポーネントのfillAmount"です。ifの中で比較しているfillAmountは"GameDirectorクラスで宣言したfillAmount"なので、名前は同じでもその2つは別の物です。 「this.hpGauge.GetComponent<Image>().fillAmount -= 0.1f;」で行っているのは前者のImageコンポーネントのfillAmountに対してなので、後者であるif内の変数fillAmountの値は変化することは無く、同時にif条件も満たすことは無いという感じでしょうか。 参考にImageコンポーネントのリファレンスを下記に貼っておきます。Imageコンポーネントが持っている変数もそこで確認出来るかと思います。 https://docs.unity3d.com/ja/2018.4/ScriptReference/UI.Image.html
Neet-Saikou

2019/12/25 06:43

ありがとうございます!
guest

回答1

0

ベストアンサー

GameDirectorのfillAmount変数が変更されていないことが原因ではないでしょうか。

fillAmountはあくまで画像表示の埋め度合いを示す単語なので、HPを管理しているなら変数名もHPとしたほうが管理しやすいかもしれません。

csharp

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class GameDirector : MonoBehaviour 8{ 9 public GameObject hpGauge; 10 11 public int MaxHP = 10; 12 int HP; 13 14 void Start() 15 { 16 this.hpGauge = GameObject.Find("hpGauge"); 17 18 HP = MaxHP; 19 } 20 21 public void DecreaseHp() 22 { 23 HP -= 1; 24 var currentHPPercentage = Mathf.Clamp01(HP / (float)MaxHP); 25 this.hpGauge.GetComponent<Image>().fillAmount = currentHPPercentage; 26 if (HP <= 0) 27 { 28 Destroy(gameObject); 29 Invoke("GoToGameOver", 1.0f); 30 } 31 } 32 33 void GoToGameOver() 34 { 35 SceneManager.LoadScene("GameOver"); 36 } 37}

HPというデータ概念が「主」であって、ゲージ画像をどう表示するのかは「従」と考えてコードを整理すると読みやすくなると思います。

投稿2019/12/19 04:02

編集2019/12/19 04:07
tor4kichi

総合スコア769

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

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

Neet-Saikou

2019/12/19 08:41

ありがとうございます。 しかしGameOverシーンには何故か移行しませんでした… また色々試してみます。
Neet-Saikou

2019/12/25 06:44

Destroyのコードを消せば移行することに成功しました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問