Arbor 3の使い方を初心者向けに解説する

※この記事は、Unity公式が開催している「Unityアセット冬のアドベントカレンダー 2019 Winter」の1日目の記事です。

どうも、個人ゲーム開発者のゆみねこです。

UnityにはArbor 3というとても便利なアセットがあります。

とても便利なんですが、どうにもハードルが高そうに見えるのか、手を出しづらいという方もいるようです。

  • 結局なにができるアセットなのか?
  • 使うとどう便利になるのか?
  • どうやって使うのか?

この記事では、Arbor 3でどんなことができるのか・どうやって使うのかを解説していきます。初心者向けの解説なため、あまり難しく考えなくて大丈夫です。

ちなみに、Arbor 3は有料アセットですが、公式サイトに無料体験版があります。

購入するか迷っている方は、まずはこの記事を読みながら試用版をさわってみることをおすすめします。

Arbor 3でなにが解決するのか?

Scriptの流れが見えるようになる

Arbor3を使うことで、Scriptをグラフで見やすく表示してくれます。

皆さんは、Scriptがしだいにゴチャゴチャして、プログラムの流れが分かりづらくなったことはありませんか?

Scriptを動かすためのGameObjectが増えれば増えるほど、どこで何をやっているのかが把握できなくなってきます。

気がつくと「あれ? Playerはどこにあったっけ?」となる

Arbor3を使うことで、この「HierarchyやScriptがゴチャつく問題」が解決できます。

例えば上の画像だと、

  • 1秒待機
  • 5秒巡回

を繰り返す処理が実装できます。

待機と条件分岐がかんたんに実装できる

  • 一定時間待ってから実行
  • 複雑な条件をもとに処理を分岐

といった「待機・条件分岐」が、いとも簡単に実装できるようになります。

待機も条件分岐も、たいていのゲームで必要になる処理です。
敵AIの挙動、UIマネージャー、プレイヤーの操作全般など、ゲームのジャンルを問わず幅広く使うことができます。

バグを見つけやすい

ゲーム実行中も、どのScriptを実行しているか常に追跡してくれるため、バグが生じたときの原因特定に役立ちます。

上の画像だと、黄色が実行中のScriptです。
ブレークポイントを設定すると、そこに到達したときにゲームを一時停止してくれるので、じっくり変数の中身を見ながら原因を突き止めることができます。

基本的な使い方

Arbor 3の魅力がわかったところで、さっそく使い方を解説……していきたいのですが、基礎に関しては公式のチュートリアル(日本語)が非常に分かりやすいため、まずはそちらを読まれることをおすすめします。

チュートリアルに委ねるのは手抜きに思えるかもしれませんが、本当にこれ以上丁寧に解説するのは難しいので、騙されたと思って一度覗いてみてください。

上記の基礎編で、「1秒ごとにCubeの表示・非表示が切り替わる」処理がScriptなしで実装できます。

上記のコーディング編では、「スペースキーを押すたびにそれぞれ別の自作Scriptを呼び出す」処理を解説しています。

上記2つが理解できれば、「自作Scriptをタイミングよく呼び出す」系の処理はおおむねスムーズに作れるはずです。

スポンサードサーチ

実践的な使い方

本当にArbor 3はシンプルすぎて、基礎的なことならチュートリアルを読めば説明いらずです。

かといって、アセットの紹介だけではあまりに記事として貧相なので、 実践的な使い方の一例をご紹介します。

例として、Unityちゃんの移動とジャンプを、Arbor 3で実装してみましょう。

下準備

恒例行事からすませていきましょう。
Unityちゃんをアセットストアからダウンロードし、インポートします。

unity-chan! > Unity-chan! Model > Prefabs > unitychan

をHierarchyにドロップ。

アタッチされているScriptを削除し、Animatorに「UnityChanLocomotions」をアタッチします。

Rigidbodyをアタッチし、重力およびX・Z軸の回転を無効化したら準備完了です。

あ、当然ですがArborもプロジェクトに追加しておいてください。
他のアセットと同様に、ダウンロード・インポートするだけで、特別なインストールなどはありません。

Arbor 3(アセットストア公式)

UnityChanLocomotionsを確認する

UnityちゃんをHierarchy上で選択したままAnimatorウィンドウを開くと、UnityChanLocomotionsの中身を確認できます。

  • Speedが0.1以下でIdle(待機アニメーション)
  • Speedが0.1より大きければLocomotion(走る)
  • Locomotion中にJumpパラメータがONになったらJump(跳躍アニメーション)

Animatorの基本的な説明は割愛します。
あくまで、このAnimator(UnityChanLocomotions)の仕様です。

このAnimatorへ、Arborからパラメータを送り、アニメーションを制御してみましょう。

Arbor を使う準備をする

まず、UnityちゃんにArborの機能を追加しなければいけません。

Unityちゃんを選択し、Add Componentから「Arbor FSM」を追加します。

Arbor FSMが追加されたら、Open Editorを選択すると、Arborの編集画面が開きます。

移動

まずは、WASDキーの入力に応じてUnityちゃんを走らせてみましょう。

Arbor Editor上で右クリックし、「ステート作成」を選択します。
現れたステートに、Input Moveなどの分かりやすい名前をつけます。

なお、ステートを選択して右クリックし、「コメント表示」を選択することで、ステートに説明文を追記できます。

この、「Input Move」というステートに、移動処理のScriptを追加していきます。

いつものようにProjectビューを右クリックしてScriptを作成したいところですが、Arbor用のScriptを選ぶ必要があります。

  1. Projectビューで右クリック
  2. Create > Arbor > StateBehaviour C# Script を選択
  3. Scriptに「InputMoveFSM」など分かりやすい名前をつける

追加したファイルにScriptを記述していきます。
こちらで用意したものがあるので、コピペして必要に応じてアレンジしてください。

入力情報を取得し、AnimatorとRigidbodyに渡しているだけの簡単な処理です。

記述したら、先ほどのステートにScriptを追加します。

  1. Input Move ステートを右クリック
  2. 挙動追加をクリック
  3. InputMoveFSMを選択(Scriptsの項目にあります。検索してもOK)

Arbor用のScriptであるStateBehaviourは、MonoBaviourを継承しています。
そのため、MonoBehaviourで使えるSerializeFieldアトリビュートや、FixedUpdateなどのメソッドも使用可能です。

GameObjectにScriptをアタッチする感覚でScriptを書くことができます。

実行すると、Unityちゃんが前後左右に移動します。

ジャンプする

これだけでは、GameObjectにScriptを直接アタッチしているのとなにも変わりません。

Arborの真髄は、ステートが増えたときの管理のしやすさです。

ということで、次はジャンプ処理を実装してみましょう。

さて、ジャンプ処理をScriptで記述したい場合、皆さんはどう書きますか?

if ( Input.GetButtonDown("Jump") ) {
    // ジャンプ処理
}

みたいな感じのを、先ほどのInputMoveFSMに追加する、などが考えられますね。

じゃあ、アタック処理を追加したい場合は?
ダッシュ、スライディング、よじ登り、鼻ほじりetc…

if ( Input.GetButtonDown("Jump") ) {
    // ジャンプ処理
}

if ( Input.GetButtonDown("Attack") ) {
    // アタック処理
}

if ( Input.GetButtonDown("Sliding") ) {
    // スライディング処理
}

if ( Input.GetButtonDown("Climbing") ) {
    // よじ登り処理
}

if ( Input.GetButtonDown("Hana HojiHoji") ) {
    // 鼻ほじり処理
}

アクションが増えるほど、ソースコードがごちゃついてきますね。

csファイルを分けようとすると、今度はInspectorが縦長になって管理が面倒になります。

Arborの場合はステートを自由に配置し、やじるしで遷移を管理できるので、見た目が分かりやすくスッキリします。

Arborには「Transition」という機能があり、条件を満たした時に他のステートへ遷移することができます。

このように、「Scriptをパーツに分解し、使い回せる」のもArborの強みです。

話を戻しましょう。ジャンプ処理を実装します。
ジャンプ処理は移動処理と分けたいので、新たにステートを作成します。

Editor上で右クリックし、ステート作成を選択し、分かりやすい名前をつけます。

JumpステートにScriptを記述していきます。

今回の「UnityChanLocomotions」では、「AnimatorにJumpフラグを送るとジャンプアニメーションが再生される」という仕様でしたね。

そのため、遷移先のJumpステートでは、「AnimatorにJumpフラグを送る」というScriptを書いていきます。

(実のところ、それぐらいの処理ならArbor側がScriptを用意してくれていますが、今回は練習ということで自作してみます)。

ステート開始時にBool型のパラメータをtrueにし、ステート終了時にfalseにするだけのScriptです。

コピペしても構いませんが、練習だと思って、手打ちで入力してみてください。

このScriptを、Jumpステートにアタッチし、パラメータ名に「Jump」と入力します。

この状態で再生し、ジャンプボタンであるSpaceキーを押してみてください。

どうですか?
ジャンプ……しないと思います。
したなら逆にどうやったのか教えてください。

それもそのはず、Input MoveステートからJumpステートに遷移する条件が設定されていないからです。

Jumpステートに遷移させるために、「Jumpボタンを押したらステートを遷移させる」という処理を実装しなければなりません。

(実はこれもArbor側でScriptが用意されていますが、練習のため自作します)

任意のボタンを押したら、ステートを遷移するScriptです。
これもできればコピペせず、見よう見まねでもいいので自分で入力してみましょう。

StateLinkクラスをInspectorに表示すると、遷移先ステートを指定できるようになります。そのStateLinkをTransitionメソッドへ渡すことで、任意のタイミングで遷移できるようになります。


ボタン名をJumpに限定していませんが、こうすることでアタックボタンや鼻ほじりボタンで遷移させたいときでも同じScriptで対応できるようになります。

Scriptを書いたら、Input Moveステートにアタッチし、ボタン名を入力します。

これで完了……ではありません。

最後に、Next StateからJumpステートをマウスでひっぱり、やじるしで結びます。

再生してみましょう。

UnityChanLocomotionsの内容上、前後の移動時しかジャンプできないので注意してください。(気に食わない場合は、Animatorを編集してIdleからJumpへのTransitionを作成してください)。

Wキーで前進しながら、Spaceキーを押してみましょう。

はい、一度ジャンプすると、操作不能になって延々とジャンプし続けてしまいます。

なにがいけないのか、実行中にArbor Editorをひらいて見てみましょう。

黄色が実行中のステートです。一度ジャンプしたが最後、ずっとJumpステートが黄色になっています。
一度Jumpステートに遷移してしまうと、Input Moveステートに戻れない作りになっているためです。

戻る条件はいろいろ考えられますが、今回は「0.5秒後」にしましょう。

Scriptを書いてもいいですが、そろそろしんどくなってきたと思うので、Arborが用意してくれたものを使います。

Jumpステートに「Time Transition」を追加し、Secondsを0.5に設定し、Next Stateのリンク先をInput Moveにつなぎます。

無事、Input Moveステートに戻ることができました。

まあ正直、まだまだ挙動にバグがあるのですが(着地時に上手く移動アニメーションが再生されないなど)、主にAnimator側の修正作業になるため今回は割愛します。

Arborの基本的な使い方としましては、十分に説明ができたものとします(強引)。

まとめ

いかがでしたか?

「ボタンで遷移」も「Animatorにフラグを送る」も、Arbor側で最初から用意されているScriptです。

その「最初から用意されているScriptの紹介」をしてもいいのですが、それよりも「自作で用意したScriptを自在に切り替える」方法を学んだほうがより実践的かと思い、このような紹介をさせていただきました。

Arbor3の機能は、これだけではありません。

  • 変数を一覧表示してグラフ間でやり取りできる「Parameter Container」
  • 複雑な条件分岐を実現する「Behaviour Tree」

などなど。

慣れてくると、以下のように「複数の条件が設定されたクエスト」の達成判定や……

「立ち止まる」「歩く」を一定間隔で繰り返すNPCなど、いろいろな挙動がかんたんに実装できるようになります。

この他にも、

  • ターンベース戦闘の進行管理
  • ボードゲームの対戦AI
  • UIの表示・非表示制御

など、思いつき次第であらゆる場面で応用が利きます。

Arborは全ての機能を使う必要がなく、使いどころも自分で選べます。
シンプルな実装なら本当に簡単なので、少しずつ挑戦してみてください。

Arborは奥が深く、欲張りな上級者の要望にもとことん応えてくれるポテンシャルを秘めています。

大手のソーシャルゲームでも採用実績があることが、それを裏付けています。

▲ グリー株式会社の子会社である株式会社WFS から配信されている「ららマジ」にて採用されました

初心者から上級者まで、 幅広い人におすすめです。
Unityをつかって4年近く経ちますが、ぼくの中では絶対に手放せないアセットのひとつになっています。

今回はあくまで初心者向けということで駆け足な紹介となりましたが、以上です。

Arbor 3(アセットストア公式)

明日は、コガネブログでおなじみの baba_s さんです。

「 Unity】50種類以上のデバイスでゲーム画面がどう表示されるかエディタ上で確認できて、ノッチやセーフエリアの対応もできる「Universal Device Preview」紹介 」
とのことで、今から記事が待ち遠しいです!

記事をシェアする