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

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

ただいまの
回答率

90.01%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 981

rashiobi

score 4

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;
                }
            }
        }
    }
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/01/14 07:21

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

    キャンセル

  • torisan

    2019/01/14 13:28

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

    キャンセル

  • rashiobi

    2019/01/14 15:44

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

    キャンセル

回答 1

0

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/14 11:07

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

    キャンセル

  • 2019/01/14 11:29

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

    キャンセル

  • 2019/01/14 12:15

    if(Cime >= 0)を試してみたのですが
    上手くいきませんでした

    少しややこしいですが
    タイムを制御している処理は
    何個かのプログラムの変数を他のプログラムに持ってきたりしてから 制御しています。
    純粋にタイムを処理している
    プログラムが【タイマーの処理】と
    書いてある場所のプログラムです。
    この中のtimecountというタイムを処理する変数を他のプログラムに持っていってます。

    プレイヤーのhpを制御するプログラム【HpBarCtle】にも持っていってますし、ステージをクリアしたプログラムにも持っていってます。

    hpを管理しているプログラムでは
    タイムを処理しているプログラムで
    timecountが0になったら
    このタイムを処理しているプログラムのtimecountに90(初期値)を代入し、HpBarCtrlからHPの変数を持ってきてその変数に100000を代入しています。代入した100000の値はHpBarCtrlで体力を回復させる条件ししています。こんな感じで体力を処理しているプログラムにもタイムを処理している変数を持っていってます。もしかしたらそこら辺の処理で問題が起きてるのかもしれません。

    上手く伝えられたかわかりませんが
    伝わるでしょうか?

    キャンセル

  • 2019/01/20 17: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にしないことを私はおすすめします。

    思考停止でしたね、ですが私からはその程度しか言えませんでした。
    お力になれなくて申し訳ありません。
    私からの返信はこれで終わりにします。
    頑張ってください!

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる