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

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

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

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

Unity

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

Q&A

1回答

8830閲覧

スクリプトの中の値を初期値に戻したい

rashiobi

総合スコア10

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/01/13 16:13

編集2022/01/12 10:55

unityをあまり触ったことのない初心者ですが質問させていただきます。
私はいまゲームの中で時間を扱っているのですが、この時間をスクリプト内で制御したいのですが
上手くいきませんでした。

ゲームの流れとしては
タイトルでステージ選択

選択したステージにシーンを移す

そのシーンの中でタイムアップかゲームオーバーかステージクリアとなる

タイムアップの場合はゲームを再開するかタイトルに戻るかどうか選べる
(再開した場合、タイマーは設定した値に戻る
タイトルに戻って再開してもタイマーの値は初期設定した値と同じ)

ゲームオーバー(プレイヤーの体力が0になる)した場合はゲームオーバーしたときのtimeはそのままで再開できる

ステージクリアした場合は
タイトルのシーンに戻ってもう一度ステージ選択のシーンでステージを選択をする………

という流れになっていますが
最後のステージをクリアした場合の処理がうまくいきません。

タイムアップした場合と違い、タイマーの値が
クリアした時の値を引き継いでしまいます。
自分なりに色々コードを改変したり、いじったりして試してみましたが上手くいきません。
なのでどなたかこの問題を解決してほしいです。

【これがステージセレクト画面の処理です】

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class slect : MonoBehaviour { void Update () { if (Input.GetMouseButtonDown (0) == true) { SceneManager.LoadScene("stage"); } if (Input.GetMouseButtonDown (1) == true) { SceneManager.LoadScene("umi"); } } }

【これがゲームオーバーした場合の処理です】

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class restart1 : MonoBehaviour { public static int rhp = 0; void Start () { rhp = HpBarCtrl._hp; } void Update () { if(rhp <= 0){ rhp = 100000; } if (Input.GetMouseButtonDown (0) == true){ SceneManager.LoadScene("stage"); } } }

【これがステージクリアをクリアした場合の処理です】

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class stageclear1 : MonoBehaviour { public static float Ctime = 0; void Start () { Ctime = HpBarCtrl.time; } void Update () { if(Ctime < 0){ Ctime = 90; } if (Input.GetMouseButtonDown (0) == true) { SceneManager.LoadScene("title"); } if (Input.GetMouseButtonDown (1) == true) { SceneManager.LoadScene("title"); } } }

【これがタイムアップしてゲームを再開するかタイトルに戻るかの場合の処理です】

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class TimeUpbutton : MonoBehaviour { void Update () { if (Input.GetMouseButtonDown (0) == true) { SceneManager.LoadScene("stage"); } if (Input.GetMouseButtonDown (1) == true) { SceneManager.LoadScene("title"); } } }

【これがタイマーの処理です】

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class GameController : MonoBehaviour { public Text timeLabel; public static float timeCount = 90; public static int hp = 100000; //public static float Crtime = 90; void Start () { timeLabel.text = "TIME:" + timeCount; hp = HpBarCtrl._hp; //Crtime = stageclear1.Ctime; } void Update () { timeCount -= Time.deltaTime; timeLabel.text = "TIME:" + timeCount.ToString("0"); if(timeCount < 0){ timeCount = 90; hp = 100000; SceneManager.LoadScene("TimeUp"); } //else if(Crtime <= 0){ //timeCount = 90; //hp = 100000; //SceneManager.LoadScene("TimeUp"); } } //}

【これがプレイヤーのhpなどを処理しているプログラムです(ここでタイマーの値を変えようとも試しました)】

using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.SceneManagement; public class HpBarCtrl: MonoBehaviour { public GameObject LoserLabelObject; public static int _hp = 100000; public static float time = 0; public static float rhp = 0; public static float ctime = 0; public int a; public int doro; public int mob; public int head; Slider _slider; GameObject player; private Text targetText; HpBarCtrl _script; private GameObject pauseUIPrefab; private GameObject pauseUIInstance; int max_hp; void Start () { player = GameObject.Find("FPSController");  _slider = GameObject.Find("Slider").GetComponent<Slider>(); _slider.value = _hp; max_hp = _hp; _hp = GameController.hp; time = GameController.timeCount; ctime = stageclear1.Ctime; if (time >= 90) {// hpを初期値に戻すためにtimeが60秒以上になったら100000回復するようにしている _hp = 100000; max_hp = _hp; }if (ctime >= 90) { time = 90; _hp = 100000; max_hp = _hp; }else if (rhp <= 100000) {//restart1でrhpに100000を入れる事によって条件が成立する _hp = 100000;//ここの_hpに100000を代入してゲームが再開 max_hp = _hp; } void Update () { if (_hp <= 0) { SceneManager.LoadScene("GameOver"); } if (Input.GetMouseButtonDown(0)) { _hp = _hp - doro; } int count = GameObject.FindGameObjectsWithTag ("mob").Length; if (count == 0) { SceneManager.LoadScene ("GameClear"); } _hp = _hp - a; //HPが減少 _slider.value = _hp; } void OnTriggerEnter(Collider hit){ if (hit.CompareTag ("Mango")) { //もしアイテムにあたったら _hp = _hp + 30000; //HPが回復 Debug.Log (_hp); //HPを表示 _slider.value = _hp; //HPゲージを表示 if (_hp >= max_hp) { //最大HPより大きいか _hp = max_hp; //最大HPの値を入れる } } else if (hit.CompareTag ("mob")){ //もし攻撃を受けたら if(_hp >= 0){ _hp = _hp - mob; //HPが減少 Debug.Log (_hp); //HPを表示 _slider.value = _hp; //HPゲージを表示 if (_hp <= 0){ _hp = 0; } } } } }

別のプログラムの変数を他のプログラムで使うなどの、覚えたての知識を使ってみたのですが、
自分自身、プログラムを触るのも初心者なのでプログラムの中によくわからない命令や処理などがあるかもしれません
ただ自分が悩んでいるのは
** 【タイトルに戻った場合 タイマーの値を引き継いで戻ってしまうので遊んだステージのタイマーの値を引き継がないで初期値に戻したい】**
ということだけです。
非常に見辛いかもしれませんが、解決策を教えて下さい!

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

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

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

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

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

y_waiwai

2019/01/13 22:21

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
torisan

2019/01/14 04:28

今ひとつ仕様が見えないのですが、 ステージ呼び出し時にタイムを初期化する、では駄目なのでしょうか。
rashiobi

2019/01/14 06:44

void startに初期値を入れたら解決しました。すごく簡単な解決策だったので質問したのが恥ずかしいです
guest

回答1

0

私も初心者なので間違っているかもしれませんが
お役に立てそうかなと思ったので回答させていただきます。

ステージクリア時のupdate内の処理 if(Ctime < 0){ Ctime = 90;

これが原因ではないでしょうか

これではCtimeが0より少ないときでないと元に戻らないからというのが理由です
ステージをタイムアップまでにクリアしたのなら0より多いはずと
(間違っていたら本当にすみません)

投稿2019/01/14 01:06

torisva

総合スコア23

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

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

rashiobi

2019/01/14 02:07

回答ありがとうございます。 なるほどな、と思って試してみたのですが駄目でした ですが参考にはなったので助かりました! 確かにステージクリアするときはtimeは0より大きいはずですもんね そこをヒントにもう一度試してみます
torisva

2019/01/14 02:29

もう一度見てみたところ public static float Ctime = 0; というところを見落としていました。 もしかしたらですが if(Ctime == 0)または>=や<=と書くと成功するのではないでしょうか? 試してみたらというのは<0を>0に書き換えたのでしょうか? これだと結局0より多い場合となり0は含まれません 二回目ですが間違ってたらすみません。
rashiobi

2019/01/14 03:15

if(Cime >= 0)を試してみたのですが 上手くいきませんでした 少しややこしいですが タイムを制御している処理は 何個かのプログラムの変数を他のプログラムに持ってきたりしてから 制御しています。 純粋にタイムを処理している プログラムが【タイマーの処理】と 書いてある場所のプログラムです。 この中のtimecountというタイムを処理する変数を他のプログラムに持っていってます。 プレイヤーのhpを制御するプログラム【HpBarCtle】にも持っていってますし、ステージをクリアしたプログラムにも持っていってます。 hpを管理しているプログラムでは タイムを処理しているプログラムで timecountが0になったら このタイムを処理しているプログラムのtimecountに90(初期値)を代入し、HpBarCtrlからHPの変数を持ってきてその変数に100000を代入しています。代入した100000の値はHpBarCtrlで体力を回復させる条件ししています。こんな感じで体力を処理しているプログラムにもタイムを処理している変数を持っていってます。もしかしたらそこら辺の処理で問題が起きてるのかもしれません。 上手く伝えられたかわかりませんが 伝わるでしょうか?
torisva

2019/01/20 08:04

パソコンに触れない時期が続いたので返信が遅れました。すみません。 もう必要ないかもしれませんが最後に私なりの考察を残しておきます。 解決できなかったため返信はしてもしなくても構いません。 class HpBarCtrl time = 0; ctime = 0; void start time = GaCo.timeCount; ctime = stcl1.Ctime; if(ctime >= 90) time = 90; class GameController timeCount = 90; void update timeCount -= Time.deltaTime; if(timeCount < 0) timeCount = 90; LoadScene(TimeUp) class stageclear1 Ctime = 0; void start Ctime = HpBarCtrl.time; HBCのtimeにはゲームコントローラのtimeCount HBCのctimeにはステージクリア1のCtime HBCでctime(ステージクリア1のCtime)が90以下だとtimeに90 ステージクリア1のCtimeはHBCのtime(ゲームコントローラのtimeCountまたは90) ゲームコントローラのtimeCountには90 1、ゲームコントローラのtimeCountは時間とともに減っていき0になると90に戻ってタイムアップのシーンへ   タイムアップのシーンではtimeCountには一切触れずステージシーンかタイトルシーンへ  どちらに行ってもtimeCountは90のまま 2、ゲームコントローラのtimeCountを40でクリアした場合   (とりあえず一番最初のスクリプトで考えます)   Ctimeが0より下の場合、Ctimeを90にしタイトルシーンへ   0以上の場合Ctimeは40のままタイトルシーンへ タイトルシーンでステージを選び ステージに入るとHBCとゲームコントローラが稼働して HBCのtimeにはゲームコントローラのtimeCount(90または40) HBCのctimeにはステージクリア1のCtime(HBCのtime=90または40) うーん…この40のパターンがバグの原因だと思ったんですけど それだとif(Ctime >= 0)で治るはずなんですよね… HPとタイマーは完全に処理が分離されているように見えるので HPの処理は関係ないのかなぁと思いました(もしかしたら関係あるのかもしれませんが) ctime,Ctime,time,timeCountの四つの変数に何かあると思うんですけど難しいですね。 プログラムを大幅に書き換えることになりますが いっそのことステージのシーン以外ではタイマーをいじらないようにしてみてはどうでしょうか ステージクリアしてもゲームオーバーになってもタイムアップになっても ステージシーン中にタイマーを元に戻すよう処理をすればすっきりするかと思います もしかしたら他にやりたいことがあってこの処理を選んでいるのかもしれませんが 変数はできる限りpublicにしないことを私はおすすめします。 思考停止でしたね、ですが私からはその程度しか言えませんでした。 お力になれなくて申し訳ありません。 私からの返信はこれで終わりにします。 頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問