さけのさかなのブログ

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

【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

開発中タイトルの紹介

 試遊展示も近いので、ちょっと次回作のシステムの紹介です。基本システムとしては横スクロールSRPGなんですが、ここではMST(MagicScrollTactics)とどう違うのかを重点的に紹介しようと思います。こんなところ読んでる人はわりとディープだからね。

ターン制

f:id:enuenupi:20190823222719p:plain

 MSTでは敏捷値に応じてユニットごとに行動が回ってくるシステムでしたが、次回はちょっと変えてあります。ターンという概念があり、全ユニットにそれぞれ敏捷順に一回ずつ行動がまわってきて1ターンが経過、という具合。普通のターン制だ。左上に行動順が表示されます。

f:id:enuenupi:20190823225512p:plain

 行動前/行動後という概念が生まれるので、ユニットの動かし方は変わってくるかも。

 (敏捷値の高いキャラがバリバリ行動するのが楽しいじゃん、みたいなのは今回パス)

クラス:サムライ

f:id:enuenupi:20190823225836p:plain

 サムライは近接に特化したクラスです。刀を装備し、攻撃力が高く、パーティの主力アタッカーとなります。

 サムライは行動が遅く、敵の攻撃を受けてしまいがちです。が、「行動前防御」というアビリティがあり、行動が回ってくるまでは防御状態をとることができます。敵の攻撃を耐えきり、強力な一撃をお見舞いしましょう。

クラス:メカ

f:id:enuenupi:20190823225845p:plain

 今回はメカ系ユニットがいる! 武器は銃。遠距離アタッカーです。

 同じ遠距離武器の弓とは違い、銃は高所に対しても命中率が下がらない特性を持ちます。ただし、銃の射線は敵ユニットや地形を貫通できないため、ステージによっては思うように活躍できないかもしれません。

 (MSTでは銃の射線は敵味方に関わらずユニットを貫通できない仕様でした。プレイヤーが使うなら味方ぐらいは貫通してくれないと不便すぎるなあ、ということで変更してあります)

megabitconvention 02参加と、取材拒否のこと

f:id:enuenupi:20190802171050p:plain

 来たる8/25、メガビットコンベンション02でサークル参加します。

megabitconvention.com

展示予定

 MagicScrollTacticsの2……ではない! えーと、同じ横スクのSRPGなのでシステム的には延長上ではあるんだけど、シリーズではない、というやつ。SaGaからロマサガみたいな……いやあれはシリーズじゃん。するとブラックマトリクスからサモナイみたいなもんですね。

youtu.be

取材拒否します

 megabitconvention(以下メガビット) 02において、当サークルに対して行われる取材を一切拒否します。

対象

 基本的に、誰によるものであってもイベントにおける当サークルの取材および撮影はすべて禁止です。ブログやツイッターに展示内容を公開するのもダメ(個人/法人問わず)。もちろん展示なわけですからゲームの説明や雑談ぐらいはやるんですが、その内容を公開してはいけない。

 (「基本的に」というのは、もちろん私自身は撮影するし、イベント主催による会場の撮影等の例外はありますからね)

 なお、これがこうなったら取材拒否を撤回する、みたいな条件設定は一切ありません。

趣旨(一般参加者は読まなくていいです)

 メガビット02の参加資格は、かつて以下のように記述されていました。

★参加資格

インディーゲーム/同人ゲーム/フリーゲームが好きな方。
一般参加料金:500円

制服女子高生割:-2000円/(先着50名) ※1時間滞在プラン

 この「制服女子高生割」について、Twitterにおいて否定的な意見が出るということがありました。2019/06/16のことです。

 個人が意見を表明することについては自由の範疇だと思いますが、問題はこちらのツイートです(すでに削除されているので文字に起こしています)

https://twitter.com/shinimai/status/1140210333065207808

*死に舞 @shinimai
普通に謝ればいいのに人のRTでお茶を濁す@MEGABIT_CONは最悪だと思いますね。あのような差別的な入場条件を課しているイベントは取材したくないし、参加する開発者も取材したくないと思います。頭を冷やして謝罪すればいいと思う

 「制服女子高生割」は、前回の開催までは存在した規定です。抵触している法が提示されたわけでも誰かが被害を被ったという話が出たわけでもありません。ですので修正する義務はないのですが、それに対してメディアが「取材をしたくない」と言及しています。これは制裁をちらつかせての不当な圧力です。あまつさえ対象はイベントだけでなく参加する開発者にまで及んでおり、主催者としてはたまったものではないでしょう。

 制服女子高生割が削除されたあと、ツイートの削除が以下のように行われました。

 削除の意図はわかりかねますが、少なくとも発言の撤回として行ったものではないようです。

 その後、私(@_enu)に対して返信をいただいています。

 あとから「したくない仕事もします」はないでしょう。すっかり自分の願望どおりになってから発言を取り繕ったところで何になるのかと。これでそうなんですねーとホイホイ納得できるものではありません。

 (なお、私の判断する限りですが、@MEGABIT_CON氏のツイートに謝罪するべき内容のものはありません。炎上している話題の渦中で適切に対応できる人間は少ないと思いますし、即時対応が不十分だったところで「最悪」と評されるいわれはないでしょう。@MEGABIT_CON氏の発言数は多くはないので、今からでも遡れると思います。)


 確かに、メディアが全てのイベントを網羅し取材することは難しいのでしょう。どこかで選定する必要があり、そこに主観的な判断が入り込むのは仕方ないのかもしれません。しかし、取材したくないというなら、ただ単に取材しなければいいだけなのです。「取材しない」はメディア側が己の限界として背負うべきことです。ペナルティとして振りかざし、イベントの在り方を変えさせるための行為ではないはずです。

 メディアが「取材したくない」のなら、対するカウンターは「取材されたくない」で良いでしょう。簡単に見せていいカードではないと思っていたんですが、どうやら気軽に切ってもいいようです。

 今回は以上の意思表明として、取材拒否を行うものです。


 結局、制服女子高生割は修正され、なくなってしまいました。イベントの在り方は主催者や参加者によって決められるべきことであり、外部の圧力によるものではあってはなりません。もはや入場料の項目において下品なジョークを言うことはできないでしょう。「上品になったからいいじゃん」ではないのです。失われたものは何なのか考えて欲しい。

 今回の件は「小規模イベントに存在した伝統に対し、メディアが一方的に差別的であると断じ、その権力をもって消し去ろうとした、あるいは実際に消し去ってしまった」ものです。その影響は、大多数にとっては取るに足らないことなのかもしれません。しかし、多様性というものは、こういった末節の部分から奪われていくものなのでしょう。

 メガビット02の参加資格は現在以下のようになっています。(2019/06/18)

★参加資格

インディーゲーム/同人ゲーム/フリーゲームが好きな方。
一般参加料金:500円

学生割引:高校生以下/無料
※ 当日学生証を受付にお見せください。
※ 小学生以下は学生証の提示は要りません。

謝辞

 このような当サークルの行動は、ゲームを発表する場としてのイベントの主旨からは外れるものです。イベント主催ならびに他のサークル参加者、一般参加者の皆様に対しましては、ご迷惑をおかけいたしますことをお詫び申し上げますと共に、あらゆるサークルがもつ当然の権利として行うものであることをご理解いただければ幸いです。