紹介記事
完全図解,無償配布のUnrealEngine 3開発キットで3Dゲームを作ってみよう
仕掛けを作る:物体を物理的に動かす
とりあえず,敵も出て攻撃してきてということで,FPSについてはゲームの概略のめどが立ったところですが,FPSだけでは面白くないですよね。
いろいろレベルを作り込むことと同時に,いろんな仕掛けを作ってみましょう。
その第1弾として,物体を動かすことから始めます。
すでに述べたように,レベルを構成する基本となるBSPブラシで作った壁や天井などは基本的に動きません。StaticMeshで読み込んだものも標準状態では動きませんが,物理エンジンの管理下に置くことで動かすことができるようになります。
まず,床と照明だけの簡単なレベルを作って,球体を置いてみましょう。BSPブラシで作った球体ではなく,コンテンツブラウザから読み込んだStaticMeshのものです。
適当なレベルを作ってコンテンツブラウザから球体をドラッグ&ドロップします |
適当な大きさに縮小しておいてください |
しかし,このままではまったく動きません。
そこで,その球体を選択したうえで右クリックメニューを開き[アクタを置換]してやります。一覧のなかから[Add RigidBody]を選びます。
これで球体が物理運動をするようになります。
銃で撃つと,球が跳ね飛んでいくことが分かります。
ところが,プレイヤーがぶつかってもびくともしません。ここは,なにか設定個所はあるのだろうと思いますが,見つけられませんでした。そもそも接触判定が発生していないように思われます。
跳ね方にしても,どこかで物理設定をいじれそうなものですが,現状では設定する場所を確認できていません。今後の課題です。
Triggerを使う
さて,では仕掛けを動かすためのきっかけとなるイベントにはどんなものがあるのでしょうか。これはKismetのメニューでの[新しいイベント]を見れば分かりますが,どれもがすぐ使えるわけでもありません。比較的簡単に使えそうな者を抜き出してみましょう。
●Actor
- Destroyed
- Take Damage
アクタとして扱われているものが,壊れたり,ダメージを受けた場合に発生します。
●AI
- Reached Route Actor
- See Enemy
Botが,指定された地点まで到達した場合や敵を発見した場合に発生します。
●ゲーム系
- Game Ended
- Level Loaded
- Level Startup
それぞれゲームが終了した,レベルデータのロードが完了した,ゲームが始まったというタイミングで発生します。ロード完了直後では,動的に発生させたオブジェクトがありませんし,ゲームが開始されてからでは,ゲーム内で使うオブジェクトの生成は遅すぎます(まあ,ほとんど問題になることはないでしょうけど)。似たタイミングのイベントですが,使い分けてください。
●Pawn
- Death
- Get Inventory
- Line Of Sight
- See Death
Botやプレイヤーの動作によるものです。死んだ場合,アイテムを拾った場合,視界内にいる場合,ほかのBotが視界内で死んだ場合です。
●Physics
- Constraint Broken
- Hit Wall
- Projectile Landed
- Rigid Body Collision
- Touch
物理的な現象によるイベントです。順に,動きの制約が解放されたとき,壁にぶつかったとき,射出物が着弾したとき,剛体の衝突が起きたとき,プレイヤーなどによる接触があったときに発生します。BSPメッシュなどは壁扱い,RigidBodyアクタなど剛体系の物理運動をするもの,さらにプレイヤーが絡んだものに分かれることが分かります。
ただ,TouchイベントはStaticMeshに対しても指定できるのですが,私は適切に動作させることに成功しておりません。
●Player
- Player Spawned
プレイヤーが出現したタイミングです。
FPS以外のゲームでよく使いそうなものに「物体に触れたら」という条件があるのですが,前述のとおり,StaticMesh(要するに画面内に置きそうなオブジェクト)ではTouchイベントの発生に成功しておりません。公式Forumの雰囲気ではプロパティでCollide ComplexやNo Encroach Checkをいじればできそうな感じではありましたが,動きません。エラーメッセージからすると,指定できないような気はするのですけど……。
少なくともデフォルトだとプレイヤーとの接触が適切に判定されていないようですので,この球体と確実に接触を判定できるようにしてみましょう。公式サイトなどのチュートリアルでも多出しているTriggerオブジェクトを使用してみます。
床の上で右クリックしてメニューを開き,[アクタを追加]−[Add Trigger]を選択します。
画面にスイッチ状のアイコンが表示されます。Cキーを押すと,当たり判定範囲が表示されます。とくに変更の必要はありませんが,Cキーの操作を覚えておいてください。
F4でプロパティを開き,「Display」の「Hidden」指定を切っておきます(切らなくても動作には支障ありませんが)。
今回は,触れるとNoteの位置にテレポートする処理を作っていきます。トリガーの確認用ですので,動作はなんでもよいのですが,簡単に設置できて効果が分かりやすいので,ここではテレポートを使ってみました。
下準備として,コンテンツブラウザを開き,Actorクラス一覧に切り換えてNoteを選んで床に置きます。
Triggerを選択した状態でKismetを開いて,Trigger_0を起点としたイベントを発生させます。
新しいアクションでテレポートを選択します。[新しいアクション]−[Actor]−[Teleport]です。
この状態で実行すると,スイッチに触れるとキャラクターがテレポートするようになります。
では,Kismetを一度閉じ,三面図を良く見て,球体とTriggerが重なるように配置しなおしてください。
ここで,Kismetを開きます。三人称視点にしたときの要領で,ボールとTriggerをくっつけてみましょう。[新しいアクション]−[Actor]−[Attach To Actor]を選択して,処理をつなぎます。
再生します。ボールが転がると,一緒にTriggerも転がりますので,これで移動する物体での接触判定も取れるようになりました。
静止した物体にはTriggerをそのまま置いて,動く物体にはAttachしてと,多くの状況でイベントを使えることが確認できました。
物体を移動させる:アニメーションエンジンMatinee
次に,物理運動ではなく,物体をプログラムで移動させてみましょう。チュートリアルムービーのSimple Levelなどでも出てくる操作ですが,ここでまとめ直しておきます。
先ほどと同じように適当なレベルを作って(ここでは同じレベルを流用しています),今度はStaticMeshの立方体を追加してください。
ただし,ここで立方体のところで右クリックメニューを開いて,[アクタを置換]−[add Mover]を選んでおいてください(重要)。
あらかじめ立方体を選択しておいてから,Kismetを開き,起動条件としてLevel Startupを入れておきます。ここで右クリックメニューから[New Matinee]を選択してください。
Matinee(マチネー)というのは,フランス語で午前中の意ですが,一般的には芝居などで昼間の興業のことを指します。夜中に行われるソワレと対になっています。昼興業と夜興業ではなにが違うかというと,主に客層が違うようで,マチネアイドルという言葉は女性に人気の二枚目俳優の意味とのこと。まあ,余談はいいんですが,要するに芝居関係の単語です。UDKでは,アニメーションエンジンの名前になっています。
Matineeでは,タイムライン上にキーフレームを設定して,その間を補間するようなアニメーションを簡単に作れます。
立方体を選択したままMatineeを開くと,立方体用のデータが一緒に作られていることを確認してください。
では,ダブルクリックでMatineeを開きます。
下側にあるタイムラインの左エリアで右クリックし,[空のグループを新規追加]します。名前は動作を示したものを付けておいてください。
新しくできたラインにカーソルを載せて右クリックメニューで[動作トラックを新規追加]します。
タイムラインの数字が書いてある部分で,0.00のところに少し太い縦バーがあることを確認してください。これをつかんで適当な秒数のところまで移動させます。
移動させたら,そこに新しいキーフレームを作りましょう。キーボードからEnterキーを押してください。なんでGUIで指定できないのかさっぱり分かりませんが,ここはEnterです。
次に,パース図か三面図で物体を好きな位置に移動させてください。前のフレームの位置から移動終了位置まで,直線的に移動するようなアニメーションが指定できます(曲線補間も可能ですが)。
再生してみましょう。すーっと立方体が平行移動していきます。
StaticMeshのままでは,Matineeで移動できません。あらかじめMoverに置換しておくことが重要です。
Matineeでは,こういった単純な物理運動だけではなく,さまざまな動作を指示できます。ただ,現時点では移動と表示/非表示の切り換えくらいしか簡単に使えそうなものを見つけていないのですが……。適用する相手のオブジェクト種類など,少し制約がありそうです。
ゲームができちゃった場合:ライセンスは?
割と高いことで知られるUE3のライセンス料ですが,UDKは無償配布ということもあってか,同人ソフトなど,大きな会社でない場合でも,ある程度現実的なライセンスが用意されているようです。
ライセンスにはいくつかのパターンがあり,そのうち小規模ゲーム販売に対応してそうなものを紹介しておきます。翻訳に誤りなどがあるかもしれませんので,実際に適用したいという人は必ず原文を確認してください。
まず,開発期間の使用は無償です。発売が決定した時点で99.99ドルをEpic Gamesに支払います。売り上げの最初の5000ドル分までは無償,以降は売上高に対して25%のロイヤリティがかかります。
個人相手にはやってないみたいなので,決まったら,まず会社を作れということのようですが,プログラミングができなくても高品質グラフィックスが実現できますので,CGデザイナー系の人にいいんじゃないかという気がします。同人ソフト作家の人は,世間の度肝を抜くようなタイトルに挑戦してみるのも面白いかと思います。
さて,年末企画ということで一気に連載5回分くらいのボリュームで流してきましたが,まだまだUDKの上っ面のさらに一部にすぎません。公式サイトでは日本語コンテンツも用意されているのですが,リファレンス部分もぱっと見で見方がよく分からないものですのであまり役に立たないような気はします。公式サイトのチュートリアルビデオは分かりやすくて非常に貴重なのですが,いきなり複雑な作り込みをしている部分などもありますので,まず,少しツールを触ってみて,だいたいの感触をつかんでからチュートリアルビデオを見ることをお勧めします。
UDKを使ってみた感想ですが,「ViZiMO」の100倍凄いモノといった感じでした。似た部分も多いのですが、作り込みなどはいくらでも加えられるのでビジュアル面では凄いゲームが作れます。ただ,できることが多いのはともかく,分かりにくい部分も多いのは確かです。単にゲームを作るだけならViZiMOのほうが100倍は速く作れます。高機能だから分かりにくいんじゃなくて,単に分かりにくい部分が結構あります。両者の中間くらいの環境があるといいんですけどねえ……。
とにかく,今回はできるだけ分かりやすく解説してみました。プログラミングのできない人でも正月休みをつぶせるくらいはたっぷり遊べますので,ぜひこの機会にUDKに挑んでみてください。
●UDK 公式ページ(日本語)
http://udn.epicgames.com/Three/DevelopmentKitHomeJP.html
●ビデオチュートリアル
http://udn.epicgames.com/Three/VideoTutorials.html
●ユーザーの作成したゲーム例(Forum)
http://forums.epicgames.com/forumdisplay.php?f=368
- 関連タイトル:
Unreal Engine
- この記事のURL: