はかせのラボ

なんか好きなこと色々書きます

AWS Cognitoでのサインアップ

あいさつ

どうも、はかせです。
今回はようやっとCognitoでサインアップに成功したので
そのまとめです。

今回使用したunityのバージョンはUnity 2018.3.6f1です。

Unityでやること

Unityでやることは
AWS使うための前準備
・コーディング&オブジェクト配置

この二つです。

AWS使うための前準備

まずは前準備として、
AWSを使うためのdllやらなんやらを入手します。
私は下記の5つを入れました。
NuGet Gallery | AWSSDK.Core 3.3.103.29
NuGet Gallery | AWSSDK.CognitoIdentity 3.3.100.65
NuGet Gallery | AWSSDK.SecurityToken 3.3.102.14
NuGet Gallery | AWSSDK.CognitoIdentityProvider 3.3.102.50
NuGet Gallery | AWSSDK.Extensions.CognitoAuthentication 0.9.4

それぞれページに飛ぶと右側に「Download package」ってのがあるので
そこをクリックしてダウンロードします。
f:id:hakase0274:20190818215141p:plain

ダウンロードしたら拡張子が「.nugkg」になっていると思います。
f:id:hakase0274:20190818215430p:plain
この部分をまるっと「.zip」にしましょう
データの欠損とかは発生しないので安心してください。
名前を変えたら解凍してください。

そしたらおそらくこんな感じのフォルダ構造になっているはずです。
f:id:hakase0274:20190818215534p:plain

今回使うのはlib配下のnet45というフォルダです。
f:id:hakase0274:20190818215655p:plain
これをそのままUnity内に放り込んじゃってください

この作業をダウンロードしたもの全てで行ってください。
そうしたらUnityの中身はこんな感じになっているはずです。
f:id:hakase0274:20190818215915p:plain
(AWS_Packagesはフォルダが取っ散らかるのが嫌だったんで作っただけです)

前準備もあと少しで終わります。
次に放り込んだdllを使えるようにUnityの設定を弄ります。
Unityの左上らへんにあるメニューの
Edit > Project Settings > Player > Other Settingsの中にある
Api Compatibility Levelを.NET 4.xに変更してください
f:id:hakase0274:20190818220745p:plain

コーディング&オブジェクト配置

いよいよUnityでのコーディング&オブジェクト配置です。
まずはオブジェクトを置いてしまいましょう。
今回必要なものは
・サインアップ用のEmailとPasswordの入力フォーム
・サインアップボタン
・入力したEmailに送られてきた認証コードの入力フォーム&送信ボタン

まぁこんな感じです。
f:id:hakase0274:20190818221959p:plain

次にコードです。
まずはサインアップボタンを押したときの処理です。

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Amazon.CognitoIdentityProvider; // for AmazonCognitoIdentityProviderClient
using Amazon.CognitoIdentityProvider.Model; // for SignUpRequest
using MySpace;

public class Signup : MonoBehaviour
{
    public InputField emailField;
    public InputField passwordField;

    public void OnClick()
    {
        var client = new AmazonCognitoIdentityProviderClient(null, Amazon.RegionEndpoint.APNortheast1);
        var sr = new SignUpRequest
        {
            ClientId = AWSIDs.ClientID,
            Username = emailField.text,
            Password = passwordField.text,
            UserAttributes = new List<AttributeType>
            {
                new AttributeType
                {
                    Name = "email",
                    Value = emailField.text
                }
            }
        };

        try
        {
            var result = client.SignUp(sr);
            Debug.Log(result);
        }
        catch (Exception ex)
        {
            Debug.LogError(ex);
        }
    }
}

内容自体は落としてきたdllの中にあるクラスを作って
手順通りにリクエストを送っているだけです。

ここで使っているAWSIDsというのは自作クラスで
こんな感じです。

namespace MySpace
{
    public static class AWSIDs
    {
        public static string ClientID = "自分のクライアントID";
        public static string UserPoolID = "自分のUserPoolID";
    }
}

まぁマジックナンバーは少しでも減らしましょうってことで。

こうして作ったコードをサインアップボタンにあてがって
OnClick()をボタンコンポーネントのOnClickに登録しましょう

そして次は認証コード送信ボタン

using System;
using UnityEngine;
using UnityEngine.UI;
using Amazon.CognitoIdentityProvider;
using Amazon.CognitoIdentityProvider.Model;
using MySpace;

public class Confirmation : MonoBehaviour
{
    public InputField emailField;
    public InputField confirmationCodeField;

    public void OnClick()
    {
        var client = new AmazonCognitoIdentityProviderClient(null, Amazon.RegionEndpoint.APNortheast1);
        var confirmSignUpRequest = new ConfirmSignUpRequest
        {
            Username = emailField.text,
            ConfirmationCode = confirmationCodeField.text,
            ClientId = AWSIDs.ClientID
        };

        try
        {
            var confirmSignUpResult = client.ConfirmSignUp(confirmSignUpRequest);
            Debug.Log(confirmSignUpResult.ToString());
        }
        catch (Exception ex)
        {
            Debug.LogError(ex);
        }
    }
}

やってることはさっきとほとんど同じです。
こっちも同様にボタンにつけて登録しましょう。

これでUnityでやることは終わりです。

AWSでやること

AWSでやることは
・UserPoolの設定
・IDPoolの設定

この二つです。

UserPoolの設定

Congnitoで認証するアプリやユーザーの設定をします。
基本的には公式とか先人たちの記事に従って作ればいいのですが、
注意点が一つあります。
おそらく順当に作ってIDとか取得して先述のコードに値放り込んでやると
こんなエラーに遭遇すると思います。

NotAuthorizedException:Unable to verify secret hash for client XXX

(XXXがクライアントID)

これはちょっとIDを作るときの設定を弄ることで解決します。
f:id:hakase0274:20190818223723p:plain
このクライアントシークレットっていう設定が邪魔らしいです。
なのでクリックして設定を外しましょう。

ちなみに散々言ってるクライアントIDってのはこれです。
f:id:hakase0274:20190818223920p:plain
(アプリクライアントタグから確認できます)

IDPoolの設定

IDPoolってのは認証時と非認証時での
アクセス権限の設定とかできるらしいです。
今回はサインアップだけだったので
特に弄らず公式や先人たちの記事を参考に作りました。

実行

時は満ちた・・・・
というわけで諸々の値を設定して
実行ポチっとな。
f:id:hakase0274:20190818224353p:plain

無事ユーザーが追加されました。

あとがき

今回はAWSCognitoを使ってサインアップをやってみました。
ただサインアップするだけでこの手間がかかるとは・・・・
私が慣れてないってのが大きな要因でしょうが
極めて時間がかかりました。

最初はUnityで配布されているAWSSDK使ってたんですが、
公式や先人たちのやり方に倣ってやってもうんともすんとも言わない。

諦めて.NETの方で配布されているAWSSDKを使ってやりました。
(こっちのが割と慣れた書き方や使い方だったりする)

それでは今回はこの辺でノシ

ゲーム開発 ストレスから見るゲームの面白さ ~ペルソナの重要性~

あいさつ

どうも、はかせです。
今回は今までとちょっと趣向変えて
ゲームの面白さをストレスという面から考察し
ペルソナというものの重要性について書いていきます。

ゲームとストレス

ゲームとストレスの間には密接な関係があります。
なぜならゲームは娯楽であり、
快感を感じ、ストレス発散するためのものだからです。
ゲームの快感ってのは要は面白いと感じるってことですね。
そして人が快感を感じる背景にはストレスが必要不可欠です。

「ストレス発散するためのゲームでストレス感じるって本末転倒じゃない?」

言わんとすることはわかります。
ただ人間はストレスがないところには快感を感じない生き物です。

快感のメカニズム

快感ってのは主に報酬系と言われる
神経回路グループによってもたらされます。
報酬系の名前の通り快感は何かの報酬を得た時に感じるわけですね。

では報酬とは何か?
それぞれ例を上げて考えてみます。

食事

我々人間は空腹になったら何か食べ物を食べるでしょう。
そうすることで空腹というストレスを解消し満腹という快楽を得るわけです。
つまり空腹時の人間にとって食事は報酬にあたるわけですね。

では満腹時の食事はどうでしょう?
おそらく大抵の人間は、
「苦しい」
「吐きそう」
「もう見たくない」
「別に食べたくない」

こんな感情になるのではないでしょうか?

それは満腹時の食事は報酬ではないからですね。
満腹時というのは空腹というストレスが無い状態なので
食事が報酬にあたらないわけですね。

人間はこの仕組みを利用して
適度な食事を取るようにコントロールしています。

ゲーム

今私がやっているファイアーエムブレム(以下FE)で例えを出しましょう。
FEはシミュレーションゲーム
自ターンで自ユニットを操作して敵を倒していきます。
そして特定ユニットがロストしたり、
自ユニットが全滅したりしたらプレイヤーの負けになります。

敵味方問わずユニットには移動量と攻撃範囲が設定されており、
移動量分しか移動はできませんし
攻撃範囲内でしか攻撃はできません
この制限がこのゲームのストレスですね。

そして
その制限下で敵を倒していく
ステージをクリアすることが報酬になります。

FEのうまいところは
ワンミスで簡単に自ユニットがロストしてしまうことですね。
なんでうまいこと敵には攻撃させず、
こちらが敵を倒していく必要があります。

そして攻撃していくと徐々に武器の耐久値が減り、
耐久値が0になるとダメージや命中率が大幅に下がります
こうなったらいくら完璧な采配をしても敵を倒すのは
かなり難しくなりますね。

またロストしたユニットはモードによっては帰ってこないので
ロストによって発生する損失が大きいです。
これもストレスに該当しますね。

そういったストレスをかいくぐり、
ノーミスでクリアした際の達成感は一際強いです。
この達成感を感じた瞬間に面白いと思うわけです。

さてFEのストレスの話をしたところで
そのストレスを一切合切無くしたらどうなるかちょっと考えてみましょう。

移動は無限にでき、
攻撃はどこまでも届き、
武器の耐久値は存在せず、
何度ミスしてもユニットがロストすることはない

この状況下で敵を倒し、ステージをクリアするとなった場合どうでしょうか?

まず攻撃がどこまでも届くため移動をする必要が消えるでしょう。
自ユニットがロストしないので敵の行動を考える必要もありませんね。
武器の耐久値の件がないので常に安定した火力と命中率が維持されます。

結果脳死で敵を攻撃するだけでクリアできてしまいますね。
そうなった場合このゲームは一体何が楽しいのでしょうかね?


相手を一方的に殲滅して俺TUEEEってやることでしょうか?

それともボタンを押すだけで話が進んでいくことでしょうか?


いずれにしても私があげたFEの面白みは消滅していますね
この状態を楽しめるひとならばいいでしょうが、
私はこんな状態にFEがなったならもうやらないでしょうね。
おそらく虚無しか感じないでしょうから。

ゲームでストレス発散できるの?

さてストレスが無ければ快感が生まれないという話をしたところで
こんな声が聞こえてきそうです。
「ストレスが無きゃいけないならストレス発散にならないんじゃないの?」

これには筋トレの超回復の理屈が一番イメージが近いのかなと思います。
超回復ってのは簡単に言うと
・トレーニングで筋線維をズタズタにする
・その後休憩する
・するとリバウンド的に元の筋線維量以上に筋線維が回復する

これをストレスと快感の件に書き換えると
・ストレスをかけて苦しい思いをする
・その後報酬をもらう
・するとリバウンド的に元の快感以上に快感を感じる

なので適度なストレスは快感に変わります。

ゲームでストレスがたまる

「ストレス以上の快感が得られるならストレスはたまらないのでは?」
これは理屈通り行けば確かにそうなります。
ただ理屈通りいかないのが現実です。

実際には快感の感じ方は個人差があるので
快感 > ストレスという構造にならないこともままあります
(FPSが好きとかRPGは苦手とか)

また残念ながら個人の感じ方の差異レベルでは済まないレベルで
ストレスを感じやすいゲームというのは実際問題存在します。

そういったゲームは総じて
ゲームのプレイ自体がストレスになっていることが多いです。

・普段はキーボードorパッド操作なのにメニューの操作はマウス
・エリア移動などのたびに十数秒~数分レベルでのロードが入る

あくまで一例ですが、こういうストレスって
プレイしているだけでほぼ無条件に発生してしまうストレスで
どんどんかかるストレス量が増えていきます。
(私がちょいちょい言う不要なストレスってやつですね)

かかるストレス量が多いってことは
それを上回る強い快感をユーザーに与える必要がありますが、
それはなかなかむずかしいです。

ストレスをためないためには

ではゲームでストレスをためず、
ストレス発散をしてもらうために
我々開発者はどうすればいいのでしょうか?

色々ありますが、
私はペルソナをしっかり作ることが大事だと考えています。

ペルソナとは

簡単に言えばこのゲームはどんな人にやってもらいたいかということです。
ターゲッティングとか色々呼び方はあります。

なぜペルソナが重要か

誰に向けたゲームなのかが明確化されていれば、
ユーザーとのミスマッチが減るような広告や宣伝ができます

こういう人に向けたゲームだからここは妥協できない
だけど、この辺りなら多少不便でも気にする人は少ないだろう
といった感じでリソースを割く優先順位も設定しやすくなります

例えばFEならば
戦闘のシステムや育成周りは妥協できないが、
多少のロードやモーションは目を瞑れるだろう的な。

もちろん妥協無しで全てが最高クオリティにできれば理想ですが、
ハードウェアリソースも
ソフトウェアリソースも
開発リソースも有限です。
どこかにこだわるならばどこかを捨てなければ成立しません

その取捨選択の基準もペルソナが無ければ
設けることができません。

ペルソナがちゃんと設定されてなかったら

ペルソナを設定せず開発した場合、
誰にでも受ける普遍的な内容なため快感は微妙。
しかしストレス軽減のための取捨選択がされていないため
ストレスマッハになり結果は散々となることが目に見えます。

クソゲーと言われるゲームはおそらくこのペルソナが設定されていない
もしくはペルソナ設定が甘かったかのどちらかと私は思っています。

まとめ

面白いゲームってのは総じて適度なストレスがあります。
つまり
快感っていうのはストレスの裏返し
です。

なのでストレスが無くユーザーが詰まったりすることが無いゲームや、
逆にストレスが強すぎてユーザーが詰まり続けたりするゲームは
快感、つまり面白さを感じないためクソゲー言われるわけですね。

また快感の感じ方には個人差があるので
ある人にとっては神ゲーでも別の人にとってはクソゲーかもしれません。

なのでゲームを開発するときは
必ずペルソナを立ててください。

ペルソナ、ターゲットと言って難しく考える必要はありません。
家族のだれかや友人でも、特定の趣味趣向を持つ人でも、
極論自分だっていいわけです。
とにかく「誰に」向けたゲームなのか
ちゃんと考えて開発してください。

私が過去に作成した「ABSOLUTESPEED」というレースゲームは
「ゲーセンでレースゲームがあったらちょっとやってみようと思うような人」に向けて開発しました。
(私は主にハードウェア担当でしたがゲーム体験をより良いものにできるよう最善を尽くしました)

あとがき

今回はゲームの面白みをストレスという面から考え、
ペルソナの重要性について書きました。

この記事はもちろんゲームを作る人に向けた記事ですが、
実のところは私自身に対する戒めみたいなニュアンスもあります。

私自身開発をしていくなかでどうしても自分がこうした方がいい
こうしたいと思ったことをやってしまいそうになります。

そうしてできたゲームってどうしても独りよがりな出来になって
自分以外の人にはもちろん、
ひどいときには作った自分でさえ
面白いと思えない出来になるんですよね。

ゲームには適度なストレスが必要
そしてその適度なストレスを決めるためにもペルソナは必要

この二点は人間という生物が遺伝子レベルで変わらない限り
不変な理屈だと思います。

私もそうですが、
ゲームを作る人はこの二点は忘れずに作りましょう。

それでは今回はこの辺でノシ