やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Roppongi.unity#5 in メルカリ@六本木ヒルズ に行ってきました #roppongiunity

メルカリさんで行われた、Roppongi.unity #5 in メルカリ@六本木ヒルズに行ってきました。

roppongiunity.connpass.com

以下、雑なメモ。スライドは拾えたものだけ。

楽しい!LWRP + 2D Light @lycoris102

speakerdeck.com

  • 新規プロジェクトのテンプレにLWRPがある
  • 既存プロジェクトでは、PackageManagerで追加 → コンテキストメニューでLWRPアセットを追加 → Settings > Graphics で選択できるようになる
  • 2D Renderer
  • Global light 2D
    • sorting layer単位に適用できる
  • Point light 2D

Unityでブロックチェーンアプリを作る @takayukib

  • 分散DBとの違い:非中央集権、改ざん耐性あり
  • .NET向けライブラリがあり、Unityからも使える

nethereum.com

ぼくとAddressablesの戦いの歴史 @akinama3

  • fast/virtual/packed mode
  • 0.1.2のとき
    • バグを報告してエコシステムに貢献するぞ!
  • 0.2.1
    • 破壊的変更
  • 0.3.4
    • 破壊的変更
  • 0.5.x
    • 自分で実装することを考えはじめた
  • Mini Addressablesを作ってみた → 無事リリース
  • previewが外れたらしいのでまた触ってみたい

Zenject.SceneTestFixtureと向き合った @naninuneno_y

speakerdeck.com

LINQ to NativeArray @pCYSl5EDgo

speakerdeck.com

github.com

  • NativeArray GCが一切走らない
  • LINQ WhereでGC Allocate
  • UniNativeLinqを作った
    • MIT, GPLv3
    • manifest.jsonに追加すれば使える
  • AsRefEnumerable()
  • の戻りが参照
  • byteへの変換が簡単
  • LINQより30%高速
  • unmanagedな総称型もある程度使える

Unity花火ワークショップ(小中学生)をやった件について。 @tomotomospot

docs.google.com

  • ゲームエフェクトに興味のあるお子さんが発端
  • 参加者:パーティクル作るだけ
  • モニターorスクリーンで上映会
  • ほかの.unity立ち上げ。参加者・登壇者ともに募集中*1。岩手も深夜バスを使えば安く行ける

iwateunity.connpass.com

yokohamaunity.connpass.com

Visual Scripting ライブラリ「UniFlow」のご紹介 @monry

speakerdeck.com

github.com

  • 処理の逐次実行
  • イベント待受
  • シグナルによるドメイン接続
  • を、UIElementsのGraphViewでやるライブラリを作った
  • MIT License
  • AssetBundle/Addressableにも対応
  • UPMでも提供
  • UnityでできることはUniFlowで、できないことはC#

Animation Riggingで簡単リアルタイムリターゲット @karukaru

speakerdeck.com

  • ボーンの異なるHumanoidに同じアニメーションを適用したい
  • モーキャプのデータは直接ボーンに設定するので、Mecanimのリターゲット機能が使えない
  • 脚が浮いている、接地感がない
  • Animation Rigging
  • multi position constraint: Hipの移動に利用
    • 最大1fだが、position constraintを挟むことで1fを超える値を設定可能
  • multi rotation constraint
  • Animator.HumanScaleを利用して移動量の倍率を変える
  • Animaiton Riggingにはヒューマノイドに必要なものはだいたいある。足りなければ自分で書ける

展示

@warapuriさんの『立体視VRで巨人体験』だけ体験。以前、自分で似たようなもの作ったときはIPD(瞳孔間距離)を大きくしても巨大感が出なかった(ただ飛び上がったように見えた)のですが、こちらはかなり巨大感ありました*2。あとなんかビームが撃てて最高。

所感

すっかりLT会形式が定着した".unity"ですが、機能が多いUnityにはとても合っている形式だと思っています。今回も普段触れない機能やライブラリ、preview packageの話など聞けて楽しかった。

Roppongi.unityも、Gotanda.unityに続いて "流浪の.unity" となるのか、今後の動向に注目ですね。

*1:yokohama.unityにはLT登壇で申し込みました!

*2:IPDはだいぶ大きく取っているという話だったのと、実写なのが要因なのかも?

PlayFab Meetup#1 in Microsoftに行ってきました #PlayFab

日本マイクロソフトさんで行われた、PlayFab Meetup #1 in Microsoftに行ってきました。

connpass.com

以下、雑なメモ。スライドは拾えたものだけ。

Unite 振り返り - 日本マイクロソフト / 南

Unite 2019でのセッション振り返りと、+αのお話。

learning.unity3d.jp

Unity SDKはPlayFab公式サイトからダウンロードできるが、SDKを直接入れるよりもエディタ拡張機能を入れるのがおすすめ。ログイン後、エディタ拡張からSDKをインテグレーションできる。

docs.microsoft.com

PlayFab with HoloLens - JackMasaki

  • PlayFabは様々なユーザ認証APIが提供されているが、Twitterログインは無い
  • xRはID・パスワードの入力がつらい
  • HoloLensのUDIDは使えない
  • xRではLoginWithEmailAddressがベターでは

PlayFab:現実のお金とゲーム内仮想通貨 - Simplestar

スライド: PlayFab:現実のお金とゲーム内仮想通貨

  • 課金プラットフォームざっくり比較してみた
    • Game Sparks: モバイル特化みたい(に見えた)
    • Firebase: Stripeというサービスも使わなければならず、めんどくさそう
    • PlayFabならPayPalが使える
  • Add-ons > PayPal
    • マーチャントID、return linkを設定
  • ゲーム内通貨
    • Economy > Currency > new Currency で追加
    • 通貨コード2桁を指定
  • カタログ:リアルマネーとゲーム内通貨の交換レートを定義。Catalog Bundleを使うと便利
  • PayPalは自分のビジネスアカウントと同一アカウントから支払えない
  • PayPalの履歴には、ゲームタイトルの名前で入る
  • PayPalでUSDをJPYに変換してから払い出し。5営業日くらいで出金(銀行口座に入金)される

リアルタイムコマンドバトルのゲームで PlayFab を使ってみた - 南

www.slideshare.net

  • ゲーム会社でサーバサイド → 辞めてWeb企業に入ったので、個人開発で一式自前で作ってみた
  • コストなどの問題
  • まずDataStoreをPlayFabに移行
  • C# SDK
    • Unity SDKと異なりWebGLとかで動かないが、async/awaitが使えたりする
  • Game Server
    • アウトゲーム系、RESTのものは移行できる
    • gRPCなどリアルタイム系は以前のまま
      • ロードマップではPubSubがprivate previewなのでそのうち
    • 自前サーバコードのホスティングもできない
      • public previewの機能でできそうなのでそのうち
  • まとめ
    • 無料のDataStoreとしてだけでもメリットはある
    • ランキング、マッチング、ショップ
    • リアルタイム通信はまだできない

PlayFabのカタログとマスタデータ - Yoshitaka Kimisaki

スライド: PlayFabのカタログとマスタデータ

  • PlayFabのタイトルデータは、KVSでValue=json。このままマスター管理するのはつらい
  • テーブルで管理したい
  • Airtable というWebサービスを使った
    • Google Spread Sheetのようにブラウザで編集できる
    • APIアクセスできるので、AirtableからPlayFabにデータを移すスクリプトを書けばいい
  • mBaaSの不得手なところは頑張らない

airtable.com

PlayFab の最新ロードマップについて - 梅津(日本マイクロソフト

先日公開されたロードマップについての説明

blog.playfab.com

Whats' new

直近の予定

  • 中国本土での一分機能利用
  • マルチプレイサーバ関係
  • C#CloudScriptの実装、年内予定

2020前半の予定

  • 中国本土での全機能利用
  • User Generated Contentのパブリックプレビュー開始(マインクラフトで使っているもの)
  • PlayFab Insightの機能拡張
  • マルチプレイ、マッチング、パーティ、新しいランキングシステムの一般公開

所感

機能は多いし、大手の適用事例もあるし、安定のマイクロソフトさんに買収されたし、かなり有力なmBaaS*1なのではないでしょうか。

Unite 2019での齋藤さん・南さんのセッションは裏で自分が登壇だったので聴講できなかったのですが気になっていたサービスなので、良いタイミングで色々話を聞けてよかったです。

*1:モバイルに限らない気がするのでBaaSでいいのかも? でもモバイル向けのほうが機能が多いので包括してるのがmBaaS説も。むつかしい…

Unity Test RunnerのPlay Mode testsを実機上で実行する #UniteTokyo

9/25, 26に開催されたUnite Tokyo 2019の『Unity Test Runnerを活用して内部品質を向上しよう』というセッションの中で、テストはPlayer(Android端末など)でも実行できる旨をきちんとお伝えできていませんでした*1

以下の質問をいただいたので、これに回答する形でまとめます。

なお、本セッションのスライドはすでにUnity Learning Materialsで公開中。動画は後日公開される予定です。

learning.unity3d.jp togetter.com

セッション全体のフォローアップ記事はこちら。

www.nowsprinting.com

ネイティブプラグイン自体のテストについて

いきなりオフトピですが、ネイティブプラグイン自体のテストは、C++であればGoogletestXcodeを使ってC++のレイヤでユニットテストを書くべきです。

以下に紹介する、Unity Test RunnerのPlay Mode tests実機実行は素早く実行できるものではなく*2、Unityプロジェクトとのインテグレーション(結合・統合)を確認するためのテストケースだけに留めておくのが賢明です。

Play Mode testsをPlayer(実機)で実行する

Test Runnerウィンドウ

Play Mode testsは、Player(実機)で実行することができます。逆に言うと、Edit Mode testsは実行できません。しかし、すべてのテストを実機で実行する必要はないはずですので、一般的なロジックのテストはEdit Modeで、特別に実機でも動作させたいテスト*3のみPlay Modeで書くことをおすすめします。

ビルドターゲットを"Android"に切り替えた状態でTest RunnerウィンドウのPlayModeタブを開くと、右上に "Run all in player(Android)" と書かれたボタンが表示されます。 Android端末をUSB接続した状態でこのボタンをクリックすると、すべてのPlay ModeテストがAndroid端末上で実行されます*4

f:id:nowsprinting:20191001091335p:plain

コマンドライン

コマンドラインからのテスト実行では、引数-testPlatformに(playmodeの代わりに)実行するBuildTarget文字列を指定することで実行できます。

特定プラットフォームでのみ実行されるテスト

「このテストコードは特定のプラットフォームでのみ実行したい」というケースがあるはずです。 その場合、テストメソッドに[UnityPlatform()] アトリビュートを付与し、引数にRuntimePlatformを指定できます。

下例の場合、Test RunnerウィンドウではPlay Modeで”Run all in player(Android)”をクリックしたときのみ、コマンドラインでは引数に-testPlatform Androidを指定したときのみ実行されます。

/// <summary>
/// Android playerでのみ実行されるテスト
/// </summary>
[Test]
[UnityPlatform(RuntimePlatform.Android)]
public void RunOnlyAndroid()
{
    var platform = Application.platform;
    Assert.That(platform, Is.EqualTo(RuntimePlatform.Android));
}

なお、[UnityPlatform]アトリビュートに指定するのは、RuntimePlatformです。 コマンドライン引数-testPlatformに指定するBuildTargetとは文字列が異なるものもありますので注意してください。

iOS Playerの場合

今回Androidを例にしました。iOSの場合、例の如くXcodeプロジェクトが生成されてXcodeが起動します。このときiOS端末がUSB接続されていれば、そのまま自動でインストール・実行されます。

ただし、iOS端末は開発機としてUDIDが登録されているもので、Unityプロジェクト側にTeam IDが設定されている必要があります(要するに普通にXcodeでアプリをBuild and Runできるようにしておく必要があります)。 [1/14追記]

*1:スライドp.34には「Player(実機)」とだけ書いてありましたが特に触れなかった模様

*2:Play Mode testsが遅いだけでなく、実機で動作させるためのビルドが行われます

*3:ネイティブプラグインのほか、パフォーマンス計測など

*4:以前はUnityエディタを起動しているPCとAndroid端末が同じLAN(セグメント)に接続されていなければテスト実行結果がTest Runnerウィンドウに反映されなかったはずですが、Unity 2018.4ではUSB接続だけで反映されました

Unite Tokyo 2019『Unity Test Runnerを活用して内部品質を向上しよう』のフォローアップ #UniteTokyo

9/25, 26に開催されたUnite Tokyo 2019 Day 2に『Unity Test Runnerを活用して内部品質を向上しよう』というタイトルで登壇させていただきました。

スライドはすでにUnity Learning Materialsで公開中。動画は後日公開される予定です。

learning.unity3d.jp togetter.com

以下、説明が足りなかったところ、質疑応答やTwitterでコメントいただいた点など補足していきます。

CEDEC 2019『組織にテストを書く文化を根付かせる戦略と戦術』 (p.6)

いきなり、TDD(テスト駆動開発)の大家、@t_wadaさんによるCEDEC 2019でのセッションを紹介しました。 私はUnity製ゲームに特化した話をしましたが、そのベースとなる、より一般的な視点での開発者テストについて語られています。 ぜひ併せて読んでいただくことをおすすめします。

cedil.cesa.or.jp

当日「すでに見た」という方に挙手いただきましたが、2割いないくらいで驚きました。こちらを見てテストに興味を持って来る方が大多数だと思っていたので、その前段階なしでテストのセッションに興味を持ってたくさん来ていただいたのは良い意味で予想外でした。

Unity Test Framework (p.33)

Unity 2019.2からUnity Test Runnerがpackage化されたことに触れましたが、それにまつわる変更についてコメントいただきましたので確認して別記事にまとめました。

www.nowsprinting.com

Player(実機)でのテスト実行 (p.34)

実機でのテスト実行についてセッションで触れなかったので、別記事にまとめました【10.2追記】

www.nowsprinting.com

インテグレーションテスト (p.52)

スライドで紹介した、Sceneベースのテストフレームワークはこちら。

github.com gitlab.com

AltUnityTesterについては、以前Gotanda.unityでお話したスライドも参考にしてください。

www.slideshare.net

インライン化 (p.65)

これはきちんと検証できていないので情報のみですが、インライン化してほしいメソッドに [MethodImpl(MethodImplOptions.AggressiveInlining)] アノテーションをつけることで積極的なインライン化を指示できるはずです。

ただし、Unityエディタ上では無効、MonoおよびIL2CPPでは有効なようです。

このあたり情報源はForumのこのスレッドを読んだだけなので、追って検証していくつもりです。

検証しました。次の記事を参照してください。 [2021/12/16追記] www.nowsprinting.com

AllocatingGCMemory (p.68)

Unity 2018.3で追加されたAPIです。ドキュメントはこちら。

Class AllocatingGCMemoryConstraint | Test Framework | 1.1.30

使用例はこんな感じ。下はsut.UsePrimitive()の中でGCされるメモリ(ヒープ)を確保していたら(Is.Notなので)failするテストです。

[Test]
public void UsePrimitive_isNotAllocatingGCMemory()
{
    Assert.That(() => sut.UsePrimitive(), Is.Not.AllocatingGCMemory());
}

AllocatingGCMemoryについては、お伝え忘れていた重要なトピックがあります。対象のメソッド内(上例ではUsePrimitive())でDebug.Log()を使用していると、その中でメモリ確保が行われるためfailしてしまいます。

性能を要求されるメソッド内でDebug.Log()を使うことは無いとは思うのですが、ご注意ください。

依存オブジェクト (p.70)

依存オブジェクトを持つコンポーネントのテストを行なうためのパターンとして、「Dependency Injectionパターン」や「Test Doubleパターン」があります。

そのパターンを踏まえて、少ないコードで実現させるフレームワークが存在します。確かに便利なのですが、ツール・フレームワークに振り回されることがないように、基本を知っておくことは大事です。

スライドでもご紹介した『xUnit Test Patterns』、Kindle版がセール中のようです。この機会に買って積んでみてはいかがでしょうか。

テストダブル (p.71)

Test Doubleパターンについては、@goyokiさんのこちらの記事が参考になります。

goyoki.hatenablog.com

もしくは拙著『iOSアプリテスト自動化入門』(絶版)がお手元にあれば、「2.3.5 テストダブル」を参照してください。

YAGNI (p.77)

Wikipediaさんにも載っているYAGNI*1。"You ain't gonna need it"の略で、今必要ないものは考えない・実装しない、という意味で使います。技術者なら言いたいセリフ「こんなこともあろうかと」とは対極にある言葉です。

ja.wikipedia.org

シンプルに「今は必要ないから考慮しない」という意味でも使えますが、テストコードがあることによって後々の仕様変更のコストとリスクが減るために取れる選択肢でもあります。

また、これはセッションでは取り上げなかったのですが、XPやアジャイル開発の文脈で言われる「ドキュメントは書かない」も、本来はテストコードがドキュメントの役割をなす "Test as Documentation" が前提だったりします。

境界値を攻めすぎない (p.80)

前提となる「境界値テスト」の話を端折ってしまったので補足します。

例えば、HPゲージが通常はグリーン、HP 50%以下はイエロー、HP 20%以下はレッド、という色を返すメソッドを例にします。

public static Color GaugeColor(int hp, int maxHp)
{
    var percent = hp / maxHp;
    if (percent <= 20)
    {
        return Color.red;
    }
    if (percent <= 50)
    {
        return Color.yellow;
    }
    return Color.green;
}

このとき、結果が分岐する条件となる入力値である「0〜20%」「21〜50%」「51〜100%」はテスト用語で「同値クラス」と呼ばれます。 そして同値クラス同士の隣接した値、ここでは 20, 21, 50, 51 が「境界値」です。

境界値にはバグが発生しやすいので*2、通常のテストではよく境界値のテストを実施します。しかしゲームの世界では、「やっぱりHP 30%で赤にしよう」といった変更もあるのではないでしょうか。

同じ境界値でも、「HPが0になったら死ぬ」といった境界値は厳密にテストしていいのですが、HPゲージの見た目であれば「10%」「40%」「80%」くらいのゆるい値でテストしておけば、最低限色が変わることは保証できますし、しきい値が調整されてもテストコードを修正する手間もありません。

つまり、境界値を厳密に評価する必要があるテストなのかどうか、という「出力」の見極めが大事ということです。

なお、上例では、引数がhp > maxHpmaxHp=0で呼ばれる可能性を考慮していません。テストを書く過程でこうしたことに気付けるケースもよくあります。

テストコードの構造化 (p.82)

@goyokiさんのスライドが参考になります。

www.slideshare.net

ただし、過度の構造化によってテストコードの可読性が損なわれたり、プロダクトコード側にテストのためのコードが紛れ込んでしまうアンチパターンもありますので注意が必要です。

あくまでも目的は、テストコードが壊れにくくなる、堅牢性 (robustness) のための構造化です。

質疑応答

講演後の質疑応答には10名ほど来てくださり、30分ほどQ&Aさせていただきました。以下、覚えている範囲で*3

Unity Test Runner以外のテストツール・フレームワークは使っていないのか?(Miyamasuとか)

  • ユニットテストとしてはEdit mode testsに絞っているので、Unity Test Runnerのみ
  • もう少し上層の(結合度の)テストは、ツールから分けている

MonoBehaviourのテストをどうしているか(Play mode testsでしかできないのか)

  • MonoBehaviourのテストであっても、Edit mode testsでのテストは可能
  • ただし、責務が分離されていないとテストしづらいのはお話した通り。コンポーネントごとの分離も必要だし、MonoBehaviourと、個々の処理を分離することも必要。例えば、Update()にすべて書くのではなくメソッドを分けていく
  • テスタビリティを上げるためのデザインパターンとしてHumble Object Patternが知られています。これも『xUnit Test Patterns』に書かれています

Humble Object Patternについては、@adarapataさんのスライドも参考になります。

www.slideshare.net

静的解析ツールはあるのか

  • JetBrainsさんが "ReSharper Command Line Tools" を提供しています。インスペクション、重複コードの検出、コードクリーンナップをコマンドラインから実行できます
  • 実行にUnityエディタライセンスもReSharperライセンスも不要ですが、WIndows版のみ

www.jetbrains.com

所感

テストのセッションということでどのくらい来ていただけるか不安でしたが、400人部屋の8割くらい埋まっていたように見えました。ありがとうございました。

セッションのほうは、後半急ぎ足になってしまい反省しています。これでも直前になっていくつかトピックを削ったりTipsにまわしたりしたのですが…。

なお、壇上から客席まで距離があり、かつ照明の関係で暗く、客席の反応がほとんどわからなかったので戸惑いました。冒頭で笑いを取ってペースを掴むのが常套手段なのですが、ウケているのかどうかわからないのはつらかったです。

Unite Tokyo 2019全体について。皆さんTwitter等で書かれていますが、とても素晴らしい会場とホスピタリティで、たいへん満足度の高いカンファレンスでした。スピーカー特典で利用できたVIPルームおよびVIP席もものすごく快適で、来年は登壇しなくてもVIPチケットは確保しようと心に決めました。

最後に。今回のUniteのセッション公募、気づいたのは締め切り4.5h前でした。@nkjzmさんに感謝。

参考文献

*1:読みは「ヤグニ」でいいはず。みんなそう言ってるので…

*2:実装以前に、仕様書の段階で「以下」と「未満」があいまいであったり矛盾があったりもありがちなバグです

*3:こんな質問もしたよ!というのがあればTwitter等で教えて下さい

Unity 2019.2からのUnity Test RunnerとUnity Test Framework #UniteTokyo

9/25, 26に開催されたUnite Tokyo 2019の『Unity Test Runnerを活用して内部品質を向上しよう』というセッションで、Unity Test RunnerがUnity 2019.2からpackage化されたことをお話ししました。

その際、以下の情報をいただいたので確認してみました。

なお、本セッションのスライドはすでにUnity Learning Materialsで公開中。動画は後日公開される予定です。

learning.unity3d.jp togetter.com

セッション全体のフォローアップ記事はこちら。

www.nowsprinting.com

Unity 2019.2のAssembly Definition Files

Unity 2019.2でのAssembly Definitionは次のようにインスペクタに表示されます。

f:id:nowsprinting:20190928122522p:plain:w400

たしかに"Test Assemblies"のチェックボックスは無くなり、かわりにUnityEngine.TestRunnerおよびUnityEditor.TestRunnerへの参照が追加されています。

しかし実際のasmdefファイルの中身は下記の通りで、Unity 2019.1以前と変わっていませんでした。Unity 2019.1以前からのマイグレーションでも、新規に作ったasmdefでも同様です。

{
    "name": "UniteSample-Test-EditMode",
    "references": [
        "UniteSample",
        "UniteSample-Editor"
    ],
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    (snip)
}

このあたりはUnityエディタのインスペクタ上の表示仕様であり*1、package化されたUnity Test Frameworkのバージョンには依存しないと思われますので、これ以上は追求しないことにします。

Play mode tests用テストコードを格納するフォルダとasmdefファイルは、Projectウィンドウで右クリック > Create > Testing > Tests Assembly Folder で作ることができます*2

Edit mode tests用フォルダは、以下いずれかの方法で作ることができます【9/30修正】

  • パスに/Editor/を含むフォルダ(asmdefファイル不要)
  • 任意のフォルダにasmdefを置き、Platformsの"Editor"をonにする*3

なお、UnityEngine.TestRunnerおよびUnityEditor.TestRunnerは、Unity Test Frameworkパッケージに含まれるアセンブリです。名称から、Play mode tests用とEdit mode tests用に分かれているように見えますが未検証です。

Rider Integrationとの相性

Unity 2019.2から、JetBrains Rider Integrationもpackage化され、プロジェクト内にpluginを置く必要がなくなりました*4

しかし、このRider Editor(com.unity.ide.rider)はTest Framework(com.unity.test-framework)に依存しており*5、バージョンの相性がありますので注意しましょう。

確認した範囲では、Rider Editorのバージョンを1.1.1に上げるとき、Test Frameworkも1.1.3以上に上げる必要があるようです。

*1:内部的にも参照方法が変わっているはずですが

*2:この方法、セッションで言ってなかったことにこの記事を書いていて気づきました…

*3:Unity 2019.1まではEdit mode testsでもTest Assembliesをonにする必要がありましたが、2019.2からは不要となりました

*4:普通のプロジェクトなら.gitignoreに書いておけばいいのですが、UPMパッケージに混ぜてpublishされてしまいがちだったので嬉しい

*5:Riderからテスト実行できるので当然といえば当然ですね

Unity++ 〜ショートセッション勉強会 presented by Unity部〜 #unity_pp に行ってきました

7/20(土)に開催された『Unity++ 〜ショートセッション勉強会 presented by Unity部〜』に行ってきました。

meetup.unity3d.jp

主催は日本Androidの会Unity部さん*1、会場はGINZA SIXのユニティ・テクノロジーズ・ジャパンさん。 スライドや動画は後日ユニティ・ジャパンさんのUnity Learning Materialsで配信されると思いますので、ごく簡単に。

Democratized Unity Package Manager

speakerdeck.com

  • Unity 2019.1からUnity Package Manager Scoped Registryが使えるようになった
  • Unity Package Managerは2017.2から導入
  • パッケージには4種類ある
    • 公式/verified
    • 公式/preview
    • 公式/built-in
    • 非公式 ← これを扱いやすくなった! 民主化
  • Package Name: reverse domain記法
  • Version: semver形式、previewもここで表現
  • Unity Version: 最低ver*2
  • Dependencies: 依存パッケージ
  • Registory: npm仕様
  • Scoped registory
    • package nameのスコープごとにRegistryを切り替えられる((uplinksで上位のレジストリを書くことでカスケードにもできるが、Scopedでのほうが様々な構成に対応できる)) -VerdaccioというOSSで簡単に立てられる
  • Package Manager UIには表示できないのでPackages/manifest.json直書きする
    • Removeはできる
  • Packageを作る
    • Assets/直下にpackage.jsonを置く
    • README.mdとかもAssets/直下に置く
    • asmdef必須
    • Documentation~直下に置くとメタファイルがつくられないのでべんり
    • Test Assembryがコンパイルされないバグ
  • 公開する
    • 認証を通す
    • ROOT/.npmrmにレジストリURLなどを書いておくと便利
    • $ npm publish
  • 詳しくはUNIBOOK 11(C96 4日目 南リ45a)で!
  • upm-packages.dev を立てた*3
  • Command line interface for Unity Package Manager を作った

補足

よーし、パパ Cinemachineを2Dプロジェクトに適応して遊んじゃうぞー

speakerdeck.com

  • プレイヤーにカメラを追従させる処理 → 親子にするなどで実現はできる
  • いい感じにしたい → Cinemachine
  • Unity 2017から、Package Managerでインストール可能
  • 遅延移動、プレイヤーの動きを先読み
  • 特定の範囲から外を見せたくない
    • コライダを設定できる
  • 複数カメラの切り替え、ブレンド
  • 複数ターゲットを収める(拡大縮小して収める): Target Group
  • カメラシェイク: Impuls Listener
  • ドキュメント充実してる+テラシュールブログも参考
  • [非公式] Unite Tokyo 2019 Eve2 LT Fes - connpassが8/2募集開始なのでよろしく

アクションゲームにおけるポーズ系演出の難しさと解決法

Preview機能のプレビュー 公式Localizationパッケージの今

Unity開発者が知っておきたい.NETのこと

speakerdeck.com

  • Scripting Backend
    • .NET 4.xが使える
  • Compatibility
    • .NET 4.x: dll大きい。動かないAPIもある
    • .NET Standard 2.0: dll小さい
  • .NET実装: ランタイム+クラスライブラリ
  • .NET Standard: 仕様・規格

Unity サウンドTips 2019

www.slideshare.net

  • 基礎的なことは 【Unite Tokyo 2018】Audio機能の基礎と実装テクニック 参照
  • Unityはサウンドエフェクトがややムズ
  • Audio Mixer とっつきにくいけど優秀
  • VR特有
    • 指向性:位置情報、直接音:パンニング、初期反射、
    • 360度から聞こえる音:ambisonics
  • VRサウンドSDK多すぎ問題:Oculus Audio SDKがほぼ正解
  • 罠: OculusSpatializerUnityコンポーネント
    • 単位がフィート
  • 処理はそれなりに重い。無理に使わなくてもパンニング+距離減衰だけでいいことも
  • CRI ADX2
    • 法人向け有償版、個人開発者向けLE
  • Audio DSP Graph
    • previewですらない。Megacityデモからコード抜いて調べた
    • 2-3年先では

書籍が8/27に発売されます

Unityサウンド エキスパート養成講座

Unityサウンド エキスパート養成講座

UniTask入門

speakerdeck.com

  • コルーチンの置き換え、戻り値を返せる
  • C#のTaskより軽い
  • UniRxよりはわかりやすい
  • C# 7以降
  • 生成
    • asyncの戻り
      • async UniTaskVoid: async voidの代わりに使える
    • UniTaskCompletionSource
    • (UniRxの)Observableから変換する
      • 必ず完了するObservableであること
      • ToObservableするとメインスレッドで動く
  • UniTask.Run, UniTask.Delayとか
  • UniTask.WhenAll: 型が違っても待てる
  • WhenAny: どれかひとつ終わったら抜ける
  • Awaiter
    • GetAwaiter()が生えてればawaitできる。拡張メソッドでもok
    • UniTaskはいろいろ提供している
  • UniTask.ToCoroutineでコルーチンに変換できる
  • SceneManager.LoadSceneAsync()とかを待てる
  • progressも取れる
  • OnCollisionEnterとかも
  • コルーチンの上位互換として使える
  • UniTask Tracker
  • UniTaskとキャンセル
    • CancellationToken
      • GetCancellationOnDestroy() べんり
    • OperationCanceledException: 投げるとUniTaskは「キャンセル状態」になる
      • エラーログには出ない
      • 外部からキャンセル要求があったとき
      • 下流で投げたら上までスルーして伝えること
      • 悪用しないこと
  • 標準Taskは必要がなければ使わないでok
  • Observable: イベント処理、結果が複数になるなら使う

カシスちゃんのグッズ発売中

所感

Unityはできることが多く、普段触らない分野の知識はなかなか入ってこないので、Gotanda.unityRoppongi.unityのようなLT、また今回のようなショートセッション形式で色々聞ける勉強会というのはとてもありがたいです。

似たようなインプットとしては、Unity Pro Tipsのメールマガジンもいいですね。ちょうど先日Cinemachineの記事を読んで興味を持っていたところでした。

いつもながら、企画・運営、そして登壇者のみなさんには感謝。

*1:当時、雨後の筍のようにたくさんあった「部」の数少ない生き残り。テスト部とか酒部とかVR部とかありました

*2:休憩のとき聞きましたが、rangeでは指定できないそうです

*3:ちょうど個人的に、ローカルにVerdaccio立ててもUnity Cloud Buildから使えないしなーと考えていたところだったので、使わせてもらおうかと

GitKraken v6.0リリースとIndividual料金プランの新設

マスコットキャラクターがたいへんかわいいと評判のGitクライアント"GitKraken"のバージョン6.0がリリースされました!

youtu.be

とりあえず触ってみたい! という方は、ぜひ下のリンクからサインアップして試してみてください。

www.gitkraken.com

主な変更点

爆速

起動やリポジトリを開くスピードがとても早くなりました。

起動時のたいへんかわいいアニメーションはいつまで見ていても飽きないのですが、それでも素早く作業に取り掛かれるほうが良いですね。

タブ

画面上部にタブが付き、複数のリポジトリを開いた状態で保持できるようになりました。

従来通りプルダウンでの切り替え操作もできますが、タブのほうが便利。

マージコンフリクト警告

PRをつくるときにマージ先とのコンフリクトを検出したら警告してくれるようになりました。

Individualプランの新設

これまで、Freeプランと$49/yのProプランの二択でしたが、$29/yのIndividualプランが新設されました!

Individualプランでは、従来Proでのみ可能だった以下の機能を使えます。

なお、複数プロファイル切り替え、GitHub Enterpriseの利用などは、これまで通りProプランが必要です。

免責事項

私はGitKraken Ambassadorであり、GitKraken開発元のAxosoft社の従業員ではありません。

I am a GitKraken Ambassador, not a paid employee of GitKraken by Axosoft.