simplestarの技術ブログ

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

Unity:オンラインVRM TPSゲーム作り作業ログ

■前書き
ローカルで動く TPS ってのは思い立てば、アセットを買って 2時間で完成してしまうものでした。
これをオンラインゲーム化する前に、VRM ファイルを動的に読み込んで、ルーム名を決めてオンラインルームに入室し

互いにチャットできるようにして、ローカルでのゲームと疎通確認まで済ませ、何のデータを送り合えばオンラインゲームになるのか
その土台と試験環境を作っていこうと思います。

■横道
とくになし

■本題
まずは Magic Onion でチャットできる部分を切り出して Unity に組み込みます。
疎通確認に関してはこちらの記事をなぞると良いかも
qiita.com

■技術詳細
MagicOnion\samples\ChatAppCodeLink\ChatApp.Unity\Assets 以下を
MagicOnion というフォルダ配下へ配置してインポート完了としました。

Scripts\ServerShared フォルダ以下のファイルに注目しました。
サンプルのままだと
Join, Leave, SendMessage のみ

SendMessage を真似て、Enum値とfloat値をコントローラの入力として与えるインタフェースを追加しました。

もしサーバーが情報を中継してくれるなら
自分以外のプレイヤーへ、プレイヤー名とキーと値を分配してくれるはず

その期待をもとに、プレイヤー名からゲームオブジェクトを特定するような Dictionary を作りました。
Dictionary に追加するタイミングは、自分のキャラクターだったら動的に VRM キャラを追加したときの VRM ルートオブジェクトを Join 時の名前をキーに追加し
他のプレイヤーが Join したタイミングで、そのキャラのデータから VRM を作り、これをそのキャラ名で追加するようにします。

もし、すでにルームに複数人のメンバーがいた場合は、Join したタイミングで、既存メンバー分の Join 通知が行われます。
それを実現するため、Join してきた新規ユーザーに向けて既存メンバーはキャラデータを送信します。

サーバーの実装が気になるけど、ユーザー名が重なっても受け取りてが判別できるような id を添えて受け取れるようになるとうれしい。
可能なのかな?

■技術調査手順
サーバー側の実装は、いったんブロードキャストで実行するようにしてローカルで動作を見てみましょう

ここで MagicOnion の共通インタフェースを編集したら、自動コード生成を噛まさなければならないことに気づかされました。
エディタ拡張のメニューから実行できましたが、コマンドラインとしては以下のものを実行する様子

/win-x64/moc.exe -i GameBase2019.1.Server.csproj -o MagicOnion.Generated.cs
/win-x64/mpc.exe -i Assembly-CSharp.csproj -o MessagePack.Generated.cs

exe ファイルはそれぞれここから入手するようにと
MagicOnion/samples at master · Cysharp/MagicOnion · GitHub
サンプルの README には書かれていましたね

Releases · Cysharp/MagicOnion · GitHub
Releases · neuecc/MessagePack-CSharp · GitHub

サーバー側の実装とビルドを通してから、パス設定を間違わなければ目的のコード生成は成功することを確認しました。

■技術調査2
動作を見る前に、ルームに入るタイミングで VRM のデータ byte 配列も渡すようにして
VRMファイル or url 指定と、ユーザー名でログインしてゲーム内に VRM を動的ロードできることを確認します。

そのためには、ファイル選択ダイアログとダウンロードですね

ファイル選択はこちらのアセットを利用(過去にBase18.3のときに使ったことを思い出して使います)
assetstore.unity.com
urlのダウンロードは UnityWebRequest
Networking.UnityWebRequest - Unity スクリプトリファレンス
を使います。

最後に技術詳細としてコード載せます

■実装中、都合の良いフローを考えた

ゲームを実行すると

プレイヤー名
VRMファイルパス or url

を入力するテキストインプット

ルーム名選択ドロップダウン(ディフォルト Pluto 一択)
Join Room ボタン

ステータス:メッセージテキスト
(プレイヤー名とVRMファイル or url を指定してください
VRM はどVroidHUB などから取ってこれます、参考 url は…)

一度プレイヤー名とファイルパスを入力して Join したら Prefs だかで、記録して
次回起動時は初期値として入れる

Join Room ボタンを押した時、一端 VRM ファイルパス or url で
もし url ならダウンロードして、unity の永続ファイル保管場所に保存、パスに切り替えて記録
それ以外なら直接読み込んで、同じくunity の永続ファイル保管場所に保存、パスに切り替えて記録

もし vrm ファイルが正しく読めなかったら、エラーメッセージをステータステキストに赤で表示して
やり直し

もし vrm が正しければそのままゲームオブジェクトに色々コンポーネントを追加してゲームシーンへ

ひとまずこの企画通りに実装してみます。

■実装してわかったこと

テキストメッシュPRO で日本語入力できない
なんで?どうやって直る?
qiita.com
ここの手順で解決、理解もした

otf ファイルを無料で取得しました。
取得元はこちら
github.com
SourceHanSans-Normal.otf ファイルを適当に見つけて Unity に配置してみました。

使った CustomRange はこちら

32-128,12288-12543,12448-12543,65280-65519,,19968,19971,19977,19978,19979,20013,20061,20108,20116,20154,20241,20808,20837,20843,20845,20870,20986,21147,21313,21315,21475,21491,21517,22235,22303,22805,22823,22825,22899,23376,23383,23398,23567,23665,24029,24038,24180,25163,25991,26085,26089,26376,26408,26412,26449,26519,26657,26862,27491,27671,27700,28779,29356,29577,29579,29983,30000,30007,30010,30333,30334,30446,30707,31354,31435,31481,31992,32819,33457,33609,34411,35211,35997,36196,36275,36554,37329,38632,38738,38899,19975,20024,20132,20140,20170,20250,20307,20309,20316,20803,20804,20809,20844,20869,20908,20992,20998,20999,21069,21271,21320,21322,21335,21407,21451,21476,21488,21512,21516,22238,22259,22269,22290,22320,22580,22768,22770,22799,22806,22810,22812,22826,22969,22985,23460,23478,23546,23569,23721,24037,24066,24112,24195,24215,24339,24341,24351,24369,24375,24403,24418,24460,24515,24605,25144,25165,25945,25968,26032,26041,26126,26143,26149,26172,26178,26228,26332,26360,26397,26469,26481,27005,27468,27490,27497,27597,27598,27611,27744,27773,27963,28023,28857,29238,29275,29702,29992,30011,30058,30452,30690,30693,31038,31179,31185,31572,31639,31859,32025,32048,32068,32117,32218,32701,32771,32862,32905,33258,33337,33394,33590,34892,35199,35242,35282,35328,35336,35352,35441,35486,35501,35895,36023,36208,36817,36890,36913,36947,36960,37324,37326,38263,38272,38291,38634,38642,38651,38957,38996,39080,39135,39318,39340,39640,39770,40165,40180,40614,40644,40658,19969,19990,20001,20027,20055,20104,20107,20181,20182,20195,20303,20351,20418,20493,20840,20855,20889,21015,21161,21193,21205,21213,21270,21306,21307,21435,21453,21462,21463,21495,21521,21531,21619,21629,21644,21697,21729,21830,21839,22338,22830,22987,22996,23432,23433,23450,23455,23458,23470,23487,23506,23550,23616,23627,23736,23798,24030,24115,24179,24184,24230,24235,24237,24335,24441,24453,24613,24687,24746,24754,24819,24847,24863,25152,25171,25237,25342,25345,25351,25918,25972,26053,26063,26132,26157,26257,26263,26354,26377,26381,26399,26495,26609,26681,26893,26989,27096,27178,27211,27425,27503,27515,27703,27770,27833,27874,27880,27891,27915,27969,28040,28145,28201,28207,28246,28271,28450,28845,29289,29699,30001,30003,30028,30033,30149,30330,30331,30382,30399,30456,30476,30495,30528,30701,30740,31036,31070,31085,31119,31186,31350,31456,31461,31515,31532,31558,31561,31665,32026,32066,32209,32244,32650,32654,32722,32773,32946,33510,33655,33853,33865,34220,34880,34920,35433,35519,35527,35910,36000,36215,36335,36523,36578,36605,36786,36820,36861,36865,36895,36914,36938,36939,37096,37117,37197,37202,37325,37444,37504,38283,38498,38525,38542,38598,38754,38988,39154,39208,39365,40763,19981,20105,20184,20196,20197,20210,20253,20301,20302,20363,20415,20449,20489,20505,20511,20572,20581,20596,20685,20740,20806,20816,20849,20853,20856,20919,21021,21029,21033,21047,21103,21151,21152,21162,21172,21191,21253,21330,21332,21336,21338,21360,21442,21490,21496,21508,21578,21608,21809,21916,22120,22258,22266,22411,22530,22633,22763,22793,22827,22833,22909,23395,23403,23436,23448,23475,23519,24035,24046,24076,24109,24111,24213,24220,24247,24314,24452,24466,24471,24517,24565,24859,25104,25126,25240,25369,25913,25937,25943,25955,26009,26071,26152,26223,26368,26395,26410,26411,26413,26448,26463,26494,26524,26628,26696,26757,26800,26997,27161,27231,27424,27508,27531,27578,27602,27663,27665,27714,27835,27861,27875,27973,28020,28165,28288,28417,28783,28961,28982,28988,29031,29105,29287,29305,29987,30340,30465,31069,31080,31278,31309,31478,31505,31649,31680,31881,32000,32004,32080,32102,32154,32622,32769,32963,33032,33144,33251,33322,33391,33464,33469,33521,33756,34903,34915,35201,35226,35251,35347,35430,35500,35506,35696,35937,36008,36015,36027,36062,36557,36650,36766,36794,36899,36948,36984,37089,37327,37682,37857,38306,38520,38538,38745,38918,39000,39006,39131,39151,39178,39443,20037,20175,20206,20214,20219,20284,20313,20385,20445,20462,20469,20491,20633,20687,20877,21002,21028,21046,21048,21063,21177,21209,21218,21402,21477,21487,21942,22240,22243,22311,22312,22343,22522,22577,22659,22675,22679,22818,22971,23142,23481,23492,23500,23566,23621,23646,24067,24107,24120,24185,24207,24321,24373,24448,24489,24499,24535,24540,24555,24615,24681,24773,24907,24931,25215,25216,25307,25480,25505,25509,25552,25613,25903,25919,25925,25973,26029,26087,26131,26292,26465,26525,26619,26684,26716,26908,27083,27494,27604,27704,27827,28082,28151,28187,28204,28310,28436,28500,28797,29123,29256,29359,29366,29420,29575,29694,30041,30053,30410,30524,30772,30906,31034,31062,31105,31227,31243,31246,31689,31934,32032,32076,32113,32118,32191,32207,32232,32318,32340,32618,32676,32681,32789,32887,32933,33021,33288,33292,33294,34899,34907,35069,35079,35215,35299,35373,35377,35388,35413,35611,35613,35672,35703,35914,36001,36007,36012,36024,36031,36032,36039,36059,36074,36664,36848,36855,36864,36870,36896,36942,36969,37240,37489,37509,37549,38450,38480,38522,38555,38609,38750,38928,38936,38989,39164,20006,20081,20083,20129,20161,20379,20467,20516,20663,20778,20826,20874,20966,21051,21106,21109,21127,21220,21361,21365,21427,21454,21518,21542,21560,21628,21892,22256,22402,22478,22495,22863,22894,23039,23384,23389,23429,23431,23447,23449,23453,23459,23494,23544,23554,23556,23558,23562,23601,23610,23626,23637,23652,24049,24059,24149,24178,24188,24193,24231,24310,24459,24467,24536,24544,25010,25105,25209,25285,25309,25313,25448,25506,25512,25582,25805,25964,26144,26217,26262,26286,26391,26426,26522,26579,26666,26834,27169,27177,27193,27442,27573,27839,27849,27927,27966,28168,28304,28526,28608,28784,29087,29255,29677,30064,30097,30171,30343,30427,30431,30475,30722,30913,31169,31192,31296,31348,31379,31563,31574,31777,31958,31995,32005,32013,32020,32121,32294,32302,32626,32716,32854,32954,32972,33016,33075,33145,33235,33256,33267,33509,33879,33976,34101,34453,34886,35009,35013,35023,35036,35222,35239,35342,35370,35379,35422,35468,35469,35477,35488,35492,35542,35576,35686,36020,36035,36986,37109,37111,37341,37628,38281,38307,38477,38491,38500,38556,38627,38761,38914,39592,19976,19982,19988,19992,19993,20025,20047,20057,20094,20102,20114,20117,20124,20139,20141,20171,20185,20208,20225,20239,20240,20271,20276,20280,20282,20294,20304,20339,20341,20365,20381,20398,20399,20405,20419,20426,20439,20472,20498,20515,20523,20537,20553,20559,20597,20598,20605,20621,20625,20632,20652,20661,20670,20693,20698,20711,20736,20754,20767,20805,20811,20813,20860,20882,20887,20896,20934,20941,20957,20961,20982,20984,20985,20995,21000,21009,21040,21050,21066,21078,21083,21091,21092,21104,21155,21169,21182,21189,21208,21215,21223,21234,21242,21249,21280,21305,21311,21319,21329,21331,21344,21363,21364,21368,21380,21400,21448,21450,21452,21460,21465,21483,21484,21513,21519,21520,21535,21547,21561,21576,21577,21682,21696,21746,21766,21767,21776,21807,21843,21914,21917,21930,21931,21987,22022,22065,22132,22151,22234,22287,22346,22353,22378,22435,22475,22519,22521,22528,22533,22549,22564,22570,22592,22593,22602,22609,22612,22615,22618,22654,22684,22696,22707,22718,22721,22727,22730,22732,22766,22769,22855,22857,22865,22868,22885,22888,22890,22900,22914,22915,22916,22922,22937,22949,22952,22995,23019,23035,23041,23064,23072,23087,23110,23130,23167,23186,23233,23244,23265,23330,23380,23396,23452,23472,23476,23477,23490,23515,23517,23521,23527,23529,23534,23551,23553,23561,23563,23578,23612,23613,23614,23615,23624,23653,23663,23696,23724,23731,23776,23777,23792,23815,23822,23849,24033,24039,24040,24070,24093,24101,24125,24133,24163,24187,24189,24190,24202,24246,24248,24259,24265,24266,24311,24330,24336,24340,24358,24359,24382,24425,24427,24432,24433,24444,24449,24464,24481,24490,24494,24500,24505,24524,24525,24537,24594,24598,24608,24618,24651,24656,24658,24677,24680,24685,24693,24724,24735,24736,24739,24742,24745,24764,24785,24796,24808,24816,24833,24841,24858,24904,24908,24910,24917,24930,24936,24942,24944,24950,24962,24974,24996,25001,25014,25022,25031,25040,25074,25080,25106,25135,25147,25151,25159,25161,25173,25201,25206,25220,25226,25233,25239,25244,25246,25259,25265,25269,25273,25276,25277,25293,25296,25298,25299,25304,25305,25312,25324,25335,25361,25375,25391,25407,25429,25436,25454,25475,25484,25490,25496,25499,25511,25514,25522,25551,25562,25563,25569,25588,25594,25644,25645,25658,25662,25666,25688,25705,25731,25764,25774,25778,25793,25830,25836,25915,25935,25954,25975,25993,25998,26007,26012,26020,26021,26045,26059,26082,26088,26092,26118,26119,26159,26222,26230,26241,26247,26278,26283,26311,26356,26361,26367,26389,26417,26420,26429,26441,26479,26512,26528,26530,26543,26550,26564,26576,26580,26611,26643,26680,26685,26691,26705,26719,26820,26827,26842,26847,26874,27004,27010,27133,27396,27431,27450,27454,27475,27507,27529,27530,27542,27572,27579,27583,27713,27735,27738,27743,27784,27798,27809,27810,27832,27836,27841,27850,27852,27873,27877,27888,27934,27941,27946,27972,27996,28006,28010,28014,28024,28057,28079,28092,28113,28129,28155,28167,28169,28171,28179,28193,28198,28286,28287,28317,28342,28357,28363,28369,28381,28382,28404,28418,28422,28431,28448,28459,28460,28472,28508,28511,28516,28548,28609,28611,28651,28655,28716,28809,28810,28814,28858,28872,28966,29017,29033,29038,29128,29157,29190,29237,29298,29344,29378,29417,29421,29467,29471,29483,29486,29494,29503,29508,29539,29554,29572,29645,29664,29748,29872,29885,29942,29976,29978,30002,30036,30044,30045,30067,30094,30123,30130,30142,30151,30168,30178,30196,30274,30290,30294,30342,30406,30423,30435,30436,30450,30462,30496,30522,30561,30563,30636,30683,30703,30741,30770,30813,30827,30828,30849,30865,30952,30977,30990,31048,31049,31077,31109,31117,31168,31199,31209,31216,31258,31282,31292,31295,31298,31311,31339,31361,31363,31378,31406,31407,31452,31471,31526,31570,31623,31684,31716,31807,31821,31883,31890,31895,31896,31899,31911,31975,31998,32011,32027,32033,32034,32043,32047,32051,32057,32058,32094,32097,32153,32173,32177,32178,32202,32210,32224,32233,32239,32257,32260,32283,32299,32321,32330,32341,32365,32368,32566,32624,32631,32645,32705,32763,32764,32784,32791,32884,32908,32918,32925,32930,32937,32938,32943,32966,32974,32990,33012,33026,33029,33050,33073,33081,33104,33109,33136,33178,33180,33192,33261,33268,33303,33310,33311,33324,33334,33351,33382,33419,33437,33459,33495,33538,33550,33618,33624,33738,33740,33747,33775,33900,33988,34180,34214,34218,34219,34281,34299,34384,34394,34396,34398,34442,34503,34509,34542,34701,34909,34913,34928,34935,34955,34987,35010,35029,35064,35088,35090,35167,35186,35206,35207,35302,35330,35351,35359,35380,35386,35408,35412,35424,35440,35442,35443,35463,35465,35475,35480,35531,35565,35566,35582,35584,35585,35588,35609,35617,35641,35676,35698,35930,35946,35998,36002,36009,36011,36036,36042,36051,36060,36064,36066,36070,36092,36104,36198,36212,36229,36234,36259,36317,36321,36339,36341,36362,36367,36493,36556,36562,36575,36600,36611,36617,36637,36649,36676,36763,36785,36796,36805,36814,36843,36845,36867,36879,36880,36883,36884,36893,36910,36920,36930,36933,36935,36941,36949,36963,36973,36974,36981,36983,36991,36996,37030,37034,37048,37066,37070,37101,37196,37204,37218,37226,37228,37237,37239,37276,37304,37320,37347,37389,37428,37467,37474,37507,37521,37528,37613,37619,37656,37664,37676,37679,37723,37782,37806,37912,37969,38289,38309,38322,38360,38459,38468,38499,38501,38506,38512,38515,38517,38518,38533,38534,38543,38548,38560,38563,38583,38587,38596,38597,38599,38604,38626,38640,38646,38647,38656,38663,38666,38684,38695,38706,38772,38907,38911,38917,38929,38930,38971,38972,38997,39015,39138,39165,39166,39187,39321,39364,39366,39376,39438,39442,39472,39514,39620,39658,39740,39746,39749,39764,39854,39912,40335,40599,40635,40665,40723,40802,20018,20028,20062,20096,20238,20406,20474,20658,20677,20901,20918,20932,21049,21085,21187,21246,21250,21489,21570,21610,21693,21754,21764,21822,21897,21929,21957,22066,22524,22534,22622,22625,22856,22934,22956,23195,23241,23451,23611,23713,23830,23888,24062,24324,24357,24409,24616,24675,24807,24900,24999,25004,25114,25140,25289,25325,25331,25334,25384,25387,25417,25431,25467,25711,26001,26028,26086,26106,26151,26326,26365,26517,26613,26623,26627,26689,26775,26792,26885,26894,26999,27584,27710,27726,27760,27779,27801,28139,28263,28346,28528,29006,29066,29226,29245,29273,29401,29609,29792,29827,29863,29926,30031,30079,30165,30185,30221,30473,30566,30637,30643,31293,31391,31627,31672,31840,32187,32251,32629,32670,32680,32920,32929,33031,33034,33102,33131,33146,33181,33203,33222,33276,33335,33398,33455,33499,33576,33806,33883,33995,34065,34109,34253,34276,34382,34425,34562,34588,34966,35070,35331,35427,35438,35504,35558,35559,35598,35980,36010,36028,36034,36077,36394,36468,36771,36956,36961,37027,37198,37266,37319,37340,37670,37678,37707,37749,37772,38343,38428,38442,38553,38867,38915,38920,38931,38960,38990,39173,39180,39378,39608,39729,40372,40575,40595,40634

エラーいくつか出たけど、無視しました
チャットとかには TextMesh Pro は使わない方が良いかも?
警告もうるさいので メニュー Edit > Project Settings > TextMesh Pro Settings の順に選択して Disable Warring 的なフラグにチェックして黙らせました

UI はこんな感じで配置したよ

f:id:simplestar_tech:20190501134239p:plain
UI

この Browse ボタンを押すとファイル選択ダイアログが出るようにしてみました。
ブラウズしたときは、直接そのパスを設定するようにします。

URL ダウンロード実装しようとしたけど、VRoid Hub などでは、一時アクセス url しか提供してくれませんでした。
仕方ない、今は必ずローカルにファイルがあることを前提に進めます。

色々文言とロジックが修正されますね。

Magic Onion で bytes の送受信できるか試験したところ
Clinent が受け取る byte が null だった

どこに問題があるのか調べます。

メッセージオブジェクトの構造体のメンバが byte を許してなかった
ふつうに RPC の引数で byte[] 使うと、クライアントサーバー間でバイト配列データのやりとりができました。

送受信したデータに間違いがないことも確認済み

あれ、たまたま小さい vrm データを送受信に使ったからかな
3 MB 程度なら問題なかったけど
40 MB くらいになると必ず失敗するようになってしまった。

大きいサイズは送れないのかな
調べます。

gRPCで4MB以上のデータ転送をしようとすると失敗するのは仕様らしい

一つの byte 配列だからダメ?と思って分割コード書いてみたけどダメでした

const int blockSize = 1048576<202c>;
for (int offset = 0; offset < vrmData.Length; offset += blockSize)
{
    int lastSize = blockSize > vrmData.Length - offset ? vrmData.Length - offset : blockSize;
    byte[] data = new byte[lastSize];
    Array.Copy(vrmData, offset, data, 0, lastSize);
    bytes.Add(data);
}

それ以上大きいデータは別の方法を考えろとのことなので
一度 Amazon S3 にアップロードしてから、これを各自クライアントがダウンロードするようにしてみます。

Unity クライアントから AWS 接続できるようにする方法はこちらで確認済み
qiita.com

となると、ログイン ログアウトの機構も必要になってくるし
ログインユーザーのみ書き込み可能な権限の設定など、調べることが増えてしまった。

いずれはクリアしないといけないと思ったことが、まさかこんなにも早く訪れるとは
仕方ない、未開の知を広げていきますか

■S3のUserPoolごとの権限付与の方法?
安全を期すなら、クライアントから直接行えるのはダウンロードまでとしたいが、どうしてもアップロードも含めないといまくいかなそう
せめて、ユーザーが書き込めるバケットのパスが限定されるようにして、他人のアップロードしたものが見えないようにする、壊せないようにするという権限を付与してみたい
可能なはずだが、どうすれば?

調べます。

CustomRoleARN パラメータかな?
うーん、API 経由でパラメータを得て、それを頼りにリクエストパスを作る?
GetCredentialsForIdentity - Amazon Cognito Federated Identities

ID プールの概念 (フェデレーティッドアイデンティティ)読む
ID プールの概念 (フェデレーティッドアイデンティティ) - Amazon Cognito

わからんを一時間ほど

これじゃないか!
docs.aws.amazon.com

これは…経由でログインしたユーザーのみを信頼するロールを作成できます、というものらしい

これだ
docs.aws.amazon.com

セキュリティ保護を高めるために、Amazon Cognito では GetCredentialForIdentity によって提供された認証情報にスコープを絞り込んだポリシーを提供し、非認証ユーザー用以外のサービスへのアクセスを防止します。

それの具体的な方法を学びます!

cognito-identity.amazonaws.com:aud → 複数の ID プール
cognito-identity.amazonaws.com:sub → 特定のアプリユーザーに限定

という情報を見るに aud が ID プールを特定する何かで
sub がユーザーごとの何かの情報と思われるが

それの説明へのリンクを飛ばしてほしい
ここだと思うの見つけた
ウェブ ID フェデレーションを使用したユーザーの識別 - AWS Identity and Access Management
"Condition": {"StringLike": {"s3:prefix": ["Amazon/mynumbersgame/${www.amazon.com:user_id}/*"]}} みたいな指定で行ける様子

これで、ユーザーごとにアップロードできるフォルダが限定できるようになる
要はログインユーザーになったとしても、他人のアドレスの配下を編集できないということ

ダウンロードに関しては、ログインユーザーに対して特に制限を設けないようにすれば、パス情報をリアルタイム通信しつつ
url からダウンロードして VRM データを送受信できそう。

リストさせる権限も与えないようにすれば、S3にどんなデータがあるかわからないから、あてずっぽうでしか url アクセスできなくなるはず

ところで、恐れるのは悪意あるユーザーが同じルームに来た他人の VRM データを盗むこと
VRM データは秘匿されるべきものなので、他人がゲームの目的以外でホイホイ利用できてはならない。

まぁでも、クライアント側のログに他のユーザーのIDを残さなければ、あとはメモリー内の解析と
ゲームプログラム自体の公開、その改竄やネットワーク部分の作り直しになる訳で、それでも悪用しづらい対策としては十分なのかな

■Unityゲームの改ざん防止について

そういえば Unity ゲームは簡単に解析できてしまいます。
simplestar-tech.hatenablog.com

ひとまず、この方法で改造できないことを確認することが重要ですね。
対策はあるのかな

ローカルの dll ファイルの hash 値を計算して、サーバー側のバージョンごとの hash 値と比較するとか?

そのロジックを改竄されて、バージョンごとの正規の hash 値をウソデータとして送られたら終わりですし…
難読化のアセット上がるので、それを利用することにしますし、可能ならそれを IL2CPP でさらに解析が難しくなるようにします。

ここまですれば、それでも悪意あるプレイヤーによって漏洩する VRM データについては、もうそいつ指名手配でいいかなと…

■疑問が晴れて

いずれ難読化するとして、ロールによりユーザーが触れる S3 の範囲が限定されるとしたなら
S3 に VRM データをアップロードして、これを Unity クライアントが直接ダウンロードすることにより、他のユーザーのアバターを表示することができるでしょう。

S3 アップロードの機構などを入れて、動作を見ていきましょう。

ページ更新速度が遅くなってきたので、次の記事に続きを書きます。

Unity:一般的なTPSゲーム作りログ

■前書き
ゲームパッドを動かすと、それに反応してカメラとキャラクターが動くゲーム
一般的に三人称視点なので TPS と呼ばれます。

グランドセフトオートとか、バイオハザードとかが有名ですね。
背景やキャラ、世界観やストーリーを作りこまなければ、Unity を使って短時間で制作できそうなものです。

簡単に制作ログを残していこうと思います。

■横道
9連休使えるゴールデンウイークも、のどの痛みと発熱で三日も寝込んでスタートという残念なことになった。
昨年の2月の発熱以来、ここ1年と少し、ずっと体調良かったので、ちょっと熱出るとこんなに苦いのかと、ほんとツライ三日間でした。
退屈なベッドの上ではずっと音楽聞いていて、気になる曲をたくさん買って5千円くらい使っちゃったよ…
通勤始まったら、改めてこれらの曲を聴きながら会社行くとしようかな。

■本題
Unity もいつの間にか 2019.1 が公式リリースされてます。これをインストールして起動します。
TPS セットとなるアセットを買って、導入してみます。

VRM キャラデータはこちらを使用
hub.vroid.com

TPS アセットはこちらを使用(有料)
assetstore.unity.com
全部は読めませんが、VRMみたいなキャラクターにTPSアセットを適用する手順の確認までは公式ドキュメントに頼りました。
invector | THIRD PERSON DOCUMENTATION

で、ちょっと遊んでみた結果がこちら
www.youtube.com

■技術詳細
動的に VRM をロードした際に、このようなアクションが行えるかに注目して研究しました。

発見したこととして次の画像のように順番を守ってコンポーネントを追加したときにうまくアクションできるようになりました。

f:id:simplestar_tech:20190430163203p:plain
v 順番を守る必要あり

順番を間違えると、動くには動くのですが…なんか着地がカクカク振動したり、ワープしたりします。

  1. vThirdPersonInput
  2. vThirdPersonController
  3. vGenericAction

パラメータはどれもディフォルト値でいけそう

Regidbody の Collision Detection は Discrete から Continuous にするのが良いらしい

Unity:リアルタイム通信ゲームのひな形

最近書いたQiita記事
qiita.com

実際 Unity でリアルタイム通信ゲームを作ろうと思った時に、脳内で走ったシミュレーションをここに書き出してみます。

ある一人がルームを作成している状態
もう一人がルーム一覧を知る術はあるか→知らない

ルーム名を固定したときに、すでに入っている人のアバター情報を取得する方法はあるか→知らない

誰かがルームに入ってきたことはわかる→既存のメンバーがその新規メンバーに情報をその後に渡せばよいだろう
特定メンバーにだけ送信できるのか→なかった、guid で除外するメンバーを指定できる
StreamingHubBase.Context にContextId があり、ここの値を使う
Room の Group に AddAsync するときにデータを載せられるらしい?次の関数を使えば
ValueTask<(IGroup, IInMemoryStorage)> AddAsync(string groupName, TStorage data) where TStorage : class;
であるならば、Group からリストを取り出して、対象の guid 以外を except することも可能か…

各種入力値を通信で渡すようにすれば、通信量は小さい
定期的に絶対値などのステータスを同期する、5秒に1回とか

ルーム名一覧は別途Lambdaなどの別の WebAPI で取得できれば良い
別の方法にすればパスワードでルームを保護することも自由だし、一覧に情報を付加しやすい

アプリケーションを強制終了させたり、ルームメンバーが消えた時などはどうする?
→アプリ終了時に Disconnect する直前にルームを退出できる

退出と入出ごとにルーム情報を更新できればいける

いろいろ、答えは README に書いてあった
github.com

読む、理解するで疑問は解決できた

オンライン部分の構想をメモ

直近でやりたいこととしては AWS の ECS を使って .net core サーバーイメージを実行し
これを中継役とするオンラインチャットゲームが動くのを確認したい
これを記事にまとめたい

追記 20190817

過去の自分へ、今も同じようなものを構想している、ただ DynamoDB はやめて Cache サーバーから試すと良いと思う。
ほか PlayFab について学ぶといい、ゲーム内の実際のお金を使った購入や、ゲーム内の複数の仮想通貨を利用した交易などが不正が難しい形で利用できる。
simplestar-tech.hatenablog.com

あと、PlayFab は、プレイヤーが実行するサーバー側のロジック(Cloud Script)から外部サービスとして AWS を呼び出せるから
バックエンド設計については何ら制約は持たせなくて良さそう。PlayFab の認証システムを利用してゲームを作ると、遊ばずに登録作業で離れるユーザーを取りこぼさなくて良いデザインで作れるんじゃないかな?
外部サービス呼び出しの具体的な手順はこちらに書いておいたぞ
simplestar-tech.hatenablog.com

追記 20191109

過去の自分に有益な情報を送っている、過去の自分へ
Cache サーバーも一通り動作確認したけど、うまく解決できなかったので自分でバイナリキャッシュサーバーを作ることになりました。
S3 にバックアップを定期的に保存する処理も効率的に行うことができるようになったよ。
simplestar-tech.hatenablog.com

Unity:VRMをLWRPで表示するためのマテリアル変更

VRMのシェーダーの LWRP 対応が期待されるところですが、無理やりマテリアルを置換して表示することも可能です。
ランタイムロードについては過去記事
simplestar-tech.hatenablog.com

の通りですが、LWRP 環境で表示するとピンク色(シェーダエラー色)になります。
置換する具体的な方法をここに記します。(VRMファイルによって失敗することもあります。)

foreach (var renderer in go.GetComponentsInChildren<Renderer>())
{
    bool body = 0 == string.Compare("Body", renderer.gameObject.name);
    foreach (var material in renderer.sharedMaterials)
    {
        var tex = material.mainTexture;
        var objname = renderer.transform.gameObject.name;
        bool transparent = false;
        if (!body)
        {
            foreach (var keyword in material.shaderKeywords)
            {
                if (0 == string.Compare("_ALPHABLEND_ON", keyword) || 0 == string.Compare("_ALPHATEST_ON", keyword))
                {
                    transparent = true;
                    break;
                }
            }
        }
        material.shader = transparent ? transparentShader : opaqueShader;
        var names = material.GetTexturePropertyNames();
        foreach (var name in names)
        {
            material.SetTexture(name, tex);
        }
    }
}

コード内で登場する以下の変数は、あらかじめ LWRP 用に作ったシェーダーである必要があります。
transparentShader
opaqueShader

追記:スカートや袖など衣服は TwoSide シェーダーだったので、次のようにチェックして、カリングしないシェーダーも用意して適用すると見た目の破綻が無くせました。

if(material.HasProperty("_CullMode"))
{
    var cull = material.GetFloat("_CullMode");
    if (0 == cull)
    {
        material.shader = opaqueTwoSideShader;
    }
}

なんで "_CullMode" がわかったかについてですが、オリジナルのシェーダーコードをじっと眺めるとわかります。

上記のコードあるなしの結果はこちら
要はMToonシェーダーにこだわらなければ、ひとまず表示できるようになります。

f:id:simplestar_tech:20190413180803j:plain
この絵を直すのに、このコードが必要だとイメージできればOK

追記の追記

色々とややこしくなったので、手っ取り早い対応を発見したので、最後に追記しておきます。
次のような Unlit LWRP 用シェーダーを構築して

f:id:simplestar_tech:20190413211118j:plain
Shader Graph for MToon
先ほどの複雑化したコードの代わりに次のコードでマテリアル置換するようにします。
上の Shader を opaqueTwoSideShader 変数に代入して使います。

foreach (var renderer in go.GetComponentsInChildren<Renderer>())
{
    foreach (var material in renderer.sharedMaterials)
    {
        var tex = material.mainTexture;
        material.shader = opaqueTwoSideShader;
        var names = material.GetTexturePropertyNames();
        foreach (var name in names)
        {
            material.SetTexture(name, tex);
        }
    }
}

Alpha Test などのテクスチャ繰り抜きが正しく機能することは確認できました。
ただ、髪の毛の色とかが反映されていないことに気付いて、色々いじって、すぐに解決しなかったのであきらめました。
公式に LWRP コンバート対応が入る日が近い気がしていて、これ以上は頑張らなくても良いかなと思ってます。

f:id:simplestar_tech:20190413211812j:plain
髪の毛やまつげの色が付いていない…

追記:それから三ヶ月、自分で LWRP の Toon を写経ですが、利用できるようになりました。
simplestar-tech.hatenablog.com

追記の追記の追記の追記

LWRP で MToon 表現置換する ShaderGraph を作って公開しました!
github.com

AWS DynamoDB を Unity で操作する

AWS DynamoDB を Unity で操作できました。
詳細な手順をなんもわからん状態から出来るようになるまでを記録しました。

記事概要として、AWS Cognito の機能として

1.ユーザープールを作成(サインアップ、認証コードをメールアドレスへ送信、サインインできるようになる)
2.IDプールを作成(未認証ユーザー、サインインしたユーザーそれぞれにAWSアクセス権限を付与)
3.未認証のユーザーが AWS DynamoDB を利用してテーブルの作成と利用ができることを確認
おまけ:認証ユーザーになるには ID トークンなるものが必要らしい

それでは順に見ていきましょう。

# ユーザープールを作成

ユーザープールの作成方法としてこちらのステップ 1, 2, 3 を実行してみました。

ユーザープールの開始方法。 - Amazon Cognito

いいですか?
ステップ 1, 2, 3 のみですよ。

ソーシャルIDプロバイダーはいくつか選択できますが、Google のみ行いました。

Google での手順リンク先でまた迷いましたが、次のページにて「CONFIGURE A PROJECT」ボタンを発見できました。
https://developers.google.com/identity/sign-in/web/sign-in

Google 側も手順を省略する方向でサイトを整備したみたいですね。
リダイレクト URL など設定するため、作成したプロジェクトのGoogleコンソール画面へ移動すると、すでに認証情報が作られていました。
あとは設定項目にステップで指定された url を記入して完成~

作ったユーザープールの login のURLを開くと次の Google でログイン or 新しくメールアドレスとパスワードでアカウント登録の画面が出ました!

f:id:simplestar_tech:20190324113618j:plain
https://your_user_pool_domain/login?response_type=code&client_id=your_client_id&redirect_uri=https://www.example.com (作成したものによる置換がいるよ!)を開いたときの画面

それぞれでログインすると、AWS Cognito のユーザープールのユーザー一覧ページにて、それぞれのユーザーアカウント情報を確認することができました。

f:id:simplestar_tech:20190324114404j:plain
Google認証と新規email&パスワード認証をしたときのCognitoユーザー一覧画面

ユーザーそれぞれの情報を確認できます、ここでメールアドレスは確認できましたが、パスワードまでは閲覧できませんでした。(これ重要)
これでユーザープールが出来た…

# IDプールを作成

次の手順に従って ID プール名を記入して、上記ユーザープールの ID とアプリクライアントIDをプロバイダーの項目に入力しました。
サインイン後に ID プールを使用して AWS サービスへアクセスする - Amazon Cognito

これで ID プールが出来た。
その ID プールのダッシュボード開いてる状態…

# 未認証のユーザーが AWS DynamoDB を利用

ここからはいよいよ Unity のコードに触れってことらしいですね。
次の手順に従って .unitypackage 群をダウンロードします。
AWS Mobile SDK for Unity のセットアップ - AWS Mobile SDK

> 使用する .unitypackage ファイルに移動して選択します。
どれ?

f:id:simplestar_tech:20190324153201j:plain
AWS SDK for Unity packages

なるほど、今回は DynamoDB というオンラインデータベースを使おうと思っていますので
AWSSDK.DynamoDBv2.3.3.100.1.unitypackage
を展開して利用することにしました。

AWSSDK, Examples, Plugins フォルダが作られそれぞれに SDK, Sample, Plugin が配置されました。

サンプルちょっと眺めてますが、書式古いですねー(Unity ユーザー、上から目線w)
同梱の readme にシーンの構成と使い方が示されています。こちら一読して作業しました。

とにかくシーンビルド構成を

1. DynamoDbExample.unity
2. LowLevelDynamoDbExample.unity
3. TableQueryAndScanExample.unity
4. HighLevelExample.unity

にして実行しろとのこと
そして、それぞれのシーンのゲームオブジェクトのインスペクタにて ID プールの ID を記入し、適宜お使いのリージョン名に書き換えろとのことです。
対処しました。

ほか、オンラインドキュメントで説明のある awsconfig.xml ファイルがないことで混乱しましたが…
混乱したまま進めることにしました。

実装を見るに、認証しないユーザーで DynamoDB の Table を作ったり Table を列挙したり、Table の中身を更新したり、Table の中身を列挙したり、Table を破壊したりしています。
先に IAM の方で、そんな DynamoDB への操作を許可しているか確認してみましょう。

IAM コンソールにはいくつかディフォルトのロールと、今回作成した Cognito* というロールがあります。
未認証のロールの方を選択して、インラインポリシーの追加を選択すると、次の通り DynamoDB をサービスに選ぶと、一覧と設定UIが現れました。

f:id:simplestar_tech:20190324163932j:plain
IAM ポリシーの編集はビジュアルエディット可能

これらを設定して保存してあげれば、一時認証のときに DynamoDB を操作することができますね。
さらにリクエストする IP アドレスの範囲設定までできたので、自宅からのアクセスのみに絞ってみました。
これで、第三者から勝手に DB 編集されずに済みますね!安全である

さて、Unity サンプルを実行するとなにやらエラーが発生したので、解決に取り掛かります。(わけわからん時に触るサンプルはだいたい修正しないと動かないものです。めんどくさい)

エラー内容から調べると、次の解決方法に出会いました。
Unity2017.3.0p4 で AWS SDK が例外を吐くようになったので原因を調べてみた

具体的には DynamoDBExample.cs にて、次の行を追加します。

        void Start()
        {
            UnityInitializer.AttachToGameObject(this.gameObject);
            AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest; // ←この行で UnityWebRequest 使うように指定

うごきました!
Create Table ボタンを押すと Forum, ProductCatalog, Reply, Thread の四つの DynamoDB Table が作られました。
Table の Describe も行えましたし、Table のDelete もできました。

IAM に権限がないとアイテムの追加に失敗し、IAMポリシーを編集すれば、ゲーム起動中に権限が切り替わって Table 内のアイテム操作が行えることも確認しました。

オンラインデータベースにブロック情報を書き込んだり、読み出したりする時に参考になるサンプル実装はこんな感じでした。

        int bookID = 1001;
        DynamoDBContext Context;

        void Start()
        {
                var _CognitoPoolRegion = RegionEndpoint.GetBySystemName("ap-northeast-1");
                var Credentials = new CognitoAWSCredentials(IdentityPoolId, _CognitoPoolRegion); // ID プールの ID を文字列で指定
                var Client = new AmazonDynamoDBClient(Credentials, _DynamoRegion); // ユーザープール使っていない、つまり未認証の権限ロールを使用することになります。
                Context = new DynamoDBContext(Client); // アイテム操作は Context というものを介して操作する模様
        }

        private void PerformUpdateOperation()
        {
            // Retrieve the book. 
            Book bookRetrieved = null;
            Context.LoadAsync<Book>(bookID,(result)=> // Update なので、値が取れることは期待
            {
                if(result.Exception == null )
                {
                    bookRetrieved = result.Result as Book; // ここは期待通りなら強制キャスト
                    // Update few properties.
                    bookRetrieved.ISBN = "222-2222221001";
                    bookRetrieved.BookAuthors = new List<string> { " Author 1", "Author x" }; // Replace existing authors list with this.
                    Context.SaveAsync<Book>(bookRetrieved,(res)=> // 更新したデータ構造をそのままコピーします
                    {
                        if(res.Exception == null)
                            resultText.text += ("\nBook updated");
                    });
                }
            });
        }

    [DynamoDBTable("ProductCatalog")] // データ構造はこれらの属性が必要
    public class Book
    {
        [DynamoDBHashKey]   // Hash key.
        public int Id { get; set; }
        [DynamoDBProperty]
        public string Title { get; set; }
        [DynamoDBProperty]
        public string ISBN { get; set; }
        [DynamoDBProperty("Authors")]    // Multi-valued (set type) attribute. 
        public List<string> BookAuthors { get; set; }
    }

上記コードで更新した ProductCatalog テーブルのアイテム id = 1001 を AWS DynamoDB コンソールで選択すると、以下のような値が確認できました。

f:id:simplestar_tech:20190324181528j:plain
上記コードで作った Table の一つのアイテム

最初は、愚かしいデータ構造にしてみて、どんなレスポンスでゲームが遊べるのか試してみましょうか
やりたいことができるようになってきたのでいったん記事は完成ということで

# おまけ:認証ユーザーになるには ID トークンなるものが必要らしい

追記:
未認証による操作はできたのですが、認証を通した後の操作は?
気になりますよね。

Google の場合はここに示されている手順で 3つのクライアントIDを作成して、もろもろ登録して Unity に Googleプラグインを入れて操作することになるそうです。
Google (ID プール) - Amazon Cognito

AWS Cognito の User プールは?

ユーザープールを ID プールと統合するに示される通り

                       CognitoIdentityProviderName = "cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>";
                        Credentials.AddLogin(CognitoIdentityProviderName, initiateAuthResponse.Response.AuthenticationResult.IdToken);
                        Credentials.GetIdentityIdAsync(responce =>
                        {
                            Debug.Log("Logged In with refreshed IdToken : " + responce.Response);
                        });

で、認証情報にユーザープールを統合できるそうです。
おや initiateAuthResponse.Response.AuthenticationResult.IdToken はどうやって手に入れるのか
参考ページはこちら
https://qiita.com/t5ujiri/items/07575a7596e18340eefb#unity%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B

どうしても認証を通して作業したいので、次はこちらの記事を参考に認証を通した後の IAM ロールで操作できることを確認してみます。

認証を通してから IAM による権限制御で AWS を Unity から直接操作できました!
手順をQiitaの方に書いておきました。
qiita.com

ゲームデータの永続化

■前書き
しばらくぶりで記事の書き方を忘れてしまいました。

ここ最近は新たに Unity でゲームを作っていてちょうど見た目はこんな感じのサンドボックスゲームです。

f:id:simplestar_tech:20190321221355j:plain
テキトー

ゲームデータの永続化の部分を後回しにしたおかげで、後半になってスケジューリングまわりの挙動確認をしたり
どこにどうやってデータを置いて、これを引き出すべきか思案しなければならないことに(逆に最初からも難しいですが)

そこで最近 AWS の DynamoDB とか良いんじゃないかなって思い始めています。
高速読み書きできるオンラインデータベースです。

Unity での導入方法としてとても親切でわかりやすい記事も見つけました。
UnityでAWSを使うのはゼンゼンコワクナイヨー(シカモ無料デイケルヨ!) - Qiita

ちょっと触ってみようじゃないですか

追記:最終的に DynamoDB も遅くて話にならないから Cache サーバー(Redisとか)を使うことに決めてます。

■導入

Amazon Prime 契約されている方も多いかと思いますが
それより簡単に Amazon Web Services のアカウント登録が完了できます。

いざ、AWS 使うぞーと思ったら、どれにしますか?とこの画面が表示されます。

f:id:simplestar_tech:20190321223018j:plain
AWS 一覧

あまりに多く、AWS の人たちも全部に通じている人は少ないんだとか…
まずは認証認可の仕組みを学んで、ゲーム側からキーとなる文字列を使うとオンラインのデータベースを読み書きできるようにしてみようと思います。

参考記事では Cognito の ID プール使うとありますね。

AWS Cognito

f:id:simplestar_tech:20190321223528j:plain
AWS Cognito

ID プールボタンを押すことにしました。


認証プロバイダーに FacebookTwitter を選べるけど、コンシューマー登録IDとそれに関する秘密鍵を書き入れないといけないとある…
いきなり何してよいかわからなくなった、怖い…

ここで Cognito について基本的な部分を調べてみます。
AWS Cognitoについて調べてみた - Qiita

1.UserPoolにログインしてTokenを取得
2.取得したTokenをFederated Identitiesに渡す
3.Federated IdentitiesがTokenを検証
4.検証が完了したらSTSから一時クレデンシャルを取得
5.ユーザに一時クレデンシャルと統合IDを返す
6.統合IDと一時クレデンシャルを利用してAWSリソースにアクセス

確かにそうなんですけど…これだけではわからない
読んで得た知見:新出単語多くて、関連情報が引き出せただけでした。

上記用語と意味ですが、以下の参考リンクの方をすべて読む&理解したときにわかってきます。(結局全部読まないとダメでした)
よくわかる認証と認可
AWS Black Belt Online Seminar 2017 AWS Cognito
Amazon Cognitoによる認証はSTSのweb identity federationとどう違うのか!?

用語理解

認証:アクセスしてきた人が誰か特定すること(パスワードが合っていることを確認して認めるとか)
認可:認めた相手にオンライン操作を許可すること(権限の範囲を決めて、自由に操作させるとか)
OAuth: 歴史的に認証情報を渡さずに認可の権利だけ与える仕組みが流行り、そのときに色々取り決めた認証システム
MFA: 普通パスワードだけで入れるところ、指紋認証を加えるとか、パスポートのコピーを提出するとか、とにかく複数の要素で認証すること…あ、Multi(複数)-Factor(要素) AuthN(認証) の略字っぽい
認証しな認可ある?:あるっぽい、電車乗るのに切符買えばいい、誰でも切符あれば乗れる(は?切符持っているという要素を認証してない?)意味不明…と思いきや、誰でもいいというところが認証なしと言えるかも

認証は証明書を検証すること、認可は鍵を発行すること
参考:
よくわかる認証と認可 | DevelopersIO

ユースケースから見た AWS の Cognito

ユーザー認証を簡単に行いたい→ Congnito 使え
TwitterFacebook でログインしたい→ Cognito 使え
課金ユーザーにだけ限定コンテンツ配信したい→ Cognito 使え
オンラインサービスをユーザーにも提供したいがアクセスキーは提供したいくない→ Cognito 使え
デスクトップPCモニタ、ゲーム機画面、スマホ、ノートパソコンでまったく同じことしたい→ Cognito 使え

何度も同じこと書くようで悪いですが…
1.ユーザーデバイス上で Twitter にログインし、アプリで使う秘密の文字列(トークン)を取得
2.Twitter とかを認証プロバイダーと呼ぶことにして、それらを使わない場合は Cognito の User Pools にユーザーアカウント情報を記録するからこれを認証に使える?
3.とにかくトークンを取得する
4.そのトークンを Cognito の Identities に見せろ、一時的な認可の鍵を渡してもらえる
5.その鍵で許された範囲のオンラインコンテンツ操作が行える(期間限定で)

です。

用語確認:
認証 Provider:Twitter のユーザー名・パスワードなどでログインしてトークンを提供する人
Cognito Your User Pools : トークンを渡す人
IAM(アイアム): Cognito User Pool の User Group と認可の結合をする人
Cognito Identities : トークンをもらって IAM の通りの認可用の鍵を発行して渡す人
Temporry Credential : Cognito Identities からもらった一時的な認可用の鍵(ログインしてトークン得て、トークン渡して手に入れる一時的な鍵)

サービス提供者が行う具体的な準備

Cognito で User Pool を作成する
Cognito で Identity Pool を作成する
Cognito で User Pool と Identity Pool を結合
IAM で Identity Pool に許可する操作を追加
専用 SDK 使ってクライアントデバイスから、ログイン→トークン取得→Temporary Credential取得のコードを実装する
その Temporary Credential を使って AWS リソースを操作(例えば DynamoDB への書き込み)を行うコードを実装する

と言った内容をイメージしたが、合っているのかな?

参考:
AWS Black Belt Online Seminar 2017 AWS Cognito


…ここも読むしかなさそうだな
Amazon Cognito(ウェブ/モバイルアプリのユーザー管理)| AWS

読んで得た知見:外面だけの文言も、また前提知識を求めるものばかりで要点がつかめない…

仕方ない、やっぱりここを全部読みます。(途中で日が暮れたのでやめました…)
Amazon Cognito とは - Amazon Cognito

ディレクトリって何をイメージすればいんですか?

2004年の記事ですが、こちら読みました。
ユーザー・アカウントを一元管理できる「認証ディレクトリ」に注目
認証を一回にする、簡単にするために、みんなで一緒のものを使おう…おれのシステム使えー!という戦国時代があったんですね…という感想を得ました。
WebシステムやC/Sシステムなどが混在した環境でアカウントの一元管理をするため考え出されたもの、それが「認証ディレクトリ」だ
一元化したユーザー情報のことを「ユーザー情報」と呼ばずに「ディレクトリ」と呼ぶことにしたらしい。なんで?
すべてのユーザーのアカウント情報を集め、管理するシステムを「統合ディレクトリ」とも呼ぶ、なんで?
クライアントマシンにエージェントと呼ばれるサービスを忍ばせて、統合ディレクトリからID・パスワードを取り出して、勝手にサイトへアカウント情報を送信する仕組みらしい。
なのでエージェントを仕込めば、ユーザーはID・パスワードの入力から解放されるそうな
安全ですね!

関連してプロビジョニング(Provisioning)という用語も理解しようと思う
…セキュリティの確保という意味らしいが、具体的にはユーザー・アカウントのライフサイクル(生成/配布/更新/廃棄あるいは失効)を管理/運用する機能のことをさす

歴史的に 2004 年頃はまだ統合ID管理製品が発展途上期だった様子
なるほど、知らずに高校生やってたぜ…

公式ドキュメントの本文にもどります

Amazon Cognito は、SOC 1~3、PCI DSS、ISO 27001 に準拠し、HIPAA-BAA に対応しています。

わかんねーよ(笑)
公式ドキュメントのこういう専門用語理解できないと何もわからなくするように突き放す文章スゲーと思うよ。
わざとわからなくするドキュメントコンテストで公式ドキュメント群は全部上位取れるよw

結局概要をつかんでみてわかったのはユーザープールとIDプールの二つがあって
ユーザープールがアカウント情報を管理するシステム
IDプールがサービスごとのアクセス権限を管理するシステム
アプリ実装するときはユーザープールにIDとパスワード送ってトークンを取得するように記述し
そのトークンをIDプールに渡して、一時的認証情報に交換してもらい
その一時的認証情報をSDKに渡せばAWS操作できるよ、ということだった。

具体的な手順は、まずは一個簡単なプロジェクト作るところからどうぞ…とのことなので、次のサンプル手順をなぞってみることにします。
開発者用リソース - Amazon Cognito | AWS

次の記事へ続く
AWS DynamoDB を Unity で操作する - simplestarの技術ブログ