simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:HTTP通信のベストプラクティス

前書き

ちょうどこのブログを閲覧しているみなさんは、HTTP と呼ばれるプロトコルを介して私の文章とやり取りをしています。
皆さんは HTTP についてどれくらいご存知でしょうか?

インターネットには、目的地へ電気信号を届ける決まりごとがあります。(何でも規格化しておかないと、共通の機材で通信できませんからね…)
例を示すと、ある IPアドレスのマシンに情報を届けて、その情報に書かれているポート番号のアプリに情報を届けて、アプリで情報を処理してプロパティを参照して…と、層ごとにとにかく情報を渡すという仕組みです。
下位層で仕事の内容を変えたとしても、上位層で得られる情報に変化がなければ、そこから上の層の処理は変わりようがありません。
情報には決まってヘッダ部とボディ部があって、どの層もヘッダ情報を頼りに情報伝達の仕事をします。
これがOSI参照モデルと呼ばれる考え方です。

層ごとに情報を処理する決まりごとを~プロトコルと呼びまして、HTTP (ハイパー・テキスト・トランスファープロトコル)は長いこと下位層として TCPトランスミッション・コントロールプロトコル)を利用してきました。
しかし、最近はセキュリティの観点から認証・暗号化・改竄防止のため、TCP の上に TLS(トランスポート・レイヤー・セキュリティ・プロトコル)を差し込んで、TLS の上で HTTP を利用する HTTPS 通信と呼ばれる通信が主流となっています(いまだ http://~から始まる保護されていない通信のブログや個人サイトも多いけど…)

そして Unity から HTTP や HTTPS でのデータのやり取りを行う場合は、どういった実装を書くのがベストなのでしょうか?
という疑問に答えたいと思います。(良かったら追記もよろしく)

本題

UnityWebRequest は、HTTP の完全な制御が可能です。
モバイルプラットフォーム: iOS, Android でも利用できます!
詳しくはマニュアルに記載!
docs.unity3d.com

…以上なんですが

UnityWebRequest は AssetBundle のダウンロードのための専用の機能
UnityWebRequest.GetAssetBundle
やテクスチャファイルの効果的なダウンロードのための機能
UnityWebRequest.Texture
が用意されています。

とにかく、ただダウンロードして、ダウンロード済みのファイルを利用する使い方では、ダウンロード中に困ったことが起きるので
これらの関数は、そのダウンロード処理を効率的に行うための仕組みが備わっています。

詳しくは…

自分も Asset Bundle について勉強中なので、後程紹介したいと思います。
とにかくアウトプットだー

追記

Unity が用意しているのを使うのがベストと思ったけど…
Cysharp のこちらがリアルタイム通信に関しては HTTP も含めてベストかもしれない

Unified Realtime/API Engine for .NET Core and Unity.
github.com

Game:IT社会の未来を予見するための情報源

■前置き
情報化社会の変化というものは制御が利かないものではなく、その変化には大きな流れがあって
その流れを作る少数の技術者と、そこに巨大な金と大量の人をつぎ込むことで時間短縮を図る企業の存在があります。

GAFA と呼ばれる
Google, Amazon, Facebook, Apple, Microsoft, NVIDIA とか、そのレベルの企業が毎年技術者・開発者向けに会議を開いています。

そこではこれらの会社との連携や、数年先にリリースする技術のお披露目、現在進行中のプロジェクトなど
ITの未来について、実現確率の高いビジョンが語られます。

職場のリーダーミーティングや、国内の開発者会議や学会でも、こうした大きな技術会議の内容は話題にされるので
自分も、早めにキャッチアップ(遅れを取り戻すようなことを)しておこうと考えるようになりました(というか技術の流れを知ってないと…バカにされるし、評価も下がるし、クビになっちゃう的な…)

■いつ、どの会議に注目すれば良いの?

NVIDIA: GTC 2019年3月
Game Dev. Conference 2019年3月
Google: I/O 2019年5月
Facebook: F8 2019年5月
Microsoft: Build 2019年5月
Unity: Unite 2019年5月
Apple: WWDC 2019年6
Amazon: AWS Dev Day 2019年11月

■AIについての知識も問われる

だいたい AI についての話題が多いので、まったく知らない人は機械学習の歴史についても学んでおかないと
いざ話に参加したときに、トンチンカンな解釈を披露して、無能アピールしちゃうのでお気をつけを!

どのレベルまで興味を持って勉強して、AIの使い方に気付いて、できること、できないことを見分けられるかが重要で
キーワードを知っているとか、知識を掘り下げただけでは、予見できない未来像があるので、博識だけではどうにもならないのが、ツライところです。

■コミュニケーション能力

初心者にわかりやすく説明できなきゃ、本質を理解できていないことになるので、アウトプットを通して、自身の世界に対する理解力を上げていきたいところです。

■補足
Unite は私が Unity 好きなので加えました

Slack:WebAPIを用いてチャンネルに投稿する

f:id:simplestar_tech:20181208215717j:plain
Advanced REST clientからSlackへ投稿するテスト

■前置き
一人 Slack は自分が管理者ですから、Slack App や Bot も入れ放題!
いろいろなツールから Slack に対して通知を飛ばしたいので、今回は外部から Slack に投稿する方法を確認します。

■tokenの取得

次のようなリンクを踏むと Slack App Directory にアクセスできます。
https://yourworkspace.slack.com/apps

Bot の Web API の token 文字列が欲しいので、Bots を探して選択してインストールします。
するとすぐに API キーとして token 文字列が表示されます。
これをコピーしておきます。

■Advanced REST clientを有効化

HTTP 通信を試すための便利ツールとして Google Chrome拡張機能として ARC こと Advanced REST client をインストールして起動します。

■Web API を使って投稿
冒頭の画像のように POST メソッドを選んで、特定の Slack Web API を叩くと Slack 上で bot が特定のチャンネルに投稿を行いました!

参照した Web API のサンプルはこちら
chat.postMessage method | Slack

■どうやって認証をクリアしたの?
Slack は OAuth 2.0 で認証することを推奨しているため、OAuth 2.0 で定められた RFC に従ってヘッダに token を次の書式で埋め込みます。
それだけです。
具体的には HTTP ヘッダーにて

Authorization: Bearer xoxb-1234-56789abcdefghijklmnop

を指定するだけです。
また安全面から API を叩いていい IP アドレスを Slack 側で設定しておく必要があるでしょう。

■まとめ
Web API を利用する時にでたらめに難しいのが OAuth の理解です。
これを理解しないと、何もできないのですが

理解してしまえば、あとは OAuth の仕組みから得られる token を HTTP のヘッダにて指定するだけ
これで Web API への request は成功しますので、疎通確認が済んだその先は難しい部分は一つもありません。
API ドキュメントを読んで、正しい使い方で利用するだけです。

大事なことなので、もう一度
認証の仕組みを理解するのが難しいだけで、これさえクリアできれば、簡単に外部から Slack を操作することができるようになります。

■OAuthの理解で利用した情報ソース
OAuth - Wikipedia

Slack:自分だけのワークスペースを作成

f:id:simplestar_tech:20181208195955j:plain
作った個人ワークスペース

■前置き
Facebook とか Twitter とか、そのほか似たようなソーシャルネットワーキングサービス(SNS)が世に浸透してしばらくたちましたが

会社でのお仕事のコミュニケーションもまたSNSを利用するようになりました。

最近は Slack が人気のご様子…ちょっと慣れておきたいなと思って、個人で Slack を始めてみることにしました。

お値段は?
Pricing | Slack

現在だと 5GB のストレージ利用まで無料で、一人でさみしく作業する分には機能制限がないとのこと
すごい、これなら簡単に試せますね。

個人で Slack ワークスペースを作って、一人 SNS とかやってみようじゃないですか^^)

■Slack ワークスペースの作り方

もうここを読んで、手を動かすだけでした。
get.slack.help

読み終わったころには Slack App を入れ終わり
Slack についての基本操作もだいたい覚えた形ですね。

最近のこうしたオンラインサービスのドキュメントってわかりやすいですね!
いよいよ、オンラインドキュメントがわかりずらいとサービスに人が集まらない時代が来たのでしょうか?

初めて学習する人に、親切丁寧に説明していく文化が広まるといいな

Unity:新しいInputSystemを動かしてみた

■前置き
Unity 2019 のロードマップを確認して、新しい InputSystem が来るヨ
とのことなので、どんなものかだけ触ることにしました。

正式導入は 2019.2 頃なので、2019年9月末ってところです。(予定通りに事が進めば)
その後は現在の Input が廃止されていき、この新しい InputSystem に置き換わります。

これから Unity でゲーム作るぞーって考えている人は、作っている最中にいきなり導入されるだろう新しい InputSystem に驚かないよう
今から少し触っておくのも良いかもしれません。

■導入手順
Unity-Technologies さんの GitHub.com のリポジトリを閲覧し、InputSystem を見つけます。
github.com

README に導入手順が示されているので、この通りに手を動かすと、確かに Input Debugger が機能していることが確認できました。
具体的には…

  1. Copy the Packages/com.unity.inputsystem/ folder to the Packages folder of your own project.
  2. Open the player settings in the editor (Edit >> Project Settings >> Player) and change Active Input Handling* in the 'Configuration' section to either "Both" or "Input System (Preview)". Note that the latter will disable support for the old system and thus render most APIs in UnityEngine.Input non-functional. This will also have impact on systems using the API (e.g. UnityEngine.UI).
  3. Restart the editor.

f:id:simplestar_tech:20181202184114j:plain
Input Debugger の XBox Controller の入力の様子

■一般的な使用方法

まずはREADME に示されている動画を観ます。
www.youtube.com

ここには State, Event, ActionMap の三つの方法についてそれぞれの入力の取り方が示されていました。

一番簡単そうな State のサンプルを試して動きました。

具体的には…
以下のスクリプトを Camera にアタッチしてゲームを再生

using UnityEngine.Experimental.Input;
using UnityEngine;

// Using state of gamepad device directly.
public class SimpleController_UsingState : MonoBehaviour
{
    public float moveSpeed = 3;
    public float rotateSpeed = 100;

    private Vector2 m_Rotation;

    public void Update()
    {
        var gamepad = InputSystem.GetDevice<Gamepad>();
        if (gamepad == null)
            return;

        var leftStick = gamepad.leftStick.ReadValue();
        var rightStick = gamepad.rightStick.ReadValue();

        Move(leftStick);
        Look(rightStick);
    }

    private void Move(Vector2 direction)
    {
        var scaledMoveSpeed = moveSpeed * Time.deltaTime;
        var move = transform.TransformDirection(direction.x, 0, direction.y);
        transform.localPosition += move * scaledMoveSpeed;
    }

    private void Look(Vector2 rotate)
    {
        var scaledRotateSpeed = rotateSpeed * Time.deltaTime;
        m_Rotation.y += rotate.x * scaledRotateSpeed;
        m_Rotation.x = Mathf.Clamp(m_Rotation.x - rotate.y * scaledRotateSpeed, -89, 89);
        transform.localEulerAngles = m_Rotation;
    }
}

ソースは同リポジトリの Assets から持ってきたものです。

Unity:物理コンストレイント

■前置き
このブログの一つ前のブログでも Unity に関する記事を定期的に書いてきました。
お仕事でも Unity 4 ~ Unity 5 での開発は行ってきており、Unity 歴はざっと 4 年ほどあります。
そんな私でも Unity について基礎ができているかと聞かれると、無いの一言しか返せませんでした。

基礎力が欲しい!
そんなとき「ゲーム開発を 1 から学ぼう」
unity3d.com

を見つけ、例の Dark skin にしたい欲求も重なって Unity Plus 年会員になって、無料で見られるビデオチュートリアルを視聴することを決めました。

チュートリアルを確認して得られた知見を簡単にまとめようと思います。

■Unity 基礎編

全24時間の動画を観終えるのに一週間丸々使いました。(平日ぶち抜きで)

内容について、ほとんど知っていましたが、今更存在に気付いた機能が一つだけありました。

Physics の Joint です。
物理エンジンのコンストレイントと言った方が昔の自分にはよく伝わります。

f:id:simplestar_tech:20181202171338g:plain
FixedJointを付けない状態と付けた状態の挙動の変化

Fixed Joint コンポーネントを追加することで、このように二つの Rigid Body をくっつけて物理計算を行うことができるようになります。

ほかにも Hinge Jointを付ければこのようなドアのような動きを作ることもできます。

f:id:simplestar_tech:20181202172533g:plain
Hinge Joint を小さい Cube に付けた時の様子

他にも Wheel Collider という、車輪のついたオブジェクトに適したものもあります。
倒した敵が地面を転がる Ragdall もあるよ!

これから作ろうとしているゲームでは欠かせない要素なのに、知らなかったなんて…
昔 Unity にコンストレイント機能はあるか先輩に尋ねて、そんなものはないと答えられたことを鵜呑みにしてしまっていた自分が恥ずかしい!

もし他にも Joint みたいな機能があったらいいなと思う人たちに、有益な情報として伝わるといいな

Unity:Blender連携によるスキンメッシュアニメーションとシェイプキーのインポート

Unity と Blender を連携させて、Blender で編集したら即時スキンメッシュアニメーションとシェイプキーが反映されるシーン再生を確認しました。
具体的な手順を以下に記録します。

f:id:simplestar_tech:20181113162722g:plain

■前置き
ゲームは芸術と科学の結晶です。
そのため、プログラムを書くだけでは完成しないゲームがほとんどです。

個人でゲーム開発するにはモデリングもリギングもアニメーションも行えなければいけません。
ゲーム開発はより民主化していくので、センスが無くても手順だけ覚えます。

そういえば最近 Unity によるゲーム開発の民主化について記事を書いたな


Blender
世界一有名な完全無料で3Dメッシュを自在に編集して、映像制作を行える3Dアセット編集ソフト
https://www.blender.org/
仕事では Maya を使うことが多いですが、お金ない時代に Blender に慣れてしまったので、個人の開発では今後も Blender を使っていきます。

最近は Maya から Blender に切り替える職場も多いとか
FBX 形式での入出力機能を持つので Unity のアセット編集によく使われます。

■Unity は公式で Blender と連携する機能を提供している

Unity - マニュアル: Blender からのオブジェクトのインポート

次の要件だけ注意(チームで開発する場合は、全員の環境に Blender 2.60 以降のインストールが必要)

Blender 2.60 以降が必要です (過去バージョンの Blender では FBX エクスポートが変更または破損している場合があります)。
テクスチャとデフューズカラーは自動的に割り当てられません。Unity のシーン内でテクスチャをメッシュにドラッグして、手動で割り当てます。

■環境情報

Unity 2019.1.0a8
Blender 2.79b

Blender を起動して .blend ファイルとして Assets 以下に保存

ちょっと突き放してしまいますが Blender のインタフェースは一朝一夕では扱えませんので次のような入門記事を読んで覚えてから
https://blender-cg.net

複数の名前付きスキンメッシュアニメーションと
複数のシェイプキーを作成し
これを Unity の Assets 以下に .blend 形式で保存します。

Blender の Timeline の再生ボタンを押した時の様子
f:id:simplestar_tech:20181113164832g:plain

■Unity を起動し .blend ファイルを置いたフォルダを確認

環境に Blender さえインストールされていれば、.blend ファイルをそのまま fbx ファイルとしてUnityは扱ってくれます。
f:id:simplestar_tech:20181113170834g:plain

Blender のドープシートにて複数のアクションを定義して様々なアニメを作成すると、すぐにこれを反映してUnityにて新しいアニメーションを扱うことができるようになりました。
シェイプキーのアニメーションは、シーンに配置したオブジェクトの Skinned Mesh Renderer コンポーネントの BlendShapes を確認すると、そこにシェイプキーの名前で 0~100 のスライダーが現れます。
これをプログラムやエディターで制御してシェイプ(基本的な使い方は Facial のモーフ)を使います。

確認手順については以上です。

Unity で Animation を再生する方法がわからない方は、2年前に書いた次の記事が役立つかもしれません。
simplestar-tech.hatenablog.com


クォリティを上げていく前に、まずは一通りの動作を確認する、大事ですよね。
示した手順が役に立つとうれしいです。
ここから魅力的なキャラクターやモーションなどを Blender で作れるとなお良いですね。