■part 5: Adding random elements, and making decisions
今までは、一本道のBHAVを作ってきました。
次は、途中で分岐のあるBHAVを作っていきます。
分岐の条件は、まったくのランダムでもいいし、何か特定の条件を設けてもいいかもしれません。
これまで、BHAVの各Boxから出ている緑と赤の矢印を、「そのコマンドがうまく実行できたかどうか」によって
「うまくいった→緑の矢印へ進む」、「うまくいかなかった→赤の矢印へ進む」と捉えてきました。
しかし分岐を考える際、このTrue(緑)とFalse(赤)の矢印が持つ意味合いは少し変わってきます。
というわけで、シムがフラダンスをした後、条件によってアニメーションAをとるかBをとるかの分岐を持ったBHAVを作っていきます。
【1】
まずは、新しく使うアニメーション2つを探してきて、STR#の0x81にアニメーション名を登録します。
上図のように、Addボタンを2回押して新しい行を加え、アニメーション名を入力しました。
できたら、忘れずにCommitしてセーブします。
【2】
BHAVのInteraction - Come do stuffをクリック。
PluginViewのフラダンスのアニメーションを指示する0x2のBoxをクリックして、Insert via Trueを押します。
緑の矢印でつながった新しいBox 0x3が加わるので、OpCode横の矢印をクリックしてResource Chooserウィンドウを開きます。
上図のように、GlobalタブからCoin Flipを選んでOK。
【3】
このCoin Flipは50%の確立で緑の矢印、50%の確立で赤の矢印へ進むコマンドです。
このOpCodeはOperandsは使用しないそうなので、全部00と入力しておきます。
コインを投げて表が出たら緑矢印、裏が出たら赤矢印を選ぶって感じですね。
【4】
0x3のBoxが選択されている状態で、Insert via falseを押します。
赤い矢印でつながった0x4のBoxが新たに加わります。
これに、以前やったのと同じ要領で、シムのアニメーションを設定しましょう。
armswingdanceのアニメーションを設定しました。
【5】
再び0x3のBoxを選択した状態で、Insert via trueを押します。
緑の矢印でつながった0x4のBoxが新たに加わり、前の0x4だったBoxのナンバーが自動的に0x5になります。
新たに加わった0x4に、同じく別のアニメーションを設定します。
shoulderpumpというのを設定しました。
【6】
最終的にこんなになりました。
0x3のCoin Flipで、シムはshoulderpumpかarmswingdanceのどちらかのアニメーションを1/2の確立でとることになります。
0x4と0x5のFalse Target はReturn Falseに設定し直しました。
さてこれで分岐は出来ましたが、この後も続けてBHAVを設定していきたい場合もあります。
特に、一度分岐した流れを再び一つに戻すのはどうすればいいのでしょうか。
【7】
0x5のBoxを選択し、Insert via trueを押します。
新たに0x6のBoxが加わりますので、Opcodeを0x0002(Expression)に設定。
Operandsの右側にある、トンカチとスパナが交差してるボタンを押して、Instruction Wizardを開きます。
上図のように設定。
シムの「楽しさ」ゲージが、現在の値にプラス10される設定です。つまり楽しさが10回復するわけですね。
【8】
0x4のBoxをクリックします。
そして、True Targetのところに、0x0006と入力。
すると緑の矢印が0x6のBoxにつながります。
これで、0x3のCoinFlipで0x4と0x5に一度分岐し、再び0x6で一本道に統合されるBHAVが出来ました。
一列に並んでいると見にくいですが、こんな感じに図示すると分かりやすいかも。
こんな感じの図を、中学数学でちょっとだけやった記憶があります(^^;
複雑なBHAVを組む時は、一度手書きでこんな絵を書いてみた方がいいかもしれませんね。
【9】
Coin Flipで分岐を作るのもいいですが、特定の条件で分岐させたい場合もあります。
例えば、性格や持っているスキルによって異なるアニメーションをとらせたい場合など。
ExpressionのOpCodeは、こういった分岐条件を作るのにも非常に有用です。
今までは、シムの欲求を回復させたりしていましたが、今度は別の事をしてみます。
0x3を選択し、OpCodeを0x0002(Expression)に変更します。
Instruction Wizardを開いて、上図のように設定します。
(1)Decimalにチェックを入れると、十進法で数字を入力することが出来ます。
(2)100を入力。このあとDecimalのチェックをはずすと、この数値が自動的に16進法に変わります。0x64になります。
シムのスキルは、100ポイント貯めるごとに1レベルアップしていきます。200ポイントあると2レベル、300ポイントだと3レベルという感じです。
ここでは、「身体スキルポイント>100」となる設定をしたことになります。
これは、「身体スキルポイントが100ポイントより多いですか?」という条件文です。
Yes(True)であれば緑の矢印、No(False)であれば赤の矢印に進みます。
つまり、シムの身体スキルが少なくとも1レベルあれば、身体スキルが0レベルのシムとは異なるアニメーションをとることになります。
【10】
最終的にこんなになりました。
ゲームに導入して、確かめてみます。
【11】
身体スキル0レベルのお父さんに、使ってもらいました。
フラダンスのあと、腕を大きく振ったダンスをし、楽しさが少しだけ回復しました。
【12】
次に、身体スキルを1レベル以上にしたお母さんに、絵を使ってもらいました。
フラダンスの後、肩をぐりぐり回して足踏みするダンスをしてくれました。
顔は無表情のままなんですが。
どうやら、うまくいったようですね。
ここで、「さあ、シムの性別によって分岐を作るには、どうしたらいいでしょう。ヒント: ”==”の記号は”イコール”の意味を持つ」という練習問題が出されています。
あとで挑戦することにして、今はチュートリアルの先を続けてみることにします。
■Part 6: Creating error free loops
ここまでは、いわゆる終点のあるBHAVを作ってきました。
しかし場合によっては、プレイヤーが行動をキャンセルさせるか、シムの欲求がレッドゾーンになるまで、ずっと行動を続けて欲しい時があります。
つまりループするBHAVを作るわけですが、ゲームがエラーを出さない工夫が必要になってきます。
というわけで、ちょっとループを作ってみましょう。
【13】
0x6のBoxを選択して、True Targetに0x0002を入力しました。
楽しさが回復したあと再びフラダンスのBHAVに戻り、ずっと0x2~0x6で無限にループする構造です。
ところが、このループには問題があります。
この程度の単純なBHAVならまず大丈夫でしょうが、もっと複雑なループを作ると、ゲームシステムは終わりのない多くの処理を強いられることになります。これによって他の必要な処理が出来なくなり、ゲームが固まってしまう危険性が出てきます。
Maxisは事前にそれを回避するルールをシステムに組み込んでいて、こういったBHAVにはエラーを出し実行を中止するようになっているそうです。
それでもループを作りたい時はどうすればいいかというと、ループの中に小休止を挟みます。
この小休止の間に、ゲームシステムは他のBHAVの処理ができるようになります。
この理論はそれなりに複雑な話なので、詳しく知りたかったら「threaded programming」のキーワードでググってね、とのことです。
「スレッド プログラミング」でググるとウィキペディアの説明が出てくるので、読んでみてもいいかもしれません。確かに、複雑そうでした。
でも、理解しなくても今回の場合は大丈夫です。
【14】
0x6のBoxを選択して、Insert via trueを押します。
新しく0x7のBoxが加わるので、OpCodeの小さな矢印をクリック。
選択ウィンドウが開いたらGlobalタブからIdle(0x0118)を選びます。
Operandsは、上段左端の箱に「01」と入力し、あとは全て「00」にします。
TrueTargetは0x0002とします。
Commitしてセーブ。
これで、ゲームはエラーを出さずこのBHAVを実行してくれます。
ところが実はまだ、このループには問題があります。
それは、シムが自発的にこの行動をキャンセルできる余地がない事。
一度行動を始めたら、シムはずっと踊り続けることになります。少なくとも、プレイヤーが行動をキャンセルしない限りは。
楽しさは回復しますが、残りの欲求値は時間と共に減少します。
たとえ空腹値が真っ赤になってもシムは自発的に行動キャンセルできないので、餓死すらできません。
踊り続けるしかないのです。
呪い系オブジェクトとしてはいいかもしれませんが、普通は困りますね。
なので、シムに判断をさせるコマンドをIdleのあとに付け加える必要があります。
【15】
新しく0x8のBoxを付け加え、OpCodeにGlobalであるWait For Notifyというコマンドを設定します。
Operandsはすべて00とします。
このコマンドは「私はここでをループやめる必要がありますか?」という決定を、シムの欲求値にもとづいて判断するコマンドらしいです。
YesならばTrueの矢印、NoならばFalseの矢印に進みます。
なのでFalse Targetを0x0002にして、ループを作ります。
これで、ゲームシステムにとってもシムにとっても(?)安全なループが出来ました。
0x8でシムは判断をして、やめる必要があるならば緑の矢印Trueに進み、そこでBHAVを終了します。
Commit&セーブして、さっそく動作を確かめてみます。
【16】
おじいさんにやってもらいました。
便意のゲージが一番最初になくなりそうですね。
フリーの状態であれば、「トイレ行きたい!」と騒ぎ出す状態ですが、踊りはやめようとしません。
……何か設定をしくじったのかな? と思いつつ観察していたんですが、
【17】
便意がなくなった時点で自発的に行動をやめました!
【18】
お漏らし……。
BHAV作成はうまくいったようですね。
おじいさん、ごめんなさい。
しかしWait For Notifyとは、どんなコマンドなんでしょうか。
【15】のところでOpCodeを設定した際、隣の「View BHAV」が青く表示されているのに気がついたと思います。
ここをクリックすると、Wait For NotifyのBHAVを覗くことが出来ます。
【19】
覗いてみた所です。
0x0から0x8までは何をやっているのかよく分かりませんが、0x9から0xBまでの設定はなんとなく分かりますね。
空腹、便意、体力の順番で何かの判断をしているようです。
0xFF9Dは、十進法に直すと-99らしいです。
覗いた後は、どこもいじらずにそっとCloseしておきます。
どうやらシムは、餓死かお漏らしか気絶するまでは踊り続けることになりそうですね(^^;
前へ / 次へ
チュートリアルが!
この記事にトラックバックする