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