MapMagic2を使ってみる

あけましておめでとうございます

新年の挨拶をちゃんと正月にできたので感無量である。

まぁ、冬期休暇開始早々に発症したインフル療養中で特にやることないからUnityいじって記事書いてるのが正直なトコロなのだが。

テレイン、何使ってます?

さて、いきなりだがテレインについて。

Unityには地表をデザインする手段がいくつかあるが、大別するとこんな感じだろう。

  1. 根性でモデリングする
  2. Unity標準Terrainオブジェクトを使う
  3. サードパーティアセットを使用する

で、個人的な感想ではあるが結論は3.以外選択肢はないと考える。

1.は論外として、2.もハイトマップをペイントして高低をつける方式なので苦行でしかない。1.よりましという程度のものだ。また、いずれの方法でも自然な地形を作るには、相当のスキルとセンスが必要だろう。

というわけで、テレインは金出して買うほうが精神的ストレスが少なくて良いだろう。

では、何を使えばいいのかというと、先人の大半がGaiaやGaia Proと答えるであろう。

assetstore.unity.com

assetstore.unity.com

ところがどっこい、今回取り上げるのはタイトルの通りGaiaシリーズではない。

Gaiaは予め用意されたハイトマップを合成して地形を生成し、表層のテクスチャや草木などのオブジェクトの配置をいい感じにしてくれるスグレモノだが、いかんせん"予め用意されたハイトマップ"で意図する地形を作るところに手間を感じており、個人的にはなんとかならんものかと悩んでいた。

そんな折、昨年末のフラッシュディールにヤツが現れた。

その名は"MapMagic2 Bundle"

assetstore.unity.com

どういうツールかというと、アセットストアページにも動画はあるが、こんなツールである。

www.youtube.com

ノード繋いでパラメータ編集したらオッケーと、とてもお手軽そうに見えるが、実際お手軽である。

作ってみた

テクスチャやオブジェクト配置関連はまだ学習できていないので、ひとまず簡単に地形を作成。

こんな感じでテキトーにノードを繋いだところ、

サクっとこんな地形ができる。

ゲーム次第だが、これだけでも平面部分に建築物でも置けば地形として十分要を足すであろう。何より、ノード追加や数値調整しながらほぼリアルタイムに地形変化を確認できるのがいい。

というわけで、今後はこれをメインツールに据えて地形デザインに励もうと思う。

セカイのテッペンにUIを描いてみる

ラズパイ止めました

費用対効果がないってことで開発テーマそのものが破棄されました。無念。

というわけで、ゲーム制作に戻ります。

しぐれういを描くわけではない

VRHMDみたいなUI描きてぇナァ」というわけで、実はGW中に着手しており、基本部分は実機動作確認できていたのだけれど、オブジェクトの至近に移動した場合、UIオブジェクトが対象のオブジェクトに埋まってしまう状態で放置していたので、これを解決しようと思う。

尚、わりと本番に近い作成内容なので、画像、ソースは一切なし。
まぁ、大した制作内容ではないんだが、一応ね。

ちなみに今回はシェーダーを理解してる人風に記述しているので、「シェーダー?何それ?」という人は、まずシェーダーについて勉強していただきたい。

docs.unity3d.com

まぁ、筆者も対して理解しとらんケドな。

対策前はどうだったのか?

HMDということで背景透過でフォント他諸々を描画するから、アンチエイリアスは必要だろうということで、アルファブレンディングできるシェーダー記述を調べてみた。

www.wwwmaplesyrup-cs6.work

尚、参考にしたのはこれとは違うかもしれないが、要点は

Tags { "RenderType"="Transparent" "Queue"="Transparent" }

と、

Blend SrcAlpha OneMinusSrcAlpha

である。

アルファブレンディングに直接関連するのは後者だが、例えば戦闘機のキャノピーを描いたとして、キャノピーと、キャノピーを透過した先のオブジェクトをアルファブレンドして描く必要があるが、キャノピーが先に書かれるとZテストで透過した先のオブジェクトの描画が弾かれるため、キャノピーが視線上の最前面にある場合はキャノピーしか書かれず、キャノピーの向こう側に異世界へのポータルが出現することとなる。

これを回避するための前者記述である。

docs.unity3d.com

ついでにBlendはこちら。

docs.unity3d.com

しかしこれだけでは、複数UIが重なった場合、やはりZテストの問題が解決できない。

ならば「Zバッファに書き込まなきゃZテストしないからいいじゃね?」ということで、

ZWrite Off

を記述。

docs.unity3d.com

これで万事解決ヤッター!と思いきや、透過しない近接オブジェクトにUIが埋もれた...というのが、事の顛末である。

で、どうしたのか

素直に他力本願。

qiita.com

「Zテストさせない」←まちがい
「Zテストに必ず成功する」←せいかい

ZWrite Off

を削除して

ZTest Always

で無事解決。というか、マニュアルよく読めと。

Raspberry Pi Zero WをUSB OTGでsshしてみる

あけましておめでとうございました

これも今年で4回目と思うといい加減反省せぇよと思うが、まぁ無理をしても仕方がない。ふんわりいこうよ。

まさかのRaspberry Pi

別にゲーム制作をあきらめたわけではないというか水面下でFusion360やらBlenderの練習をしてたりキャンプ道具を3Dプリントしてたりするので進捗ゼロではないのだがそれはひとまずおいておき、本業でRaspberry Piを扱う可能性が出てきたので、今回は学習がてら記事にしたいと思った次第。まぁ、いつもの備忘録。

とはいえ、オープンソースやプロトタイピング関連のネタはすぐ陳腐化するので、あまり信用しないでね、未来の俺。

Wi-Fiつきなのに初期状態でWi-Fi接続できないジレンマ

今回使用したのは、Raspberry Pi Zero W(正確にはWH)。

HDMI端子を備えているが、このサイズのコンピュータボードにモニタを繋げるのは無粋というもの(偏見)。従って、ターミナルで接続となるわけで、インストールOSはGUI抜きのRaspberry Pi OS Liteを選択。

というかRaspbianがいつの間にか改名してるの知らなんだ。

さて、Raspberry Piのネットワーク接続は一般的にWi-Fiでの接続になるかと思うが、我が家のWi-FiMACアドレスフィルタリングを行っているので、接続のためにはMACアドレスを知る必要がありMACアドレスを知るためにはifconfigする必要がありifconfigするには接続する必要がある。完全なデッドロック状態だ。

「一時的にMACアドレスフィルタリング切ればいいじゃん!」

確かにその通りだが、そもそもこれは本業の予行演習である。社内ネットならばおいそれと設定変更できるものではないし、それ以前にRaspberry Piを社内ネットに繋ぐこと自体が難しい。尚更、Wi-Fi以外の接続手段が必要となる。

USBがあるじゃない

GPIOもあるのだが、ここはひとまずおいておこう。USBケーブルならそこらに転がっているが、GPIOは配線加工が面倒だからな。

というわけで、USBでOTGする具体的な方法がこちら(いつもの他力本願)。

karakuri-musha.com

そしてsshで接続すると、"Permission denied, please try again."の文字。は?

"SSH"はいらない

あ、空ファイルのほうね。

インストール時の設定でssh使用の有無を変更できるようになった模様。
ホント、この手の情報は陳腐化が著しい。

qiita.com

というわけで、無事にifconfigでMACアドレス取得完了。

あとは、フィルタリングリストに加えてRaspberry Pi側のWi-Fi設定をすれば、Wi-Fiで通信可能である。めでたしめでたし。

ちなみに

ここに至るまで、実はひと悶着あった。USB接続してもデバイスが認識されなかったのだ。

原因はとても単純。使っていたUSBケーブルが充電専用品だったこと。整理大事。

VRに手を染めてみる

 

 あけましておめでとうございます

年刊化しているのは多忙であるからで、決してゲーム制作を諦めたわけではない。
その証拠にアセットは年々積みあがっている。期待せずに待って欲しい。

あ、今年はソロキャンやろうと思います。

Oculus Quest2買いました

去年の晩秋に。

VR機器はすでにPSVRを持っていたものの、完全ワイヤレスであることで使用感がどうなのか気になったのと、何よりソフト開発ができるということが購入の動機である(リリースするとは言っていない)。

で、年末にUnity2019.4LTSで少しいじってサンプル程度のものは作成していたのだが、GWに改めていじるにあたり頭から抜け落ちていたので、今回、導入部を記事に残す事とした。

すなわち、いつもの備忘録である。

参考にしたもの

とりあえず、こちらを見てごにょごにょすれば、なんか絵は出せます。

framesynthesis.jp

尚、開発者モードにするためには開発者アカウント登録をせねばならんかったりするので、以下も参考にされたい。

note.com

早速トラブル

今回からUnity2020.3LTSとURPを使うこととした。現行のビルトインパイプラインも今世代限りという話も聞こえているので、今のうちに慣れておくこととしよう。

ちなみに、URPにするとこれまでのビルトインパイプライン向けのアセットはどないすねんと思っていたが、メニューで一発変換する機能があった。まさに杞憂。

negi-lab.blog.jp

Oculus Integarionを最新にアップデートしてインポートし、XR Plugin ManagementとOculus XR Pluginとインスコした後、Project SettingsでごにょごにょしてサンプルをBuild and Runかまして、さぁ起動!といったところでUnityロゴを見る間もなく即落ち。なんでー?

adb logcatでログを観察するも、ネットワークがナントカとかイマイチ的を得ないエラー。

途方に暮れていると、PCのOculusアプリがファームアップデートをお知らせしているのに気づく。

とりあえずアップデートし、改めてトライしたところあっさりサンプル起動。
バージョン管理は大事。古事記にもそう書かれている。

とりあえずここまで

 ほかにもカメラを入れ替えるとかいろいろあるのだが、前述のサイトで網羅されているので、ここでは省く。

次は何しようか?とりあえず、モノを掴んで投げるぐらいのことはしたいなぁ。

UIをそれっぽく組み立ててみる

 あけましておめでとうございます

今年も残すところあと4か月半ですがいかがお過ごしでしょうか?

業務多忙でUnityを完全放置していたが、Unityも2020になりUnreal Engineを猛追しつつあるので、これではイカンということで今夏季休暇を利用してUIの設計(と実装)をした次第。

とりあえず

こちらをご覧いただこう。

vimeo.com

尚、タイトル画面だけモザイクなのかは当該画面で使用しているフォントのライセンス料を払ってないからで特に深い意味はない。タイトルも仮である。

ちなみにメニュー中のフォントにはMeguフォントを利用した。

https://mix-mplus-ipa.osdn.jp/migu/

本当は、別のフォント候補があったのだけれど、商用ライセンスの有無が不透明なため、採用を見送った。ちなみにMeguフォントはIPAライセンスである(以上、免責)。

中途半端ではあるが、これ以上はゲームデザインを本格的に進めないと表示内容が定まらないので、とりあえず雛形が出来たということで、今回その内容について紹介してみたいと思う。

尚、uGUIを理解していることを前提に話を進めるので悪しからず。
といっても、せいぜいCanvasとButtonとImageとTextがナニか知っていれば問題ない程度の話である。

今週のビックリドッキリメカ

今回使用のUnityは2019.4.8f1 (64-bit)である。

また、Assetについては、

assetstore.unity.com

手軽にゲームパッドを認識させる上では欠かせない(と勝手に感じている)"InControl"と、

assetstore.unity.com

去年、何かのセールで買ったまま存在を忘れていた"DoozyUI"である。
UI設計/実装支援Assetであるが今回初めて使用するので、これの紹介も兼ねたい。

assetstore.unity.com

尚、"DoozyUI"は"DOTween"の使用前提としているので、こちらも導入が必要である。

以上のAsset導入については説明が面倒くさいので、以下を参考にしてほしい。

himatsubushi-industry.hatenablog.com

www.slideshare.net

使用方法まで説明頂いてるので本ページの存在意義が問われるが、とりあえずは話を進めよう。

InControlでUI制御を?

できらぁ!!

というわけで、こちらである。

www.gallantgames.com

いわゆるuGUIをInControlで操作するための作法についての説明である。
ちなみにuGUI以前のUIシステムについては知らん。

uGUIではUI実装上、”EventSystem"が必ず一つ必要となる。
で、これにはもれなく"StandaloneInputModule"Componentがついてくるわけだが、今回これを無効、あるいは削除し、代わりに"In Control Input Module"Componentを追加する。
設定はデフォルトで構わないだろう。気に入らなければ適宜修正を。

但し、メニュー操作が左スティックだけでは扱いづらい人もいようということで、

    void CreateActions()
    {
        actions = new InputModuleActions();

        actions.Submit.AddDefaultBinding(InputControlType.Action1);
        actions.Submit.AddDefaultBinding(Key.Space);
        actions.Submit.AddDefaultBinding(Key.Return);

        actions.Cancel.AddDefaultBinding(InputControlType.Action2);
        actions.Cancel.AddDefaultBinding(Key.Escape);

        actions.Up.AddDefaultBinding(InputControlType.LeftStickUp);
        actions.Up.AddDefaultBinding(InputControlType.DPadUp);
        actions.Up.AddDefaultBinding(Key.UpArrow);

        actions.Down.AddDefaultBinding(InputControlType.LeftStickDown);
        actions.Down.AddDefaultBinding(InputControlType.DPadDown);
        actions.Down.AddDefaultBinding(Key.DownArrow);

        actions.Left.AddDefaultBinding(InputControlType.LeftStickLeft);
        actions.Left.AddDefaultBinding(InputControlType.DPadLeft);
        actions.Left.AddDefaultBinding(Key.LeftArrow);

        actions.Right.AddDefaultBinding(InputControlType.LeftStickRight);
        actions.Right.AddDefaultBinding(InputControlType.DPadRight);
        actions.Right.AddDefaultBinding(Key.RightArrow);
    }

パッドの十字キー入力もバインドした。アナログスティックでは連打できんしな(尚、キーリピートはデフォルトで実装)。

さておき、これでInControl経由でのUI操作は可能となる。

DoozyUIができること

ありすぎて全体像のすべてを把握していないのだが、大雑把に言うと

  • 画面遷移
  • アニメーション再生
  • SE/BGM再生
  • イベント発行

を、ノーコーディングで行うことができるAssetである。

ちなみに冒頭のUIサンプル動画は一部コーディングしている。
完全ノーコーディングでできるかもしれんが、やり方を探すよりコーディングした方が速いので、コーディングに逃げた次第。
まぁ、全部コーディングしなくて良いだけでも有用である。実際便利。

DoozyUIの構成

DoozuUIの全体像をHierarkhyで表すとこんな感じである。

□MasterCanvas

 □UIView (1)

  □UIButton (1)

  □UIButton (2)

  □UIButton (3)

 □UIView (2)

  □UIButton (1)

  □UIButton (2)

  □UIButton (3)

 □Graph Controller

MasterCanvas

まず、"MasterCanvas"は該当SceneにおけるUIの根幹となるGaemObjectである。Component拡張されているが実態はuGUIのCanvasである。

DoozyUIの管理下に置かれるUI要素は、すべて"MasterCanvas"の配下に構成されることになる。
但し、"Graph Controller"についてはその限りではないのだが、管理上"MasterCanvas"下に置いた方が関係性が分かりやすいだろうということで、上記のとおりとする。

UIView

次に"UIView"だが、これもnGUIのCanvasに相当する。

"MasterCanvas"との違いは、"Canvas Scaler"と"Canvas Group"の有無と、それぞれにぶら下がっているDoogyUIのcomponentだ。

"Canvas Scaler"は"MasterCanvas"にしかないため、UIのレイアウト基準はここで設定することになる。

"Canvas Group"については本筋ではないためここでの説明は省く。
"UIView"には必要で"MasterCanvas"には必要ないと理解してもらえると良い。

そして、Componentとしての"MasterCanvas"は特に設定できることはないが、"UIView"では、画面全体に関わるアニメーション、SE/BGM再生、イベント発行をコントロールする手段が用意されている。

例えば、画面をフェードイン、フェードアウトさせたければ、"UIView"Componentの"Show View"と"Hide View"でそれぞれプリセットのアニメーションを選択し、パラメータに反映すれば、コーディング不要で実現可能である。
選択の仕方は、前述のスライド参照されたい。

パワポでスライド作る程のお手軽さである。

また、Particle SystemやAnimatorをコントロールできるので、やろうと思えば画面遷移の度に爆発演出も可能であろう(多分)。

尚、"ULView"は予めユニークな名前を付ける必要がある。

メニューバーより"Tools"→"Doozy"→"Control Panel"を開き、"Views"を選択して"Category"と"Name"を登録した後、"ULView"Componentの"View Category"と"View Name"にそれぞれ登録した"Category"と"Name"を指定するだけである。

併せて"Rename GameObject to..."をクリックするとGameObjectとしての"Name"も変更できるので、是非やっておきたい。

ULButton

 "ULButton"はnGUIのButtonに相当する。
オリジナルとの違いは"ULButton"Componentの有無であり、"UIView"と同様にアニメーション、SE/BGM再生、イベント発行をコントロールする手段が用意されている。

"ULView"Componentとの違いは効果範囲が(基本的には)ボタンに限定されること、制御のトリガーとなる事象が異なることである。

ボタンなので「押されたらナニかする」というのは当然で、フォーカスの有無やダブルクリック、長押しに至るまでコト細やかに設定できる。また、何もしていないときのアニメーションも設定可能である。

"ULButton"も予めユニークな名前を付ける必要がある。
但しこちらは、"ULView"下でユニークであれば良いので、例えば"Return"などは一つだけ登録し、複数の"ULView"下で使いまわせば良い。

メニューバーより"Tools"→"Doozy"→"Control Panel"を開き、"Buttons"を選択。
後の手順は"ULView"と同じである。

Graph Controller

 "Graph Controller"はこれまでのDoozuUIのGameObjectとは違い、画面遷移をコントロールするためのものである。

画面遷移の設計は、専用のノードベースエディタ"Nody"を使用する。
メニューバーより"Tools"→"Doozy"→"Nody"を開けば、"Nody"がアクティブになる。

基本的な使い方は、UIを構成する画面に対応する"UINode"を置いて、ノードごとの"Input Connection"と"Output Connection"を遷移線で結んで、"Output Connection"が何によってトリガされるか指定。
あとは、"OnEnterNode"と"OnExitNode"に表示したいシーン、または消したいシーンを指定すると、ひとまず画面遷移は実現できる。

詳細は、前述のスライドを参照されたい。

Q:ボタンのフォーカスに関係なく特定のキーを押したら画面の遷移を行うにはどうしたらいいですか?

 さて、上述のスライドも含め、これまでの説明は「画面上の」ボタン押下をトリガに話を進めてきたが、例えばフォーカスの位置に関わらずキャンセルキーで一つ上の階層に戻りたいというニーズもあるかと思う。

そんな時に使いたいGameObjectが”KeyToAction"と"KeyToGameEvent"である。

”KeyToAction"は"KeyToGameEvent"共に「ナニかのキーが押されたらナニかする」を指定するものだが、両者の違いは”KeyToAction"が"UIButton"のようにアニメーション等のトリガになるのに対して、"KeyToGameEvent"は"GameEvent"発行しかできない点である。

ちなみに"GameEvent"は、DoogyUIが管理する抽象化されたUnityEventと理解すればよいと思う。
"GameEvent"にはSceneユニークなシンボル名を付けておこう。

で、これを遷移に反映させたい場合は、"Nody"にて対象の"UINode"に、先ほど指定したシンボル名の"GameEvent"をトリガとする"Output Connection"を追加し、遷移線を結べば実現可能である。

Q:パッドで入力してると画面の遷移ごとにフォーカスが迷子になるんですがそれは

キーボード+マウス入力かタッチ入力を主体に考えられているのか、パッドの扱いはイマイチと常日頃感じるが、足りないモノは自分で用意するしかない。

というわけで、用意した。

PointerFocusAdjuster.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class PointerFocusAdjuster : MonoBehaviour
{
    [System.Serializable]
    public class AdjustInfo{
        public GameObject Canvas;
        public GameObject Target;
    }

    [SerializeField]
    AdjustInfo[] Infos = null;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        GameObject target = null;

        foreach (AdjustInfo info in Infos)
        {
            if (info.Canvas.activeSelf)
            {
                // Stop focus transition when multiple canvases are displayed
                if (target != null)
                {
                    target = null;
                    break;
                }
                else
                {
                    target = info.Target;
                }
            }
        }

        EventSystem eventSystem = EventSystem.current;
        GameObject current = eventSystem.currentSelectedGameObject;
        if (current == null)
        {
            EventSystem.current.SetSelectedGameObject(target);
        }
        else if (target == null)
        {
            EventSystem.current.SetSelectedGameObject(target);
        }
        GameObject currentParent = FindParentView(current);
        GameObject targetParent = FindParentView(target);
        if ((currentParent != null) && (targetParent != null))
        {
            if (currentParent.transform.parent.gameObject.name != targetParent.transform.parent.gameObject.name)
            {
                EventSystem.current.SetSelectedGameObject(target);
            }
        }
    }

    GameObject FindParentView(GameObject item)
    {
        GameObject result;

        if (item != null)
        {
            result = item.transform.parent.gameObject;
            if (result != null)
            {
                if (!result.name.Contains("View - "))
                {
                    result = FindParentView(result);
                }
            }
        }
        else
        {
            result = null;
        }
        return result;
    }
}

"EventSystem"のComponentとして登録しておけば良いだろう。

事前に"ULView"と各"ULView"遷移時のフォーカス移動先を登録する面倒があるが、これで遷移と同時に自動的にフォーカス移動できる。

尚、画面遷移アニメーション中は遷移先と遷移元が共存しているため、フォーカスを外すよう細工している。

Q:InputSystem使わんの?

docs.unity3d.com

DoozyUIが対応しとらんのだわ。

Q:Rewired使わんの?

assetstore.unity.com

XInputさえ対応してれば大半は事足りる。InControlでも問題ないやろ?(威圧)。

 Q:ARMORED COREの新作はまだですか?

「Last Labyrinth」を買えばワンチャンあるかも。

というわけで

今回はここまでとする。

限られたコーディング量でここまでできるのは素晴らしいと思うので、DoozyUIは今後も活用していきたい。

エディタ拡張に迷走してみる

 あけましておめでとうございます

というわけで、3か月も放置していたわけである。
ゲーム制作も。Unityも。

理由はいくつかある。

7dtdのα17が出たとかエスコン7が出たとか艦これ熱が再び鎌首をもたげたとか、色々理由はあるが、ゲーム制作の為にエディタ拡張に手を出したらハマッたというのが、大きな理由である。

...ハマったからゲームに逃避したとかしないとか(した)。

楽をするために苦労する

というわけで、いつまでも逃げてても仕方ないので、覚悟を決めて取り組む事にした。

何にハマったのかというと、「UIデザインをどうコーディングすりゃいいのよ」ということ。

着手当初、Visual StudioのFormデザイナみたいなもんはないだろうが、標準で用意されるオブジェクトをコーディングで生成、配置してイベントハンドラ構築すれば目的は達成できるだろうと考えていた。

甘かった。

まず、日本語文献としては以前にも参考にしたコレである。

anchan828.github.io

で、例えばスプリットバーを置くにはどうすればいいか調べた。

うむ、わからん。

なので、ゴッゴル先生の助けを借りて、更なる情報を漁った。
それが以下のスライドである。

www.slideshare.net

どこかで見た名前だと思ったら、前出の書籍の著者である。

それはさておき、解決の糸口は見つかったのか?

見つかった。単純にして、明快。神はこう宣われた。

「ソース見ろや」

真理である。

というわけで、GitHabからソースを落とし、中を拝見することにした。

今更のGitデビュー

というわけで、人生初めてのGitである。

何故に今まで手を出さなかったかというと、まぁ、ただの怠慢である。

尚、公私ともにTortoise SVNに毒されたへたれSubversionおじさんの自分としては、Explorer拡張は手放せないため、安定のTortoise Git導入である。

qiita.com

使いこなすのはさておき、とりあえずはGitHabからリポジトリを落とした。

github.com

 次回に続く

とりあえず、今回記事にするのはこれぐらいにしておく。

この調子だと、Unity Editor拡張開発記事になってしまいそうであるが、それもまた一興。

斜め後方からカメラで追いかけてみる

一月半ぶりのUnity

仕事が忙しく休日に弄る気が失せてたのもあるが、単純にセール待ちしてただけだったりする。

本来は、ついこの間までやっていた恒例のメガセールで目当てのアセットを格安購入する目論見であったが、11/11に独身の日セールが突如開催されたため、思いの外早くに入手することができた。

結局、弄れたのはメガセール終了後だけどナ!

himatsubushi-industry.hatenablog.com

で、目当ての一つであったのはコレである。 

assetstore.unity.com

端的に言うと、「視点を勝手に動かしてくれるアセット」である。

なんとも単純明快な名前だが、過去の「いくつかアセット買えば無料で貰える」セールで取り上げられていたので、さぞかし素晴らしいモノなのだろうということで購入した。

実際素晴らしかった。

使い方

  1.  空のGemeObjectを置く("Camera Rig"とでもしておこう)。
  2. "Camer Controllrer"Compornentを追加する。
  3. "Main Camera"GameObjectを、"Camera Rig"の下に置く。
  4. ”Camer Controllrer”の"Camera Style"で、目的の視点を設定する。
  5. "Anker"に追従させたいGameObjectを指定する。

とりあえずこれで、視点は勝手についてきてくれる。

「それぐらいScriptで組めよ!」

という意見も聞こえそうだが、それぐらいではないからアセットを使うのである。

よくある追従視点だが、設定は1人称視点で"Main Camera"の位置を左後方にオフセットして迎角をマイナスにしただけである。
ちなみに"Main Camera"の座標は原点にするのを忘れないようにしておこう。

ちなみに「外から見れたら3人称ちゃうんかい」とツッコミが入りそうであるが、この際気にしないでおこう。

では、3人称設定だとどうなるかというと、

進行方向に勝手に動きます。もちろんコーディングは不要。

設定項目を弄ればさらに色々できそうだけども、とりあえずこれだけでもsteamワンコインクソゲーと比べれば遥かにマトモなカメラワークが行えるというもの(下を見て悦に入るスタイル)。

尚、障害物を置いてからがこのアセットの本領発揮なので、まだまだこんなものではないと言っておく。試してないので実力は知らんけど。

次回予告

視点も様になったので、今度は地面に起伏や障害物を置いてその上を歩かせてみたいと思う。

つまり、アニメーションを地形に追従させるわけで、例の大人気アセットの登場である。