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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
私も初心者なので間違っているかもしれませんが
お役に立てそうかなと思ったので回答させていただきます。
ステージクリア時のupdate内の処理
if(Ctime < 0){
Ctime = 90;
これが原因ではないでしょうか
これではCtimeが0より少ないときでないと元に戻らないからというのが理由です
ステージをタイムアップまでにクリアしたのなら0より多いはずと
(間違っていたら本当にすみません)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
y_waiwai
2019/01/14 07:21
このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
torisan
2019/01/14 13:28
今ひとつ仕様が見えないのですが、
ステージ呼び出し時にタイムを初期化する、では駄目なのでしょうか。
rashiobi
2019/01/14 15:44
void startに初期値を入れたら解決しました。すごく簡単な解決策だったので質問したのが恥ずかしいです