12/08/2018, 15:15

Day 12 - Field creation and scene load

こんにちは。 昨日はゴリ押しでver1.2を実装したところで終了しました。 悔しい気持ちもありますが100%の途中の物よりも60%ぐらいでも完成物を期限までに作成するのが目標です。 60%も出来ているかどうかはまた別の話ですが。 ver1.3 さて、ver1.3がどういう機能を追加するものかというと ver1.3 外フィールドの作成 外フィールドに行けるポータル作成 街以外のフィールドを作成して、そのフィールドへとつながるポータルを作成するというものです。 村のどこかに門を配置して、門に入ったら外に出ていくという感じですね。 ...

こんにちは。 昨日はゴリ押しでver1.2を実装したところで終了しました。

悔しい気持ちもありますが100%の途中の物よりも60%ぐらいでも完成物を期限までに作成するのが目標です。 60%も出来ているかどうかはまた別の話ですが。

ver1.3

さて、ver1.3がどういう機能を追加するものかというと

ver1.3 外フィールドの作成 外フィールドに行けるポータル作成

街以外のフィールドを作成して、そのフィールドへとつながるポータルを作成するというものです。 村のどこかに門を配置して、門に入ったら外に出ていくという感じですね。

まずは見た目から入ります。 右の家の近くのレンガを外につなげて、そこに門を配置してみます。

Emptiness

うーん。 そういえば虚無感を消すためにフェンスを設置したんだった。 門を配置するためには閉鎖空間をぶち破らなければならない今、虚無がまた僕を襲いに来た。

よくあるゲームでは、作り込みはしないけど外もある程度建物や自然を配置してこの虚無感を消しているみたい。 あるいはカメラの位置が固定でそもそも外を見えないようにするとか…色々方法があるみたいですね。

TPSという特性上カメラは移動出来るためごまかしは効かなさそうです。 門の先に続く道をちょっと作ってあげましょう。

Terrainを使って周りに山を配置、そして門の後に続く道を作成。 Terrainの木を配置する機能も使って道に森を作る。

わちゃわちゃやった結果がこちらです。

超大きな山に囲まれた村が誕生しました。 ファンタジーっぽい世界観で虚無感を埋めるほどデカイものって山ぐらいしか思いつかないですね 圧倒的アイデア不足。もうちょっとゲームをプレイする時に風景の表現の仕方も見る癖を付けてみよう。

Create portal

さて、ではポータルを作成していきましょう。 RPGにおいて街から外のマップへ移動するまで、プレイヤーがずーっと移動しなきゃいけないゲームなんて珍しいですよね。

多くのゲームは門に触れたらローディング画面に移行してロードが終わったら外のマップに居るっていう感じだと思います。 このゲームもそれと同じにします。

例によって見えない当たり判定を配置して、その当たり判定に当たったら外のマップへと移動する処理にします。

画像のような感じがいいでしょうか。 これを見てるとモンスターハンターで尻尾を切った時にマップ移動地点に尻尾が飛んでしまって剥ぎ取りが出来ない時の悲しみを思い出します。

外のマップに移動する際は、Sceneから別のSceneへ移動するのだと予想。 なので、新しいSceneを作ってそこに適当なフィールドを作ります。というか実はもう作ってあります。

ほんとにTerrain便利ですね、他にもUnityには色々機能あるんだし色々と使ってみなければ。 フィールドが出来ているので、あとは門に入ったら別のSceneを読み込むスクリプトを書きます。

Load map

マップ移動って結構複雑な処理のように思ってしまいますが、実際は結構簡単みたいです。

Application.LoadLevel ("SceneName"); //SceneNameという名前のシーンを読み込む

こちらを実行してやるとシーンの読み込みが発生します。 僕の場合Fieldという名前のSceneで新しいマップを作ったので

void OnTriggerEnter(Collider other) //当たり判定にキャラクターが入ったら
{
    Application.LoadLevel("Field"); //Fieldという名前のシーンを読み込む
}

このようなスクリプトを門の近くの見えない当たり判定に組み込んでやることでマップ移動が実現します。 実際に動かしてみると…

うわぁ~~~

フリーズしたしなんかエラー吐かれてる。いやだ~~ と思ったけどこれ、Build Settingsのところで新しく作ったシーンが追加されてないから「そんなシーン見つからないぞ!」と怒られてるだけでした。

ここに追加しないと読み込めないんですね、追加してからもう一度実行!

Dark

読み込みは出来た、でもなぜか凄く暗い。 これ、チュートリアルの玉転がしを作っているときにも同じような現象に会ったような記憶がある。

その時と同じ解決方法で WindowタブからLightning→Settingsを選択。 その次にGlobal mapsタブを選択してAutoのチェックを外し、Generate Lightningをクリック。 Unityのバージョンによって色々と項目の名前が変わってややこしいことになっているみたいですね。 一応、僕のUnityのバージョンは5.6です。

↑操作が終わった後の画像。 この操作を読み込むシーンに適用することで暗くなる現象を修正することが出来ます。

実際に動かして確認します。

ちゃんと明るくなりました、やったぜ。 プレイヤーくんも心なしか嬉しそうです。

Return to village

今の状態だとフィールドに出たら村八分にされて一生村に戻れない状態です。 フィールド上にも移動判定を置いてあげてそこに触れたら村に戻るようにします。

当たり判定に以下のコードを書いたスクリプトを組み込んでやります

void OnTriggerEnter(Collider other)  //当たり判定にキャラクターが入ったら
{
    Application.LoadLevel("Town0"); //Town0という名前のシーンを読み込む
}

そういえば最初は街を作るつもりだったのでシーン名がTown0になっていますね まあ、気にしないでおきましょう

実際に動かしてみます。

ちゃんと動作してます、これにてver1.3完成!!

Wait

待て、おかしい。 このプレイヤーは門から出て同じところに戻ってきたはずなのになぜか村の中から場面が始まっている。

現実で例えるなら家に帰ってきて玄関の扉を開けた瞬間台所に突然ワープしたみたいな状態になってますね。 一体コレはどうすればいいのか・・・?

Convenient bool and ...?

そうだ、bool型変数でゲーム開始時なのか村に戻ってきた時なのかを判定してプレイヤーを移動させればいいんだ。 true,falseって判定だけでいろいろな事が出来るなあ。

しかし、そのためには外マップでtrueになったboolを保持したまま村マップでboolの判定を行わなければいけない。 そのためにはどうすればいいか?

static変数です。 public static bool hogehoge; みたいに宣言してあげれば、あとは宣言したクラスにアクセスして変数を呼び出してあげるだけで 値を読み込んだり、変えたりできます。

では、コードを書いていきます。

public GameObject pureiya; //インスペクター上で取得するゲームオブジェクトをpureiyaという名前で定義する
public static bool muramodori; //muramodoriというtrue.falseの判定を行うための変数を定義。

void Start()
{
    talkt.SetActive(false);
    kaiwauii.SetActive(false);
    if (muramodori) //muramodoriがtrueならば
    {
        Vector3 zahyou1 = pureiya.transform.position; //pureiyaの座標を取得する
        pureiya.transform.position = new Vector3(-20, 0.11f, 7); //取得した座標に(-20,0.11,7)という座標を代入する
        Vector3 kaiten1 = pureiya.transform.localEulerAngles; //pureiyaの回転角度を取得する
        pureiya.transform.localEulerAngles = new Vector3(0, 90, 0); //取得した回転角度に(0,90,0)という回転角度を代入する
        muramodori = false; //muramodoriをfalseにもどす

    }
}

今回pureiyaに入れるゲームオブジェクトは動かすプレイヤーです。ちなみにbool型の初期値はfalseです。 こんな感じのスクリプトを書いて、外フィールドから村に戻ってくる時の 当たり判定に組み込んでいるスクリプトの移動判定を行った後に

gamecontroller.muramodori = true; //staticで宣言しておいたmuramodoriにアクセスして、muramodoriをtrueにする

という一文を追加します。 外フィールドから村に入る時にmuramodoriがtrueとなるので、上の長い方のコード内のif文の中身が実行されます。 if文の中身が実行されたあとにmuramodoriはfalseとなります。 もしまた別のフィールドが出てきた場合には、muramodori2とかで判定をして都度座標指定をしてあげればOKです。

これを動かすと…

位置は完璧ですけどカメラのことをすっかり忘れていました。 カメラも同様に位置の座標の指定をしてキャラクターの後ろに配置してあげます。 スクリプトの内容はVectorの所をカメラ用に書き換えたものを追加しただけなので省略します。

Completed!!

パーフェクト。マップを追加すると、ゲームの世界がだんだんと出来上がっていく感触が味わえていいものですね。

これにてver1.3のマップ作成、マップ移動機能の追加が完成しました。

boolだとかstaticだとか、そういう物を一つ一つ覚えていって組み合わせていくことでいろいろな事が出来るようになってきた。 なんだか四則演算を覚えているようで楽しいですね。

月曜終わりまでにver1.4のモンスターの配置と戦闘機能を実装するために頑張っていくぞーーー 今日はここまで。

0