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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

3171閲覧

unity C# ステージ解放について

O.M

総合スコア1

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/08/04 08:57

編集2020/08/04 09:18

前提・実現したいこと

ステージ開放を実装したのですが初期値を0に設定しているのに再生するとするとOnTriggerEnterがまだなのに2や3が代入されてしまっていてtrueになってしまいます
理想としては別のシーンでblockに触るとstage2が解放されほかのシーンでまた触ってstage3を開放という形にしたいです
あとなぜかOnTriggerEnterに触れてもステージ開放できなかったです
原因がわからないので教えてくださるとうれしいです

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

エラーメッセージ ```なし ### 該当のソースコード c# ```ここに言語名を入力  ソースコード```using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class StageScript : MonoBehaviour { public int stage_num; public GameObject ni; public GameObject san; // Start is called before the first frame update void Start() { //現在のstage_numを呼び出す stage_num = PlayerPrefs.GetInt("SCORE", 0); } // Update is called once per frame void Update() { //stage_numが2以上の時、ステージ2を解放する if (stage_num >= 2) { ni.SetActive(true); } if (stage_num >= 3) { san.SetActive(true); } } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class ReleaseScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } void OnTriggerEnter(Collider other) { if (other.gameObject.name == "Player") { Debug.Log("当たった"); //PlayerPrefsのScoreに2を値に入れる PlayerPrefs.SetInt("SCORE", 2); //PlayerPrefsをセーブするS PlayerPrefs.Save(); } } }

イメージ説明
イメージ説明

### 試したこと https://qiita.com/takayuuu/items/7da32e2290be4fbf1b4e こちらの記事を参考にしていたのですがうまく行きませんでした ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PlayerPrefsからステージ解放状況を取得してるようですが、
過去のデバッグ・テストなどで既にSCOREに3や2等の値が入っていませんか?(PlayerPrefsはデータとして保持される為)
PlayerPrefs.DeleteAll(); など使用してPlayerPrefsを削除した後でも同様のことが発生するか確認してみてください。

またOnTriggerEnterしても解放できない件ですが、OnTriggerEnter時にPlayerPrefsに開放状況を代入してもステージ解放チェックに用いている stage_num変数 への代入は行われていない為です。
GetComponent<StageScript>.stage_num 等で代入する等してやる必要があると思われます

投稿2020/08/04 10:03

MMashiro

総合スコア2380

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

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

O.M

2020/08/04 10:19

すみませんPlayerPrefsは今回が初めて使用するのですが PlayerPrefs.DeleteAll(); はどこにいれたらいいのでしょうか?
MMashiro

2020/08/04 10:24

O.MさんがどのようにPlayerPrefsを活用したいかによります。 PlayerPrefsはいわゆるセーブデータのようなものなので、 ステージの開放状況を保存して次回起動時にも開放状況を保持したいのであればデータ削除ボタンなどを用意してPlayerPrefs.DeleteAll() を呼び出すのが無難な実装かと思います。 逆にデータを持ち越したい等なければそもそもPlayerPrefsを使用する必要がないと思われます。 デバッグ用として常にPlayerPrefsを初期化(削除)してデバッグしたい場合はどこかのスクリプトのAwake関数等でPlayerPrefs.DeleteAll() を呼び出せばよいかと思います。
O.M

2020/08/04 12:08

個人的には最初の選択画面でステージ1.2.3の中からステージ1だけ挑戦できてステージ1をクリア→解放→ステージ2をクリア→解放といった感じにしていきたいと思ってます
MMashiro

2020/08/05 07:37

ほぼ繰り返しになりますが 次回アプリ起動時にも開放状況を引き継ぐということであればPlayerPrefsを使用して 起動するたびにステージの開放状況がリセットされるのであればPlayerPrefsを使う場面ではないです。 恐らくアプリを終了しても開放状況を保持したいのであれば、 PlayerPrefsを使用して、ステージ選択画面の端にでもデータ削除ボタンを用意してそこから PlayerPrefs.DeleteAll() を呼び出すようにすれば、 デバッグする際もそのボタンから開放状況をリセットできるので便利そうに思います。
O.M

2020/08/09 13:27

遅くなりましたが詳しくありがとうございます。わかりました使う場面を考えて活用したいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問