さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】UIをキーボードから操作するサンプル

github.com

 なんかの拍子に「マウスとキーボード両対応したい」みたいになった時にウチはこんなのを組んでますというやつ。

 別にそんなん要らん…という場合でも、「右クリックを閉じるボタンに割り当てる」というのも仕組みとしては同じなので、組んでおくとわりと操作性がよくなったりします。

 大まかな仕組みとしては、たとえばEnterキーが押されたらUI表示を上から順に探し、キーがバインドされてるボタンが見つかったらInvokeするという感じ(ざっくり)。実際はさらに方向キーによるカーソル移動やらUIのリンク処理やらメンドクサイあれこれを書いてやる必要がある。

 CursorControllerUtil.csあたりの書き殴り感がひどいのでアレですが、あの辺こそが秘伝ソース的奥儀的だったりするわけだ。(そのうち綺麗に書けるようになったりしろ)

 というか、なんか似たようなことをしてくれる既存アセットはないんすか。

【Unity】アツマールにUnityWebGLをアップロードするときの画面サイズ対応

やること

 UnityWebGLビルドをRPGアツマールにアップロードした場合、そのままだと画面サイズが固定になってスマホで遊べない。のでその対応。

index.htmlの書き換え

 bodyタグを以下のようにする。0.75というのがアスペクト比4:3の数値。

  <body>
    <div id="unityContainer" style="width: 100%; height: calc(100vw * 0.75);"></div>
  </body>

参考

[css]アスペクト比を固定して可変させる方法 ~よく見る75%ってなに!?~|blog(スワブロ) | スワローインキュベート

前記事

toriden.hatenablog.com

【Unity】RPGアツマール対応

やること

UnityでつくったゲームをRPGアツマールに対応させる。

使ったUnityのバージョンは2019.3.0f1。

成果物

game.nicovideo.jp

0.ググれ

 すでにネット上に記事があるので、「Unity アツマール」とかでググりましょう。

1.最小構成 まずは動かす

game.nicovideo.jp

WebGLでビルドし、zipにまとめてアップロードすれば動いてくれる。 アツマールではzip内にあるindex.htmlが表示される。

ちなみにアツマール標準サイズである816x624は微妙に4:3からずれているので注意。

2.機能対応 ニコニコのコメント

 まず結論。以下のようなコードを用意する。

Assets/Niconico.cs

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

// https://atsumaru.github.io/api-references/comment/
// https://docs.unity3d.com/ja/current/Manual/webgl-interactingwithbrowserscripting.html

namespace TSKT
{
#if !UNITY_EDITOR && UNITY_WEBGL
    public static class Niconico
    {
        [DllImport("__Internal")]
        public static extern void ChangeScene(string str);

        [DllImport("__Internal")]
        public static extern void ResetAndChangeScene(string str);

        [DllImport("__Internal")]
        public static extern void PushContextFactor(string str);

        [DllImport("__Internal")]
        public static extern void PushMinorContext();

        [DllImport("__Internal")]
        public static extern void SetContext(string str);
    }
#else
    public static class Niconico
    {
        public static void ChangeScene(string str)
        {
            Debug.Log("ChangeScene : " + str);
        }

        public static void ResetAndChangeScene(string str)
        {
            Debug.Log("ResetAndChangeScene : " + str);
        }

        public static void PushContextFactor(string str)
        {
            Debug.Log("PushContextFactor : " + str);
        }

        public static void PushMinorContext()
        {
            Debug.Log("PushMinorContext");
        }

        public static void SetContext(string str)
        {
            Debug.Log("SetContext : " + str);
        }
    }
#endif
}

Assets/Plugins/Niconico.jslib

mergeInto(LibraryManager.library, {

  ChangeScene: function (str) {
    window.RPGAtsumaru.comment.changeScene(Pointer_stringify(str));
  },

  ResetAndChangeScene: function (str) {
    window.RPGAtsumaru.comment.resetAndChangeScene(Pointer_stringify(str))
  },

  PushContextFactor: function (str) {
      window.RPGAtsumaru.comment.pushContextFactor(Pointer_stringify(str))
  },

  PushMinorContext: function () {
    window.RPGAtsumaru.comment.pushMinorContext()
  },

  SetContext: function (str) {
    window.RPGAtsumaru.comment.setContext(Pointer_stringify(str))
  },

});

使い方

 コメントを流したいタイミングでいい感じにChangeScenePushContextFactorPushContextFactorを呼べば良い。例えばBattleシーンに入ったらChangeScene("Battle")といった具合。

 おおざっぱに言うと、状態が一致するときに打ち込まれたコメントが画面に流れることになる。どうすればいい感じにコメントが流れるかはゲームの設計に依るので、アツマールのリファレンスを読み込んで考えよう。

 ツクールMVの実装にあわせるなら、マップの移動でChangeScene(マップid)、セリフの表示でPushContextFactor(セリフid)といった具合か。

 ちなみにPushContextFactorPushMinorContextはサーバーアクセスが発生しないっぽいのでこの二つは気軽に呼んでよさそう。

どういうコードなのか

 UnityWebGLからjsの関数を呼ぶためのあれこれ。以下を参照。

docs.unity3d.com atsumaru.github.io

課題

スマホ対応

 そもそもUnityWebGLがスマホ非対応で警告が出る。が、警告を無視すると動いてくれたりする。画面サイズがおかしなことになる。

ほかのAPI対応

 優先順位が高そうなのはスコアボードあたりか。

つづき

toriden.hatenablog.com

デジゲー博2019参加します・直前告知

 17日に秋葉原です。スペースはC-18a

f:id:enuenupi:20190919195727p:plain

開発中ゲーム展示

 8月にやったメガビット版と内容はあんまり変わらないですが、デモ用ステージが遊べます。

 立ち絵ができてきたのでキャラが表示されたりします。

折本頒布

 開発中ゲームの内容を小出しにした感じの折本です。なんと今回はペーパーではなく4Pの折本、れっきとした同人誌だ。

f:id:enuenupi:20191115214216p:plain

過去作頒布

 Steamカードの頒布です。

 MagicScrollTactics 1000円、Ethanol in Dungeon 300円。セールで買ったほうが安いな!

リンク

digigame-expo.org

【Unity】押したら凹むボタン

 凹むっつってもスケールを小さくするだけですが。

 ボタンの押下時アニメーションはデフォルトだとColorTintなんだけど、少し複雑なことをさせようとするとAnimationでやれよ、という作りになっている。が、Animationはメンドクサイ。できるだけ使いたくない。

 というわけでコードで動かすことにする。

github.com

 UniTaskやTweenパッケージに依存するのでコードをコピペすれば一発で動くというわけではないんだけど、中身としてはOnPointerUpOnPointerDownが発火してるだけなので似たようなものはすぐ作れるんじゃないでしょうか。

【Unity】パッケージ自作:翻訳とロードと乱数

翻訳対応

 機能自体はすでに作ったものがあったんだけど、パッケージとして上手く切り分けられなくてどうしたもんかなーという感じで。が、いい加減観念してとにかくパッケージ化することにした。

 翻訳処理はいまUnity公式で開発中らしいんだけど、まあ待っててもいつになるかわかんない…っていうか既にデファクトなアセットがあったりはしないのか。

github.com

ロード処理

 こっちはアセットのロード処理。Resources.LoadAsyncを生で触るのもそろそろ嫌だ。UniTask<T>が返ってくると嬉しい。

 外部ファイルのIO機能も含めたかったんだけど、切り分けがさらに難しいので保留。

github.com

ついで:どこからでも呼べるRandom

 いい加減UnityEngine.Randomのメインスレッド縛りにも辛くなってきた。というわけでサブスレッドからでも呼べるRandom

 例えばステージ生成処理なんかは裏で回したい&乱数使いたいのダブルパンチなのでこういうのが欲しくなるんよね。

github.com