ゲームのメインメニューを作る前に
1.こんな感じで作りたい
簡単な仕様
ゲームのスタート画面(これがメインメニュー)ここからステージを選択し、ゲームのステージへ移行させる
ゲームステージ中メニューを開くとこの画面に行く前に、報酬画面を出し、そのあと、なんかのボタンでメインメニューへ移行する、これの繰り返しでゲームを展開させて行く
どうやって実装するか?
シーンでゲームステージ(まずは、実験用なので2ステージほど)作成、メニュー画面と報酬画面を作成
メニューの開き方は、キーボードCキー
クリック型のボタンでマウス左クリックで選択
まずは、目次ー 目次 1.こんな感じで作りたい 2.必要そうなパーツ集め 結局こうなった&何をやったのか説明
2.必要そうなパーツ集め
なんとなくの想像
プロジェクトの階層をテキストでイメージして書いてみます
プロジェクト
・プレハブとか、オブジェクトが格納されている場所
これは、シーンとかではなくアセット置き場みたいなところ?
・シーン1(プレイヤーの情報経験値等破棄されては、困るもの置き場)
・シーン2(メインメニュー)
・シーン3(報酬画面)
・シーン4(ステージ1)
・シーン5(ステージ2)
シーン1は、破棄せず使い回す
多分この考え方でできるはず、できなければ第2案を考えます
必要そうなパーツスクリプト列挙します(徐々に増えていくかも)
DontDestroyOnLoad
シーンを破棄しても破棄したくないオブジェクトとかに使うもの
LodeLevelAdditive
シーンを破棄せずにシーンを呼び出すことができるらしい
SetActive()
false trueを入れることでそのシーンを見えなくする?実際は、存在している、ができるかも
static変数
使いまわしたい変数を作れるかも
アプリ終了まで消えないらしい
usingのとこにunityEngine.SceneManagement
これを使わないとそもそもシーンを移行できないみたい
SceneManager.LoadScene(“シーン名”);
現在のシーンを破棄して新しいシーンを呼びだす
LoadSceneMode
LoadSceneの第二引数
SceneManager.LoadScene(“シーン名”,LoadSceneMode.~~~);
第2引数があったのです(これ調べてきます)これを使えばシーンを破棄せず他のシーンを呼び出せるはず
SceneManager.UnLoadScene(“シーン名”);
いらなくなったシーンを消す(ステージは、これで消していく予定)
あと必要そうなもの等
どこのシーンに情報(経験値やプレイヤーのステイタス)を格納しとくと楽なのか
シーン(メインメニュー)をずっと破棄せず残しといてSetActiveで見えなくする?が楽そうだからまずは、この考え方で実験してきまーす
パーツが足りているのか足りていないのか試してみないとわからないな
途中で気づいたのですがシーンの移行は、気をつけないと、後からステージ追加した時、合体でシーン追加ではなく、そのまま追加してしまい最初のシーンは、破棄されるのを注意しないといけないしシーン追加は、使うけど、破棄したくない変数たちは、どこかのオブジェクトにくっつけておいた方が安心かも、それか全部staticこれは、まだやっていい事なのかわかんないでは、あるデメリットないか調べる必要がありますね
結局こうなりました&何をしたのか説明
まずは、動画をみてください
ゲーム画面をメインメニューからスタート
プロジェクト ・プレハブとか、オブジェクトが格納されている場所 これは、シーンとかではなくアセット置き場みたいなところ? ・シーン1 ・シーン2(メインメニュー) ・シーン3(ステージ1) ・シーン4(ステージ2)
ヒエラルキーでシーンをクリエイトしてメインメニューをつくる(若干端折ります)そしてボタンを配置
作ったシーンは、unity の上のバーのfile buildsettingを開いてScene in buildの枠の中に入れておいてください、いれたら閉じてよかったはず
シーンを編集するときは、シーンごとに保存してほかのシーンをロード、邪魔なシーンをアンロードを繰り返して作っていきました、アンロードする前にちゃんと保存を心がけてやりました、リムーブだけは、怖かったので試してません、多分消えます
スクリプトをボタンにaddします
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//これわすれるとシーンチェンジできないぞ public class stage_01he : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } public void Stage_01hego() { SceneManager.LoadScene("stage_01"); } }
赤文字を追加しました
説明します
using UnityEngine.SceneManagement;
これを使わないとシーンチェンジの機能がつかえないのでとりあえず書いときます
public void Stage_01hego(){}
まだあまり詳しくないのですがpublic void ~~~(){}とやるだけで関数?(機能が作れるのです、すごい)わざわざつくったのは、クリックしたときボタンの機能(unityが準備してある)で呼び出すためです次の記述まで説明したら書きます
SceneManager.LoadScene(“stage_01”);
stage_01というのは、僕のシーン名(シーンのファイル名)です(みなさんは、かっこいい名前を作ってください)
こうかくだけでシーンチェンジします、ただ今開かれているシーンのオブジェクト等全部破棄されます、今回は、それでよかったのでこれを使いました
どういう条件でこのpublic void Stage_01hego(){}が呼び出されるのか?
ボタンを作った時最初からついているスクリプトをみてください
Button(sclipt)と書かれているやつです、ヒエラルキーでボタンをクリックしインスペクターを見てください、これの詳細にOn clickこれのプラスボタンをおすと
runtime only nofunction noneobject
こんな感じで出てくると思います、これのnoneobjectにスクリプト(さっき作ったやつ)をドロップしてください、するとnofunctionが選べるようになっていると思うので、これの中からさっき作った機能stage_01he(自分で作ったスクリプトのファイル名)を選びstage_01hego(自分で作った関数(機能名))を選んでください、これでクリックしたらこの機能が呼び出されるようになりました
つまりクリックしたらステージに画面チェンジができます。もっと難しいと思ってたら簡単だったー
次にUキーを押したらメインメニューへ
最初Cキーと書いてたけど自分でやってて誤操作がおおかったのでUに変えました(UIからきてます、あんまり関係ないけど)
とりあえずスクリプト、今回は、キャラの移動用に使ってたスクリプトに追記しました
using UnityEngine.SceneManagement;これは、忘れずに
void Update() { if (Input.GetKeyDown(KeyCode.U)) { SceneManager.LoadScene("main_m"); } }
さっきは、ボタン(unityにある機能)を使うためにちょっとすごいこと(僕的には、)しましたがいつものif文の中にさっきと同じやつの移動シーン違いをやりました
これで動画でやっているようにメインメニューからステージ選択しゲーム画面からUキーでメニュー画面にということができるようになりました
ただ今回のやり方だとシーンチェンジのたびに今いるシーン(オブジェクト等)は破棄されます。次回予定の破棄されないための方法(レベルアップを実装するぞ、シーンチェンジでデータ破棄されたら困るぞ編)でやる予定です
ただ今回の実験で分かったのは、シーンチェンジで破棄されないもののなかに「プレハブ」「インターフェース」これが破棄されないとわかったのが僕的に大収穫でした、シーンチェンジのほかの機能の勉強を後回しにできるのです、レベルアップの機能追加からやりたいのです、空のゲームオブジェクトに変数のみのスクリプトを作りアタッチして破棄しないでねというスクリプトを追加すればよいとのことなので、次の勉強が楽しみです
また次回お会いしましょう。
コメント