simplestarの技術ブログ

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

Unity:初心者向け最短学習コース2018版

前書き

Unity を使う目的は人それぞれですが、最速で最新機能を学習したいと願うのが常だと思います。
最近、こうすれば Unity について素早く学習できるなと感じた学習方法を見つけましたので共有します。

いや、私がここのところ、こういうことしていましたって報告と捉えるのが正しいかも…

Unity 公式学習教材:ゲーム開発を 1 から学ぼう

Unity Game Dev Courses
unity3d.com

こちらに用意されている Fundamental Course を 24 時間かけて視聴するのが最も速く、深く Unity を理解できます。

具体的にはUnity Master Trainer による Unity 2018 でプロトタイプを完成させる基礎コースで
・Unity Hub でのプロジェクト管理
・マウスカーソルの制御
・Nav Mesh Surface による巡回、プレイヤーを追いかける NPC AI
・Pro Builder によるコンセプトアートからのレベルデザイン
・Baked Reflection Probe
・Particle System によるスモークの表現
・Line Renderer による Light Streaks (月の光が挿している絵)
・Spotlight の Cookie
・Animation Blend による移動速度による歩容の変化
・Text Mesh Pro. による UI とボタンイベントによるシーン切り替え
・Audio Mixer による音響
・Post Processing による絵の仕上げ
・Cinemachine によるカメラ制御
・ビルド成果物でのプロファイリング、アイコンなどのビルド設定

と、一つのトラック(5時間ほど)だけでも Unity 2018 でのプロトタイプ作成の一連の流れを学習できます。
Unity をこれから勉強する人はこれ見ると効率が良い(有料だけど)

意欲的な人でも動画の 2倍の時間はかかるので、最低でも48時間ほど時間を確保する必要があります。
何の予定もない方でも基礎編を受講し終えるまで最低でも 1週間は必要です。
学校や会社勤めの方は週に1日確保できたとして 1ヶ月半は基礎の学習に時間を要することでしょう。

Unity 関連の記事を定期的に読む

基礎編を終えた後、Unity Game Dev Courses はさらに職種ごとに深堀りした Programmer 向けコース、Artist 向けコース、Game Designer コースに分かれ
動画時間も 60 時間と、基礎編の比ではない量が用意されています…まじめに全部見ていくと簡単に半年が経過してしまいますが…

私は Programmer 向けの動画を見終わったあたりで、そろそろ机の前に座って見続けることが辛いと思うようになってきました。

そろそろ Unity での開発の仕方がわかってきた頃なので、様々な Unity に関する記事を読んでいくと、理解もできますし、やる気が湧いてきます。
具体的には Twitter で Unity の情報を精力的に発信している方の反応を追うことを行いました。

Unity Technologies Japan にはエヴァンジェリストと呼ばれる方たちがいます。
Unite Tokyo というイベント(有料 3日間で 20,000円くらいかな)に参加すれば、エヴァンジェリストたちに会えますし
どういったチャンネルで情報発信しているかを知ることができます。(過去のイベント情報から、すぐに知ることもできます!)
そのほか、2018年からはアンバサダーに認定される方たちが増えました。

彼らの発する情報や、彼らが参照する情報を発信した人をフォローしていくと、毎日追いきれない Unity 最新、お役立ち情報を目にすることができます。

勉強ネタには困らない毎日が続くと思われます。

小中学生が私の記事を読んでいるとは思っていませんが、こういうイベントに子供の頃から参加して、自分の未来を考えて行動できたらきっと人生楽しいなぁと思います。
ぜひお年玉 5,000 円を 4年間貯金して、年1回開催される情報交換イベントのチケットを購入してみては?(ここ笑うところです。)

FPS Sample

Unity 関連記事でも話題に上る、Unity の技術サンプルです。
20GB のデータと、アセットのビルドに半日要するなど、扱いづらいサンプルですが
どうやって最新技術を使ってリアルタイム Online 対戦ゲームが作られているのか、技術と具体的な実装が見えた時
きっと初心者を脱して、Unity を使って様々なアイディアの実現について考えていける人になっているでしょう。

Best Practices

マニュアルを全読みする作業と共に、ここに示される Best Practices を読むと、よりプロフェッショナルな判断のもと、開発が進められるようになるかもしれません。
unity3d.com

まとめ

・Unity Game Dev Courses で一本通してゲーム開発を模倣学習する(猿真似する)
エヴァンジェリストの方たちの発する Unity 関連の記事を定期的に読む習慣をつける
FPS Sample(今後も Unity 最新機能が入っていくサンプル)を読み解いて、具体的な実装についても理解する
・Best Practices の知識を使って落とし穴から脱出する

あとは、思いついたアイディアを形にしていく毎日を送る、ですかね?

毎日がクリエイティブで楽しいです!

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 みたいな機能があったらいいなと思う人たちに、有益な情報として伝わるといいな