見出し画像

UnityでSceneをまたいで変数を参照したり書き変えてみる話

こんにちは。「仕様です。」(@shiyoumasayume)という名前でSNSをやっているゲームプランナーです。ふだんはコンシューマータイトルプロジェクトでディレクターやプロデューサーが旗を振ったイメージを具体的にゲームデザインするという仕事をやっています。

また最近では在宅での仕事も増え、結果として自分の自由な時間が増えました。そこで勉強も兼ねて普段の業務では作れないようなゲームを個人開発したりしています。Unityを使ってひとりでゲーム制作を進めており、10月31日にプロトタイプの公開することを目指して作業をしています。

今回は、

ゲーム内のSceneをまたいで変数を共有し、
プレイ状況に応じて戦闘に変化を出すシステム

を作ってみようと思います。

このnote単体で読んでいただいても大丈夫ですが、作っているゲームについての詳細を知りたいという方は開発内容まとめなどを見ていただけると嬉しいです!

 作成中のゲーム「Dr.Holeking」についての全記事はこちら

開発に使うもの

PC
・MacBook Air 2020 13インチモデル
・第10世代の1.2GHzクアッドコアIntel Core i7プロセッサ
・Intel Iris Plus Graphics
・16GB 3,733MHz LPDDR4Xメモリ
・1TB SSDストレージ
ゲームエンジン
・Unity バージョン2020.1.2f1
Google chrome
・調べ物をするときに
Twitter / note
・経過報告用

Macbook AirにUnityというツールを入れてゲームを作っていきます。
1台のノートPCだけでの開発というたいへんコンパクトな装備です。

作ろうとしているゲームの概要

今回作っている「Dr.Holeking」というゲームはこんな要素を持っています。

・ポストアポカリプス(崩壊後の世界)なSFモノ
・基地のリソースを管理して襲来する敵を倒す
・敵を倒して得たリソースを使って基地の地下を掘削し、地球の核へと到達する
・iPhoneの縦持ちでプレイ
・ゲーム名:Dr.Holeking

プレイヤーが遊ぶときの流れはこんな具合です。

1.基地のリソースを消費して基地設備を整える
2.襲来する敵を倒す
3.敵を倒して得たリソースでさらに基地を増築or地面の掘削を進める。

敗北条件:所有する基地の設備が襲来する敵を倒しきれなかった
クリア条件:特定の深度まで掘削を進めた

戦闘にプレイヤーが工夫できる余地をつくりたい!

今回作りたい要素とは、プレイヤーがうまく戦闘をこなすための判断材料の提供です。

Dr.Holekingでは何ターンか基地内での行動を済ませると自動的に敵との戦闘が発生します。複数種類ある対抗用の戦闘リソースを満遍なく生産していけばどんな敵が来ようと安全ですが、それが行き過ぎるとプレイヤーの思考領域が少なくなり遊びではなく作業になってしまう。これを解消するために以下の思考をプレイヤーに提供することをねらいます。

■1
ランダムで特定のリソースにダメージを追加で与える敵を出現させ、被害状況を散らす。損害にばらつきが生まれることで満遍なく準備をする難易度があがり、今何を優先的に生産すべきかの思考が生まれる。

■2
ランダムで出現する敵のヒントを得られるような機能を与える。ヒントから次回の戦闘を予測し、リソース準備の確度を上げる。

ヒント自体は謎解きではなく、戦闘内容の予告のようなものです。ちゃんと考えないといけないヒント文を複数用意することは謎解きを作ることと同義でコストが高く、またその数にも上限があるため今回は見送ります。数種類程度の決まったヒント文章を用意し、初回はその意味から戦闘内容を考えるものの、一度文章と戦闘内容の相関を覚えれば後は予告文としての機能だけになるようなものにします。

文章を見るだけで戦闘内容がわかると遊びとしての手触りが向上しない可能性があるので、そこは実際にテストしながらみてみます。場合によってはいくつかの費用を支払えば戦闘内容の一部が事前にわかる情報を得られる、という立場にしてもいいかもしれません。ただ今回はゲーム途中から解放される便利機能のような位置でひとまず置いてみようと思います。

実際に作ってみた

・戦闘中にランダムで敵の増援が発生する機能を実装
・ラジオボタンから周辺状況を受信できる機能を実装

ゲーム開始時や、戦闘を終えたときに次回の戦闘で敵の増援が起きるかの判定が行われます。ラジオ画面ではその判定結果に応じたメッセージが表示されるというつくりになっています。

実装メモ

・メイン画面Sceneにて、ゲーム開始時や戦闘終了時に増援内容を決めるStatic変数の値が、「増援無し」「増援パターン1」「増援パターン2」「増援パターン3」のランダムで決まる。一度決まると、次回の戦闘が行われるまで新たな判定は行われない。

・ラジオ画面に入るとメイン画面のSceneで設定されたStatic変数を参照し、その内容に応じたテキストを出力

・戦闘画面に入るとメイン画面のSceneで設定されたStatic変数を参照し、その内容に応じた敵増援を出力。戦闘完了時に増援内容のStatic変数を初期化。

・戦闘を終えてメイン画面に帰ってくると次の戦闘での増援有無が再度決まる。
変数の参照と変更 メモ

<メイン画面スクリプト(例:MyGameMain)での宣言>
public static int hoge;
public static bool hogeCheck;

if(!hogeCheck)
{
    hoge = Random.Range(0,4);
    hogeCheck = true; // 1回だけ判定を行う
}


<ラジオ画面(例:RadioScene)での参照>
if (MyGameMain.hoge == 0)
{
    // 次回戦闘内容のヒントになるテキストを出力
}


<戦闘画面(例:BattleScene)での参照、上書き>
if (MyGameMain.hoge == 0)
{
    // Hogeの内容に応じた増援処理を行う
}

MyGameMain.hogeCheck = false; // メイン画面でのチェック判定を戦闘画面で初期化

というわけで

リソース管理ゲームにおいて戦闘にプレイヤーが工夫できる余地を入れたい!そのためにゲーム内のSceneをまたいで変数を共有し、プレイ状況に応じて戦闘に変化を出すシステムを作ってみよう、作ってみた、というお話でした。

いつにもまして込み入ったことを書きましたが、僕のように実装に不慣れなプランナーのなにか参考になればと思い書きました。実はStatic変数のやりとりにめちゃくちゃ詰まってしまって、Twitterで助けを求めたところたくさんの方が助言をくださいまして…本当にありがたいことですね…!

10月31日のプロトタイプ公開に向けてバリバリ進めております。引き続き優しく見守っていてくださると嬉しいです。

続きが気になる方はこちら!


ここまで読んでいただきありがとうございました!

よろしければコメント、スキ、フォローお願い致します!

Twitterもやっていますのでよろしければこちらでも絡んでいただけると嬉しいです。
https://twitter.com/shiyoumasayume


他にも色々な記事を書いています。

作成中のDr.Holekingについての全記事はこちら

プランナー向けの記事はこちら

はたらくクリエイターのためのプレイリストはこちら



よろしければサポートお願いします!いただいたサポートをモチベーションにまた活動を続けていきます