スポンサーリンク

Unity実習22、ゲームの流れを作ってみよう

SnapCrab_NoName_2016-6-7_11-32-1_No-00.jpg


だいぶ出来上がってきたので、ダンジョンに敵を複数出現させて、ボスを倒したらクリアできる
そんな設定をしていきます

ジェネレータ作成
敵を出現させすぎるとゲームが重くなるので、一定の数以上は出現しないようにしつつ、減ったら敵を増やす「ジェネレータ」を作ります
Hierarchyに空のオブジェクトを作成、名前を EnemyGenerator
SnapCrab_NoName_2016-6-7_8-56-7_No-00.jpg

Projectの Assets/Scripts に UNIDRA_DATA/Data/MainGame/Scripts/Chapter12/EnemyGeneratorCtrl.cs をドラッグ&ドロップ
HierarchyのEnemyGeneratorに取り付けます
SnapCrab_NoName_2016-6-7_8-55-27_No-00.jpg

スクリプトの解説がありますが、カット
面倒なプログラム書かずにゲーム作れないもんですかね...RPGツクールでやれってか

このジェネレーターから敵をスポーンさせることができます
HierarchyのWargを削除(念の為、消す前にPrefabをApplyしておくと安心)
HierarchyのEnemyGeneratorを選択して、InspectorにあるEnemyPrefabに、ProjectにあるWargプレハブをドラッグ&ドロップ
SnapCrab_NoName_2016-6-7_9-9-23_No-00.jpg

EnemyGeneratorをSceneビューでわかり易い場所に(地上)移動、ゲームを実行して敵が出現するか確認します
倒した側から狼がリスポンして、クソリスも良いところですが、こんなもんでしょう
リスポンが1つだけも寂しいので複製してマップに何箇所か配置します
HierarchyでEnemyGeneratorを右クリック > Duplicate で複製できます

ドラゴンとプレイヤーを、それぞれマップの好きな位置に移動させます
ドラゴンはラスボスなので奥に
ドラゴンがすぐに死んでしまってもいけないので、体力や攻撃力を上げておきます
SnapCrab_NoName_2016-6-7_9-33-19_No-00.jpg

そして、ゲームを実行してみて、強いか弱いかを試せば良いのですが
ここにきて、一つ重大な問題を発見
なんと、敵の攻撃を食らってもプレイヤーの体力が減らない!
何が駄目なのかと見てみると、こんなエラーが
SnapCrab_NoName_2016-6-7_9-39-50_No-00.jpg

SendMessage Damage has no receiver!
UnityEngine.Component:SendMessage(String, Object)
HitArea:Damage(AttackInfo) (at Assets/Script/HitArea.cs:8)
UnityEngine.Component:SendMessage(String, Object)
AttackArea:OnTriggerEnter(Collider) (at Assets/Script/AttackArea.cs:36)

そういえば無視してましたね...
クリックしてMonoが起動するとこんなエラー
SnapCrab_NoName_2016-6-7_9-41-40_No-00.jpg

Error while trying to load the project 'C:\Users\Public\Documents\Unity Projects\UNIDRA\Assembly-CSharp.csproj': オブジェクト参照がオブジェクト インスタンスに設定されていません。

なんのこっちゃ
Monoでは HitArea.cs が開かれて、エラーの原因と思しき場所を参照してくれていますが...
SnapCrab_NoName_2016-6-7_9-53-9_No-00.jpg

試しにProjectのプレハブフォルダに有るWargを置いて、プレイヤーが撃破して消滅させると
エラーが増えた
SnapCrab_NoName_2016-6-7_10-16-10_No-00.jpg

NullReferenceException: Object reference not set to an instance of an object
SearchArea.OnTriggerStay (UnityEngine.Collider other) (at Assets/Script/SearchArea.cs:16)

なぜ!?
ジェネレーターからスポーンするのを倒しても出ないのに!
このあたりは、Unityが自動変換したり、本が間違ってて色々大変だったので
恐らくその辺りで変になったんでしょうね
(剣振りながらスライド移動するし)

最終的に、突如としてあらーが出なくなり解決したので、最後まで読んで、どうぞ

いろいろと探してみましたが原因不明なので、飛ばします

ゲームクリアとゲームオーバー
ゲームの終了条件を設定します
1、一定時間経過
2、プレイヤーが力尽きる
3、ボスを倒す

空のオブジェクトを作成、名前を GameRule に
SnapCrab_NoName_2016-6-7_10-40-56_No-00.jpg

ProjectのAssets/Scriptsに UNIDRA_DATA/Data/MainGame/Scripts/Chapter12/GameRule.cs をドラッグ&ドロップ
HierarchyのGameRuleに取り付けます
SnapCrab_NoName_2016-6-7_10-40-40_No-00.jpg

SnapCrab_NoName_2016-6-7_10-43-25_No-00.jpg

5分間放置すると、Consoleに GameOver と表示されます
これで、終了条件1つ目が終わり
SnapCrab_NoName_2016-6-7_10-45-10_No-00.jpg

HP0でゲームオーバー
PlayerCtrlスクリプトを更新
既にProjectにある PlayerCtrl.cs を UNIDRA_DATA/Data/MainGame/Scripts/Chapter12/PlayerCtrl.cs で上書きします
前回同様Monoで
今回はGo Ahead!が出ませんでした、なんでだろ
2つ目終わり

ボスを倒してクリア
HierarchyでDragonを選択、タグを Boss に(なければAdd Tagから追加)
SnapCrab_NoName_2016-6-7_10-57-22_No-00.jpg

EnemyCtrlを更新
既にProjectにある EnemyCtrl.cs を UNIDRA_DATA/Data/MainGame/Scripts/Chapter12/EnemyCtrl.cs で上書きします
SnapCrab_NoName_2016-6-7_11-9-28_No-00.jpg

ちなみに、この作業が終わると、先ほどのエラーが何事もなかったかのように無くなりました!
ちゃんと敵の攻撃でプレイヤーのHPが減る!!
よくわからないが、やったぜ。
(たぶん、Unity5の自動変換が良くなかったのでは...?)

が、新しいバグも見つかりまして
エラーは出ないものの、アイテムを拾ってもHPが回復しない、攻撃力が上がらない
次から次へと...

こちらは原因は分かりました
アイテムを拾ってみると、どちらを取っても「攻撃力が上がる」事がわかったので、設定ミスです
Projectのプレハブで緑の方を選んでInspectorにある Kind の部分を Heal にします
ここで攻撃か回復かを選択していたんですね
見落としてました、これで拾ったらHPが回復するように
昨日の記事には追記しておきます
SnapCrab_NoName_2016-6-7_11-21-29_No-00.jpg

他にも変化があって、HPが0になって倒れると、その後地面を這いずり回らなくなりました
どうも、ゲームオーバーで判定してるような?

最後まで行くと、色々と不具合も直ってなんとか出来ました
これで今回はお終い

本の第二部も終わりました
次からは新しい分野?に入ります
まだまだ終わりません
関連記事

Leave a Reply

管理者にだけ表示を許可する

Comment

Leave a Reply

管理者にだけ表示を許可する