もぐりの日記

雑日記

【正月】この冬コタツでワールドトリガーを読め【充実】

全国3000万人のTUTにかかわりのある皆様こんにちは。これはTUTAdC21日の記事です。 adventar.org

今日はTUTでは年内最後の授業日でした。時の流れは早いもので、AdCも終わりが見えてきて、ああクリスマスなんだなぁとか思っていると、賞味期限ぎりぎりのケーキが店に並び、TVCMはお正月を写そうとか言うようになりますねぇ。

今回は、そんなお正月休み(与えられるものとする) におすすめの作品を紹介します。

【トリガー】ワールドトリガーとは【オン】

誰が呼んだか「遅効性SF*1」、ジャンプ本誌で連載開始、今はSQで連載中のマンガです。 ワールドトリガー.infoのあらすじは筋が通りすぎてるので、適当なサービスで1話、できれば1巻を試し読みする方がおすすめです。

f:id:sumogri:20181215233912p:plain
W主人公の空閑遊真(左)と三雲修(右)*2

ざっくり言うと、異世界からの侵略者 近界民(ネイバー) と、この世界の守り手 ボーダー の戦いのお話です。 「まぁよくある異世界との交流&バトルかー」なんてのは、結構吞気してる感想。この作品のキモは ロジカルな集団戦 にあります。

【全力で】ワートリの集団戦【まあまあ】

ワールドトリガーの世界では、一人ひとりの戦闘力は大差がないです。たとえば戦闘力が53万あったり、既に卍解を折っておいたりというチート的な強さはありません。あるのは、現実世界で言う柔道の白帯と黒帯のような熟練度の差だけです。なので、個人戦闘力に限界のあるこの世界では、「戦略・戦術」が占める割合がとても大きいです。いかに熟練の戦士であろうとも10人に囲まれれば負けますし、弱い奴でも環境がそろえば強者を下します。

淡々と文字で書くと、まぁそうだよな、となるだけの話ですが、この描写が大変ロジカルで引き込まれます。

ワールドトリガーの集団戦が真価を発揮するのは"B級ランク戦編"(10巻~13巻)。ボーダー隊員が1~4人ずつのチームを組んで3~4つ巴のバトルロイヤル模擬戦をする話が続くシーズンです。「へぇ?でも修行パートじゃないの?」そう思っていると足元掬われることに。

Bランク戦編は作戦立案&ブリーフィングの描写から始まります。ボーダー身内戦なので、相手も自分もある程度情報を持ってる状態で戦うのは当たり前。事前にわかる有利不利をどう覆すか?の準備段階です。 戦闘員は、近接攻撃を行う攻撃手(アタッカー)、中距離が得意な銃手(ガンナー)/射手(シューター)、遠距離専門な狙撃手(スナイパー)とそれぞれ兵種がわかれていて、隊によって構成もまちまち。強みを生かせるよう悩み抜きます。

f:id:sumogri:20181216003514p:plain:w300 f:id:sumogri:20181216003704p:plain:w300
ブリーフィング風景 この時点でも各隊の特徴が出てくる*3

準備が済むといよいよ本番、模擬戦闘です。これがまたロジカル。ランク戦は正隊員の昇級試験であると同時に訓練生の経験値でもあるので、実況解説つきで観戦する視点を織り交ぜながらの描写がなされます。

f:id:sumogri:20181216005333p:plain:w300f:id:sumogri:20181216005444p:plain:w300
実況解説 ブリーフィングを第三者視点でまとめたり、戦況を俯瞰するマップが使われる *4

もちろん戦闘描写もばっちりすごい。特にアタッカーが切り込む様は気持ちがいい。読者も事前に戦術を共有しているからこその集中力・テンポの良さで引き込まれます。

f:id:sumogri:20181216011333p:plain:w400
戦闘描写 何気ない所作に意味があることも……*5

戦闘が終わるとどうなる?知らんのか?デブリーフィングが始まるんですね。ここでは事前に予測されなかった事象やそれに対する各隊員の行動の意図をまとめたり、試合のターニングポイントを振り返ったりします。普通なら冗長に感じる所ですが、事前に予測をしっかり立てている上、戦闘中の隊員のアドリブもまたロジカルなので、再構築されていく達成感がこみ上げます。

f:id:sumogri:20181216014935p:plain:w400
デブリーフィングの様子 今日より強くなるために振り返りは欠かせない *6

このランク戦の展開だけでもワールドトリガーというマンガの魅力が伝わるかと思います。

そう、 ロジカル なのです。

【玄界の進歩も】集団戦を支える技術【目覚ましい】

ところでTUTはUTなので、学生は支える技術なんてものが好きだったりします。

ワールドトリガーの世界での基幹技術は「トリオン」にまつわるものです。トリオンとは作中に出てくる不思議エネルギーで、人のもつ見えない臓器で作られるとされています。生み出せる量には個人差があります。

戦闘員はこのトリオンを燃料にする武器、「トリガー」を使って戦います。ボーダーのトリガーは、戦闘体と呼ばれるトリオンでできた仮の体、脱出機能(ベイルアウト)、レーダーや無線などを基本サポートします。これに加えて個人で選択できるトリガーチップを装備します。チップは、たとえば銃や剣といった武装、外套やシールドといった補助的な装備が該当します。

f:id:sumogri:20181216024943p:plain
狙撃手用トリガー 状況に応じて使い分ける*7

トリガーチップはメインとサブ*8で各4つ選択し、戦闘中はそれらを切り替えつつ戦います。これは、戦闘中に同時に使えるトリガーは二つまでということを意味します。また、トリガーチップはセットするだけでもトリオンを消費するので、持っていく装備を厳選することにも意味があります。

f:id:sumogri:20181216030043p:plain:w400
トリオン量とトリガーチップの容量の概念図 *9

ボーダーのトリガーの特徴は、何と言っても「組み合わせ」にあります。トリオン量にもよりますが最大8種類の兵装を持ち込めるので、単純に考えても\binom{n}{4}^{2}程度のバリエーションが個人単位で存在します。これにチーム戦術まで加わるわけです。そうなると、もう組み合わせはめっちゃすごい*10ことになります。

こういう風に「無限の可能性」みたいなことを言い始めると、たいていのヒトは「え、でもフィクションでのそれって後出しじゃんけんじゃね?」とか思いますね。新たなカード生み出してるんじゃないよ、と。ご安心ください。確かに新しい兵器は出てきますが、そこにあるのは人類の進歩の歴史です。剣の強い奴に銃で挑むのは道理ですよね? 一時の気合より、緩まず備える方が強い世界観は揺るぎません。

ほかにもいろいろなトリガーがあったり、トリオン技術があったりするのですが、紹介し尽くすのは野暮というものです。

これら設定が物語に さらなるロジック を与えていくのは、 おわかりですね?

【ぼんち揚げ】おわりに【食う?】

ということで、正月にワールドトリガーを読みましょうという話でした。クリスマスでもいいよ。 この記事に含まれているワールドトリガー成分は10%以下なので、こんな程度でクラっと来てる人はぜひ読んでみてください。遅効性SFパワー があなたを襲うこと間違いなしです。

【つまんない】蛇足【ウソつくね】

ところで金曜日といえばアニメ「やがて君になる*11」の放映日ですね? TUT生のみなさまにおかれましてはリアルタイム視聴なさっていることと思い、あえてここでお勧めすることはありませんでした。 ワールドトリガーとは全く毛色の違うお話ではありますが、これも ロジック にあふれた作品です。おすすめ。

f:id:sumogri:20181220025542j:plain:w300
やがて君になる 原作漫画もおすすめ

明日は @ot0eu さんの「記事の内容の予定などを入力してください」になります。デフォルト、普通への執着……あぁ……たまりませんね……

*1:HN/野菜炒めさん作。10巻発売記念のキャッチコピーコンテストのグランプリ大賞。1巻を対象に作られたものだけれど、作品全体に通る名キャッチコピーだと思う

*2:オフィシャルデータブック BBF P.4より

*3:ワールドトリガー 10巻 P.157 P.163より

*4:ワールドトリガー 10巻 P.172 P.179より

*5:ワールドトリガー 11巻 P.18より

*6:ワールドトリガー 11巻 P.62より

*7:ワールドトリガー 14巻 P.78より

*8:利き手と反対の手に該当する概念、左右に持ち分けるイメージ。それぞれにセットできるトリガーに制約はない。サブだからといって補助的トリガーしかセットできないわけではないということ。

*9:ワールドトリガー 19巻 P.82より

*10:めっちゃすごい

*11:TVアニメ「やがて君になる」公式サイト

Unityでの設計の話 -鉄血篇-

この間のTUT-LTでコンポーネントとは何かを、めっちゃ抽象度高く喋りました。 この記事はその補足というか、喋っただけで資料になってない話を書いていきます。静的LTです。

www.slideshare.net

(幣チームの)ゲーム開発ではこんな感じに仕様が降って沸くので、それに対応してみる、継承ベースな設計と集約ベースな設計とをそれぞれ追ってみて、ここがこう難しいよね、みたいな事を喋らせてもらいました。

話のキモは、オブジェクト指向で「オブジェクト」という枠に押し込めたいのは「流動要素」で、決して現実世界の「物」なんかじゃあないよって事でした。 今回の場合、流動要素とはゲーム世界での物体(車/バイク/アイテム)の「振る舞い」そのものでした。なので、そこを切り分けて「オブジェクト」にしました。

じゃあ、どうやって流動要素を見極めるんだ! という質問をいただいたので、それについて書いてみます。

その前に、幣サークルでのゲーム開発手順を軽く説明すると、

  1. 各個人がA4一枚に企画書いて持ち寄り
  2. やりたい企画に参加(この時点で1企画2-4人位になる)
  3. チームで企画をブラッシュアップ
  4. 適当に分担して設計&実装、時間があれば3に戻る
  5. 完成

という感じです。今回のLTで再現したのは3-4の繰り返し部分です。核になるゲームアイデアはあれど、具体的になるのは4の直前ということになります。 仕様が変わるのは2巡目以降の工程3なので、如何にこれを先読みするか?が鍵です。

一つは、初回の3をきっちりやることです。つまりは、このゲームの面白さは何か? 何が自分たちにとって譲れないか? ということを固めることです。これは他のチームメンバーと共通認識を作るためにも大切です。譲れないものが固まると、そのために調整すべき事柄が見えます。

幸い(?)、うちのサークルでは、プランナーとプログラマーがちゃんと分業しているわけではないので、変更の痛みを無視した要求が飛ぶことは稀(のはず)です。これは逆に、プランナー的な仕事の質を求められない可能性を意味してもいます。面白さが担保されず、なんだかよくわからないものが出来上がることがあります。

もう一つは、先読みを諦めることです。3-4を回すためのプロトを作って、ある程度仕様が固まるまで待つ方式です。ゲームの企画において幣サークル民はほぼ素人である一方、プログラミング/ソフトウェア開発については企画ほど素人ではないため、実際に作ってしまう方が掴みやすいです。

しかし、恐ろしいことに(??)、プロトができると、「わーいwできたw」「実質完成」などとのたまい、気が抜けがちです。また、学業優先で進めていると、思ったほど3-4のサイクルが回せるほどのテンポで開発ができない事も多々あります。

どちらを取るにせよ、流動要素を抜き出すには、要件を固めるほか無い、というのが私の回答です。 なぜなら、設計とは要件の影であり、要件を実装可能にするものだからです。では要件とは何か、これはどうすれば引き出せるのか。これは企画の進め方そのものを考えないといけません。

というのも、例えばこれが受注開発で、クライアントとのコミュニケーションで作るなら、それを如何に円滑にするか?ということにもなりうるし、幣サークルの事案であれば、如何に自分達が納得できるものを余暇の時間内で組み上げるか? になるわけです。

幣サークルの場合、最もネックなのは、サークル民は忙しいという事実です。これは幣学の入学年次的にも仕方ない話です。なので、如何に手軽に実装するか、の早道である「使い回し」がし易いモデルを求めて、いろいろな設計パターンを取り入れてみています。その一つがLTで紹介したコンポーネントモデルです。流動要素を見極めるのも、変更にかかる労力を最小にしたいがためです。

そんなこんなな、設計すると、やがて楽になるよって話をしました。したかったです。

蓋を開けると、なんだか設計というより幣サークルの紹介みたいな内容になりました。 熱血編ではUI設計の話をします。たぶん。

技科大祭展示VRゲーム製作記録

adventar.org

TUT-AdC 2日目の記事です。 「UnityでVRをとりあえず動かした話」改め、「技科大祭展示VRゲーム製作記録」です。
本年度技科大祭のコンピュータークラブで展示していたVRゲームの製作記録になります。
開発環境はWindows10、Unity5、Oculus Rift + Touchです。

つくったもの

杖と盾で戦うVRシューティングゲームを作りました。 敵を倒し尽くせばゲームクリアという単純なものです。


UnityでVRをとりあえず動かした話

製作記録

大まかなスケジュール

製作は、4人グループで行いました。大まかな流れは、

  • 5月:企画決定
  • 6,7,8月:モックを作りつつ、仕様を詰める
  • 9月:完成させる

です。この記事では、8-9月中に行われたVR対応機能の実装について触れていきます。

VR対応

対応させる段階別に、それぞれ見て行きます

  • ヘッドトラック
  • 手の表示
  • 触る/握る/使う
  • 握られる/使われる

ヘッドトラック

UnityはVRをサポート*1していて、ヘッドトラックはチェックボックス一つで実現できます。
客注リンク先の「VR サポートを有効にする」を参考に“Virtual Reality Supported” オプションを有効にすると、VRヘッドセットに合わせて、メインカメラの回転とポジションが上書きされるようになります。

手の表示…の前に

Touchコントローラーを使っていくために、Oculus Utilities for Unity*2,Oculus Avatar SDK*3,VRTK*4というアセットを導入します。
前者2つはOculus developersのサイトから、VRTKはアセットストアから入手できます。

インポートできたら、VRTKについているサンプルシーンや、ドキュメントなどを参考にセットアップをしていきます。

手の表示

  1. 空のシーンに、空オブジェクトを2つ作成
  2. 一方の子要素に、Oculus Utilities と Avatar SDK からインポートした、OVRCameraRigとLocalAvatarをおく
  3. OVRCameraRigにアタッチされている、OVR Manager の Tracking Origin TypeをFloor Levelに変更
  4. 2.で子要素を追加したオブジェクトに、VRTK_SDKSetupをアタッチ,Quick SelectをOculusに設定
  5. 2.で選ばなかった方のオブジェクトに、VRTK_SDKManagerをアタッチ,Auto Populateを押す

これでコントローラーに追従する手が表示されるはずです。

触る/握る/使う

前項で表示した手に、握る/使うといったアクションができるようにしていきます。

  1. 前項で、VRTK_SDKManagerをアタッチしたオブジェクトの子要素に、Left,Rightという名前で空オブジェクトを作る
  2. それぞれを、VRTK_SDKManagerのScript Aliasesに設定

ここまでの作業でヒエラルキーはこのようになります。ここでVRTKがSDKManager、VRPlayerがSDKSetupをアタッチしたオブジェクトです。

f:id:sumogri:20171202022554p:plain

ここで追加した、Left,Rightに手で行えるアクション機能を乗せていきます。
たとえば、触る/握る/使うの機能を乗せたLeftのInspactorは

f:id:sumogri:20171202023516p:plain

となります。

ここまでの設定で、手の側の設定が一通り完了します。試しに、サンプルシーンの16番にある剣をもってきてみると、握れるはずです。

握られる/使われる

最後に、サンプルシーンにあるような、握れる/使えるオブジェクトを作っていきます。
例として、今回作ったゲームの杖にアタッチしたスクリプトを見てみます。

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using VRTK;

public class IntaractableStick : VRTK_InteractableObject{
    [Header("Stick Option")]
    [SerializeField] private int magicIndex = 0;
    [SerializeField] private Transform magicGeneratePoint;
    [SerializeField] bool followToEnemy = true;
    private Raycaster raycaster;
    private VRTK_ControllerReference controllerReference;
    private MagicManager magicManager;

    protected void Start()
    {
        raycaster = gameObject.GetComponent<Raycaster>();
        magicManager = AurorPlayerController.PlayerObject.GetComponent<MagicManager>();
    }

    public override void StartUsing(VRTK_InteractUse currentUsingObject = null)
    {
        var magic = Instantiate(magicManager.MagicPrefabs[magicIndex],
            magicGeneratePoint.position,
            magicGeneratePoint.rotation);

        if (followToEnemy) FollowToEnemy(magic);

        VRTK_ControllerHaptics.TriggerHapticPulse(controllerReference, 0.5f, 0.5f, 0.01f);

        base.StartUsing(currentUsingObject);
    }

    public override void Grabbed(VRTK_InteractGrab currentGrabbingObject = null)
    {
        controllerReference = VRTK_ControllerReference.GetControllerReference(currentGrabbingObject.controllerEvents.gameObject);
        VRTK_ControllerHaptics.TriggerHapticPulse(controllerReference, 0.7f, 0.25f, 0.01f);
        base.Grabbed(currentGrabbingObject);
    }

    public override void Ungrabbed(VRTK_InteractGrab previousGrabbingObject = null)
    {
        controllerReference = null;

        base.Ungrabbed(previousGrabbingObject);
    }
}

肝心なのは、VRTK_InteractableObjectを継承している点です。 これを継承し、StartUsingやGrabbedといったメソッドをオーバーライドすると、それらに対応したアクションがなされたときに実行されます。

inspectorから見てみると、こんな感じになっています。

f:id:sumogri:20171202025254p:plain

掴みについての設定や、使えるタイミングなど設定できることが見て取れます。
これ以外の機能、たとえば、左手でつかんだものをそのまま右に持ち変える、持った時の手とオブジェクトの位置関係を調節するなどは、別のスクリプト(VRTK_SwapControllerGrabAction等)をアタッチすることで実現していきます。

このようにして、もろもろ実装していくと、とりあえず動くものが出来上がります。

まとめ

長々と Oculus Rift + Touch でとりあえず動かす話を書き連ねてきました。
VRTKにはすぐに使えるサンプルが多数収録されているので、それらを見て行くことでもいろいろできることがわかっていくと思います。
VRというと、ハイスペックPCとお高いHMDが欲しくてなんとなく敷居が高いイメージかもしれません。 しかし、このように気軽に動かすものが作れるとなると、ちょっと近くに感じませんか?感じますよね? Oculus Rift + Touchも当初の価格から随分値下げされ今では5万円とお手頃(?)になっているので、これを機に買ってみるのもいいかもですね!
といったところで、記事を終えたいと思います。

ちなみに、今回紹介したゲームを含めた技科大祭展示作のゲームCDを、コミックマーケット93[金曜日 東地区 "ク" 34a]とよぎぃそふとにて頒布します!どうぞよろしくお願いします!

明日は@naruhodo2015さんによる、「JRA銀行から出金する方法について(中京2日目11R)」です! お楽しみに!
果たして昨年の預金を引き出せるんでしょうか!?私気になります!

TUT-CCのマスコットキャラを目立たせたかった

TUT-CCのマスコットキャラ

TUT-AdC、14日目の記事です。
TUT-ConputerClubのマスコットキャラを、Blender初心者が3D化している話です。

www.adventar.org

TUT-CCのマスコットキャラとは

遡ること1.5年前、コミケに参加することになった幣サークルは、サークルカットを募集しました。
次々と投稿されるシンプルで、洗練されたデザイン。採用という狭き門をくぐり抜けるための血で血を洗う死闘があったかどうかはわかりませんが、 出来上がったロゴには、なんともかわいらしいキャラクターが描かれていたのでした。

f:id:sumogri:20161214001154p:plain

マスコットキャラ認知されてない疑惑

ところで、このマスコットキャラは一般に、どころかサークル内でも認知されてない気がします。うっかりすると新教務システムのマスコットキャラの方が有名です。これはいけません。可愛いものは愛すべしです。
認知度を上げるにはどうすればいいでしょう。それは人前に出ることです。サークルのロゴとして技科大祭のパンフレットに出演する奥ゆかしさも捨てがたいですが、この子にはもっと前に出てもらいましょう。
幣サークルにはゲームを作成しているグループがあります。このゲームは新入生歓迎会や技科大祭で展示するほか、コミックマーケットでも頒布されます。ここを活躍の場にできれば、この子はより有名に、愛されるようになるでしょう!

ました工法

ということで、作製中の3Dモデルがこちらになります。  

GitHub - sumogri/mascot: TUTコンピュータクラブのマスコットの個人的3Dモデル化

球とかキューブとかの組み合わせでさっくり作ってあるので、モデリングについてのあれこれは割愛します。ラティスモデファイヤはいいぞ。

このモデルには、ヒューマノイドリグを設定してあります。なので、fbxなりを経由してUnityにエクスポートすればUnityちゃんのモーションのようなヒューマノイド用モーションが適用できます。

使用例

せっかくなので、Blender上でポーズさせてみようと思います。

f:id:sumogri:20161214005355p:plain はい。

まとめのような言い訳

同じポーズを取らせてみるとひしひしと感じるのですが、足のサイズ感とか顔の縦横比率とかお尻のもっちり感とか可愛かった部分がうまく再現できてませんね。すみません許してください。
きっと来年のAdCまでには元気に走り回るマスコットくんの姿が見られるでしょう。

次回は@NU_Panさんの「DTMか音楽関連」の記事です。お楽しみに!

使用ツール

3Dモデリング:blender 2.77
テクスチャ :GIMP 2

参考

Unityマニュアル,BlenderとRigify の使用https://docs.unity3d.com/jp/current/Manual/BlenderAndRigify.html

今日の天鳳.3

1日休めば取り戻すのに3日かかるのだったら30日休んだんで3ヵ月くらいかかりますね(確信)
もともと感覚で打ってるのに拍車がかかってて笑えないじぇ
ターツ優先度とかオリとかどっか飛んでってるとしか……

1局目

牌譜:http://tenhou.net/0/?log=2016040500gm-0089-0000-8fc01e14&tw=2

東場 特になし
南1
11巡目
234577m67p468s ポン自風 打8s
ここで下家が竹染って気づいてないし警戒もしてない
6mドラ受したいのはわかるけどそれも打2mで何とかなる
ここで竹切りは下家にエサやるだけだし順目も巡目だし67p落としでよかった(?)
14順目
3457777m67p6sポン自風 ツモ8m 打7m
打7mではなくツモ切りor降りて67p切り

2局目

牌譜:http://tenhou.net/0/?log=2016040612gm-0089-0000-2bb6a530&tw=3

東1
5-6順 45s切り
9-10順 9s対
南4
n順目 23s切り
まあ運がよかったとしか
オーラスとか1-4sで十分なのに聴牌とらなかったり
1-4sだったら出てなかったっぽいのは結果論かなぁって

まとめ

勝てないからつまんないじょ~

今日の天鳳.2

忙しいし一戦だけ
現在:R1515 二段

一戦目

牌譜:http://tenhou.net/0/?log=2016022700gm-0089-0000-45bb6398&tw=0

総括

前回とは打って変わってチャンスまみれのドラまみれ。
リンシャン出来なくてもドラ増やせるしカンしていこうぜ。ただし乗るのは他人の手牌だけどな。
結果論だけど東場の下家に上がられなくてよかったなって。

東1/2/3二本場/4一本場

牌譜見るまで染めに気づけないのどうにかしたい。
一段目で二色の456とか切ってくれないと染めって気づけない。まあ切ってても気づけないときあるけど。
東4一だったら10順目手出し東とかでおや?っと思っとくべきなんだろうな?どうなんだろ。
東1の白対子落としとかもタイミング違う感ある。結果的に対面染めじゃなかっただけであれ染めだったら普通に危険な切り方だよなって。

おわり

安直なカンはしないほうがいいって教えたはずです。
f:id:sumogri:20160227020939p:plain

今日の天鳳.1

オンライン麻雀でのあれこれ。
やっとこさ上卓で打ち始めたところ。
R1499で二段、まあ初心者だし多少はね?
伸び悩むのも嫌なので何か書く。
本日は2戦。

一戦目

牌符:http://tenhou.net/0/?log=2016022500gm-0089-0000-f5a1118c&tw=1
ファイヤロー。
東4局とかのリーチとか、南3の嶺上ドラドラ投げ捨てとかなるべくしてなってる感。

二戦目

牌符:http://tenhou.net/0/?log=2016022500gm-0089-0000-e03977d1&tw=2
ぎりセーフな感じ。ことごとくチャンスがつぶれて行ってる。運なのか牌理の結果なのか。
南1とかなんなん?って言いながら打ってた。

おわり

麻雀って楽しいよね!(血涙)f:id:sumogri:20160225020139j:plain