【Unity】シス研メンバーに祝福を

# はじめに　<font color = "pink"; >メ</font><font color = "green"; >リ</font><font color = "gold"; >ー</font><font color = "crimson"; >ク</font><font color = "pink"; >リ</font><font color = "green"; >ス</font><font color = "gold"; >マ</font><font color = "pink"; >ス</font><font color = "red"; >！</font>


ワッハ↑ハ↑　！
クリスマスイブを暇しているメンバの皆に少しでも感動と祝福を届けたいので，無理やりにでも笑顔になってもらうべく，ネタアプリを作っていこう思います．とは言えまず，自己紹介と執筆動機から．始めまして？シス研「Itooooo_Main@Slack」です．これまでめったに記事とか書いてこなかったのですが，「学生生活最後のクリスマス，最後くらい伝えたいことや制作を残したい！」みたいな気持ちになりこの記事を執筆します．
もしよかったら読んでいってください．
身内ノリの記事なので，一定期間で消しちゃうかも．

# 制作動機
  では何を残していくのか？
  僕は大学生活の中で何よりも「人との繋がり」が何よりも重要であることに気が付きました．何をするにしてもその人がどんな人なのか，信頼できるのかを知らなければ話は始まりません．また，チーム開発や研究活動において，一人では大したこともできないと実感してきた人，これから実感していくひと，いると思います．特に今の世代では社会情勢的に人間関係が希薄になりがちだと思います．そこで，僕は考えました．シス研にはどんな人がいるか，何ができる人がいるのか，それが分かる人間データベースが必要だと．

  まずはその第1弾！

### 「<font color = "steelblue"; >シ</font><font color = "hotpink"; >ス</font><font color = "gold"; >研</font><font color = "aquamarine"; >ガ</font><font color = "thistle"; >チ</font><font color = "olive"; >ャ</font>」

  を提案します．

  先ほど人間データベースが必要であるといいました．データベースを作るにしても最初はオフラインで会いたいものです．そのためのシス研に来たくなる，モチベーションになるアプリになればと思っています．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/70ac72c8-7976-c4e3-dcbd-8b96be387cb2.jpeg" width="200">

# 仕様検討

- プレイ環境

  制作環境は<font color = "orangered"; >Unity</font>です．僕がそう判断しました．Unityは様々なOS，デバイスで動くものを製作可能です．ユーザ，すなわちシス研メンバの皆さんにどうプレイしてほしいのか．<font color = "orangered"; >優先すべき観点</font>は何か？
  この制作は既存IPでもなんでもなく，制作の趣旨からまずは簡単にプレイできなければ，触ってもらえなければ意味がありません．ということで，<font color = "orangered"; >手軽さ</font>という観点を優先します．となると<font color = "orangered"; >ブラウザ</font>ですよね．いろんなアプリがブラウザでもできるようになっているのは，やっぱり手軽さからでしょうね．Unity的に言えばWebGLをビルドターゲットにします．

- 内容

  触れてもらうことも大事ですが，<font color = "orangered"; >継続</font>してもらうことも大事です．
  [「すべては依存症になるようデザインされている？――僕らをのめり込ませる6つのテクニック」](https://diamond.jp/articles/-/209526?page=2)によると皆さんにこのゲームの中毒者になってもらうためには

      1. ちょっと手を伸ばせば届きそうな魅力的な報酬(目標)
      2. 抵抗しづらく、また予測できないランダムな頻度で、報われる感覚（正のフィードバック）
      3. 段階的に進歩・向上していく感覚(進歩の実感)
      4. 徐々に難易度を増していくタスク(難易度のエスカレート)
      5. 解消したいが解消されていない緊張感(クリフハンガー)
      6. 強い社会的な結びつき(社会的相互作用)

    の存在があることが重要だそうです．
    全部含めるのは難しそうなので今回は1，2，5，6当たりを最大化できる簡単なアプリで考えていきたいと思います．
    また，前述の手軽さという観点も含めて考えると何かしらのガチャがよさそうです．２と手軽さの観点からゲーム性は排除し，単純なクリッカーゲームみたいにして6の観点から出現する報酬はシス研のメンバにしたいと思います．

    もう，タイトルから駄々漏れでしたがこんな内容で作ります．


# 制作課程

  制作する上でハマったこと，考えたことを殴り書きしていきます．<font color = "orangered"; >重要→ほぼ確か約だいたい</font>，正しいことをいうように心がけますが，間違っていたらごめんね．[SideViewGolf](https://sideviewgolf.com/ja)なんかを作ったことがあるくらいだから，実はほぼハマったことはないんだけど，ハマりそうな部分として，ハマったことにするね．特筆すべきコーディングは無かったよ．

  - 最終システム構成
    ![system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/028027c1-1cd7-92fd-bf01-520bc3c9bebd.png)

    最初はガチャシステムをUnity製ページに入れ込んでいたよ．メンバデータなどのリソースを全て突っ込んでいたのでアプリだけで500MBくらいあったよ．通信料ヤバかったので，ガチャシステムとして分けたよ．代替のバックエンドサーバを「k22097　仁木正人　nikimasato
 @Slack」がやってくれたよ．そっちの詳しいことは分からない．魔法で動いているよ．マジ感謝
  - ユーザ視点フローチャート
    ![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/1d63ecee-f85a-4ecb-1599-a72960e55e35.png)

  - [シス研wifiにつないでやってみて(シス研ガチャ)](http://172.16.0.169/SyskenGacha_Xmas)
  ![qr20221223191422099.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/56e79f42-063d-64ee-fe2a-831e3d145032.png)
  http://172.16.0.169/SyskenGacha_Xmas

  - フォント
    - テキスト関連はWebGLで書き出すと大体□とかになるよ．これはデフォルトのフォントが日本語に対応していないからみたい
    - Googleフォント([Google Font](https://fonts.google.com/))から取ってきたよ.Googleはいろいろデザインに使える物を無償配布していたりするよ．すごいね！
    - 変換作業
      - TextMeshPro用の形式にする必要があるよ(というか全部TMPになったんだUI->Textなくなったんだ)
      - 基本的には[ここ](https://www.midnightunity.net/textmeshpro-japanese-font/)を参考にするといいけど，特にWebGLでは
        - Sampling Point Size 13(フォントによる)
        - Atlas Resolution 2048 * 2048 (以下)

        にする必要がある．これはブラウザの制約によるものらしいです．
  - 非同期処理
    - WebGLではマルチスレッドが使えないみたい([参考](https://qiita.com/kazuki_kuriyama/items/3155606bb6cb5861ce68#%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E9%9D%9E%E5%AF%BE%E5%BF%9C))
        - Unityで非同期処理する方法はいくつかあるみたい([参考](https://shikaku-sh.hatenablog.com/entry/unity-organize-async-await-coroutine#:~:text=Unity%20%E3%81%AE%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%EF%BC%88%E2%89%A0%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%EF%BC%89,-Unity%20%E3%81%A7%E9%87%8D%E8%A6%81&text=%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%AF%E3%80%81%E9%87%8D%E3%81%9F%E3%81%84%E5%87%A6%E7%90%86,%E3%81%A7%E3%82%82%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82))
          - 中でもマルチスレッドを使わず非同期に見せかけることができるコルーチンを使うよ
  - Webサーバ
    - CORS → リバースプロキシ
      - ページ配信サーバとバックエンドサーバを別々にしたせいで怒られるよ.これをCORSの制約っていうらしいよ([参考](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS))
      - 困ったけどリバースプロキシで解決([参考](https://www.server-world.info/query?os=Ubuntu_22.04&p=httpd&f=13))
        - クライアント的には同一サーバであるように見せかける技らしい
  - 仮想マシン Proxmox

    |  | Spec(Apache) |
    | --- | --- |
    | OS | Ubutntu 22.04 |
    |  CPU |  4 core   |
    | Mem | 4 GB |

    |  | Spec(Backend) |
    | --- | --- |
    | OS | Ubutntu 22.04 |
    |  CPU |  1 core   |
    | Mem | 512 MB |

    パフォーマンス分析とかしてないけど，同時に4, 5人でも今のところ動いているのでヨシ！

  - Github
      - Gitignore([参考](https://www.sejuku.net/blog/83605))
        - UnityプロジェクトをGithubで管理したいと思ったらプロジェクトファイル全部あげればいいと思うじゃん．
        - 例えば画面配置なんかも共有されちゃうとか100MB以上のファイルはアップロードできないとかあるのでめんどくさいよ．
        - そのためにクライアントの個々で違う部分とかは無視したほうがいいのでその設定ファイルだよ．100MB以上のファイルとか画像リソースファイルとかは他のストレージサービスを使おう．
    - 消えたパスワード認証([参考](https://note.kiriukun.com/entry/20210904-github-password-authentication-was-removed))
        - Source Treeを今まで通り使おうとすると，プッシュ時になんか認証に失敗するよ．クローン時にトークンを発行して，URLに入れ込む必要があるみたい．僕はセキュリティー意識がばがばなのでトークン期限無期限にしちゃったよ．
  - 確定演出
    - 本当は何にも結果に影響しないのにユーザがあたかも自分の操作が結果に影響しているかのように見せかけることができる手法の一つみたい．
      - [偶然における操作量がエンタテインメント性に及ぼす影響の調査](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjFzu_gxo_8AhUysVYBHVG6C-0QFnoECBMQAQ&url=https%3A%2F%2Fipsj.ixsq.nii.ac.jp%2Fej%2F%3Faction%3Drepository_action_common_download%26item_id%3D199442%26item_no%3D1%26attribute_id%3D1%26file_no%3D1&usg=AOvVaw1OIpXBw1JLpAUXu3aEsBiZ)
      - [制御幻想とは何か？](https://www.jstage.jst.go.jp/article/sjpr/45/2/45_125/_pdf/-char/ja)
    - 今回はシス研から溢れ出るオーラの色で演出別けすることにしたよ
      - [SpriteGrow](https://baba-s.hatenablog.com/entry/2018/01/15/090100)
          - spriteのエッジを光らせてくれるよ
        - 色は大体Apex方式だよ
      - [PostProcessing](https://styly.cc/ja/tips/unity_postprocessing_master/)
        - SpriteGrowを使うのに前提となるアセットだよ
        - 結構動作重い
  - 素材
    - [Medibang Paint](https://medibangpaint.com/)
      - 簡単な素材はこれで書いたり，切り抜いたりしたよ
    - PowerPoint
      - シルエット画像をよくこれで作るよ．

- メンバ画像の変換
    - バックエンドサーバからとってきたPNG形式の画像はそのままではSprite Rendererでは表示できないよ．Texture → Texture2D → Spriteの変換作業がいるみたい．
        - Texture → Texture2D([参考](https://baba-s.hatenablog.com/entry/2018/02/26/210100))
        - Texture2D → Sprite ([参考](https://www.hanachiru-blog.com/entry/2019/09/13/214940))
    - PCでは軽いものの，スマホだと重かったので結局却下，手軽さの観点に反する．
        - 結局Textureをそのまま扱えるRaw Imageにしたよ．
- バックエンドサーバとのやり取り
    - バックエンドサーバにUnity(ブラウザ)からガチャしたいってリクエストを送るとガチャ結果のシス研メンバデータと画像が送られてくるよ．Jsonでやり取りをしていて[以前のアドベントカレンダ記事](https://qiita.com/wdtkr/items/d73987ee933f711bd51b)とほぼ同じことをしているよ．
# できたもの
1 .タイトル（クリスマス仕様）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/74f1e290-5313-7ab0-0d13-49b6eba6dcc7.png" width="200">
2. 爆破
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/a8e4df83-5506-e19a-3b33-3c55148aed0a.png" width="200">
3. シス研メンバ爆誕！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/5809184e-45ac-070e-ad58-3b92aeff96cc.png" width="200">



# 運用と広告
- いいものを作っただけでは誰の目にも触れることはできません．シス研メンバに周知，宣伝する必要があります．
    - QRコード
      - 適当に調べて出てきたサイトを使った．
      - QRコードって文字列をただ単に画像に変換したものなんだね！
      - https://twitter.com/intent/tweet?text=%E3%81%B6%E3%82%8A%E3%81%B6%E3%82%8A とかやるとツイート用リンク作れたりする！面白い
    - 広告風景
      ![DSC_0209.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/ec361f7f-6020-9644-1bf0-9bae8db0b151.jpeg)
![k.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/f9f20720-117e-fe3c-ac80-54e04a38de22.png)

- メンバデータアップロードシステムの公開と運用
  - みんなもアルバムとして活用できるようにメンバ追加できるようになっているよ．後日，やりかたをSlackで共有するよ．↓バックエンドシステム　ユーザ認証も備わっていて，プライバシーも大丈V!?
   ![Backend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294495/ed9eb179-3218-bdfe-9d45-469646c43586.png)

# 今後の展望
最終目標はシス研メンバ(OB含む)の人間データベースをつくることです．横の繋がりはもちろん，縦の繋がりもつくれないかと思っています．そういった意味ではまだまだな部分も多く，その点，今後誰かに引き継いで貰ったり，追加開発してもらったりして，最終目標に少しでも近づけたいです．この点に関して今ある課題を記して行きます．

- 登場キャラにタグを追加してピックアップガチャなようなことをできるようにする．

- 内容が内容だけに外に公開できません．ある意味シス研に来るモチベーションになっていいのかなとも思いますが，モザイク処理や登場の可否の調査，アップロード内容の審査プロセスなんかを検討して，外部公開もできるようになるといいなと思っています．

- アクセスログをとってアップロード件数とってちゃんと報酬(ジュースとか)に反映したい．

- 来年度以降のゲーム制作班の題材にでもしてくれるとうれしいと思っています．

# おわりに
シス研ガチャ楽しんでもらえたでしょうか？これから来るシス研メンバもぜひプレイしてもらってこんな人がいるんだ！とか興味を持ってもらえるとうれしいです．

人を楽しませる，楽させる．それが技術の存在意義です．
逆に言うと技術の先には常に<font color = "orangered"; >"人"</font>がいるわけです．(小泉構文)
 <font color = "orangered"; >"人"</font>に技術が伝わらなくても意味がないし，<font color = "orangered"; >"人"</font>に技術がなくでもいみがない．
アイデアも<font color = "orangered"; >"人"</font>の求めに応じて生まれる．
こういったことから
- 技術大事！だがそれと同時に <font color = "orangered"; >"人"</font>！

 ということを伝えたかったです．
シス研メンバには技術！技術！とそればかりに没頭してしまう人もいますが，視野をもっと広げてみて，その技術は誰に役立つのか，どう役立つのか．誰と実現するのか，そういったことを想像できるような人になってほしいと思います．多分研究室ではいっぱいその点を先生やお世話になる方に聞かれますよ．技術を<font color = "orangered"; >"人"</font>に活用していきましょう！

以上，僕は何か残すことができたかな？この記事で誰かを幸せにできますように！
それではよいお年を！メリークリスマス～　明日のカレンダーの方よろしく！