◆やったこと
必要なUIパーツの洗い出し
エクセル風UIパーツの制作取り掛かり(背景)
◆課題
ドット絵の打ち方の基本をどこかのタイミングで学ぶ必要がある
Firealpacaのドット絵ツールで間に合わせているが、これでいけるんだろうか……?
◆やったこと
プランナー以外のアサイン状況もプロジェクトの進捗に影響するようにする
2本目、3本目のラインも稼働するようにする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//現行のプロジェクトが完成して、次のプロジェクトを提案する際にどのラインなのか引数を渡す public void MasterUpProj2() { //新しいプロジェクトを提案してくる //現行のプロジェクトが完成して、次のプロジェクトを提案する際にどのラインなのか引数を渡す this.proposal.ProposeProject(2); (省略) } public void ProposeProject(int tmpLine) { //渡された引数をStaticな変数に代入する line = tmpLine; (省略) } //Proposalウィンドウで左のプロジェクトのOKを押したときの処理 public void OnClickAcceptLeft() { (省略) //project.masterupメソッド内でproposal.ProposeProjectメソッド実行時に渡した引数の値によって処理分岐 switch (Proposal.line) { case 1: this.project.DecideProject1(tmpPropNum); break; case 2: this.project.DecideProject2(tmpPropNum); break; case 3: this.project.DecideProject3(tmpPropNum); break; } } |
◆次やること
一通り実装が終わったので、UIパーツの制作に移ります。
そのあとにはデータの調整を行い、面白くしていきます!
◆やったこと
デバッグ用にスペース押下で時間が進むようにしていたのを、UI上のボタンで進行させるように変更
プランナー以外も雇ったりアサインしたり解雇できるようにした
GifCamというソフトを利用して、UnityのゲームビューをGifで録画できるようにした
◆困ったこと
ボタンにつけるスクリプトはすべて独立させるべきなのか?
publicな変数を含む場合、そのボタンには不要であっても余計なメモリを食ってしまう気がする
ボタンに使うスクリプトはpublicな変数を使わずfindを使うべきか?
メンバーの雇用解雇、各プロジェクトへのアサインがボタンだとわかりにくい?D&Dとかで直感的に操作したいけどちょっと今の自分にはハードル高い気がする
昔の実装を思い出しながらひたすらコピペしまくるので、イージーだけど単純作業でちょっと辛い
◆明日やること
プランナー以外もプロジェクトの進捗に影響を与えるようにする
プロジェクトを同時並行で複数進むようにする
◆やったこと
ゲーム開始→メンバーをリクルート→給料を払いながらプロジェクトを進捗→完成して報酬を獲得→一定額稼いだらクリア
の基本サイクルをプランナーだけ、ライン一本分だけ実装
◆次やること
クリア画面、ゲームの目的を伝える導入シーンの整備
プランナー以外も実装
複数ラインで並行して開発できるよう実装
時間経過をボタンに出す
これらが終わったら、エクセル風UIのリソース制作に移ります
◆気づいたこと
あえて区切りの悪いところで終わらせることで、次に取り掛かるときのハードルを低くするという開発ハックを思いつきました。
前の記事はこちら
◆今日やったこと
・プロジェクト全体の構成を再度確認
└間の空いてしまったプロジェクトなので、前まで何をやっていたのかさっぱりわからなかった。まずはその振り返りに時間を使った。まったくモチベの上がらない作業なので、なるべく減らしたい部分である。
・実際にウィンドウで選んだゲームを、作るゲームとしてUIに表示させること
・ゲームが完成した時の報酬を、マスタデータから参照すること
└ゲッターセッターでうまくいかなかったので、メソッドの引数としてマスタのIDを渡した。
Projectクラス:作っているゲームの進捗処理やUIの更新を管理
Proposalクラス:新しく作るゲームの情報や、ゲーム提案フェーズのUIを管理
Buttonクラス:提案フェーズで提案されたゲームを選んだ時にProposalが持っているマスタIDをProjectへ橋渡しする
ButtonクラスにマスタIDを渡し、さらにProjectクラスからButtonクラスへマスタIDを参照したがうまくいかなった。理由は不明だが、下記の通りButtonクラスから直接ProjectクラスへマスタIDを引数として渡したらうまくいった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//Buttonクラス //Proposalウィンドウで左のプロジェクトのOKを押したときの処理 public void OnClickAcceptLeft() { //Proposalウィンドウを閉じる this.proposalParent = GameObject.Find("Proposal"); this.proposalParent.GetComponent<Canvas>().enabled = false; //選んだタイトルの情報をラインにぶち込む処理 //Pro1に入った配列番号を取得する this.proposal = FindObjectOfType<Proposal>(); this.tmpPropNum = proposal.GetPro1; //projectクラスでUIを更新させる this.project = FindObjectOfType<Project>(); this.project.DecideProject(**tmpPropNum**); } ----- //Projectクラス //プロジェクトのUI更新する public void DecideProject(**int line1**) { //プロジェクト名の表示 this.projectName.GetComponent<Text>().text = projectMaster.param[line1].Name; this.SetterLine1 = line1; } |
◆課題
・ゲーム内で複数のゲームをラインとして同時に作るとき、それぞれの進捗の仕方はそれぞれのクラスで管理することになる。共通の挙動も多いため、本来ならクラスの継承をつかうべきところな気はするが、新しいことをあんまりやりすぎると時間がかかって集中力が落ち、モチベが下がるので、複数クラスを用意する力業で行こうと思う。継承はまた今度。
◆アイデア
結局自分は絵が描けないため、既存のアセットに頼っている。もちろんうまくはまればよいクオリティのものができるが、ハマるものを探し続けていくうちにモチベが下がっていくことも考えられる。将来的なことを考えると、少しずつでもデザイン作業をやれるようになっていきたい。が、突然イラストを描くのもハードルが高い。ということで、難易度を落としつつチープに見えないためのアイデアとして、UIをエクセルなどのスプレッドシート風にしてみると面白いかもしれない。ゲームのコンセプトにも合致するし。
Unity1week「あつい」にて制作。
作品URL:https://unityroom.com/games/huttobademae
やりたいことはいろいろあったが、結果的にはかなりオミットすることになった。
一番ボトルネックになったのは、パラメータの強化システム。ここの解決に時間を食った。
具体的に言うと、あるスクリプトで定義した変数を、ほかのスクリプトで呼び出し、変更し、再定義すること。
基本的にGetter/Setterを使うことは分かった。
ほかのスクリプトから変数の値を参照する
https://qiita.com/Teach/items/8d1cdb90a3b533707c9aシーンをまたいでデータを参照する
※FindObjectOfTypeを利用してGetterを使うやり方はできない?⇒シーンに存在するオブジェクトから探してくるっぽい
が、ボタンオブジェクトにくっつけたスクリプト内でGetter/Setter関数を使ってもうまくいかない。
public staticな変数を取得、変更しても、同じ変数名で中身が異なるものが複数存在するような状況になってしまった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public void OnClickPowerUpSpeed() { //所持金がパワーアップコストより少なければエラー if (tmpCash < powerUpCost) { Debug.Log("所持金足りません"); } else { //tmpPowerValueの値を増やす tmpPowerValue++; //所持金を減らす tmpCash -= powerUpCost; //必要コストに倍率かける powerUpCost *= powerUpCostRate; //表示に更新する this.valueSpeed.GetComponent<Text>().text = tmpPowerValue.ToString(); this.valueCashUI.GetComponent<Text>().text = "現在の所持金 " + tmpCash.ToString() + "円"; } } |
tmpPowerValueは、別スクリプトで定義したパワーの値をGetterで取得して格納している。仮に10が入っているとして、これを実行すると、中身が10のtmpPowerValueと11のものが同時に存在するような状況に。
解決策としては、tmpPowerValueもpublic staticなものとして宣言することで意図するような挙動となった。残念ながら理由はわからない。おそらく、変数の寿命の問題だろうと考えている。このメソッドの中で変更した値が、クラス全体で共有されてないとかそんな感じ。クラス変数と、メソッドの中でしか有効でない変数について、勉強する必要がありそうだ。ということで下記を読んでみる
苦しんで覚えるC言語「変数の寿命」
https://9cguide.appspot.com/12-01.html
◆こんなゲームにしよう
コンセプト:
ゲームを作るゲーム
必要な仕様:
・開発するゲームが提示される
・選んだゲームトップ画面に表示される
・選んだゲームバーをアサインできる
・時間が経過するとアサインされたメンバーの能力に応じて、ゲームが進捗する
・ランダムイベントが起こる
・ゲームが完成するとポップアップが表示され、報酬が受け取れる。
・完了したゲームはトップ画面に表示されなくなる
・メンバーや設備に投資する
・次のゲームが提示される
(以上を繰り返す)
◆新たな試み
・ゲーム内で制作するゲームを外部マスターとして管理する。
アチーブメントをスプレッドシートで管理して実装する
https://note.mu/azumagoro/n/n1e915ab38ead
ScriptableObjectとして作成したデータを取り出す
◆トラブル
途中でUnity1Weekが挟まって開発期間が意図せず長くなってしまっている。
今作では、この外部マスタを使ったデータの管理が新しい学びになったので、その他の機能の部分はある程度シュリンクさせて、とりあえず完成させることを優先しようと思う。
本当は、開発メンバーにも信長の野望みたいに個性を持たせたかったが、クッキークリッカーのようにリソース(=数字)と割り切ってそれを増やしていくタイプの強化に割り切ろう。強化の仕組みはUnity1weekのフットバ出前で習得したので時間かからずできるはず。