Day 10 - Set the end point
連休明けです。 連休中は現在製作中のゲームはいじらずに、クソゲーを作ったりそれで友達と遊んだり普通にゲームしてたりとしていました。 記事上で10日目となる今日まで色々とやってきましたが…気がついたらちょっとしたゲームを作って共有するなんてことが出来るようになったんですね。 さて、自分の作りたい物を作るとは言いましたが、グラフィックやら戦闘システムのバランスやらを考えていると 求める物を自分一人で作ると年単位の時間がかかってしまいます。 最高を追求するのも良いですが 「100%をダラダラやるより、ある程度の成果を決めた期間で出すほうがいい」とアドバイスを頂いているこの身。 ...
連休明けです。 連休中は現在製作中のゲームはいじらずに、クソゲーを作ったりそれで友達と遊んだり普通にゲームしてたりとしていました。 記事上で10日目となる今日まで色々とやってきましたが…気がついたらちょっとしたゲームを作って共有するなんてことが出来るようになったんですね。
さて、自分の作りたい物を作るとは言いましたが、グラフィックやら戦闘システムのバランスやらを考えていると 求める物を自分一人で作ると年単位の時間がかかってしまいます。
最高を追求するのも良いですが 「100%をダラダラやるより、ある程度の成果を決めた期間で出すほうがいい」とアドバイスを頂いているこの身。
End point
そこで、今回作る物の制作期限は来週火曜日の23:59に設定します。 そこまでに作ろう!と決めたバージョンがこちら。(現在ver1.1)
ver1.2 UIの作成(HP・MPや、メニュー画面) NPCとの会話機能 - 木曜日まで ver1.3 外フィールドの作成 外フィールドに行けるポータル作成 - 金曜日まで ver1.4 敵モンスターの作成 戦闘機能追加 - 月曜まで ver1.5 クエスト機能 -火曜まで
大分ヤバいスケジュールを組んでしまいましたが、まあなんとかなるでしょう。 ではどんどん作っていきましょう
ver1.2
UIの作成とNPCとの会話機能ですが、UIから作っていきます。 UIを作った時の画面の完成図は大体こんな感じです
また、ESCを押した時にゲームを終了するかどうかを表示する機能を付けます
では、左上にHPバーとMPバーっぽい画像を配置してあげましょう。 HPとMPっぽい画像をjpgで適当に作り、ゲームオブジェクト作成からUIのRaw imageを選択。
その後、表示するイメージを作成した画像に置き換えます。
HPが減る要素などはまだありませんが、もし実装した場合はWidthパラメーターを下げることで表現しようと思います。 下げた場合↓
あとはNPCと会話した時の会話ウィンドウですね。 これもまた適当にjpgで画像を作ってRaw imageで配置します。
How to make the talk UI invisible
何も会話してないのに表示されても邪魔なので、会話UIは普段は非表示にします。 非表示にする方法は2つあるらしくて、それぞれにメリットデメリットがあるみたいです。
こちらのサイト情報↓ http://marunouchi-tech.i-studio.co.jp/2290/
GameObjectのAlphaを0にする、というのはゲームオブジェクトを完全に透明にしてあげるという方法です。 それによって、「画面には写ってるんだけど透明だから見えないよー」という状態になるわけですね。
もう一つの方法は、GameObjectを非アクティブにする。 こちらは完全に存在を消してやることで、「ほんとに何もない」状態になります。
サバイバルシューターを作った時にはAlphaを0にしてイベントが起きた時に透明を解除するようにしていました。 ならば、ここは非アクティブにする方法を試してみましょう。(参考サイトにも非アクティブ化が基本って書いてるし)
"Talk" function
非アクティブ化を試すといってもまずは会話機能をつけなければいけません。 しかし、会話機能ってよくあるゲームではどういう処理になっているんだろうか?
特殊な処理など無い一般的な会話(村へようこそ!みたいなただの会話)の流れとしては
相手に近づく → 会話の指示 → そのボタンを押すと会話イベント発生 → 会話内容が表示される → クリックかキーを押すと会話が進んでいく → 会話終了
こんな感じでしょうか。これをUnityでの処理に置き換えると
NPC周りの判定に近づく → 判定に触れ、会話の指示 → そのボタンを押すと会話イベント発生 → UIが表示される → 会話の内容がUIに表示される → クリックかキーを押すと会話が進んでいく → 会話終了
といった流れになります。 では、一個一個作っていきましょう。
Collider Around NPC
鍛冶屋の周りに見えないColliderを作ってあげます。 画面上ではこんなかんじ
このColliderにIsTriggerを入れて近づいているかどうかの判定にします IsTriggerを入れないと鍛冶屋の周りにATフィールドが張ってるみたいな状態になります
Talk text
次は、会話指示テキストの表示です。 文字で書くと何を言ってるのか分かりづらいと思うので、とりあえず画像を
このPress "F" to talk ですね。Fを押してくださいって指示です これも普段は非アクティブにしておきます。
Display when approaching
次は、鍛冶屋にプレイヤーが近づいたら会話指示が表示されるようにします。 処理は簡単
プレイヤーが見えない判定に入る → 非アクティブの会話指示がアクティブになる
ついに出てきましたね、アクティブ非アクティブ とりあえず、判定を出すスクリプトを書きます
error
と思ったら・・・なんだこのエラーは?
どうやらクラス名とファイル名が違っていたために出てしまったエラーみたいです。 クラス名がtalkなのにファイル名はtalk"k"になってましたね。ファイル名をtalkになおしてあげます。
気を取り直して… 動作チェックの為に、鍛冶屋の周りに行くと接近判定が出てキャラクターが消されるようにします。
消されてますね。 ではこれを会話指示テキストをアクティブにするスクリプトに変えていきます。
まずは最初にゲームが開始したと同時にテキスト(以下Talktext)を非表示にするスクリプトを書きます。 スペースシューター作成の時にそんなスクリプトを書いた覚えがあります。 しかし見直してみると、表示するテキストを空白にするというもので、擬似的に非表示にしていました。
今回は、ゲーム開始時にGamecontrollerというゲームオブジェクトからTalktextにアクセスして非アクティブにする。 という処理を行いたいのですが…
public class gamecontroller : MonoBehaviour { public GameObject talkt; void Start() { talkt.SetActive(true); } }
と書いてみてインスペクター上でTalktextを指定してあげてみても消えず。 なんでだろ、Void Startの中は開始時に一回だけ読み込まれるって習ったぞ。
試しにVoid Updateにしてみてもだめ。 じゃあ、中の記述の仕方が悪いのかな?
ん?
talk.SetActive(true);
これ・・・
talk.SetActive(true);
あっ。
表示しますか?→「はい」になっていた。ここをfalseにしてみたら消えた。
Next
同じように上の様な処理をIsTriggerに入った時に書いて、TalktextをtrueにしてやればOKです。
思い描いた通りの動きになっています。 しかしこれ、鍛冶屋から離れてもTalktextが永遠に表示されるようになってしまっていますなので当たり判定から離れた時にTalktextをfalseにしてやる処理を追加します(もっと頭のいい方法があるとは思う)
void OnTriggerExit(Collider other) { talkf.SetActive(false); }
こいつを上のスクリプトに追加。 これでやっと会話指示の表示が完成しました。
次は指示されたFを押した時に会話イベントが発生する処理ですが、長くなってしまったので次の記事で書きます。 今日はここまで。