連載
前回に引き続き,3Dゲームも作れるSNS「ViZiMO」で,ゲームを作るコツなどを紹介してみたいと思います。今回は,前回よりもうちょっと凝ったゲームをということで,簡単なレースゲームを作成する予定です。
「ViZiMOってなに?」という人は,とりあえず,公式サイトでオープンβテストに参加して,どんなことができるものなのか見ておくとよいでしょう。
ViZiMOには,いろいろなオブジェクトが最初から用意されています。これらを組み合わせてゲームなどを作るのですから,オブジェクトについて知ることは重要です。すでにいろいろ試されていると思いますが,ここで少しまとめておきましょう。
まず,個人的に多用しているオブジェクトを紹介します。
・基本立方体
なんにでも使えます。
・浴槽
中にものを入れられる構造物は貴重です。
・土管
これも内と外を遮蔽する場合に使いやすいものです。
・グミ
透明体は,いろいろなところで応用がききます。
・ハーフパイプ
内面が滑らかであることから,回転体とも相性がよいです。
・歯車
回転運動をする貴重なオブジェクトです。動くオブジェクトのなかでは動作が安定しているのも使いやすいですね。
最初から動作が仕込まれたオブジェクトは便利に使えます。しかし,実際に使っているとうまく動かなかったり(例えば,重いものを乗せた場合とか)します。そのような場合にはどうしたらいいでしょうか?
ViZiMO内で,なんらかの動作を仕組まれているオブジェクトは,その動作の「強さ」を変化させることができます。だいたい2種類に分かれており,
- 重さに比例するもの
- 大きさに比例するもの
があります。せり上がりやフリッパーなどは重さに比例し,扇風機,爆弾などは大きさに比例します。車の速度は単純で,タイヤの大きさに比例します。回転数は固定ということですね。タイヤの大きさはX方向の倍率で変化しますので,ゲームにあわせて調整してみるとよいでしょう。
オブジェクトが使えないと思う前に,プロパティをいろいろ変えてみるのが正しい使い方です。しかし,それでも使いにくいものが存在するのも事実です。以下は,いろいろ試して使いにくいと思われるオブジェクトの例です。
・ゴルフクラブ
スイングのモーションはよいのですが,キャラクターがボールを打つように微調整するのは実用上無理があります。
・ベルトコンベア
動作範囲のバグは直ったようですが,載せたものを安定して動かすことができません。
・階段
登りにくいです。当たり判定なしにして,透明なスロープを重ねて用意するほうがいいでしょう。
・バンパー
横方向への弾き方が弱く,変形するのも使い勝手を悪くしています。
・バレーボールネット
ViZiMOでバレーは無理でしょう。置物やデザインとして網目を利用する方向はアリでしょうけど。
また,ViZiMOでは,グループ化したオブジェクトを,そのまま動かすことができません。基本図形を組み合わせれば,いろいろな造形ができるのですが,静止物ないし,触ると崩れたり弾け飛んだりするような状態にするのがせいぜいで,構造体のまま動かすことは至難の業です。
ViZiMOでは,画面表示は3Dと得点などしかできません。ゲーム内でメッセージを出したい場合は,ポリゴンで作るか,得点などと一緒に出すしかないことが分かります。 私がしばらく前から使っているのが,スコアボードのメーターを使ったものです。スコアボードでは,スコアボード名がそのまま表示されますので,メッセージ内容を名前としたスコアボードを作り,必要に応じて表示するというものです。文字色や大きさが選べないので,実用度はいま一つなのですが,メッセージを手軽に表示する方法としては有効です。
今週は,サンプルとして簡単なレースゲームを作成してみます。レースゲームにもいろいろあります。まず,自分で走る,乗り物に乗るという選択肢があります。複合型もありますね。それぞれについて見てみましょう。
・走る
ジャンプと絡めたいろいろな動きが可能です。プレイも作るのも扱いやすく,レースゲームに最も適しているかもしれません。半面,扱いやすさゆえに,障害物競走の要素を入れないと,差がつかないという問題もあります。障害物を導入すると,一般に難しすぎになりがちなので,バランスの取り方が重要になります。
・自動車
乗り物の代表です。方向キーの操作でちゃんと走りますが,サスペンションの概念がないのか,バンピーな路面ではコントロールを失いがちになります。ひっくり返りやすい場合もあります。操作技術がタイムに反映されますので,変なことをしなくてもゲームにはなります。
・スケートボード
素のままでは制御が難しいので,使い物にならないオブジェクトかと思っていたのですが,重量を重くしたり,横幅を広げることで非常に安定感のある走行が可能になります。レースゲームでもちゃんと使えます。スケートボードでは,乗っている人になにかが少しでも接触すると,気絶状態にまでされてしまうので,注意が必要です。
・UFO
最近加わった空中を飛べる乗り物です。ジャンプ動作で上昇しますが,上昇するのは機体が水平になっているときだけです。移動中はほとんど上下変動はないのですが,速度を緩めると少しずつ降下していきます。どこでも飛べるので,どうやってコースを規定するかが問題になります。また,UFOを使ったゲームでは,上下移動が鍵になりそうです。ちなみに,シフトキーを押すと急速上昇ができます。急降下は,なにかにぶつかって墜落するのが最も高速です。制御できればの話ですが。
・トロッコ
事実上,制御方法がなく,レースには向きません。
・ローラー(通称コンダラ)
持って走ることはできますが,乗り物ではありません。
・台車/椅子
乗り物ではありません。坂道のみ移動できます。乗ることはできますが,制御できません。
とりあえず,今回はオーソドックスな自動車による周回レースを作成してみます。
まず,コースを作成します。ここでは,道路のパーツを適当につないでみることにします。テンプレートにあるレースゲームのコースをいじるのもよいでしょう。
路面はアスファルトの舗装路でよいとして,路肩には自動車がコース外に飛び出さないような工夫が必要になります。ここでは,三角柱を横にして両脇に並べてみました。三角柱2個と路面1個を基本パーツとして,どんどんつないでいきます。
たくさんのものを並べる場合には,パーツを縦向きにして,当たり判定と落下モードをOnにしてコピーを重ねます。Ctrl-Cを押せば上にどんどん積み上がりますので,それを横倒しにします。ここで,各パーツのY座標をよく見てもらうと,微妙にずれていっているのが分かると思います。そこで,1パーツずつ上下に少し動かして,地べたに落下させ,高さを揃えておきます。少々の誤差が出てもかまわない場合は無視してもよいのですが,今回は確実な段差となるので,ずれを取っておきます。
一列分の道路ができたら,先端から曲げるなど,お好きな方法でとにかくコース状になるようにしてください。
今回は,先端から曲げていく,1パーツずつ継ぎ足す,作った部分をコピーしてつなぐといった操作を繰り返しています。カーブと起伏を同時に作るとなかなかうまくつながらなくなるものですが,基本的に,コースの進行方向を考えて,進行時に抵抗の少なくなるように段差が配置されるようにしていきます。綺麗につないでいくと,ものすごく時間がかかりますので,適当に作って,目立つ部分を徐々に修正する方針で作業を行いました。最終的には,最初からていねいにつないだほうが時間がかからないのかもしれませんが。
次に自動車のセッティングです。今回は,最大速度を抑え,コントロールしやすくすることを目標にしました。自動車自体,かなり小さくなっています。車速を抑えるには,タイヤを小さくすればよいと先ほど書きましたが,タイヤを小さくすると,路面の凹凸を拾いやすくなるという欠点があります。テストを重ねながら,路面修復を行うのがよいでしょう。
コースができたら,ゲームにするための仕組みを入れていきます。まず,どのようなゲームにするかを考えます。
・マルチプレイ時
最大4人プレイ
3周で終了
いちばん速くゴールした人の勝ち
・シングルプレイ時
ラップタイムを記録する
以上のような方針で行きます。レースゲームはマルチプレイで楽しむこともできますが,一人でも遊べるような工夫がないとせっかく作ったコースがもったいないので,プレイヤー数によって,動作を切り換えます(基本的な考え方は,先週のTipsに書いたとおりです)。
では,最初に問題となる「3周したら終了」の部分を見てみましょう。まず,コースを回ったかどうかを判定するには,何か所かで車を見張る必要があります。すなわち,カウンタで路面と車の接触判定を取ります。これは,基本的にコースを3等分するような位置でよいでしょう。1か所でしか判定しないと,コントロールライン上を何回か往復されると周回を記録してしまったり,2等分だと,簡単そうな側でUターンして往復されても周回と判定されてしまいます。3か所の判定であれば,往復しても得になるケースはほとんどないでしょう。
ちなみに,今回のコースに限っていえば,片方向からの進行安定性しか考えずにデザインしているので,逆走してタイムが上がる可能性はまったくないのですが,念のために3か所で判定を行います。
路面と車の判定ではそれぞれ,
3か所×4台=12個
のカウンタを設置します。オブジェクトグループを使うと,ゲームが高速に動作していなければ,カウンタを減らすこともできなくはないのですが,誤動作の可能性があるので,ここでは個別のカウンタを使います。
- chk1-1〜4
- chk2-1〜4
- chk3-1〜4
のカウンタを作ることにしますが,スコアボードは必要でしょうか? スコアボードはカウンタ設置の前に必要なものなので,そちらも先に検討しておきます。
まず,各プレイヤーが何周したか,それぞれのラップタイム,それぞれの最速タイムを取りたいところです。しかし,ViZiMOでは,最速タイムの保存というのが非常に困難なことでもあるのです。スコアボードでは,値の比較はできても,値の代入はできません。ここでは,2個で1組のスコアボードを作って,値が小さい側を残すような仕組みを考えていきましょう。カウンタはコース上のタイム計測点だけ,倍の8個作って対応することになります。
基本的な考え方としては,2通りのスコアボードにタイムをそれぞれ記録するような処理を作り,片方がもう片方より小さい(速い)場合には,カウンタの動作を止めておきます。大きい(遅い)ほうは,周回を重ねるたびに,初期化され,タイムを記録し続けます。小さいほうは,動作を無効化されているので更新されず,どちらかだけが動くという感じです。動いているほう(ないし保存してあるほう)がどちらかというのも記録しておきます。
そのほか,マルチプレイヤー判定のためのものを加え,以下のようなものを定義しておきます。
最終的にファステストラップをサーバーに送るときには,スコアボードが指定されていないといけないので,どうしても代入処理が必要になるのですが,これはひとまずあと回しです。
・カウンタ
chk1-1a〜4a(チェックポイント1での各プレイヤーの通過判定)
chk1-1b〜4b(チェックポイント1での各プレイヤーの通過判定2)
chk2-1〜4(チェックポイント2での各プレイヤーの通過判定)
chk3-1〜4(チェックポイント3での各プレイヤーの通過判定)
・スコアボード
Player1 Laps〜Player4 Laps(周回数:得点板)
Time1a,1b(最速ラップタイム用:タイマー:カウントアップ)
a_or_b (どちらのタイマーを使うか:得点板)
Time(全体の経過時間:タイマー:カウントアップ)
Players(プレイヤー数:得点板)
Solo?(1人モードか?:得点板)
こんな感じです。最初思ってたより大がかりになりそうな気配ですが,とりあえずこれで作ってみましょう。
まず,周回数を数えるロジックからです。チェックポイントと車の接触判定を取るカウンタを用意しました。3か所のチェックポイントを順に回ると1周と判定します。ここでは,途中のチェックポイントを通過したかの情報をスコアボードで用意していません。これは,イベントで処理することにします。
まず,チェックポイント1判定の動作を有効に,それ以外の判定(カウンタ)を無効にしておきます。これが初期状態です。chk1-1aのカウンタが動作したら,イベントを起動します。このイベントでは,チェックポイント2のカウンタを有効にし,チェックポイント1のカウンタを無効にします。
チェックポイント2を通過したときも同様な処理で,チェックポイント3を有効にし,チェックポイント2の判定を無効にします。再度,チェックポイント1を通過した場合に,周回数に1を加えるわけですが,場合分けが面倒なので,最初にチェックポイント1を通ったときも同じ処理で周回数を増やすことにします。初期値を0から始めれば,1周目に1が表示されるので辻褄は合います。
マルチプレイヤーの場合は,誰かの周回数が「4」になった時点で,ゲームを終了します。
シングルプレイヤーの場合は,制限なく周回を重ねられたほうがよいと思うので,ボタン操作などで終了するようにしましょう。
ゲームの種類にもよりますが,コースやステージを進むタイプのゲームでは,シングルプレイ用のゲームであっても,プレイヤーオブジェクトをグループに入れておき,グループ単位で処理するのがおすすめです。
たとえば,デバッグ作業などで,コースの途中から始めたい場合など,いちいちプレイヤー1を移動させるのは面倒です。プレイヤー2をそこに置き,プレイヤーグループに入れて起動すれば,プレイヤー2でデバッグ作業ができるようになります。プレイヤーオブジェクトの着地イベントでそこまでのフラグを設定するようにすれば,複数の条件でのデバッグ作業がすぐに切り換えできるようになります。
まず,スタート地点から少し離れたところを第1チェックポイントにします。これは1週目からラップタイムを計る際に,車速を安定させるためです。マルチプレイ時の計時はスタート直後から行いますが,1週目に神懸かり的なドライビングをしたのに,スタート直後の加速時間がかかってファステストラップにならなかったとかいう悲しい事態をできるだけなくすために,ストレートエンドから周回を計測しています。
あとは,3分の1くらいの地点で見ると,下の左図のような感じでチェックポイントを置けばよさそうなのですが,この場合,ヘアピン部分をショートカットされてしまうおそれがあります。そこで,下の右図のようにずらした位置にしておきます(最終コントロールライン以外は画面に表示する必要はありません)。
車がコースアウトすると復帰することは無理です。スタート地点からやり直しとします。この際に,消滅したオブジェクトの自動出現は使えません。マルチプレイヤー対応にしているため,自動出現だと,消しておきたい自動車を隠しておけないからです。そこで,コースの周りに囲いを作り,これと接触すると「出現」するようにしておきます。「出現」は初期位置への強制移動となります。消失と対になっているように見えますが,単体で使うと使い勝手がよいですね。消失させないで出現を行えば,イベントを使わずにオブジェクトの指定だけで処理できますので。
なお,コースアウトでスタート地点に瞬時に戻ってしまうと,それだけでショートカットになってしまうので,コース復帰時にペナルティをつけましょう。
ここではタイマーを動かし,20秒間は車に乗れなくしてみました。この処理は,タイマーが0より大きい間は,ずっと自動車を出現させ続けるようにして実現しています。目の前に自動車はありますが,乗れない状態になります。マルチプレイヤー時には,障害物となりますので,避けて走ってください。タイマーが切れたら出現するようにしたほうがよいのかもしれませんが,判定を簡略化してみました。
物体が速く動いていたり,干渉して弾け飛んだりなどした場合,ほかのオブジェクトをすり抜けてしまうことがあります。これを防ぐには,シミュレーション精度を上げることが有効です。ただし,ゲームによっては,これを行うことでかなり重くなってしまう場合がありますので,遮蔽物を肉厚にするなどの対応と使い分けるのがよいでしょう。
マルチプレイヤーモード時には,各プレイヤーが3周したかを見て,勝利フラグを立て,終了します。
エンドレスで走れるシングルプレイヤーモードでは,Aキーを押すことで終了することにしましょう。
以上でだいたいの処理は終わって,ゲームの様相を呈してくるのですが,懸案のランキング処理をどうにかしないといけません。ランキングに登録できるスコアボードは決め打ちですので,そこに記録する内容(この場合はファステストラップタイム)を入れなければなりません。
まず,ラップタイムを取る処理を周回判定部に追加します。タイマーを動かせばよいのですが,これは,2個のタイマーのうち,どちらかだけを動かし,もう片方には最速ラップタイムを入れておきます。動いているタイマーが片方より小さくなったら,処理を入れ替えます。ちょっと複雑な動作になります。
ここで,ランキング用に,Recordというスコアボードを新設しておきます。カウントダウンタイマーです。タイマーの切り換え動作が起こったときに(ファステストラップが更新されたときに),そこのイベント処理でRecordの動作を有効にします。Recordは,100秒単位でカウントダウンを行っていき,値の小さいほうのタイマー値以下になったら処理を停止するようにしておきます。
値を直接代入することはできませんが,このようにすれば,同じ値にすることは可能です。これでファステストラップタイムをRecordにコピーできるようになりました。処理内容からして,最速ラップを出した直後にゲームを終了すると,正しく反映されないわけですが,100分の1秒単位で更新されるタイムであれば,前の値から100分の1秒単位で反映されるので,あまり問題はないと思われます(一応,タイマーのコピー中には終了できないようにしておきましたが)。個の処理は,次のランキング処理が最低40秒間はこないことを前提としたものです。即時に値を反映したい場合は,ある程度の幅で値を判定し,直接値を指定してからタイマーを回すなどの工夫が必要となるでしょう。
なお,Recordをゲーム終了時に表示するようにしても,タイマーの整数部分しか表示されませんが,Vizルームでランキング設定にしておけば,そちらのほうには実数値で保存されるので問題ありません。
とりあえず,できあがったゲームをプレイしてみると,どうもコースのデキがよくないようです。車が安定して走りません。車重を重くして対応してみましたが,このあたりが限界のようです。一応,車重を2tにまで上げるとかなり安定したのですが,ひっくり返ったときに元に戻せなくなりました。
トロトロとした進行速度は,狙い通りで,ブレーキなどなくてもすべてのコーナーを曲がれるようにしています。しかし,コースのデキによって操縦性が悪くなっているところが反省点ですね。
ゲームバランスをどのように取るかについては,人それぞれの考え方があります。このへんに関して,昔,友人からいわれた言葉に「操作の難しさをゲーム性にしているゲームはクソゲー」というのがありました。操作しにくいことで成り立っているゲームには,ゲームとしての価値がないというのですが,ゲームの難しさのうち,操作性に起因するものは,プレイヤーを不快にさせるだけで,ゲームデザインとしてはなにも見るべき点がありません。そういう意味では至言だと思っています。きちんと制御できて,そのうえで楽しいのがいちばんです。
異論もあるかもしれませんが,ぶっちゃけていって,ViZiMOでは,そんなにだいそれたゲームは作れません。グラフの右方向に「神ゲー」,左方向に「クソゲー」の座標軸を取ると,大半のものは左寄りにプロットされていまうでしょう。せめてプレイしている人を不快にしないくらいの注意は払いたいというのが,私の基本的なゲームバランスについての考え方です。8割以上の人にちゃんとクリアしてもらうように,余計なところでストレスをかけないようにというのが基本です。そういう意味では,今回はイマイチのデキでした。
今回のサンプルは予想外に複雑になりましたので,ファイルをアップロードしておきます。参考にしてください。(編注:ViZiMOファイルは,作成者しか開けないようにロックされているとのことでした。確認が足りず,ご迷惑をおかけしました)
ゲームが終わった直後に,ルームに入り直さなくてもゲームができたほうが便利です。オブジェクトなどは,すべてを大きなグループで囲み,それを「出現」させれば,初期化できます。ただし,オブジェクトで初期動作が仕込まれている場合には対応できません。このようなリプレイをつけたい場合には,初期動作は,オブジェクトで直接指定するものを利用するのではなく,別途まとめておいたほうがよいでしょう。
|
- 関連タイトル:
ViZiMO
- この記事のURL:
(C)2007 MiCROViSiON Inc.