元記事:Bf-institute-ApricotBgeLogic - BlenderWiki
(訳注:この記事はYo Frankie!に関する記事であり、一般的な機能解説ではありません。一部は後日公開される予定のファイルの解説です)
このゲーム(訳注:Yo Frankie! のこと)はいくつかの blend ファイルに分けられます。キャラクタ(Characters)、レベル(Levels)と小道具(Props)です。レベルと小道具にはほとんど Logic がなく、キャラクタがどう反応するかを決めるのに使用されるプロパティのみ設定されています。
レベルには、大半を占める動かない地形に、キャラクタ、小道具、エフェクトのグループへのリンクがあります。
外部の blend ファイルに自身のカメラやアニメーション、音声、Logic を持ったキャラクタを置くことは非常に効果的な方法です。キャラクタを複数のレベルにリンクできるだけでなく、そのキャラクタの複数のインスタンス(コピー)を一つのレベル内に置くことができるからです。
私たちは、すでにある Sheep(ひつじ)用の Logic を別のキャラクタの追加時に流用したいと考えました。これは最近 Apricot 用に特別にゲームエンジンに追加されたグループインスタンスで可能になりました。
それぞれのキャラクタの Armature、Mesh、シャドウ Mesh といった、キャラクタ固有のオブジェクトは、Logic を実行しているダミーの Mesh に Parent されています。3つのすべてのグループは、この Logic オブジェクトを共有していますが、固有の Armature と Mesh はそれぞれが持っています。
それぞれのキャラクタが同じ挙動をしないよう、そのキャラクタの開始時にスクリプトを実行し、子オブジェクトを元に "type" プロパティを設定します。この type プロパティでキャラクタが攻撃できるか、キックを受けるか、運ばれるか、どれぐらい活動的かなどを決定します。
2匹のプレイ可能なキャラクタ(Frankie と Momo)があり、これらも Logic を共有していますが、それぞれ固有の Mesh と Armature を持っています。
挙動の変更は必要ないものの、別々のキーレイアウトと各自のスクリーン部分(分割スクリーン)を使用する必要があります。Sheep の時同様、これはキャラクタ開始時に行なわれます。しばらくは1プレイヤーもしくは2プレイヤーのみのサポートですが、これ以上の追加もたいしたことではありません。
States 機能は Apricot プロジェクト用に新しく Blender に追加された物で、Logic を、それぞれを ON/OFF できる States にグループ化することができます(Logic レイヤと考えてもらうといいでしょう)。
States 機能はあらゆる複雑な Logic で多用されています。例えば Frankie では idle(アイドル)、walking(歩行)、running(走行)、falling(落下)、gliding(滑空)、hanging(ぶらさがり)、drowning(溺死)、death(死亡)といった具合です。それぞれの状態には、いくつかの States に切り替える、多くの Sensor と Actuator を持っています。
以下は、States がゲーム中どう切り替えられるかです。
[wiki]-初期 State → fall State
-地面との衝突 → idle State
-上キー → walk State
-地面との衝突がなくなる → fall State
-水との衝突 → drown State[/wiki]
このファイルでは、Apricot でカメラがどう動作しているかを紹介しています。前を向いているサードパーソンカメラはそんなに複雑ではないのですが、それでも克服すべき問題がいくつかあります。
Blender のカメラについての最初の問題は、Frankie が他のオブジェクトによって見えなくなり、ゲームがプレイできなくなることでした。
私たちはまず Frankie に Camera を Parent し、Slow Parent 機能を使用することで、その Camera の Frankie に対する反応を弱め、ぶれたりいらいらする動きを抑えることから始めました。木や壁が Camera をじゃまするのを防ぐため、Frankie の位置から Camera へ向けた Ray Sensor と Python スクリプトを使用し、レイが衝突した位置を元に、Camera との Parent の距離をスケーリングしています。
注意
[wiki]-ファイルには移動用、そしてカメラが注視するためのダミーキャラクタがあります。
-地形と柱のあるシーンは "example_scene" です。
-操作は、カーソルキーで移動、スペースキーでジャンプです。[1]キーと[2]キーは、カメラの Orbit(周回)モードのON/OFFです。[/wiki]
オブジェクトとその用途(frankie.blend と合致)
[wiki]-''Frankie'' - すべてのプレイヤーのコントロールとプロパティのある親 Mesh
-''FrankieDummy'' - Frankie が表示される Mesh、frankie.blend ではリグと Mesh です。
-''Camera_Ray'' - Frankie の位置から Camera を追う Empty。これが Camera へレイをキャストし、ビュー内にじゃまな物がないかを判定します。
-''Camera_Scaler'' - これは Camera の親であり、スケーリングにより、Frankie からの Camera の距離を変更します。スケールは Python スクリプトからコントロールされ、Camera_Ray を使用し、ヒットした位置からそのスケールを設定します(このスクリプトはこのカメラの設定専用です)。また、Frankie が idle、drowing、dead 状態の時の Orbit モードでは、このオブジェクトが周囲を回転し、すべての方向から Frankie が見えるようにします。
-''SlowVertParemt'' - これは Camera の親で、Slow Parent を使用し、スケールの変更や Frankie の回転がすぐに Camera に適用されないようにしています。また、私たちは Vertex Parent を Camera に適用する必要がありました。そうしないと、Camera がスケーリングされてしまい、3Dビューが歪んでしまうからです。
-''MainCam'' - Camera_Ray の方を向くメインカメラです。[/wiki]
このキャラクタ Logic のサンプルは、Frankie の Logic を元に、States をどう使用すればプロパティの設定や Python スクリプトなしに、挙動をコントロールできるかを示す物です。
Python スクリプトを使えばもっと高度な機能を追加できるでしょうが、States の使用でスクリプトの内容が限定的になり、サイズを小さく抑えるのに役立ちます。
キー
[wiki]-[↑]、[←]、[→] - 移動
-スペース - ジャンプ[/wiki]
レベルのプロパティ
[wiki]-''ground'' - 歩行可能な床を判定するのに使用されます。
-''kill'' - death State にします。[/wiki]
States
[wiki]-''1'' - Idle State。ジャンプ、歩行、 旋回ができます。
-''2'' - Walk State。そこからジャンプ、Idle、旋回ができます。
-''3'' - Jump State。常に1 Logic 単位の間でのみ ON になり、上方向の力を加え、すぐさま Fall 状態に遷移します。これは他の States(このケースでは Walk)のモーションがジャンプの力に干渉する恐れがあるからです。
-''4'' - Fall State。ここから着地できます。この状態は開始時に ON になっており(黒いドットが State に表示されています)、Frankie が 'ground' プロパティを持つオブジェクトと接触していない場合は常に ON になります。
-''6'' - General State。調整と、Frankie が 'kill' オブジェクトに接触したかをチェックするための物です。この State は Frankie が生存している間は常に ON になっており、このような State を持つことは、キャラクタに現在の挙動に関係なく反応させたい場合に便利です。
-''15'' - Death 状態。この State は General State を OFF にし、ユーザ入力を除去、そして4秒待った後、そのオブジェクトを終了させます。[/wiki]
この blend ファイル集は、単一のキャラクタを複数のシーンと blend ファイルからリンクし、ポータルで簡単にこれらの間を移動する方法を示しています。
キャラクタは、ゲーム Logic のあるオブジェクトと一つの Camera オブジェクトのグループです。その後、このグループを多数のレベルとリンクし、キャラクタの Logic が一ヶ所で編集可能な状態にしておきます。
これらのサンプルでは、どうやって以下のことができるポータルを作り上げたかを説明することに焦点を合わせています。
[wiki]-そのレベルの他の位置への移動
-その blend ファイル内の(オブジェクトが定義されている)他の Scene への移動
-(Scene とオブジェクトが定義されている)他の blend ファイルへの移動
-life や inventory などのキャラクタのプロパティの、Scene 間や blend ファイル間での保持[/wiki]
ポータルを作成するには、単に衝突判定のあるオブジェクトを作成し、"portal" というプロパティを追加、値を例えば "SomeObjectName" などにします。この場合、このポータルに接触すると "SomeObjectName" という名前のオブジェクトの場所に転送されます。
もし他の Scene へ移動したい場合は、プロパティに "portal_scene" を追加し、値を "MyOtherScene" などにします。
他の blend ファイルに移動するには、プロパティに "portal_blend" を追加、値を "//level_2.blend" などにします。この値は他の blend ファイルへのパスで、// は現在の blend ファイルと同じディレクトリを意味する接頭辞です。
"portal_scene" や "portal_blend" を使用する時、"portal" プロパティが存在していなければなりません。もしオブジェクトの位置を設定したくない場合、その値を空の文字列にして下さい。
これらのプロパティは Apricot のレベルと同じ動作方法ですが、キャラクタのスクリプトはこのサンプルの目的に合わせて変更されています。
このディレクトリにあるポータルをサンプルとしてご覧下さい。
このサンプルは、水や溶岩のあるレベル用のしぶきをどうやって作成しているかを見せています。
水オブジェクトには、"splash_logic" の Controller にリンクする Collision Sensor が必要です。このケースでは水オブジェクトは二つですが、数の制限はありません。
splash_logic は、衝突が発生したとき、"detect_splash" と呼ばれる Python スクリプトを実行します。この "detect_splash" スクリプトは、"splash_logic" をそれぞれの衝突位置に移動し、しぶきのオブジェクトを発生します。
この方法では、多くのしぶきを一度に発生できます。
着水したオブジェクトが浮くか沈むか削除されるかはそのオブジェクト次第で、これらは単に水との衝突判定だけが必要です。このサンプルでは、Cube の物理演算が停止され、200 Logic 時間後に削除されます。
前述の Empty オブジェクトはしぶきを作成するオブジェクトを生成しますが、どんなオブジェクトでも降らせることができるでしょう。
しぶきオブジェクト自身は AddObject Actuator で使用するために、不可視レイヤに置く必要があります。レイヤ20をご覧下さい。
このファイルでは、同じキャラクタ Group の2つのインスタンス(コピー)に、どうやって開始時にそれぞれ固有のキーとスクリーンを適用しているかを示すものです。
これは各キャラクタに初期化用の Python スクリプトを持たせ、各自別々の設定をするため、固有の ID を設定することで実現しています。
一旦このスクリプトが実行されると、State が変更されユーザ入力のみ反応するようになります。このシーン内にいるキャラクタのオブジェクトは DupliGroups のインスタンスで、"character_group" シーンに彼らの Logic があります。また初期化方法は、"frank_init_2player" スクリプトをご覧下さい。
カーソルキーでプレイヤー1を、WASD でプレイヤー2を移動できます。
この blend ファイルでは、Yo Frankie! のスタートメニューの簡略版が見られます。
このメニューには以下の機能があります。
[wiki]-マウス、キーボード、ジョイスティックから入力
-メニューのアイテムから Scene や blend ファイルの読み込み、もしくは Actuator の起動が可能
-トグルとラジオメニューアイテムがオプションの設定に使用可能。
-オプションを Actuator の新機能を使用してファイルに保存・読み出し可能。
-Logic は汎用で、複数のメニューから再利用可能。[/wiki]
実装
このメニューの基本は非常にシンプルで、"item_" で始まるすべてのオブジェクトがアルファベット順にソートされ、メニューアイテムとして処理されます。上下カーソルキーもしくはマウスカーソルが上にくることで、一度に1つのアイテムのみアクティブになります。[Enter]キーもしくはクリックでメニューアイテムのアクションを実行します。
"menu_select" スクリプトでほとんどのメニューの Logic をコントロールしています。これは "menu_logic" オブジェクト上で実行されており、シーン内の "item_" で始まる名前のオブジェクトをスキャンし、それらのプロパティに応じてユーザの入力に反応します。
"active" プロパティは、すべてのアイテムで使用されています。1をセットすると、そのアイテムの Sensor はこれを探知してアニメーションを行います。
Yo Frankie では、私たちはアニメーションを複数のオブジェクトに付加するのに非表示のアイテムを使用することにしました。また、マウスでアクティブ化できるエリアも大きくすることができました。
アイテムの起動タイプ
trigger
このタイプのアイテムは、追加の "trigger" プロパティのみ必要です。メニューアイテムがアクティブになったとき、trigger が1にセットされます。アイテムは自身の Logic で trigger 値をチェックして動作させる必要があります。実行後はこの trigger 値を0に戻して下さい。メニューアイテムの "Quit"、"Save Config"、"Load Config" をチェックしてみて下さい。
portal
Levels 内の物と同じプロパティを使用します。portal は blend ファイルの読み込み、Scene の切り替え、オブジェクトの位置への移動を行なうことができます。
プロパティは以下のとおりです。
[wiki]-"active": 前述済
-"portal": オブジェクトの名前
-"portal_scene": Scene 名
-"portal_blend": blend ファイル名[/wiki]
メニューアイテム "Open Blendfile"、"Configure"、"Back" が portal のサンプルです。ご覧下さい。
もしこのメニューでコンフィグ設定を行いたい場合、Python の辞書、"GameLogic.globalDict" が使用できます。他のファイルを読み込んでも内容が保持され、game Actuator により、ファイルへの保存や読み込みができます。
ゲームのすべての設定は GameLogic.globalDict['conf'] 辞書に保持されます
現在二つのタイプのボタンがあり、ON にすると自動的にこの Python 辞書を修正してくれます。両方とも、"conf_key" プロパティを使用し、どの設定が変更されるかを指定します。
ボタンは少ないですが、メニュー内部を変更しなくても多くの設定用ボタンを追加できます。どう動作しているかは、"init_options" スクリプトと、options シーンのメニューアイテムをご覧下さい。
Toggle (configuration)
これは極めてシンプルで、このトグルボタンは configuration ディレクトリ内の値の ON/OFF を切り替えます。
[wiki]-"active": 前述済
-"toggle": 0 もしくは 1で、メニューアイテムがこれをチェックし、1の場合に大きなドットを表示します。
-"conf_key": このオプションを切り替えると、GameLogic.globalDict['conf'][conf_key] = True もしくは False になります。[/wiki]
Radio (configuration)
Toggle ボタンと違い、同じ conf_key を共有する複数のラジオボタンです。
[wiki]-"active": 前述済
-"radio": このボタンが ON になった時の conf_key の値。3つボタンのインスタンス、low/med/high の場合、それぞれ "radio"値に0、1、2を持ちます。
-"enabled": 一度に同じ conf_key を共有する Radio ボタンのうち1つのみが ON になります。これは ON になったオプションが目立つようアニメーションするのに使用されます。
-"conf_key": このオプションを切り替えると、GameLogic.globalDict['conf'][conf_key]に、ON になったボタンの "radio" 値が設定されます。[/wiki]
注意:このサンプルでは少し複雑になることと、Yo Frankie に特化しているため、キーの割り当て設定は省略しています。
概要
Frankie の挙動は、ほぼすべての Logic を行う見えない親オブジェクトに Parent された複数のオブジェクトで実現されています。この LogicBrick 群は、管理できるよう複数の State(walk、run、fall、idle など)に分けられており、それぞれの State は他の State の Logic を気にせず編集できます。
このルールには states(15)、action(16)という二つの大きな例外があり、Frankie はアクションを実行したり、プレイ中に Life を保守できます。
Sensor Logic Bricks は以下をチェックします。
[wiki]-ユーザ入力(キーボードとジョイスティック)
-レベル内の特別な要素(例:lave、water、bounce、portal)との衝突判定
-体力や持ち物のプロパティの変更[/wiki]
Actuator は以下に使用されます。
[wiki]-アニメーションと音声の再生
-新しい State への移行
-life、carrying、timers プロパティの設定
-物理的な力の適用(例:ジャンプや走行)
-方向の制限(例:歩行…直立に、走行…地面と平行に、滑空…ピッチの抑制)[/wiki]
スクリプトは以下のような高度な機能に必要とされています。
[wiki]-滑空、Frankie のピッチがスピードと降下に影響します。
-岩壁でのよじ登り、RaySensor からレイを飛ばし、岩壁の頂上の判定を行い、Frankie の縦の位置を設定します。
-状況に応じたアクション。周囲の敵、Frankie が運んでいる物、所持品をテストします。[/wiki]
[wiki]-''idle (1)'': デフォルトの state で、Frankie が地面の上におり、何もしていない時の状態です。
-''walk (2)'': 前方もしくは後方に移動中の状態です。
--Servo Motion actuator により、一定の速度を維持しています。
-''run (3)'': アクションキーと前を押している状態。
--線速度(Lin V)は Frankie の前進にのみ使用しています。
--Rotation オプションを ON にした Distance の Constraint Actuator を、Frankie を地面の表面と平行に走らせるのに使用しています(宙返り走行も可能)。
--走るスピードは、"frank_run_speed" スクリプトからコントロールされており、"boosted" プロパティと Frankie のピッチ(宙返り走行時の加速のため)を元に走行スピードを調節しています。
-''fall (4)'': Frankie が何の地面オブジェクトとも衝突していない時や、ジャンプ直後にセットされます。
--Frankie は落下中、Orientation Constraint Actuator によって、強制的に直立するようになります。
--この State から Frankie は跳ね返ったり、他のプレイヤー上に着地することで持ち上げられたり、岩壁の上につかまったり、ジャンプボタンを押しっぱなしにして滑空する状態に変化することができます。
-''ledge hang (5)'': 継続的に Frankie をがけに付着させ続けている状態です。ここでは Frankie は左右に移動したり、降りたり、岩壁の上に地面があれば登ったりすることができます。
--これは数少ない action(state 16)が無効化される State の一つです。
--物理演算は停止され、Python スクリプトが Frankie をがけに付着し続けます。
-''carried (6)'': Frankie の "carried" プロパティが0以外になった時、この State がセットされます。ほとんどの機能が無効化され、Frankie はオブジェクトを投げることしかできません。
-''idle animation (8)'': idle がしばらく続いた後、この State が追加され、"frank_random_anim" スクリプトを使用し、ランダムに Animation Actuator を実行します。
--この State が他と違う点は、別の State の上に追加されることです。この State はアニメーションを再生することしかできないため、もし他の walking や falling などの State がセットされたことにより、これが無効化されても問題ないのです。
-''death (11)'': は Frankie の life が0になった時にセットされます。この State はすぐさま、State 12もしくは溶岩と接触した場合は27に切り替わります。
-''death ground (12)'': は、死亡アニメーションを再生し、その後 respawn State(26)がセットされます。この State は排他的にセットされ、すべてのプレイヤーの入力は無効化されます。
-''stats (15)'': Frankie の Life を更新したり、受けた攻撃や水との接触に反応したり、アイテムを拾ったり、portal を動作させたり、ヘッドアップディスプレイ(HUD)の Overlay Scene にメッセージを送ったりします。
--この State は Frankie がフリーに動ける(death や drown、respawn ではない)、他のすべての State のほとんどの時間実行されます。
-''actions (16)'': 入力を判定し、アクション(アニメーションの再生とアクションの Logic の実行)を行います。捕獲と Frankie が地面にいるかどうかのチェックの Logic もこの State で処理しています。
--"frank_action_all" スクリプトで、キー入力判定と、キックもしくは投げる時はそこにあるものをチェック、その後 "action_name" プロパティにセットし、アニメーションを再生します。これは "action_name" がセットされている間スクリプトを実行し続けます。キー押下時に Logic を実行する方法はシンプルですが、信頼性に欠けます。そのため、このスクリプトは各アクションごとに、Armature アニメーション中での実行フレーム(訳注:TRIGGER_FRAME)を持っており、このフレーム後に Logic を実行し、そして "action_done" プロパティをセットします。
--Key Sensorと、Action Actuator を追加し、"frank_action_all" スクリプトの方法に従うことで、Action を追加できます。
--また、この State は state 15のように、他のほとんどの State と共に実行されます。しかし、ledge hang と ledge climb では OFF になります。
-''jump init (18)'': 音声を再生し、線速度(Linear Velocity)を設定後、"jump_timer" と "grounded" プロパティをリセットします。
--プロパティ設定後、すぐに fall State に切り替わります。これは jump の Actuator を idle や walk、run State の controller に接続して持たせると、保守が困難になるからです。
-''glide (19)'': 落下中、ジャンプボタンを押し続けることで ON になります。すべての glide の Logic は、"frank_glide" スクリプト内で実行されます。ここでは、急降下や短時間の空中遊泳を可能とするため、スピードとピッチの物理演算の処理を行っています。
-''ledge climb (20)'': 岩壁にぶらさがっている(ledge hang)間、前進キーを押した場合に使用されます。Frankie が岩壁の上に移動する間、アニメーションが再生されます。
--Servo Motion Actuator で Frankie を上と前に Dynamics を OFF にすることなく一定の速度で移動させています。
--Delay Sensor を使用し、上方から前方へのモーション変更の時間を測定し、Motion Actuator とアニメーションをシンクロさせています。
-''stop idle animation (23)'': idle アニメーションのタイマーをリセットし、カメラの周回移動(Orbit)を OFF にした後、idle animation State と、この State 自身を OFF にします。
-''respawn (26)'': Frankie の位置をリセットし、彼のプロパティのほぼすべてを元の値に戻します。
-''death lava (27)'': アニメーションと音声以外は death ground と同じです。
-''drown (28)'': death State と似ていますが、respawn の代わりに "frank_drown_revive" スクリプトで Frankie を最後から二つめの、地面のあった場所に移動します。[/wiki]
[wiki]-''id'': これは integer(整数型)の、それぞれのプレイヤー固有の ID で、プレイヤー1、2に対し、0か1が入ります。これはキー設定や、スクリーン分割などのプレイヤーの初期化に使用されます。
--オブジェクトを投げる時、自身の "id" が "projectile_id" に適用されます。そのため、最後に投げたオブジェクトが誰かを知ることができます。開始時は-1で、"frank_init" スクリプトで適切に初期化されます。
-''grounded'': Frankie の LogicBrick とスクリプトの多くで彼が地面の上にいるかどうかを知るのに使用されています。この値は "frank_ground_test" スクリプト(State 16)で管理されており、ここでは "ground" との衝突判定と -Z Ray Sensor で、地面の状態が変化したかどうかを探知しています。
--このプロパティを削除し、すべての場所を ground との Collision Sensor で置き換えることもできたかもしれませんが、Collision Sensor だけではでこぼこした地形で不安定で、Collision と Ray Sensor のコンビネーションの方がいい結果がでます。
-''predator'': sheep(羊)、ram(雄羊)、rat(ネズミ)の Logic で使用されます。このオブジェクトは敵であり、これに攻撃もしくはこれから逃げなければいけないことを知らせます。
-''kickable'': 2 プレイヤーモードで使用され、お互いをキックすることができます。sheep と rat もこのプロパティを持ちます。
-''hit'': 他のオブジェクト(rat、ram、他のプレイヤー)から攻撃を受けた時、それらの Logic からセットされます。これがセットされた時、Frankie の life プロパティから hit 値が減算され、hit 値は0に戻ります。"frank_health" スクリプトは0以外の hit 値に反応します。
--この方法を使用することにより、皆さんが自分で敵を簡単に追加できるようになります。すべてで必要なのは、攻撃してくるそのオブジェクトに "hit" 値を設定することです。
-''orig_pos'': そのレベルに入った時の Frankie の初期位置。Frankie が死んだ時、この位置が復活時に使用されます。
--この値は "frank_init" スクリプトで初期化されます。"frank_respawn" スクリプトと、"frank_revive" スクリプトでの位置の巻き戻しに使用されます。
-''ground_pos、ground_pos_old'': 毎秒更新され、Frankie が最後に地面にいたところを格納しています。
--現時点では溺死後の復活時、最後(から二つめ)に地面に接触していた場所に復帰させる時にしか使用されていません。
--''ground_pos_old'' は ''ground_pos'' より常に1秒古くなっています。これは使用する地面の位置が水に近すぎないように、そして溺死直前がセットされないようにするためです。
--これらの値は ''frank_ground_pos'' で設定されます。
-''water_touch_time'': Frankie が水に触れた時、特におぼれている羊に乗っかった時にに単純におぼれてさせてしまうのは具合が悪いです。この Timer は、drown State に切り替わる前の短い間、Frankie が水に触れられるようにするのに使用されます(State 15の water_timer Sensors もご覧下さい)。
-''camera_orbit'': Frankie が idle アニメーション再生中、おぼれている時、溶岩に落ちた時に、Camera を Frankie の周囲を回らせるのに使用される Integer値です。
--"Camera_Scaler" オブジェクトにはこのプロパティをチェックする Sensor があり、0以外の場合に Motion Actuator を実行し、逆回転の設定に失敗した時は Ipo を再生します(訳注:この辺はおそらく Yo Frankieリリース後に直します)。"Camera_scalers" の orbit_on と orbit_off Controller をご覧下さい。
-''idle_anim_trigger'': この Timer は、Frankie がしばらく放置された時、idle アニメーションを再生するのに使用されます。
--負の値で初期化され、Camera が Orbit モードになり、その後0.0ぐらいで idle animation State が追加されます。
--'''State 1 の接頭辞が idle_anim の LogicBrick をご覧下さい。'''
-''carrying'': Integer値で、Frankie が何かを運んでいる時に1がセットされます。多くのスクリプトでこれを使用し、Frankie がアイテム収集、テイルホイップ、ダブルジャンプ、走行などのアクションを行えるかどうかをチェックします。
--主にこの値を設定している Logic は "frank_carry" スクリプトで、これは "carrid" プロパティのあるオブジェクトが Frankie と接触している時に実行されます。
--'''State 16 の frank_carry Controller をご覧下さい。'''
-''carried'': 持ち運びできるオブジェクトを定義します(例えばプレイヤー1はプレイヤー2を持ち運びできます)。この値はスクリプトと LogicBrick から、それが運べるものかどうかを知るのに使用されます。これが0以外の場合、State 6がセットされ、物理演算が一時停止になり、Frankie は(すでに持っているものを投げること以外)ほとんどのことができなくなります。
-''force_walk'': この Timer は Frankie の走行を止めたい時に使用され、0未満の時、run State からすぐに walk に切り替わります。
--オブジェクトを運んでいる時は常に負の値がセットされます。また、Frankie が攻撃を受けた時、投げる時、キック、テイルホイップする時に少しの間だけ強制的に歩かせるのにも使用されます。
-''action_name'': Frankie が Action を行う時に使用されます。現在この値は "throw_carry"、"throw"、"kick"、"tailwhip" のいずれかになります。つまり、現在どの Action が実行されているのかがわかり、走行時から複数の Action が一度に行われるのを止められることを意味します。
--一旦終了するとこの値は空の文字列になります。
--'''State 16に、すべての Action をコントロールする "frank_action_all" スクリプトがありますのでご覧下さい。'''
-''action_done'': "frank_action_all" スクリプトから、Action に関連する関数がまだ実行中かどうかをチェックするのに使用されます。これがないと、あるアニメーションの途中で Action を実行できません。State 16も参照して下さい。
-''throw_item'': Frankie が次に投げるアイテムを格納します。もし、他の用途のあるアイテムを他にも集めることがあったなら、このプロパティを使用してアクティブなアイテムをループで切り替えすることができたでしょう。
--'''最後に集めたアイテムを "throw_item" にセットしている、State 15の "frank_sense_pickup" スクリプトと、"throw_item" で次に投げるアイテムを決定している State 16の "frank_action_all" スクリプトをご覧下さい。'''
-''life'': Frankie の現在の体力の格納と、HUD メーターの更新用です。'''State 15の "frank_health" スクリプトをご覧下さい。'''
-''life_max'': Frankie の最大体力値で、Frankie が体力回復アイテムで回復できる量を制限します。'''State 15の "frankie_sene_pickup" をご覧下さい。'''
-''revive_time'': Frankie が攻撃を受けた時に0にセットされ、"revive_time" が1.0を超えるまで他の攻撃を受けません。'''State 15の "frank_health" スクリプトをご覧下さい。'''
-''jump_time'': この Timer はジャンプを始める時に0.0にセットされ、少しの間地面との衝突判定を無視するのに使用されます。また、ダブルジャンプを行うための時間が過ぎたかどうかをチェックするのにも使用されます。
--"jump_time" は滑空時間にも再利用されます。
--'''この値がセットされている State 16と State 18の "frank_ground_test" スクリプトをご覧下さい。'''
-''double_jump'': Frankie がダブルジャンプするかどうかをチェックするのに使用されます(ダブルジャンプは一度しかできないため)。'''State 4の "frank_fall" スクリプトをご覧下さい。'''
-''glide_z_init'': Frankie が滑空を始めたとき、その Z 値をセットします。彼が初期位置より高い場所に滑空しないようにするのに使用されます。'''State 19の "frank_glide" スクリプトをご覧下さい。'''
-''run_wall_timer'': Frakie が "slip" プロパティのある壁にぶちあたった時、壁で反転宙返りできるようにするために使用されます。'''State 3の "frank_wall_run" スクリプトをご覧下さい。'''
-''boosted'': Frankie が蝶を捕まえた時("boost" プロパティのある物に触れた時)にセットされ、彼の色がフラッシュし、速度が速くなります。
--'''State 3の "frank_run_speed" と、"frank_sense_pickup" の boost 値を設定しているところをご覧下さい。'''
-''can_climb'': ぶらさがり状態中に岩壁の上にレイを放ち、Frankie が上ることのできる地面があればセットされます。0以外のとき、ぶら下がり中に上キーを押すことで、Frankie ががけの上を上ります。
--'''State 5の "frank_ledge_hang" スクリプトをご覧下さい。'''
-''ledge_regrip_timer'': がけなどから落ちる(つかまっている時に下キー)時に、Frankie が落ちた後にすぐつかみ状態になってしまうのを防ぐのに使用されます。
--'''State 4の "frank_ledge_collide" スクリプトをご覧下さい。'''
[/wiki]
Frankie のロジックを実行できるレベルを設定するのは簡単です。単に立たせたいエリアに "ground" プロパティを設定するだけです。
ここからそのレベルをプレイしてみると、おそらくいくつかの問題に気づくでしょう。しかし、これらはレベルを細かく調整することで処理できます(後述)。
現在の地面とバリアを定義する方法には、それぞれ別々のオブジェクトにしなければいけないという制限があります。
Yo Frankie のレベルは簡単にあたり判定を地形から削除したり、見えない Physics オブジェクトを追加できます。
地形の Physics は GameLogicButtons の中で OFF にすることができます。
Physics のみのオブジェクトは、不可視状態で初期化されるよう、Outliner の Render オプションを OFF にして下さい(UV を追加し Invisible オプションを追加するのを省略できます)。
壁などの垂直に立つ、上に駆け上がらせたくない面には、Friction の設定を0にしておいて下さい(MaterialButtons の DYN ボタン参照のこと)。
これらのプロパティは Frankie やその他の要素の Logic 内でチェックされ、キャラクタがそのレベルと正しく影響しあうようになっています。
[wiki]-''ground'': プロパティは、Frankie が立つことのできる物を定義するのに使用します。これらの面はフラットである必要はありません(例えばぐるっと回ることのできるループ状の地形にも "ground" プロパティがあります)。ただし、これを壁やバリアには指定しないようにして下さい。
--'''注意:ジャンプして上に乗ることのできる台は、周囲を "ground" プロパティを持たないバリアで囲み、頂上の outset はこれらのバリアの上部の衝突判定とこの ground が衝突しないよう、約0.05にして下さい。そうしないと Frankie がこの台の上に乗る前に歩行しはじめてしまうでしょう。'''
-''slip'': まっすぐ突っ込んでいった時に、宙返りして反転できる壁にするためのプロパティです。壁に走っていった角度によっては、Frankie が壁と平行に走ります。これはゲームプレイに必要な物ではないのですが、レベルをスムーズに走り回ることができるようになります。このプロパティの値自体は使用されません。
-''ledge'': Frankie がつかまることのできるエリアを定義するのに使用します。このプロパティの値自体は使用されません。
--これらは縦の長さが0.45の帯にして下さい。
--もし枝などのように、手を離すとつかまったモデルを通過して落ちていくようにしたい場合、Ghost オプションを利用して下さい。
-''bounce'': Frankie が上に落ちたとき、空中に跳ね返るオブジェクトを作成するのに使用します。このプロパティの値自体は使用されません。
-''kill'': Frankie が kill 値だけ Life 値を失います。値は integer でなければなりません。
-''water'': 川の水面に設定するプロパティで、Frankie が少しの間触れていると溺れるようになります。このオブジェクトは Ghost にして下さい。このプロパティの値自体は使用されません。
-''lava'': water とほぼ同じで、Frankie のアニメーションが少し違います。
-''liquid'': これは water や lava オブジェクトに設定するプロパティで、拾った物がこれらに触れると消えます。このプロパティの値自体は使用されません。
[/wiki]
元記事:Bf-institute-ApricotBgeLogic - BlenderWiki
17:26, 8 October 2008版を元にしています。
Blender ゲームエンジンのロジック
By Campbell Barton - aka ideasman42
(訳注:この記事はYo Frankie!に関する記事であり、一般的な機能解説ではありません。一部は後日公開される予定のファイルの解説です)
はじめに
このゲーム(訳注:Yo Frankie! のこと)はいくつかの blend ファイルに分けられます。キャラクタ(Characters)、レベル(Levels)と小道具(Props)です。レベルと小道具にはほとんど Logic がなく、キャラクタがどう反応するかを決めるのに使用されるプロパティのみ設定されています。
レベルには、大半を占める動かない地形に、キャラクタ、小道具、エフェクトのグループへのリンクがあります。
外部の blend ファイルに自身のカメラやアニメーション、音声、Logic を持ったキャラクタを置くことは非常に効果的な方法です。キャラクタを複数のレベルにリンクできるだけでなく、そのキャラクタの複数のインスタンス(コピー)を一つのレベル内に置くことができるからです。
Logic の共有
私たちは、すでにある Sheep(ひつじ)用の Logic を別のキャラクタの追加時に流用したいと考えました。これは最近 Apricot 用に特別にゲームエンジンに追加されたグループインスタンスで可能になりました。
それぞれのキャラクタの Armature、Mesh、シャドウ Mesh といった、キャラクタ固有のオブジェクトは、Logic を実行しているダミーの Mesh に Parent されています。3つのすべてのグループは、この Logic オブジェクトを共有していますが、固有の Armature と Mesh はそれぞれが持っています。
それぞれのキャラクタが同じ挙動をしないよう、そのキャラクタの開始時にスクリプトを実行し、子オブジェクトを元に "type" プロパティを設定します。この type プロパティでキャラクタが攻撃できるか、キックを受けるか、運ばれるか、どれぐらい活動的かなどを決定します。
2匹のプレイ可能なキャラクタ(Frankie と Momo)があり、これらも Logic を共有していますが、それぞれ固有の Mesh と Armature を持っています。
挙動の変更は必要ないものの、別々のキーレイアウトと各自のスクリーン部分(分割スクリーン)を使用する必要があります。Sheep の時同様、これはキャラクタ開始時に行なわれます。しばらくは1プレイヤーもしくは2プレイヤーのみのサポートですが、これ以上の追加もたいしたことではありません。
States(ステート:状態)
States 機能は Apricot プロジェクト用に新しく Blender に追加された物で、Logic を、それぞれを ON/OFF できる States にグループ化することができます(Logic レイヤと考えてもらうといいでしょう)。
States 機能はあらゆる複雑な Logic で多用されています。例えば Frankie では idle(アイドル)、walking(歩行)、running(走行)、falling(落下)、gliding(滑空)、hanging(ぶらさがり)、drowning(溺死)、death(死亡)といった具合です。それぞれの状態には、いくつかの States に切り替える、多くの Sensor と Actuator を持っています。
frankie.blend の idle State
以下は、States がゲーム中どう切り替えられるかです。
[wiki]-初期 State → fall State
-地面との衝突 → idle State
-上キー → walk State
-地面との衝突がなくなる → fall State
-水との衝突 → drown State[/wiki]
Logic エレメント
Frankies Camera
このファイルでは、Apricot でカメラがどう動作しているかを紹介しています。前を向いているサードパーソンカメラはそんなに複雑ではないのですが、それでも克服すべき問題がいくつかあります。
Blender のカメラについての最初の問題は、Frankie が他のオブジェクトによって見えなくなり、ゲームがプレイできなくなることでした。
私たちはまず Frankie に Camera を Parent し、Slow Parent 機能を使用することで、その Camera の Frankie に対する反応を弱め、ぶれたりいらいらする動きを抑えることから始めました。木や壁が Camera をじゃまするのを防ぐため、Frankie の位置から Camera へ向けた Ray Sensor と Python スクリプトを使用し、レイが衝突した位置を元に、Camera との Parent の距離をスケーリングしています。
注意
[wiki]-ファイルには移動用、そしてカメラが注視するためのダミーキャラクタがあります。
-地形と柱のあるシーンは "example_scene" です。
-操作は、カーソルキーで移動、スペースキーでジャンプです。[1]キーと[2]キーは、カメラの Orbit(周回)モードのON/OFFです。[/wiki]
オブジェクトとその用途(frankie.blend と合致)
[wiki]-''Frankie'' - すべてのプレイヤーのコントロールとプロパティのある親 Mesh
-''FrankieDummy'' - Frankie が表示される Mesh、frankie.blend ではリグと Mesh です。
-''Camera_Ray'' - Frankie の位置から Camera を追う Empty。これが Camera へレイをキャストし、ビュー内にじゃまな物がないかを判定します。
-''Camera_Scaler'' - これは Camera の親であり、スケーリングにより、Frankie からの Camera の距離を変更します。スケールは Python スクリプトからコントロールされ、Camera_Ray を使用し、ヒットした位置からそのスケールを設定します(このスクリプトはこのカメラの設定専用です)。また、Frankie が idle、drowing、dead 状態の時の Orbit モードでは、このオブジェクトが周囲を回転し、すべての方向から Frankie が見えるようにします。
-''SlowVertParemt'' - これは Camera の親で、Slow Parent を使用し、スケールの変更や Frankie の回転がすぐに Camera に適用されないようにしています。また、私たちは Vertex Parent を Camera に適用する必要がありました。そうしないと、Camera がスケーリングされてしまい、3Dビューが歪んでしまうからです。
-''MainCam'' - Camera_Ray の方を向くメインカメラです。[/wiki]
Frankie の States(簡略版)
このキャラクタ Logic のサンプルは、Frankie の Logic を元に、States をどう使用すればプロパティの設定や Python スクリプトなしに、挙動をコントロールできるかを示す物です。
Python スクリプトを使えばもっと高度な機能を追加できるでしょうが、States の使用でスクリプトの内容が限定的になり、サイズを小さく抑えるのに役立ちます。
キー
[wiki]-[↑]、[←]、[→] - 移動
-スペース - ジャンプ[/wiki]
レベルのプロパティ
[wiki]-''ground'' - 歩行可能な床を判定するのに使用されます。
-''kill'' - death State にします。[/wiki]
States
[wiki]-''1'' - Idle State。ジャンプ、歩行、 旋回ができます。
-''2'' - Walk State。そこからジャンプ、Idle、旋回ができます。
-''3'' - Jump State。常に1 Logic 単位の間でのみ ON になり、上方向の力を加え、すぐさま Fall 状態に遷移します。これは他の States(このケースでは Walk)のモーションがジャンプの力に干渉する恐れがあるからです。
-''4'' - Fall State。ここから着地できます。この状態は開始時に ON になっており(黒いドットが State に表示されています)、Frankie が 'ground' プロパティを持つオブジェクトと接触していない場合は常に ON になります。
-''6'' - General State。調整と、Frankie が 'kill' オブジェクトに接触したかをチェックするための物です。この State は Frankie が生存している間は常に ON になっており、このような State を持つことは、キャラクタに現在の挙動に関係なく反応させたい場合に便利です。
-''15'' - Death 状態。この State は General State を OFF にし、ユーザ入力を除去、そして4秒待った後、そのオブジェクトを終了させます。[/wiki]
Level Portals(レベルポータル)
この blend ファイル集は、単一のキャラクタを複数のシーンと blend ファイルからリンクし、ポータルで簡単にこれらの間を移動する方法を示しています。
キャラクタは、ゲーム Logic のあるオブジェクトと一つの Camera オブジェクトのグループです。その後、このグループを多数のレベルとリンクし、キャラクタの Logic が一ヶ所で編集可能な状態にしておきます。
これらのサンプルでは、どうやって以下のことができるポータルを作り上げたかを説明することに焦点を合わせています。
[wiki]-そのレベルの他の位置への移動
-その blend ファイル内の(オブジェクトが定義されている)他の Scene への移動
-(Scene とオブジェクトが定義されている)他の blend ファイルへの移動
-life や inventory などのキャラクタのプロパティの、Scene 間や blend ファイル間での保持[/wiki]
ポータルを作成するには、単に衝突判定のあるオブジェクトを作成し、"portal" というプロパティを追加、値を例えば "SomeObjectName" などにします。この場合、このポータルに接触すると "SomeObjectName" という名前のオブジェクトの場所に転送されます。
もし他の Scene へ移動したい場合は、プロパティに "portal_scene" を追加し、値を "MyOtherScene" などにします。
他の blend ファイルに移動するには、プロパティに "portal_blend" を追加、値を "//level_2.blend" などにします。この値は他の blend ファイルへのパスで、// は現在の blend ファイルと同じディレクトリを意味する接頭辞です。
"portal_scene" や "portal_blend" を使用する時、"portal" プロパティが存在していなければなりません。もしオブジェクトの位置を設定したくない場合、その値を空の文字列にして下さい。
これらのプロパティは Apricot のレベルと同じ動作方法ですが、キャラクタのスクリプトはこのサンプルの目的に合わせて変更されています。
このディレクトリにあるポータルをサンプルとしてご覧下さい。
Splash(しぶき)
このサンプルは、水や溶岩のあるレベル用のしぶきをどうやって作成しているかを見せています。
水オブジェクトには、"splash_logic" の Controller にリンクする Collision Sensor が必要です。このケースでは水オブジェクトは二つですが、数の制限はありません。
splash_logic は、衝突が発生したとき、"detect_splash" と呼ばれる Python スクリプトを実行します。この "detect_splash" スクリプトは、"splash_logic" をそれぞれの衝突位置に移動し、しぶきのオブジェクトを発生します。
この方法では、多くのしぶきを一度に発生できます。
着水したオブジェクトが浮くか沈むか削除されるかはそのオブジェクト次第で、これらは単に水との衝突判定だけが必要です。このサンプルでは、Cube の物理演算が停止され、200 Logic 時間後に削除されます。
前述の Empty オブジェクトはしぶきを作成するオブジェクトを生成しますが、どんなオブジェクトでも降らせることができるでしょう。
しぶきオブジェクト自身は AddObject Actuator で使用するために、不可視レイヤに置く必要があります。レイヤ20をご覧下さい。
2 Player Split Screen(2プレイヤー分割スクリーン)
このファイルでは、同じキャラクタ Group の2つのインスタンス(コピー)に、どうやって開始時にそれぞれ固有のキーとスクリーンを適用しているかを示すものです。
これは各キャラクタに初期化用の Python スクリプトを持たせ、各自別々の設定をするため、固有の ID を設定することで実現しています。
一旦このスクリプトが実行されると、State が変更されユーザ入力のみ反応するようになります。このシーン内にいるキャラクタのオブジェクトは DupliGroups のインスタンスで、"character_group" シーンに彼らの Logic があります。また初期化方法は、"frank_init_2player" スクリプトをご覧下さい。
カーソルキーでプレイヤー1を、WASD でプレイヤー2を移動できます。
Menu(メニュー)
この blend ファイルでは、Yo Frankie! のスタートメニューの簡略版が見られます。
このメニューには以下の機能があります。
[wiki]-マウス、キーボード、ジョイスティックから入力
-メニューのアイテムから Scene や blend ファイルの読み込み、もしくは Actuator の起動が可能
-トグルとラジオメニューアイテムがオプションの設定に使用可能。
-オプションを Actuator の新機能を使用してファイルに保存・読み出し可能。
-Logic は汎用で、複数のメニューから再利用可能。[/wiki]
実装
このメニューの基本は非常にシンプルで、"item_" で始まるすべてのオブジェクトがアルファベット順にソートされ、メニューアイテムとして処理されます。上下カーソルキーもしくはマウスカーソルが上にくることで、一度に1つのアイテムのみアクティブになります。[Enter]キーもしくはクリックでメニューアイテムのアクションを実行します。
"menu_select" スクリプトでほとんどのメニューの Logic をコントロールしています。これは "menu_logic" オブジェクト上で実行されており、シーン内の "item_" で始まる名前のオブジェクトをスキャンし、それらのプロパティに応じてユーザの入力に反応します。
"active" プロパティは、すべてのアイテムで使用されています。1をセットすると、そのアイテムの Sensor はこれを探知してアニメーションを行います。
Yo Frankie では、私たちはアニメーションを複数のオブジェクトに付加するのに非表示のアイテムを使用することにしました。また、マウスでアクティブ化できるエリアも大きくすることができました。
アイテムの起動タイプ
trigger
このタイプのアイテムは、追加の "trigger" プロパティのみ必要です。メニューアイテムがアクティブになったとき、trigger が1にセットされます。アイテムは自身の Logic で trigger 値をチェックして動作させる必要があります。実行後はこの trigger 値を0に戻して下さい。メニューアイテムの "Quit"、"Save Config"、"Load Config" をチェックしてみて下さい。
portal
Levels 内の物と同じプロパティを使用します。portal は blend ファイルの読み込み、Scene の切り替え、オブジェクトの位置への移動を行なうことができます。
プロパティは以下のとおりです。
[wiki]-"active": 前述済
-"portal": オブジェクトの名前
-"portal_scene": Scene 名
-"portal_blend": blend ファイル名[/wiki]
メニューアイテム "Open Blendfile"、"Configure"、"Back" が portal のサンプルです。ご覧下さい。
Configuration
もしこのメニューでコンフィグ設定を行いたい場合、Python の辞書、"GameLogic.globalDict" が使用できます。他のファイルを読み込んでも内容が保持され、game Actuator により、ファイルへの保存や読み込みができます。
ゲームのすべての設定は GameLogic.globalDict['conf'] 辞書に保持されます
現在二つのタイプのボタンがあり、ON にすると自動的にこの Python 辞書を修正してくれます。両方とも、"conf_key" プロパティを使用し、どの設定が変更されるかを指定します。
ボタンは少ないですが、メニュー内部を変更しなくても多くの設定用ボタンを追加できます。どう動作しているかは、"init_options" スクリプトと、options シーンのメニューアイテムをご覧下さい。
Toggle (configuration)
これは極めてシンプルで、このトグルボタンは configuration ディレクトリ内の値の ON/OFF を切り替えます。
[wiki]-"active": 前述済
-"toggle": 0 もしくは 1で、メニューアイテムがこれをチェックし、1の場合に大きなドットを表示します。
-"conf_key": このオプションを切り替えると、GameLogic.globalDict['conf'][conf_key] = True もしくは False になります。[/wiki]
Radio (configuration)
Toggle ボタンと違い、同じ conf_key を共有する複数のラジオボタンです。
[wiki]-"active": 前述済
-"radio": このボタンが ON になった時の conf_key の値。3つボタンのインスタンス、low/med/high の場合、それぞれ "radio"値に0、1、2を持ちます。
-"enabled": 一度に同じ conf_key を共有する Radio ボタンのうち1つのみが ON になります。これは ON になったオプションが目立つようアニメーションするのに使用されます。
-"conf_key": このオプションを切り替えると、GameLogic.globalDict['conf'][conf_key]に、ON になったボタンの "radio" 値が設定されます。[/wiki]
注意:このサンプルでは少し複雑になることと、Yo Frankie に特化しているため、キーの割り当て設定は省略しています。
Logic の詳細
Frankie の Logic
概要
Frankie の挙動は、ほぼすべての Logic を行う見えない親オブジェクトに Parent された複数のオブジェクトで実現されています。この LogicBrick 群は、管理できるよう複数の State(walk、run、fall、idle など)に分けられており、それぞれの State は他の State の Logic を気にせず編集できます。
このルールには states(15)、action(16)という二つの大きな例外があり、Frankie はアクションを実行したり、プレイ中に Life を保守できます。
Sensor Logic Bricks は以下をチェックします。
[wiki]-ユーザ入力(キーボードとジョイスティック)
-レベル内の特別な要素(例:lave、water、bounce、portal)との衝突判定
-体力や持ち物のプロパティの変更[/wiki]
Actuator は以下に使用されます。
[wiki]-アニメーションと音声の再生
-新しい State への移行
-life、carrying、timers プロパティの設定
-物理的な力の適用(例:ジャンプや走行)
-方向の制限(例:歩行…直立に、走行…地面と平行に、滑空…ピッチの抑制)[/wiki]
スクリプトは以下のような高度な機能に必要とされています。
[wiki]-滑空、Frankie のピッチがスピードと降下に影響します。
-岩壁でのよじ登り、RaySensor からレイを飛ばし、岩壁の頂上の判定を行い、Frankie の縦の位置を設定します。
-状況に応じたアクション。周囲の敵、Frankie が運んでいる物、所持品をテストします。[/wiki]
Frankie の States
[wiki]-''idle (1)'': デフォルトの state で、Frankie が地面の上におり、何もしていない時の状態です。
-''walk (2)'': 前方もしくは後方に移動中の状態です。
--Servo Motion actuator により、一定の速度を維持しています。
-''run (3)'': アクションキーと前を押している状態。
--線速度(Lin V)は Frankie の前進にのみ使用しています。
--Rotation オプションを ON にした Distance の Constraint Actuator を、Frankie を地面の表面と平行に走らせるのに使用しています(宙返り走行も可能)。
--走るスピードは、"frank_run_speed" スクリプトからコントロールされており、"boosted" プロパティと Frankie のピッチ(宙返り走行時の加速のため)を元に走行スピードを調節しています。
-''fall (4)'': Frankie が何の地面オブジェクトとも衝突していない時や、ジャンプ直後にセットされます。
--Frankie は落下中、Orientation Constraint Actuator によって、強制的に直立するようになります。
--この State から Frankie は跳ね返ったり、他のプレイヤー上に着地することで持ち上げられたり、岩壁の上につかまったり、ジャンプボタンを押しっぱなしにして滑空する状態に変化することができます。
-''ledge hang (5)'': 継続的に Frankie をがけに付着させ続けている状態です。ここでは Frankie は左右に移動したり、降りたり、岩壁の上に地面があれば登ったりすることができます。
--これは数少ない action(state 16)が無効化される State の一つです。
--物理演算は停止され、Python スクリプトが Frankie をがけに付着し続けます。
-''carried (6)'': Frankie の "carried" プロパティが0以外になった時、この State がセットされます。ほとんどの機能が無効化され、Frankie はオブジェクトを投げることしかできません。
-''idle animation (8)'': idle がしばらく続いた後、この State が追加され、"frank_random_anim" スクリプトを使用し、ランダムに Animation Actuator を実行します。
--この State が他と違う点は、別の State の上に追加されることです。この State はアニメーションを再生することしかできないため、もし他の walking や falling などの State がセットされたことにより、これが無効化されても問題ないのです。
-''death (11)'': は Frankie の life が0になった時にセットされます。この State はすぐさま、State 12もしくは溶岩と接触した場合は27に切り替わります。
-''death ground (12)'': は、死亡アニメーションを再生し、その後 respawn State(26)がセットされます。この State は排他的にセットされ、すべてのプレイヤーの入力は無効化されます。
-''stats (15)'': Frankie の Life を更新したり、受けた攻撃や水との接触に反応したり、アイテムを拾ったり、portal を動作させたり、ヘッドアップディスプレイ(HUD)の Overlay Scene にメッセージを送ったりします。
--この State は Frankie がフリーに動ける(death や drown、respawn ではない)、他のすべての State のほとんどの時間実行されます。
-''actions (16)'': 入力を判定し、アクション(アニメーションの再生とアクションの Logic の実行)を行います。捕獲と Frankie が地面にいるかどうかのチェックの Logic もこの State で処理しています。
--"frank_action_all" スクリプトで、キー入力判定と、キックもしくは投げる時はそこにあるものをチェック、その後 "action_name" プロパティにセットし、アニメーションを再生します。これは "action_name" がセットされている間スクリプトを実行し続けます。キー押下時に Logic を実行する方法はシンプルですが、信頼性に欠けます。そのため、このスクリプトは各アクションごとに、Armature アニメーション中での実行フレーム(訳注:TRIGGER_FRAME)を持っており、このフレーム後に Logic を実行し、そして "action_done" プロパティをセットします。
--Key Sensorと、Action Actuator を追加し、"frank_action_all" スクリプトの方法に従うことで、Action を追加できます。
--また、この State は state 15のように、他のほとんどの State と共に実行されます。しかし、ledge hang と ledge climb では OFF になります。
-''jump init (18)'': 音声を再生し、線速度(Linear Velocity)を設定後、"jump_timer" と "grounded" プロパティをリセットします。
--プロパティ設定後、すぐに fall State に切り替わります。これは jump の Actuator を idle や walk、run State の controller に接続して持たせると、保守が困難になるからです。
-''glide (19)'': 落下中、ジャンプボタンを押し続けることで ON になります。すべての glide の Logic は、"frank_glide" スクリプト内で実行されます。ここでは、急降下や短時間の空中遊泳を可能とするため、スピードとピッチの物理演算の処理を行っています。
-''ledge climb (20)'': 岩壁にぶらさがっている(ledge hang)間、前進キーを押した場合に使用されます。Frankie が岩壁の上に移動する間、アニメーションが再生されます。
--Servo Motion Actuator で Frankie を上と前に Dynamics を OFF にすることなく一定の速度で移動させています。
--Delay Sensor を使用し、上方から前方へのモーション変更の時間を測定し、Motion Actuator とアニメーションをシンクロさせています。
-''stop idle animation (23)'': idle アニメーションのタイマーをリセットし、カメラの周回移動(Orbit)を OFF にした後、idle animation State と、この State 自身を OFF にします。
-''respawn (26)'': Frankie の位置をリセットし、彼のプロパティのほぼすべてを元の値に戻します。
-''death lava (27)'': アニメーションと音声以外は death ground と同じです。
-''drown (28)'': death State と似ていますが、respawn の代わりに "frank_drown_revive" スクリプトで Frankie を最後から二つめの、地面のあった場所に移動します。[/wiki]
Frankie のプロパティ
[wiki]-''id'': これは integer(整数型)の、それぞれのプレイヤー固有の ID で、プレイヤー1、2に対し、0か1が入ります。これはキー設定や、スクリーン分割などのプレイヤーの初期化に使用されます。
--オブジェクトを投げる時、自身の "id" が "projectile_id" に適用されます。そのため、最後に投げたオブジェクトが誰かを知ることができます。開始時は-1で、"frank_init" スクリプトで適切に初期化されます。
-''grounded'': Frankie の LogicBrick とスクリプトの多くで彼が地面の上にいるかどうかを知るのに使用されています。この値は "frank_ground_test" スクリプト(State 16)で管理されており、ここでは "ground" との衝突判定と -Z Ray Sensor で、地面の状態が変化したかどうかを探知しています。
--このプロパティを削除し、すべての場所を ground との Collision Sensor で置き換えることもできたかもしれませんが、Collision Sensor だけではでこぼこした地形で不安定で、Collision と Ray Sensor のコンビネーションの方がいい結果がでます。
-''predator'': sheep(羊)、ram(雄羊)、rat(ネズミ)の Logic で使用されます。このオブジェクトは敵であり、これに攻撃もしくはこれから逃げなければいけないことを知らせます。
-''kickable'': 2 プレイヤーモードで使用され、お互いをキックすることができます。sheep と rat もこのプロパティを持ちます。
-''hit'': 他のオブジェクト(rat、ram、他のプレイヤー)から攻撃を受けた時、それらの Logic からセットされます。これがセットされた時、Frankie の life プロパティから hit 値が減算され、hit 値は0に戻ります。"frank_health" スクリプトは0以外の hit 値に反応します。
--この方法を使用することにより、皆さんが自分で敵を簡単に追加できるようになります。すべてで必要なのは、攻撃してくるそのオブジェクトに "hit" 値を設定することです。
-''orig_pos'': そのレベルに入った時の Frankie の初期位置。Frankie が死んだ時、この位置が復活時に使用されます。
--この値は "frank_init" スクリプトで初期化されます。"frank_respawn" スクリプトと、"frank_revive" スクリプトでの位置の巻き戻しに使用されます。
-''ground_pos、ground_pos_old'': 毎秒更新され、Frankie が最後に地面にいたところを格納しています。
--現時点では溺死後の復活時、最後(から二つめ)に地面に接触していた場所に復帰させる時にしか使用されていません。
--''ground_pos_old'' は ''ground_pos'' より常に1秒古くなっています。これは使用する地面の位置が水に近すぎないように、そして溺死直前がセットされないようにするためです。
--これらの値は ''frank_ground_pos'' で設定されます。
-''water_touch_time'': Frankie が水に触れた時、特におぼれている羊に乗っかった時にに単純におぼれてさせてしまうのは具合が悪いです。この Timer は、drown State に切り替わる前の短い間、Frankie が水に触れられるようにするのに使用されます(State 15の water_timer Sensors もご覧下さい)。
-''camera_orbit'': Frankie が idle アニメーション再生中、おぼれている時、溶岩に落ちた時に、Camera を Frankie の周囲を回らせるのに使用される Integer値です。
--"Camera_Scaler" オブジェクトにはこのプロパティをチェックする Sensor があり、0以外の場合に Motion Actuator を実行し、逆回転の設定に失敗した時は Ipo を再生します(訳注:この辺はおそらく Yo Frankieリリース後に直します)。"Camera_scalers" の orbit_on と orbit_off Controller をご覧下さい。
-''idle_anim_trigger'': この Timer は、Frankie がしばらく放置された時、idle アニメーションを再生するのに使用されます。
--負の値で初期化され、Camera が Orbit モードになり、その後0.0ぐらいで idle animation State が追加されます。
--'''State 1 の接頭辞が idle_anim の LogicBrick をご覧下さい。'''
-''carrying'': Integer値で、Frankie が何かを運んでいる時に1がセットされます。多くのスクリプトでこれを使用し、Frankie がアイテム収集、テイルホイップ、ダブルジャンプ、走行などのアクションを行えるかどうかをチェックします。
--主にこの値を設定している Logic は "frank_carry" スクリプトで、これは "carrid" プロパティのあるオブジェクトが Frankie と接触している時に実行されます。
--'''State 16 の frank_carry Controller をご覧下さい。'''
-''carried'': 持ち運びできるオブジェクトを定義します(例えばプレイヤー1はプレイヤー2を持ち運びできます)。この値はスクリプトと LogicBrick から、それが運べるものかどうかを知るのに使用されます。これが0以外の場合、State 6がセットされ、物理演算が一時停止になり、Frankie は(すでに持っているものを投げること以外)ほとんどのことができなくなります。
-''force_walk'': この Timer は Frankie の走行を止めたい時に使用され、0未満の時、run State からすぐに walk に切り替わります。
--オブジェクトを運んでいる時は常に負の値がセットされます。また、Frankie が攻撃を受けた時、投げる時、キック、テイルホイップする時に少しの間だけ強制的に歩かせるのにも使用されます。
-''action_name'': Frankie が Action を行う時に使用されます。現在この値は "throw_carry"、"throw"、"kick"、"tailwhip" のいずれかになります。つまり、現在どの Action が実行されているのかがわかり、走行時から複数の Action が一度に行われるのを止められることを意味します。
--一旦終了するとこの値は空の文字列になります。
--'''State 16に、すべての Action をコントロールする "frank_action_all" スクリプトがありますのでご覧下さい。'''
-''action_done'': "frank_action_all" スクリプトから、Action に関連する関数がまだ実行中かどうかをチェックするのに使用されます。これがないと、あるアニメーションの途中で Action を実行できません。State 16も参照して下さい。
-''throw_item'': Frankie が次に投げるアイテムを格納します。もし、他の用途のあるアイテムを他にも集めることがあったなら、このプロパティを使用してアクティブなアイテムをループで切り替えすることができたでしょう。
--'''最後に集めたアイテムを "throw_item" にセットしている、State 15の "frank_sense_pickup" スクリプトと、"throw_item" で次に投げるアイテムを決定している State 16の "frank_action_all" スクリプトをご覧下さい。'''
-''life'': Frankie の現在の体力の格納と、HUD メーターの更新用です。'''State 15の "frank_health" スクリプトをご覧下さい。'''
-''life_max'': Frankie の最大体力値で、Frankie が体力回復アイテムで回復できる量を制限します。'''State 15の "frankie_sene_pickup" をご覧下さい。'''
-''revive_time'': Frankie が攻撃を受けた時に0にセットされ、"revive_time" が1.0を超えるまで他の攻撃を受けません。'''State 15の "frank_health" スクリプトをご覧下さい。'''
-''jump_time'': この Timer はジャンプを始める時に0.0にセットされ、少しの間地面との衝突判定を無視するのに使用されます。また、ダブルジャンプを行うための時間が過ぎたかどうかをチェックするのにも使用されます。
--"jump_time" は滑空時間にも再利用されます。
--'''この値がセットされている State 16と State 18の "frank_ground_test" スクリプトをご覧下さい。'''
-''double_jump'': Frankie がダブルジャンプするかどうかをチェックするのに使用されます(ダブルジャンプは一度しかできないため)。'''State 4の "frank_fall" スクリプトをご覧下さい。'''
-''glide_z_init'': Frankie が滑空を始めたとき、その Z 値をセットします。彼が初期位置より高い場所に滑空しないようにするのに使用されます。'''State 19の "frank_glide" スクリプトをご覧下さい。'''
-''run_wall_timer'': Frakie が "slip" プロパティのある壁にぶちあたった時、壁で反転宙返りできるようにするために使用されます。'''State 3の "frank_wall_run" スクリプトをご覧下さい。'''
-''boosted'': Frankie が蝶を捕まえた時("boost" プロパティのある物に触れた時)にセットされ、彼の色がフラッシュし、速度が速くなります。
--'''State 3の "frank_run_speed" と、"frank_sense_pickup" の boost 値を設定しているところをご覧下さい。'''
-''can_climb'': ぶらさがり状態中に岩壁の上にレイを放ち、Frankie が上ることのできる地面があればセットされます。0以外のとき、ぶら下がり中に上キーを押すことで、Frankie ががけの上を上ります。
--'''State 5の "frank_ledge_hang" スクリプトをご覧下さい。'''
-''ledge_regrip_timer'': がけなどから落ちる(つかまっている時に下キー)時に、Frankie が落ちた後にすぐつかみ状態になってしまうのを防ぐのに使用されます。
--'''State 4の "frank_ledge_collide" スクリプトをご覧下さい。'''
[/wiki]
レベルのデザインと物理演算・Logic
Frankie のロジックを実行できるレベルを設定するのは簡単です。単に立たせたいエリアに "ground" プロパティを設定するだけです。
ここからそのレベルをプレイしてみると、おそらくいくつかの問題に気づくでしょう。しかし、これらはレベルを細かく調整することで処理できます(後述)。
Physics オブジェクト
現在の地面とバリアを定義する方法には、それぞれ別々のオブジェクトにしなければいけないという制限があります。
Yo Frankie のレベルは簡単にあたり判定を地形から削除したり、見えない Physics オブジェクトを追加できます。
地形の Physics は GameLogicButtons の中で OFF にすることができます。
Physics のみのオブジェクトは、不可視状態で初期化されるよう、Outliner の Render オプションを OFF にして下さい(UV を追加し Invisible オプションを追加するのを省略できます)。
Material
壁などの垂直に立つ、上に駆け上がらせたくない面には、Friction の設定を0にしておいて下さい(MaterialButtons の DYN ボタン参照のこと)。
プロパティ
これらのプロパティは Frankie やその他の要素の Logic 内でチェックされ、キャラクタがそのレベルと正しく影響しあうようになっています。
[wiki]-''ground'': プロパティは、Frankie が立つことのできる物を定義するのに使用します。これらの面はフラットである必要はありません(例えばぐるっと回ることのできるループ状の地形にも "ground" プロパティがあります)。ただし、これを壁やバリアには指定しないようにして下さい。
--'''注意:ジャンプして上に乗ることのできる台は、周囲を "ground" プロパティを持たないバリアで囲み、頂上の outset はこれらのバリアの上部の衝突判定とこの ground が衝突しないよう、約0.05にして下さい。そうしないと Frankie がこの台の上に乗る前に歩行しはじめてしまうでしょう。'''
-''slip'': まっすぐ突っ込んでいった時に、宙返りして反転できる壁にするためのプロパティです。壁に走っていった角度によっては、Frankie が壁と平行に走ります。これはゲームプレイに必要な物ではないのですが、レベルをスムーズに走り回ることができるようになります。このプロパティの値自体は使用されません。
-''ledge'': Frankie がつかまることのできるエリアを定義するのに使用します。このプロパティの値自体は使用されません。
--これらは縦の長さが0.45の帯にして下さい。
--もし枝などのように、手を離すとつかまったモデルを通過して落ちていくようにしたい場合、Ghost オプションを利用して下さい。
-''bounce'': Frankie が上に落ちたとき、空中に跳ね返るオブジェクトを作成するのに使用します。このプロパティの値自体は使用されません。
-''kill'': Frankie が kill 値だけ Life 値を失います。値は integer でなければなりません。
-''water'': 川の水面に設定するプロパティで、Frankie が少しの間触れていると溺れるようになります。このオブジェクトは Ghost にして下さい。このプロパティの値自体は使用されません。
-''lava'': water とほぼ同じで、Frankie のアニメーションが少し違います。
-''liquid'': これは water や lava オブジェクトに設定するプロパティで、拾った物がこれらに触れると消えます。このプロパティの値自体は使用されません。
[/wiki]
元記事:Bf-institute-ApricotBgeLogic - BlenderWiki
17:26, 8 October 2008版を元にしています。
投票数:61
平均点:10.00
Blender 2.48 Sun、Sky、Atmosphere |
Blender機能別 |
Blender 2.48 アニメーションツール |
ログイン
クイックリンク
2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki