フィールド⇔バトルについて
アンリアルエンジン4を使って、どうやってこのゲームを作っていったか説明します。
前にも書きましたが、私はプログラマーでもデザイナーでもプランナーでもない素人ですので、開発内容をさらすのはかなり恥ずかしいのですが、何か少しでも参考になることがあれば…と思います。
玄人の方々、間違い等々たくさんあると思いますが、お手柔らかにご指摘いただければ幸いです!!
【レベルについて】
さて、このゲーム、ターン制RPGということでフィールドでエンカウントするとバトルに入る、つまりフィールドとバトルの2つのパートを行ったり来たりするのですが、これをどうプログラムに落とし込んでよいのか…
商用ゲームを見ていると、フィールドでエンカウントするとロードが入ってバトルに、バトルが終わるとまたロードが入ってフィールドにと動作しているので、たぶんフィールドのレベルとバトルのレベルを分けて作って、都度都度ロードするのが正しいのかと思うのですが、パーシスタントレベルとかサブレベルとかレベルストリームとかやるんですよね…?
あー無理ですね、私のような素人では理解できない。
というわけで…
フィールドとバトルを同じレベルに突っ込みましたよ!
ついでにミニマップとUI用の銃の表示も同じレベルに突っ込みました。
銃表示とミニマップはどちらもUI用でScene Capture 2DでキャプチャしてUIに表示しています。
この方法で、フィールドでエンカウントしたらフィールドのキャラたちを全員一時停止してPlayerキャラをUnpossess、バトルの所にバトルで使うキャラたちをスポーン→カメラを切り替えてバトルへ突入、
バトルが終わったらバトルのキャラたちをデストロイして、リザルト処理を挟んでフィールドに戻る(一時停止解除)、
といった流れで作ってみました。
【バトルの制御】
フィールドではTPSテンプレートを利用して、
プレイヤーはプレイヤーのPawnやPlayerController、
敵は敵のPawnやAIController、
味方は味方のPawnやAIController
にプログラムをゴリゴリ書いていけばよいのですが…
バトルってどこに本体となるプログラムを書けばいいの?ってなる…、なりますよね??
ターン制のコマンド式なので味方キャラはプレイヤーや仲間の操作が等価であり、敵も順番が来るまで待って行動するってことで、TPSの例にならえば味方は順番が回ってきたキャラのPawnにPossessしてPlayerControllerで操作すればいいのかな?
敵は順番が回ってきたらAIControllerで操作すればいいのかな?
じゃあ順番を制御したりするプログラムはどこに置けばいいのかな?
カメラの制御はどこですればいいのかな?
ムリムリ、私にはムリ。
たぶんUE4のサイトのラーニングにあるターン制ストラテジーゲームとかに答えがあるんだろうけど、めんどくさいから見ない。
(見ろよ!って言われるかもですが、素人はそもそも基礎となるプログラム技術が無いから見てもその勘所がわからないからすごく時間がかかるんですよね。そして時間をかけて理解したつもりで誤解を重ねていく)
実はこのゲームを作る前にプロトタイプとして似たようなターン制RPGを作っていました。
その時のバトルの制御はBattleCameraというカメラを持ったアクターにほぼ全てを集約してました。
で、各キャラはどういうきっかけで動かせばいいのかわからなかったので、
BattleCameraから、順番の回ってきたPawnのLocationにボックスコリジョンをスポーン
↓
PawnのOnComponentBeginOverlapでそのPawnが行動を起こす。
(ちなみに行動の内容はボックスコリジョンのタグに書いてある)
というよくわからない処理をやっていました。
よく動いてたよねw
で、このゲームを作るときにこの問題をどうしたもんかと考えたのですが、どこかのサイトに
動いてるからまぁいいか…、もう後戻りできないし。
前にも書きましたが、私はプログラマーでもデザイナーでもプランナーでもない素人ですので、開発内容をさらすのはかなり恥ずかしいのですが、何か少しでも参考になることがあれば…と思います。
玄人の方々、間違い等々たくさんあると思いますが、お手柔らかにご指摘いただければ幸いです!!
【レベルについて】
さて、このゲーム、ターン制RPGということでフィールドでエンカウントするとバトルに入る、つまりフィールドとバトルの2つのパートを行ったり来たりするのですが、これをどうプログラムに落とし込んでよいのか…
商用ゲームを見ていると、フィールドでエンカウントするとロードが入ってバトルに、バトルが終わるとまたロードが入ってフィールドにと動作しているので、たぶんフィールドのレベルとバトルのレベルを分けて作って、都度都度ロードするのが正しいのかと思うのですが、パーシスタントレベルとかサブレベルとかレベルストリームとかやるんですよね…?
あー無理ですね、私のような素人では理解できない。
というわけで…
フィールドとバトルを同じレベルに突っ込みましたよ!
ついでにミニマップとUI用の銃の表示も同じレベルに突っ込みました。
こんな感じ
↓
中央から左にかけてフィールド 右にバトル さらに右のちっちゃいのが銃表示 中央下のちっちゃいのがミニマップ |
この方法で、フィールドでエンカウントしたらフィールドのキャラたちを全員一時停止してPlayerキャラをUnpossess、バトルの所にバトルで使うキャラたちをスポーン→カメラを切り替えてバトルへ突入、
バトルが終わったらバトルのキャラたちをデストロイして、リザルト処理を挟んでフィールドに戻る(一時停止解除)、
といった流れで作ってみました。
【バトルの制御】
フィールドではTPSテンプレートを利用して、
プレイヤーはプレイヤーのPawnやPlayerController、
敵は敵のPawnやAIController、
味方は味方のPawnやAIController
にプログラムをゴリゴリ書いていけばよいのですが…
バトルってどこに本体となるプログラムを書けばいいの?ってなる…、なりますよね??
ターン制のコマンド式なので味方キャラはプレイヤーや仲間の操作が等価であり、敵も順番が来るまで待って行動するってことで、TPSの例にならえば味方は順番が回ってきたキャラのPawnにPossessしてPlayerControllerで操作すればいいのかな?
敵は順番が回ってきたらAIControllerで操作すればいいのかな?
じゃあ順番を制御したりするプログラムはどこに置けばいいのかな?
カメラの制御はどこですればいいのかな?
ムリムリ、私にはムリ。
たぶんUE4のサイトのラーニングにあるターン制ストラテジーゲームとかに答えがあるんだろうけど、めんどくさいから見ない。
(見ろよ!って言われるかもですが、素人はそもそも基礎となるプログラム技術が無いから見てもその勘所がわからないからすごく時間がかかるんですよね。そして時間をかけて理解したつもりで誤解を重ねていく)
実はこのゲームを作る前にプロトタイプとして似たようなターン制RPGを作っていました。
その時のバトルの制御はBattleCameraというカメラを持ったアクターにほぼ全てを集約してました。
で、各キャラはどういうきっかけで動かせばいいのかわからなかったので、
BattleCameraから、順番の回ってきたPawnのLocationにボックスコリジョンをスポーン
↓
PawnのOnComponentBeginOverlapでそのPawnが行動を起こす。
(ちなみに行動の内容はボックスコリジョンのタグに書いてある)
というよくわからない処理をやっていました。
よく動いてたよねw
赤い四角が行動命令のボックスコリジョン |
で、このゲームを作るときにこの問題をどうしたもんかと考えたのですが、どこかのサイトに
「GameModeはそのゲームのルールを記述するところです」
的なことが書いてあったので、コレだ!と思い、今度はGameModeにバトルの内容を集約させました。
とはいえ各キャラの動き等々はそれぞれのPawnに持ってもらい、敵の行動選択は敵AIに持ってもらい分散をはかったのですが…
集約しすぎてなんかGameModeの中がすごいことになっているんですが…
速さパラメータで順番を並べて、順番が来たキャラに行動させるだけだとそんなに重くないのですが、演出込みで記述し始めるととんでもないことに…
演出もカメラアクターとか演出専用のものにやらせたほうが良いのかもと思いつつ、ダメージを計算してその表示に合わせてカメラを動かしモーションさせてとかをやるとGameMode内で一括で制御しないとタイミングが合わない。
そもそもバトルでは弾を実際に撃って、当たったらダメージを受けて、とかやってると
奥にいるキャラにはちゃんと弾が当たらないとか色々問題が起こってきてしまうので…、弾は実際には撃たない。
なのでGamoMode監督が
「よーい、アクション!」
「プレイヤー、弾撃って!」
「はいそこの雑魚キャラ、ダメージ!」
「次、お前!」
「はい!ダメージ! そこで死んで!」
と全部采配してるんで、膨大な記述がGameModeに…
これ、いいんですかね?プログラム的に。
たぶん違いますよね。
動いてるからまぁいいか…、もう後戻りできないし。
コメント
コメントを投稿