原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】TextMeshProUGUIでUIをマスクする

Instagram

インスタで小さい子供やペットの可愛い写真や動画を載せていたアカウントが急に商品の宣伝をしだすとなんだか悲しくなるナイーブな皆さんこんにちは。子供やペットが無邪気な分、将来の姿を勝手に心配してしまいます。

 

UIのマスク

UnityではImageなどのUIに関してはMask機能が用意されていて、切り抜きたい形の画像にAddComponentでMaskコンポーネントをアタッチして、その子オブジェに切り抜かれる側の画像を配置すれば良いだけとなっています。

docs.unity3d.com

 

なので非常に手軽に実装できるのですが、Imageの内側をくり抜くような逆マスクには対応していないので、そういった場合には有志の方が公開してるアセットを使う必要がありました。

github.com

 

そういった状況でしたが、Unity公式コミュニティの投稿によりMaskコンポーネントもオブジェクトの親子関係も必要とせずにマスク処理、及び逆マスク処理を行う手法が明らかになったようです。

www.zkn0hr.com

 

マスク処理(逆マスク含む)と言えばシェーダーのステンシル処理を使う為、これまではシェーダーに手を加える必要がありましたが、上記の手法ではInspetor上からステンシル用の設定を行う事ができる為、新たにシェーダーを起こす必要はありません
今回はその手法を利用して、いままでは行う事ができなかったTextMeshProUGUIの文字列でのUIのマスクを試みてみようと思います。

 

TextMeshProUGUI側の設定

今回はTextMeshProUGUIの文字列でマスクするため、TextMeshProUGUIがステンシルバッファにRef値を書き込む必要があります
最初にTextMeshProUGUI用のMaterialを用意する為、TextMeshProUGUIのInspetorにあるSDFのアイコンを右クリック→「Create Material Preset」でMaterialを作成します。


その際、分かりやすいような名前を設定しておくと後で使いまわし易くなります。

 

作成したMaterialのシェーダーにはステンシル処理用の設定を行う為、「UI→Default」を指定します。(後でTextMeshProUGUI用のシェーダーに変えます)


「UI→Default」では以下のように設定します。

重要なのはStencil ID(Ref値)とStencil Comparison(比較方法)とStencil Operation(操作方法)なんですが、どれも数値で指定する必要があるため、一度マニュアルで確認してください。

docs.unity3d.com

ステンシルの設定を行ったら、シェーダーをTextMeshProUGUI用のシェーダーに変更します。シェーダーに「TextMeshPro -> Mobile -> Distance Field – Masking」を指定、先程のステンシルの設定が内部に保存されたままTextMeshProUGUI用のシェーダーに切り替わります。(Inspector上からは見えなくなります)

 

Image側の設定

マスクされる側のImageは何でも良いのですが、マスク効果が分かりやすいように今回は白い四角を使いました。

 

マスクされる(文字列で切り抜かれる)Imageの方もステンシル処理用の設定を行うのでシェーダーに「UI→Default」を指定し、以下の設定を行います。

 

ここでStencil IDには先程TextMeshProUGUI側で指定した値と同じ値を設定、Stencil Comparisonに「Equal」(レファレンス値がバッファの値と等しい場合のみレンダリング)を指定すると

Image(白い四角)が文字列の形で切り抜かれました。

今度はStencil Comparisonに「NotEqual」(レファレンス値がバッファの値と等しくない場合にレンダリング)を指定します。

以下のように逆マスクとして機能します。

 

注意点

先程も記述しましたが、TextMeshProUGUI側では一度設定するとStencil ID(Ref値)が見えなくなるので、設定時にはメモ等の記録を取っておくことをお勧めします。
また、当然ながらマスク側(TextMeshProUGUI)はマスクされる側(Image)より先に描画する必要があるので、ヒエラルキー上の順番は「マスクされる側」が「マスク側」の下の順になるように配置してください。(オブジェクトを親子関係とする事は不要です)

【Unity】Shapesのステンシル設定を利用したマスク表現

自動車税

GWに浮かれて洋服を購入したりプリンタを新調したりアレコレと浪費していたら「自動車税を今月中に払え」と通知が来て赤貧になりかけた皆さんこんにちは。GWと母の日と自動車税の時期が重なるのは国の罠だと思う。

 

ステンシル

Unityではシェーダーの機能として1pixel毎にそのpixelの描画有無の判断として利用できるバッファ領域(ステンシルバッファ)が用意されています。
ステンシルバッファではpixel単位に8bitの整数値を設定する事が可能で、後続のドローコールでその整数値を参照してピクセルを廃棄するか描画するかを決定します。

docs.unity3d.com

これは3Dオブジェクトにマスク表現(切り抜き描画)を行いたい時に良く利用される機能ですが、アセットストアで販売されているような一般的な(トゥーンシェーダーのような)シェーダーには、このステンシルに対する操作のパラメータを用意している物は殆どなく、マスク表現をしたい場合にはマスク専用のシェーダーアセットを購入するか、シェーダーを自分で改良or作成するかの二択になっていました。

一応、技法として確立している為、Web上を検索すると有志の方がステンシルバッファを利用したマスクシェーダーを公開していたりするので、こちらを利用する事も可能です。私も以前お世話になり、このブログで紹介させてもらいました。

www.karvan1230.com

 

Shapesというアセット

Shapes」というアセットはゲーム空間に円、線、矩形といったプリミティブな図形のオブジェクトを作ることができるアセットで、図形描画に必要なパラメターをInspetor上やスクリプトで自由に変更可能な為、非常に使い勝手が良く、その辺りの基本的な機能については以前記事にしました。

www.karvan1230.com

で、このShapesではステンシルバッファに対して書き込み・参照もどちらも可能なパラメターが用意されている為、これを利用すればマスクとして手軽に利用する事が出来そうです。

赤い四角部分がステンシルバッファに対する設定箇所

 

例えば下図のように黒円の前に白三角がある場合、カメラからは白三角しか見えません


そこで黒円側のInspectorにてRef値に値を設定&Passの値に「Repalce」を選択してステンシルバッファにその値を書き込みます

 

白三角側ではRef値に黒円側と同じ値を設定し、Compareに「Equal」を選択すると

 

黒円側がステンシルバッファにRef値を書き込んだ領域のみが描画されるので、円形に切り抜かれます(マスキング)

 

逆にCompareで「NotEqual」を選択するマスク側と重なっていない領域が描画され(逆マスク)、背後にある黒円が見えるようになります。

 

白三角をマスクの形(円形)で切り抜きたい場合には、マスクする側(黒円)のColorのAlpha値を「1」と極めて小さい値にします。0だとステンシルバッファにRef値が設定されません

黒円のColorのAlpha値を「1」とした場合

 

ここで一番最初にお見せしたカメラと白三角、黒円の位置を確認するとマスクとなる黒円が白三角よりカメラから見て奥に配置されることに気づくと思います。

これはShapesでマスキングをする場合、ステンシルバッファに値を書き込む側(マスクする側)のオブジェクトは参照する側(マスクされる側)より奥に設置する必要があるためです

というのもShapesではRenderQueueがデフォルトで3000(Transparent)となっている為、

  • UnityではRenderQueueが2500以上の場合はカメラから遠い順に描画される
  • マスクされる側(ステンシルバッファを参照する側)よりマスクする側(ステンシルバッファを更新する側)の方が先に描画される必要がある
  • よってマスクする側をマスクされる側より奥側に設置する

となるからです。(以下のリンク参照)

www.vr-fluffyscafe.com

 

この性質を利用

先述のようにShapesのRenderQueueがデフォルトで3000(Transparent)となっている為、通常(不透明)の3Dオブジェクトの描画後にステンシルバッファの更新→参照が行われる事になります。
これを逆に考えると3DオブジェクトがShapesのマスクの手前にある領域ではステンシルバッファの更新はされない、という事なので、例えば下図のようにマスク側(白四角)のオブジェクトとマスクされる側(黒四角)の間に少女の3Dモデル(不透明)がある場合では

(カメラから見て)少女モデルが白い四角を遮っている為、その部分はステンシルバッファに値が書き込まれず、マスクされる黒い四角部分に本来なら見えないはずの少女モデルが見えるようになります。

 

これを先ほどと同じようにマスクされる側の設定を「NotEqual」(逆マスク)に変えてみます。

先程とは逆に少女モデルの部分に逆マスク部分(黒い四角)が反映されて影絵のような表現になりました。

少女を歩かせてみるとこんな感じ

マスク部分でShapseの黒四角が少女モデルの形に切り抜かれて表示されていますね。ちょっと演出に使えそうです。

 

【Unity】Splineを利用してLitMotionでパス移動を実現する

ゲーム漬け

休暇前はゲーム開発のみならずアレコレと意識高めの計画を立てるも結局は部屋に引き籠ってゲーム三昧だった怠惰な皆さんこんにちは。
このGW中には東京ゲームダンジョン5が開催されていたので東京近辺にお住まいの方はそちらへ出向かれた方もいらっしゃるでしょうが、福岡住まいの私は飛行機+ホテル代の高さと別の予定の為に参加を断念し、10連休のほぼ6割をRise of roninに費やし、そのうちの7割ぐらいの時間を道場での鍛錬(ボスキャラと1対1での対戦モード)で過ごすという全く"無駄"以外に表現のしようがない休暇を過ごしました。おかげさまで石火(パリィ)は非常にうまくなりました。そしてそれを誰にも誇れない事が残念です。

 

パス移動

ゲーム制作をしているとオブジェクトの移動は通常の直線移動以外に経路に沿った移動(パス移動)も必要となる事も多く、そういった場合はこれまで主にDOTweenのDOPath/DOLocalPathを使っていました。
逆に現状Tween系最速のアセットLitMotionではDOPath/DOLocalPathに該当するメソッドは用意されておらず、対策としてUnitaskとforループを駆使して経由点毎に移動を繰り返すような処理を組んでみたのですが、その手法だと経由点が多くなると指定した時間では経路全体を移動し終えない事もあったりで、DOTweenからLitMotionへ完全に移行する事はできませんでした。

なのでちょっと視点を変えて、DOPathのように通過したい地点の配列を使用するのではなく、それら(経由点)を通るようなSplineを利用する手法を取ることにしました。

4点を通るSpline

 

Spline自体はUnity2022以降であればPackage Managerからインストールする事ができ、Unityエディタ上で簡単にSplineを作成してくれるTool機能がついているので手軽に作成する事ができます。
導入法や簡単な使用法についてはこのブログでも以前記事にしているので、そちらを参考にしてください。

www.karvan1230.com

そしてこのSplineは便利なことに0~1の割合を指定すればEvaluteメソッドによりSpline上の指定した点での位置、向き、法線ベクトルといった情報を取得する事ができます。

 

割合をTweenする

という事は、その機能を利用して以下の手順で処理すれば経路に沿ってオブジェクトを動かすことが出来そうです。

  1. LitMotionで割合の値(0~1)をTweenさせる
  2. その値をEvaluteメソッドに指定してSpline上の地点(ワールド座標)を取得
  3. Bindで取得した地点をTransformに反映する

コードに表すとこんな感じ

LMotion.Create(0.0f, 1.0f, 移動時間)
    .WithEase(Ease.Linear)
    .Bind(
        value =>
        {
            // splineの位置、向き、法線ベクトルを取得
            spline.Evaluate(value, out var splinePos, out var splineTangent, out var upVector);

            // Transformに反映
            transform.SetPositionAndRotation(splinePos, Quaternion.LookRotation(splineTangent, upVector));
        }
    );

上の処理を組み込んだコンポーネントを動かしたいオブジェクトにアタッチして動作させてみると

狙った通りに動かすことが出来ました。

 

まとめ

今回の手法ではDOTweenのDOPathと比べてSplineを作るという手間は増えますが、逆にSplineで描いた自由曲線に沿った移動が可能なため使い勝手は良いのではないでしょうか。例えば

 

上のような曲線もSplineを作成して先程の処理を利用すれば

曲線に沿って綺麗に移動させることが出来ます。

【作業報告】アルファマスク使って少女の幽霊を作る

満員電車

毎年4月の初めになると朝の通勤電車が学生や新社会人で溢れて満員になるも、GWを過ぎたあたりから徐々に減り始め夏前にはすっかり元の乗車率に戻る事を知っている大人な皆さんこんにちは。ここ最近の新人の方は入社前の理想と入社後の現実とのギャップに挫けるというよりは、見習い・下働きといった下積み作業に耐性がなくて挫折する方が多いような気がしますが、実際どうなんでしょうか?

 

少女の幽霊

次作(Under A Groove)の新しいデモ版を作成するにあたりどうしても(ホラーではない)少女の幽霊のモデルが欲しかったのですが、アセットストアを漁ってもBOOTHを探してもコレといったものが見つからなかったので、既存の3Dモデルに手を加えて作ることにしました。

 

オリジナルのモデルはSURIYUNの「Farmer Girl SD」を使い、シェーダにはlilToonを使います。

 

booth.pm

lilToonではアルファマスクが使えるので、上のモデルのテクスチャ画像を基に少女の足元が徐々に消えて見えるようグラデーションを掛けたアルファマスク画像を用意します。



lilToon側の設定は「描画モード」を「半透明」に設定し

 

「アルファマスク」に「乗算」を指定してアルファマスク画像として上の画像を指定します。

 

するとこんな感じになりました。

まぁ狙い通りに足元は消えてくれたのですが、幽霊だから足元が見えないというよりは欠損したように見えるのでちょっと幽霊感が薄い感じがします。

 

発光させる

足元が徐々に消えるというだけではなく、逆に足元の部分が発光して見えるように設定を加えます。
なので今度はアルファマスク画像を反転して発光テクスチャ画像を作りました。

これをlilToonの「発光設定」にチェックを付けて上の画像を発光テクスチャとして指定します。

 

発光設定を加えたことで足元が白っぽく薄れて見えるので先程よりは幽霊っぽくなったと思います。

 

仕上げ

最後に足元の部分に光球がドロップするようなパーティクルを付けます。否が応でも常人ではない感がでるので、ただ足元を薄くするよりは「この少女は幽霊です」がプレイヤーに伝わりやすいかなと思います。

 

歩かせるとこんな感じに見えます

 

【Unity】Observerパターンの構築に役立つMessagePipe

悲哀

例の「年収4万で廃業」の話題を知りインディゲーム開発者としての悲哀を感じるより先にSNSでちょっとした話題になったことを羨ましく感じた狭量な皆さんこんにちは。例の方はゲームリリース時も一部SNSで話題になり、有名なゲーム実況者にも取り上げられていたので「実力不足」云々を嘆く前にSNSでバズる力があることを誇った方が良いと思います。それから開発者でもないただのゲームレビュアーがこの件に関して動画のネタにしているは非常に不快です。

 

Observerパターン

Observerパターンとはデザインパターンの一種で、プログラム内で発生したイベント(事象)を他のオブジェクトへ通知する形で処理が行われます。

Observerパターン

 

近年では通知者(Subject)と受信者(Observer)の1対1もしくは1対多といった直接的な関係を利用するのではなく、両者の間に仲介者(Broker)を置くことで通知者(Subject)と受信者(Observer)がより疎結合の状態となるよう工夫されたPub/Subパターンと呼ばれる手法が多く利用されているようです。

Pub/Subパターン

この場合、各々のモジュールは以下の通りとなります。

  • Publisher」は、発生した事象をBrokerに通知する
  • Broker」は、Publisherから受けた通知をSubscriberへ通知
  • Subscriber」は、Brokerから通知を受信して、それに応じた処理を行う

これによりPublisher、Subscriber双方の仕様相違や更改による影響などは全てBrokerの中で吸収することができるため、より柔軟なメッセージ伝達が可能となります。

 

MessagePipe

このようなパターンの処理をシンプルな記述で実装するには今回紹介する「MessagePipe」を利用する事が最適です。
MessagePipeはUnityで使えるハイパフォーマンスのPub/Subパターンの実装を提供するライブラリで、GitHubにて公開されています。

github.com

ただ、MessagePipeの導入はPackageManagerよりUPM経由で導入すると手早く導入することが出来ます。UnityのメニューからProjectSettingsを開いて、次のようにOpenUPMに対するURLを追加します。



するとPackageManagerから「My Registries」からインストールが利用可能となるので「MessagePipe」を選択します。
注意する点として、MessagePipeはDIライブラリ前提で組まれている為、導入に当たってはVContainerが必要です。また、UniRxも必須なのでそれらが未導入の場合は、PackageManagerの中から「MessagePipe.VContainer」「VContainer」「UniTask」を選び、事前に導入しておいてください。

 

基本的な使い方

簡単な使用例として、キーボードの矢印キーが押下された回数をそれぞれカウントする処理を考えます。


この場合、「Publisher」はキーの入力を受け付けて、そのキーコードをBroker経由で「Subscriber」へ送信します。
Subscriber」は受信したキーコードを判定してキー押下の回数を更新し、画面へ表示します。

 

■Publisher側の処理

Publisherは入力されたキーコードをBrokerに向けて通知するので、そのインターフェースを最初に定義します。
VContainerを利用するのでコンストラクタでそのインターフェースをVContainer側から受け取り、キーコードの送信処理でこのインターフェースを利用します。

using UnityEngine;
using MessagePipe;
using VContainer.Unity;
using System;

public sealed class TestInputEventProvider : ITickable
{
    /// <summary>
    /// MessagePipeへのメッセージ送信用インタフェース
    /// </summary>
    private readonly IPublisher<KeyCode> _inputPublisher;

    public TestInputEventProvider(IPublisher<KeyCode> argPublisher)
    {
        _inputPublisher = argPublisher;
    }

    /// <summary>
    /// 毎フレーム実行
    /// </summary>
    public void Tick()
    {
        if (Input.anyKeyDown)
        {
            // 押下キーコードを取得する
            foreach (KeyCode code in Enum.GetValues(typeof(KeyCode)))
            {
                if (Input.GetKeyDown(code))
                {
                    // メッセージを送信
                    _inputPublisher.Publish(code);
                    break;
                }
            }
        }
    }
}

 

■Subscriber側の処理

SubscriberはBrokerから受信する通知のインターフェースを定義します。SubscriberはMonoBehaviourを継承しますがコンストラクタでの注入を可能にするため[Inject]アトリビュートを付与しておきます。
ISubscriberのSubscribeで受け取り先の関数を定義しています。

using UnityEngine;
using VContainer;
using MessagePipe;
using Cysharp.Threading.Tasks;

public class TestSubscribeCounter : MonoBehaviour
{
    /// <summary>
    /// MessagePipeからのメッセージ受信用インターフェース
    /// </summary>
    [Inject] private readonly ISubscriber<KeyCode> _inputSubscriber;

    // Start is called before the first frame update
    void Start()
    {
        // 入力イベントの受信を開始する
        _inputSubscriber.Subscribe(OnInputEventReceived)
                                .AddTo(this.GetCancellationTokenOnDestroy());
    }
    
    /// <summary>
    /// 入力イベント処理
    /// </summary>
    /// <param name="code"></param>
    private void OnInputEventReceived(KeyCode code)
    {
        // キーコードを判定し、カウンタを更新する
        // 長くなるので割愛
        
    }
}

 

■DIの設定

Publisher,SubscriberともにVContainerにて依存性の注入を行う為、VContainerのLifetimeScopeを定義し、VContainerにPublisher,Subscriberのクラスと「Broker」役となるMessagePipeの登録を行います。

using VContainer;
using VContainer.Unity;
using MessagePipe;
using UnityEngine;

public class TestCountLifetimeScope : LifetimeScope
{
    protected override void Configure(IContainerBuilder builder)
    {
        // MessagePipeの設定
        var options = builder.RegisterMessagePipe();
        builder.RegisterMessageBroker<KeyCode>(options);

        // InputEventProviderを起動
        builder.RegisterEntryPoint<TestInputEventProvider>(Lifetime.Singleton);

        // ヒエラルキー上でTestSubscribeCounterがアタッチされているものを登録
        builder.RegisterComponentInHierarchy<TestSubscribeCounter>();
    }
}

 

Unityのシーン内に空のオブジェクトを作り、前述したLifetimeScopeのコンポーネントをアタッチしておきます。このアタッチされたGameObjectが起点となって「Publisher」「Subscriber」の初期処理が実行されます

 

これらを動作させた結果が以下の動画となります。
キー押下のイベント通知が行われ、UIテキストが更新されているのが分かります。

 

まとめ

MessagePipeを使用するとシンプルな処理で疎結合なObserverパターンが実装できるのが分かりました。
今回は紹介してませんがメッセージのハンドリングは「非同期」にできたり、「多対多」も実現できるようです。
Observerパターンはゲーム製作では結構な頻度で使用するので、MessagePipeの導入と使い方を覚えておいても損はないと思います。

【アセット紹介】プラットフォーム型ゲームで必要な機能が一通りそろった「Platform Project」

Unity1week

気が付けばUnity1weekが終了していいたうっかりものの皆さんこんにちは。今回からは参加はしないものの、投稿されたゲームは沢山遊ぼうと思っていたのですが、福岡インディーゲームEXPOで出展したゲームをアレコレ修正していたらUnity1weekの期間が終わっていました。
上位にランクインした作品を見ると投稿作品のレベルが益々上がっているようで、ゲームとしてバランスよく完成しているものが上位を占めているように感じます。もうそのままアプリとしてストアに出せそうなレベル。ここ数年で小規模インディのレベルがドンドン上がっているので、私も負けずに精進しないといけないですね。

 

指標になりそうなゲーム

前作の「Wo Long」がゲームクリア後即アンインストールしたぐらいプレイが辛かったので、今回は発売日での購入はスルーして同日発売だった別のゲームを購入したのですが、そちらの方が更に遊ぶのが辛くて結局予定より早く購入することになりました。

コーエーテクモゲームスのTeam NINJAが製作に携わったオープンワールドのアクションRPGです。
Team NINJAと言えば「死にゲー」と呼ばれる高難易度アクションゲームを作ることで有名で、前作の「Wo Long」はパリィができないと人権が無いようなゲームでしたが、今作ではその尖った部分が随分とマイルドになっており、「パリィできれば更に楽しい」ぐらいのレベルの難易度です。
また、「仁王」などで見られた攻撃法を「上段・中段・下段」と切り替える必要があった戦闘も、「流派」という概念に残されてはいるものの、そちらも「切り替えられたら楽しい」ぐらい塩梅で、難しい操作を必要とすることなくTeam NINJA製ゲームの持ち味だった高速でスタイリッシュなアクションを楽しむことができます。

高難易度アクションRPGとして一つの到達点にあるエルデンリングが戦技・魔法を使ったスキル合戦による面白さを表現しているのに対し、こちらのゲームではシンプルな操作によるアクションの面白さを追及しており、複雑なコマンドを必要としない最小限の操作で万人が「操作して楽しい」と思えるアクションゲームに仕上がっています。
今後、同じような形のアクションRPGを評価する際の一つ指標になりそうなゲームだと言えるのではないでしょうか。

 

テンプレートアセット

Unityのアセットストアを利用する理由としては、ゲーム製作で必要となる素材の購入や開発が便利になるツールの導入、といったものが挙げられますが、アセットストアでは色んな種類のゲームの基盤として利用できるアセットも販売されています。

例えばアクションゲームを作ろうとする際には、キーボード/ゲームパッドからの入力処理や自機の移動処理、当たり判定、敵の挙動ばかりでなではなく、状況に応じたアニメーションの切り替えや、各種ギミックの動作等々、プログラミングを作り込む必要のあるものが大量に発生しますが、それらを予め用意されたテンプレートを利用して素材を差し替えるだけで済むとすれば、作業工数は削減されゲームの完成はより早いものになると思います。
また、それ(素材を差し替えるだけ)を良しとしない場合でも、ゲームに必要な処理がどのように作り込まれて実装されているのか、を知ることはゲーム開発者として勉強になるし、レベルアップに繋がる事でしょう。

先日購入したのはそう言った意味で非常に有用な3Dのプラットフォーム型ゲームのテンプレートアセットでした。

 

プラットフォーム型ゲームとは文字通り、足場(=プラットフォーム)の上でジャンプすることがゲームプレイに不可欠な要素となるゲームで、その代表作としてスーパーマリオがあげられることが多いですが、このアセットはその3Dバージョン、3Dマリオのようなゲームのテンプレートとなっています。

www.youtube.com

 

Platformer Project

このアセットではゲームのコア部分のみではなく、タイトル画面、ゲームデータのロード画面、ステージセレクト画面といいた製品版として必要な機能のテンプレートも備えている為、それらに対して特に個性的な仕様を加える必要が無ければ、素材を入れ替えるだけでそのまま利用することが出来ます。

データロード画面

ステージセレクトからメインシーンへ

タイトル画面からデータロード画面へ

 

また、用意されている素材も豊富でキャラクターのアニメーション、SE等は別のアセットを追加で購入する必要がないぐらいに用意されています。

アニメーション設定

SEファイル

自機の移動処理、カメラ操作のスクリプトはキー/マウス入力だけでなくゲームパッドも対応している為、これらの処理を作り込む必要はありません。

 

学習の為に

プラットフォーム型ゲームに限らず3Dのアクションゲームでは状況に応じたアニメーションの切り替えも必要となってきます。
歩く→走るだけでなく、水の中に入れば泳ぐアニメーション、柱につかまればよじ登るようなアニメーションの切り替えが必要です。

柱によじ登る

 

プールで泳ぐ

私がこのアセットを購入した大きな理由は、上の動画のようにこのアセットではそれらが既に実装されている為、実際に動かしながらこれらの処理についてのスクリプトを参照して学習する事ができる為です。

これ以外にも、敵に対して正面からぶつかるとダメージを受け、ジャンプして上から叩くと敵を倒せるようになっており、これらについても実装方法を学ぶことができます。

 

注意点

このアセットでは上記の処理についてタグやレイヤーを利用している為、アセットをプロジェクトに導入する際にタグやレイヤーの設定に対して上書きが必要になります。
この為、既に製作途中のゲームのプロジェクトに対してこのアセットを導入する際には注意が必要です。
できれば新規プロジェクトにこのアセットを導入した上でゲーム製作に取り掛かるようにして下さい

【告知】福岡インディーゲームエキスポ2024に出展します

香水

満員電車の中で横に並んだオバさんの香水の匂いがきつくて吐きそうになった弱者男性の皆さんこんにちは。あんなのラジカセ担いで爆音で鳴らしているのと同じだからね、あなたの好みが他者の好きとは限らないので匂いのテロは本当に迷惑だと分かって頂きたい。

 

福岡IGE2024

ここ4,5年の間にインディーゲームという存在が広く一般的に認知されてきた影響なのか、全国各地でインディーゲームの出展イベントが開かれるようになりました。
古くからあるデジゲー博の他に、東京ゲームダンジョンやゲームパビリオンjp(大阪)、ぜんため(岐阜)、BITSUMMIT(京都)、INDIE GAME MARKET(仙台)など多々あり、私の地元福岡でも一度2022年に出展イベント(福岡インディーゲームエキスポ)が開かれています。
残念ながら去年は諸般の事情により開催されなかったのですが、今年は早々に福岡インディーゲームエキスポ(福岡IGE)の第2回目の開催が決定しております。

www.fukuoka-indiegame.com

今回は3/23,24の二日間による開催で、しかも福岡を代表する商業施設であるキャナルシティ博多が会場となっています。
出展作品数が40弱と、他のイベントに比べ若干少ない事は否めないのですが、その分、出展する側はアピールするチャンスが多いという事なので、去年東京ゲームダンジョンやデジゲー博に出展した経験を活かし、会場を訪れたお客さんに作品をアピールしたいと思います。

また、上記のリンクでも記載されていますが、ゲーム展示以外にも地元タレントさんや、ゲームクリエイターによるトークショーがあったり、多数のVtuberさんによるゲーム紹介があったりと、ゲーム展示というよりゲーム祭り的な雰囲気のイベントになりそうなので、多くの方に来場してもらい楽しんで頂けたらなぁ、と思っています。

 

Under A Groove

東京ゲームダンジョンやデジゲー博ではSteamでアーリーアクセス版を配信している「W.T.」の展示会用Ver.を出展しました。

store.steampowered.com

福岡インディーゲームエキスポでも当初は「W.T.」を出展する予定だったのですが、前二回の出展で「W.T.」に対するお客さんの大体のリアクションは掴めたので、今回は宣伝を目的とするよりも次回作として試作中のゲームに対する反応を知りたいと思い、新しゲームを出展することにしました。

 

Under A Groove」というタイトルで「シチュエーションをGrooveする 」をゲームコンセプトに一風変わったリズムアクションゲームとなっています。

未だ構想と試作を繰り返している段階でゲームとしてハッキリと仕様が固まってないのですが、今の段階で遊んでもらう事でこのゲームのコンセプトを伝えるために不足しているもの、必要な要素を見つけたいし、このゲームの売りと(私が)考えている部分に思い違いがないか確かめたい、そんな考えで出展を決めました。

 

このゲームについては「Snow Town Under A Groove」というタイトルで今回とは別のバージョンでUnity1Weekに参加したのですが、思うようにコメントをもらう事が出来なかった事も福岡IGEでの出展の要因の一つとなっています。

unityroom.com

なので少し不安もありますが、遊んで頂く以上は楽しんで頂きたいのはゲーム開発者なら誰でも思う事、福岡IGEまでには少しでもブラッシュアップして、より面白いと思ってもらえるようなバージョンに仕上げていくつもりなので、当日参加される方は是非手に取って遊んでみてください!

 

私の出展ブースはNo.16、上の図の場所となっています。周りにはインディゲーム界隈では有名な方も出展されていますが、気後れせずお客さんに声を掛け、この「Under A Groove」を遊んで頂き、配布物を配っていきたいと思います。

 

ちなみに配布物はいつも通り紙製のクリアファイルでデザインは以下のようになっています。

(青枠の部分はクリアファイルの形で実際には印刷されていません)

 

3/23,24 キャナルシティ博多でお待ちしております。

よろしくお願いいたします!

 

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。