さけのさかなのブログ

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

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円

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

謝辞

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

【Unity】2019.2のAssertは例外を投げる

 Unity2019.2を試したところ、どうも処理が途中で止まっているっぽい?ということで見てみたところ、Assertで警告が出るとそれ以降の処理が為されていない模様。

 この警告、例外をスローしている。

変更

2019.1

f:id:enuenupi:20190731065350p:plain

2019.2

f:id:enuenupi:20190731065359p:plain

 という感じ。前からもAssert.raiseExceptiontrueにすることで例外を投げるように設定できたんですが、2019.2ではこれがデフォルトでtrueになり、いずれ固定値になるとのことです。

代替

 Debug.Assertを使いましょう。Assertions.Assertと同じく[Conditional("UNITY_ASSERTIONS")]が設定されているので、ビルドすれば引数の評価処理ごと消えます。

 ただしbool値しか渡せない。Assertにあった評価メソッド群を手放すというのは逆行してる感があるんだけど…。

docs.unity3d.com

四倍剣^2 サントラリリース

f:id:enuenupi:20190726164957p:plain

 というわけでDL Siteで公開です。SteamのDLCで出せればいいような気がするけどあの辺がガイドライン的にどうなのかわかんないので保留だ。 ついでに言うと物理メディアで出す予定は今のところないので、欲しい人は気にせずポチってほしい。

www.dlsite.com

デモ

www.youtube.com

ちなみに

 末尾の3トラックは幻想等倍剣の曲が収録されている。……幻想等倍剣というのは、四倍剣2を出す前に作ったプロトタイプ的なやつです。説明が要る。

【Unity】フェードつき文字送り

packge

github.com

コード

  • 本文用のTextコンポーネントを作成する。
    • 本文用のオブジェクトにFadeInQuadByQuadをアタッチする
  • ルビ用のTextコンポーネントを作成する
    • ルビ用のオブジェクトにRubyTextをアタッチする。
      • RubyTextは↑の本文用オブジェクトを参照しておく。
    • ルビ用のオブジェクトにTypingEffectをアタッチする
  • 二つのオブジェクトのrectは一致させておく。(ルビと本文は親子関係ににしとくのが自然でしょう)
  • コード実行
[SerializeField]
RubyText ruby;

[SerializeField]
Text body;

[SerializeField]
TypingEffect rubyTypingEffect;

[SerializeField]
QuadByQuad bodyTypingEffect;

IEnumerator Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";

    var stringWithRuby = StringWithRuby.Parse(message)
        .FoldTag()
        .WrapWithHyphenation(body, new HyphenationJpns.Ruler())
        .UnfoldTag();
    var typingEffect = new RubyTextTypingEffect(stringWithRuby, ruby, body, rubyTypingEffect, bodyTypingEffect);

    var startedTime = Time.time;
    while (true)
    {
        var elapsedTime = Time.time - startedTime;
        typingEffect.Update(elapsedTime);

        if (elapsedTime > typingEffect.duration)
        {
            break;
        }
        yield return null;
    }
}

【Unity】UI.Textで禁則処理つき改行

Package

github.com

コード

[SerializeField]
RubyText ruby;

[SerializeField]
Text body;

IEnumerator Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";

    var stringWithRuby = StringWithRuby.Parse(message)
        .FoldTag()
        .WrapWithHyphenation(body, new HyphenationJpns.Ruler());

    while (true)
    {
        for (int i = 0; i < stringWithRuby.body.Length; ++i)
        {
            if (stringWithRuby.body[i] == '\n')
            {
                continue;
            }
            var sub = stringWithRuby.Substring(0, i).UnfoldTag();
            ruby.Set(sub);
            body.text = sub.body;

            yield return new WaitForSeconds(0.05f);
        }
        yield return new WaitForSeconds(1f);
    }
}

【Unity】TextMeshProでルビ表示

やること

 TextMeshProのラベルにルビを表示する。

コード

Unity2019.1.10

github.com

使い方

インポート

  • TextMeshPro(2.0.1)をインポートする。
    • PackageManagerを使ってインポート
    • メニューのWindow->TextMeshPro->Import TMP Essential Resources
    • メニューのAssets->Create->TextMeshPro->FontAssetで日本語フォントを作成しておく(まあ動かすだけなら英字フォントでもいいんですが)
  • Unity_TSKT_UIUnity_TSKT_Containerをインポートする
    • manifest.jsonに↓を追記すれば良い
{
  "dependencies": {
    "com.github.enue.tskt_ui": "https://github.com/enue/Unity_TSKT_UI.git",
    "com.github.enue.tskt_container": "https://github.com/enue/Unity_TSKT_Container.git",
  }
}

実行

  • 本文用のTextMeshProもしくはTextMeshProUGUIコンポーネントを作成する。
  • ルビ用のTextMeshProもしくはTextMeshProUGUIコンポーネントを作成し、TMP_RubyTextをアタッチする。TMP_RubyTextは↑の本文用オブジェクトを参照しておく。
  • 二つのオブジェクトのrectは一致させておく。(ルビと本文は親子関係ににしとくのが自然でしょう)
  • コード実行
[SerializeField]
TMP_RubyText ruby;

[SerializeField]
TMPro.TMP_Text body;

void Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";
    var stringWithRuby = StringWithRuby.Parse(message);
    ruby.Set(stringWithRuby);
    body.text = stringWithRuby.body;
}

文字送りのやり方

IEnumerator Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";
    var stringWithRuby = StringWithRuby.Parse(message).FoldTag();

    for (int i = 0; i < stringWithRuby.body.Length; ++i)
    {
        var sub = stringWithRuby.Substring(0, i).UnfoldTag();
        ruby.Set(sub);
        body.text = sub.body;

        yield return new WaitForSeconds(0.05f);
    }
}

開発中です

  • 既知のバグとして、FontSizeをAutoにしているとルビの位置がおかしくなります。
  • TextMeshProの機能を追いきれてないので多分ほかにもなんかある

【Unity】テキストにルビを表示する・2

 前回記事にしたルビ表示処理にバグがあって、なんやかんや直してたら機能が増えた。リッチテキスト対応!

コード

Unity2019.1.9

github.com

使い方

 リポジトリはUnity packageとして使えるのでmanifest.jsonに追記することでインポートできる。README.MD参照。

インポートしたら

  • 本文用のTextコンポーネントを作成する。
  • ルビ用のTextコンポーネントを作成し、RubyTextをアタッチする。RubyTextは↑の本文用オブジェクトを参照しておく。
  • 二つのオブジェクトのrectは一致させておく。(ルビと本文は親子関係ににしとくのが自然でしょう)
  • コード実行
[SerializeField]
RubyText text;

[SerializeField]
Text body;

void Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";
    var stringWithRuby = StringWithRuby.Parse(message);
    text.Set(stringWithRuby);
    body.text = stringWithRuby.body;
}

文字送りのやりかた

IEnumerator Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";
    var stringWithRuby = StringWithRuby.Parse(message).FoldTag();

    for (int i = 0; i < ruby.body.Length; ++i)
    {
        var sub = stringWithRuby.Substring(0, i).UnfoldTag();
        text.Set(sub);
        body.text = sub.body;

        yield return new WaitForSeconds(0.05f);
    }
}

 FoldしてSubstringしてUnfold。

FoldTag, UnfoldTagって何?

 リッチテキストタグを扱うための機能です。
 タグが埋め込まれた文字列はそのままだとSubstring等の操作が非常にめんどくさい。そこでFoldTagを行うことでタグをいったん文字列の外に退避させることができます。
 この状態で諸々の文字列操作を行ったあと、UnfoldTagで再びタグを文字列に埋め込み、UI.Textに渡すという具合。

 単にテキストからタグを除きたいという場合にもFoldTagを使うことができます。