【Protopieのススメ】UIデザイナーのためのインタラクションモックアップツール


#ProtoPieとは？

##インタラクションデザイン・アニメーションデザイン
ProtoPieとは、**インタラクションデザイン・アニメーションデザイン** のためのモックアップツールで、
Sketchからインポートができ、スクロールやページングなど、細かいインタラクションを表現できる素晴らしいソフトウェアです

昨今では、技術力や表現力の向上によって、常に新たなユーザー体験届けるための試みが行われています
そのため、今ではUIを考える上で、従来の静的なものでは、より良いユーザー体験が届けることができない時代になってしまいました

よりリッチで、ワクワクさせるユーザー体験を作り上げるためには、デザイナーがインタラクションやアニメーションの表現にも精通していることが求められています
そこで、デザイナー必見のProtoPieをここで紹介したいと思います！

[ProtoPie](https://www.protopie.io/)
![1_rk2PfCoGJvAxefS2qyrxOA.png](https://qiita-image-store.s3.amazonaws.com/0/83460/df3a1cb0-4ddf-2a2a-e405-9ba4f406ede5.png)




## デモ例
###どんなものが作れるか？
まずは、どんなものが作れるのかということで、Demoをみるのが、一番わかりやすいかと思います。

**BookUI**　https://share.protopie.io/MghbyR8J2gk
![bookui.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/762fd09f-8218-aceb-b4af-7bc770a96117.gif)


**3D Touch**　https://share.protopie.io/4rza6sXVga8
![3dtouch.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/a0660f3f-098d-0693-0cfc-39900dd85793.gif)


これら例のように、簡単にスクロール表現や画面遷移などの表現ができたり
またスマホの音声や加速度センサーなどのセンシングができ、3D TouchなどiPhone特有の昨日から、さらにif文のような条件分岐ができます！

さらにこちらは、僕が2017年夏CyberAgentのインターンシップにて制作したものなのですが、

https://share.protopie.io/gciggcBkEuj

このように動画を読み込ませることもできます（3つくらい動画ファイルを読み込んでも問題なく動きました。）


[その他のDemoはこちらから！](https://www.protopie.io/demo/)


## 他のモックアップツールとの比較
CyberAgentのDeveloper Blogにモックアップツールのマッピングがあり、参考にさせていただきます。
このように、今流通しているモックアップツールは次のようなマッピングができるかと。

![map.jpg](https://qiita-image-store.s3.amazonaws.com/0/83460/fd13cff0-a17f-d2b6-9cf6-4a9809f13c9d.jpeg)
[Pixateに変わるプロトタイピングツールとは？５つのツールを徹底比較！](https://developers.cyberagent.co.jp/blog/archives/2058/)より参照

トランジション型というのは、画面遷移のアニメーション表現を得意とするソフトウェア(Prottなどが例）で、
インタラクション型というのは、UIのインタラクション（例えば、スクロール表現、タップした時の表現）などを得意とするソフトウェアです。
それぞれのツールには、得意・不得意とするところがあるので、自分の制作するプロジェクトや目的に合わせて、こうしたソフトウェアを使い分けるのがいいかと思います。

### 【ProtoPieの凄いところ】
- Sketchからのインポートが可能
- 共有URLで、プロジェクトを共有できる
- 動画も読み込める
- 学習コストが低い（簡単にマスターできる）
- サンプル例が豊富
- 簡単な条件分岐ならできる


### 【ProtoPieの苦手なところ】
- UI全てを作りきるのは向いていない

あくまでメインビューや重要なコンテンツのインタラクション表現を作るためのモックアップツールなので、ProtoPieで全てのUIを作りきるのは向いていません。
そういう時は、ProttやAdobeXDを使いましょう！

- より複雑な条件分岐を行う場合はあまり向いていない

より複雑で細かいアニメーションを作りたい場合は、Origami Studio、After Effectなどがおすすめです。（しかし、学習コスト高い）




##まとめ
以上で、簡単なProtoPieの紹介はおしまいです！
これまで、インタラクション型のモックアップツールは、Pixateがよく使われていましたが、Pixateがサービスを終了して以来、次のツールの覇権争いが繰り広げられているといったところでしょうか。
そして、ProtoPieはその学習コストの低さとサポートの厚さ（メール送ったら即返信くる、Twitterでリプライ飛ばしてくる）ことから、今どんどん勢いを伸ばしています！


では次は実際に、ProtoPieのすごさを実感するために、これから一緒にTinderUIを作って見ましょう！

##参考
・[さよなら Pixate, よろしくProtoPie](https://medium.com/@herulu/david-lee-https-blog-prototypr-io-goodbye-pixate-hello-protopie-dfba9850b6fd-wsirjp7zw-%EB%8B%98%EC%9D%98-66144458b219)
・[“最も早くプロトタイプが作れる”と噂のプロトタイピングツール「ProtoPie」を使ってみた](https://developers.cyberagent.co.jp/blog/archives/2290/)
・[Pixateに変わるプロトタイピングツールとは？５つのツールを徹底比較！](https://developers.cyberagent.co.jp/blog/archives/2058/)
・[【随時更新】インタラクションデザインのためのプロトタイピングツール調査](https://qiita.com/takaaki_ishii/items/76e9c5bdb79638dc52bd)




# 実際に作ってみる【Tinder UI】
## TinderUI
前回のアドベントカレンダー担当の Life is Tech ! のディーバことちゃーはん(@https://qiita.com/shou1012)
の力を借りて、Tinder UI をProtoPieで実装していきたいと思います！

こちらを今回は制作します！

**TinderUI** https://share.protopie.io/9zsFJzfKe5K

![tinder3.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/61b61d46-a5a4-7813-379a-ade6f3a6f547.gif)




あらかじめ、ProtoPieのインストール（1ヶ月間Free！）と、こちらのスケッチファイルを手元にダウンロードしておいてください。
[スケッチファイル](https://drive.google.com/open?id=1470CEUxMcpSqw_ppYEGMqHghITDfZMVn)
[ProtoPie](https://www.protopie.io/)

##目次
- ProtoPieの環境説明
- ProtoPieの基礎
- 条件分岐　【Condition】について
- 同期【Chain】について
- 最後の仕上げ

## ProtoPieの環境説明
### ProtoPie起動・Sketchファイルのインポート
<img width="1280" alt="スクリーンショット 2017-12-04 1.59.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/32208990-6107-ab3a-b377-fbc9c76805fd.png">
ProtoPieを起動して、
**[New Pie]**を選択しましょう。
そのあと、
上画面メニューから、**File** >> **Import from Sketch**
から、ダウンロードしたSketchファイルをインポートしてください

すると下のような画面になりましたでしょうか？
<img width="1280" alt="スクリーンショット 2017-12-04 3.07.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/06bccab3-30e7-291b-92d7-2511aad71a3d.png">

左側が、Sketchファイルから読み込んだレイヤーをまとめて、選択可能なエリア
右のAdd Interactionsが、オブジェクトのインタラクションを決めるエリア
一番右側が、そのオブジェクトの属性（サイズ、位置など）を決めるインスペクターの機能を果たすエリアとなっています

作業の流れとしては、右側のレイヤーで動かしたいオブジェクトを選択して、
インタラクションで、タップやドラッグをした時などの条件を指定して、その時のアニメーションを選択します
そして、インスペクターで、その時の大きさの変化量などを定義します

実際に動かしてみましょう！

##ProtoPieの基礎

ProtoPieのInteractionを決めるわかりやすい図解がこちらになります。

![img_concept_model.png](https://qiita-image-store.s3.amazonaws.com/0/83460/c8ddd160-26ba-7a46-a49f-f124b5ccaf60.png)

①　【オブジェクト】　まず、動かしたいオブジェクトを選択します
　画像なり、テキストなり、変化させたいものをまず選択する必要があります
②　【トリガー】　次に、そのオブジェクトを変化させるためのトリガーを決めます
　例えば、画像をタップしたり、ページをスクロールしたり、テキストを長押ししたりなど、ユーザーがインターフェースに対する何らかのアクションをした時の、トリガーを決定します。
③　【レスポンス】　そして、トリガーを決めたら、決定したトリガーが行われた時、どのような動きレスポンスをするのかを定義します。
　例えば、画像をタップしたら、画像を拡大する。ページをスクロールしたら、他のオブジェクトの色を変更するなど。

これら、オブジェクト、トリガー、レスポンスを決めると、ProtoPieで、インタラクションを実装することができます！

実際にやってみましょう。

<img width="1280" alt="スクリーンショット 2017-12-04 3.09.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/b288aea5-4d90-c532-58b9-97c049cd8023.png">
①　【オブジェクト】　レイヤーから**Cha-han1**オブジェクトを選択します
②　【トリガー】　次に、**Add Trigger**を選択して、**Drag**を選択してください

<img width="1280" alt="スクリーンショット 2017-12-04 3.09.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/56b667f6-8f46-db1c-3e8a-f497040bf216.png">

③　【レスポンス】　最後に、**+ボタン**を押して、**Move**を選択しましょう

ここまで、できたら、右上の **Preview**を選択してみてください。
下のGifのように、画像がドラッグできていたら、成功です。



![drag.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/06db2668-8f43-834b-d810-80641cf301d3.gif)




このように、ProtoPieでの実装の流れは、
①　【オブジェクト】 オブジェクトを選択する
②　【トリガー】　トリガーを選択する
③　【レスポンス】　トリガーに対するレスポンスを選択する

これらの作業工程です！
全てのインタラクションはこの作業でできています
これから仕上げていきましょう

##条件分岐　【Condition】について
先ほどの例で、画像をドラッグした時に、画像を動かすことができました。
しかし、ドラッグした状態から手を話した時、動かした場所で画像が止まってしまいます。

僕たちが実装したいのは、ドラッグして
指を話した時、画像が右画面からはみ出していたら、画像が右に消えて、
画像が右画面からはみ出していたら、画像が左に消える
それ以外の時は、真ん中の位置に戻ってくるようにしたい。

どのようにしたら実装できるでしょうか？
プログラミングのIF文のような機能が求められます。

そんな時、ProtoPieで使われるのが、**【Condition】**です

###下準備
実際にConditionを触るする前に、まず準備をしましょう

①まだ出番のないLIKEとNOPEは邪魔なので、インスペクターから**Opacityを0**にして見えなくしましょう
<img width="1280" alt="スクリーンショット 2017-12-04 3.11.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/deef0c7b-17ed-682b-e5b9-fa908c36f521.png">

②cha-han1~5の画像を選択して、位置の基点を左上から真ん中にしましょう（そうすることで、条件分岐がわかりやすくなります）　
**インスペクターに表示されているOriginの青い四角形を真ん中に持っていきます**

<img width="1280" alt="スクリーンショット 2017-12-04 3.12.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/0a8c6fea-9a09-434d-6030-ff77e8418b0e.png">


###Conditionを設定する①
①まず、オブジェクトのcha-han1を選択します。そして、トリガーの中から、**Touch Up**を選択してください(指がそのオブジェクトから離れた時に発動するトリガーです）

②次に、Touch Upのレスポンスの中から、Conditionを選択してください
<img width="1280" alt="スクリーンショット 2017-12-04 3.15.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/7b709831-35ca-658e-8035-18c2bc2166e4.png">


③　Condition2つを選択して、右側のインスペクターに表示されるConditionそれぞれ、を下記のように指定してください
Cha-han1オブジェクトが、0より大きい時（画面左より内側にある時）、そして画面真ん中よりも小さい時
という条件を指定します。
<img width="219" alt="スクリーンショット 2017-12-04 3.15.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/e1bd89f6-a4c5-2c62-c752-14846a847793.png">

Cha-han1オブジェクトが、画面より小さい時（画面左より内側にある時）、そして画面真ん中よりも大きい時
という条件を指定します。

<img width="219" alt="スクリーンショット 2017-12-04 4.00.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/582d5a44-2f40-0676-0f23-f98503c857bb.png">


④　そして、**Response**の中から、**Move**を選択して、
下記のように指定します。
<img width="219" alt="スクリーンショット 2017-12-04 3.57.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/d2242bb2-e76f-9293-3f45-e20b9e07cf08.png">

そうすることで、cha-han1オブジェクトをDragしても
手を離した時、cha-han1オブジェクトが画面内に収まっているのであれば、真ん中に戻ってくるようになりました。

以上がConditionの使い方です。

Conditionで条件を指定して、その時のレスポンスを指定する流れで利用できます。

下のGifのように、画面内で手を離すと、真ん中に戻ってきたでしょうか？
![drag2.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/10a50cb8-4f7d-8e5c-7c06-bbb54bb4b9da.gif)





###Conditionを設定する②
同様に、今度は、Conditionを活用して、
Cha-han1オブジェクトが画面左に出た時には、Moveで左画面の外にだす
また、Cha-han1オブジェクトが画面右に出た時には、Moveで右画面の外にだす
というのを実装してみましょう！

①　conditionで、**cha-han1 x <= 0**を設定して、その時のResponseを**Move**に設定する。Moveのあたいは、**x = -350、y = 329**　にしましょう

②　conditionで、**cha-han1 x >= 375**を設定して、その時のResponseを**Move**に設定する。Moveのあたいは、**x = 600、y = 329**　にしましょう

すると、画面内だと真ん中に戻ってきて、画面外だと外に出るようになります。



![drag3.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/c3a8632c-b09d-ec31-b6d1-72c3a4b343ff.gif)





##同期【Chain】について

ここまでで、TinderUIの主要のインタラクションである、画像を気持ちよくめくっていくインタラクションを実装できました。
次は、画像をめくっていく時に、表示される
LIKEとNOPEのスタンプを表示するインタラクションを実装しましょう！

流れは、右側に画像を持っていくと、LIKEスタンプが表示されて、
左側に画像を持っていくと、NOPEスタンプが表示されます。

どうやったら実装できるでしょうか？

画像の動きと連動して、スタンプが表示されるようにしたいですよね

そんな時にProtoPieで活用するのが、**Chain** というトリガーです

実際に使ってみましょう

① cha-han1オブジェクトを選択して、トリガーの中からchainを選択します
　＊ここで注意が必要なのは、連動の元となるオブジェクトを選択する必要があります。今回の例でいうと、画像に連動して、スタンプを表示させたいので、画像のトリガーにchainを選択します。

<img width="1280" alt="スクリーンショット 2017-12-04 4.10.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/8a70c6e4-7390-55ee-2236-9b0abf744e08.png">


②　次に、chainのレスポンスに、Opacityを選択します

<img width="1280" alt="スクリーンショット 2017-12-04 4.11.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/a6b7d625-451a-ddb0-89e3-3bf702417b62.png">

③　そして、レスポンスであるOpecityのオブジェクトに**LIKE**を選択して、その時のRangeを設定します。
Rangeとは、連動する時の値の振れ幅です。

④　cha-han1オブジェクトの座標xが187.5の時（画像が真ん中の時は）、LIKEスタンプは邪魔なので、Opacityを0にします。

⑤　cha-han1オブジェクトの座標xが375の時（画像が右まできた時は、）、LIKEスタンプを見せたいので、Opacityを100にします。

<img width="563" alt="スクリーンショット 2017-12-04 4.12.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/b4991ebc-089d-7674-000e-2635a9a32c9c.png">


同様にして、NOPEスタンプでもやって見ましょう。
①　chainのレスポンスに、さらにOpacityを選択します

②　レスポンスであるOpecityのオブジェクトに**NOPE**を選択して、その時のRangeを設定します。
Rangeとは、連動する時の値の振れ幅です。

③　cha-han1オブジェクトの座標xが187.5の時（画像が真ん中の時は）、NOPEスタンプは邪魔なので、Opacityを0にします。

④　cha-han1オブジェクトの座標xが0の時（画像が左まできた時は、）、NOPEスタンプを見せたいので、Opacityを100にします。


下のように、スワイプした時にLIKEとNOPEスタンプが表示されましたか？

![opacity.gif](https://qiita-image-store.s3.amazonaws.com/0/83460/fdd062e6-7521-77b6-d354-37a8d39f1a1f.gif)


以上でChainの使い方は終了です。

では、最後の仕上げを行なっていきましょう！


##最後の仕上げ

現状のままでは、スタンプを画像の動きに連動して透明度を変えるところまではできましたが、動かすことまでできていません。
最後に、今まで学んだことを活用しながら、
・画像と一緒に、スタンプを移動する
・画像が消えたら、スタンプも消えるようにする

これらを作っていきましょう！

①　まずは、画像と一緒に移動するように、一番最初に定めたトリガーであるDragを選択して、新たにレスポンスMoveを2つ加えましょう！　そして、そのオブジェクトをそれぞれ、LIKEとNOPEにします
すると画像と一緒に、スタンプを動かすことができました！

<img width="1280" alt="スクリーンショット 2017-12-04 4.22.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/0cadd1ae-341c-9983-ddba-99e09e9703c3.png">


②　次に、前回のとき、一緒に画像を真ん中で指を離した時は、画像を真ん中に戻して、画面外で手を離した時は、外に画像を持って行ったように、スタンプも同じようにConditionを設定しましょう！

③　conditionで定めた、cha-han x >= 0　また、　cha-han x <= 187.5　の時、オブジェクトLIKEのMoveレスポンスを**x = 30 y = 93**に選択して、オブジェクトNOPEのMoveレスポンスを**x = 217 y = 93**に選択します

④　cha-hanx <= 0　の時、オブジェクトLIKEのMoveレスポンスを**x = 30 y = 93**に選択して、オブジェクトNOPEのMoveレスポンスを**x = 217 y = 93**に選択します

⑤　conditionで定めた、cha-han x <= 375　また、　cha-han x >= 187.5　の時、オブジェクトLIKEのMoveレスポンスを**x = 30 y = 93**に選択して、オブジェクトNOPEのMoveレスポンスを**x = 217 y = 93**に選択します

⑥　cha-hanx >= 375　の時、オブジェクトLIKEのMoveレスポンスを**x = 30 y = 93**に選択して、オブジェクトNOPEのMoveレスポンスを**x = 217 y = 93**に選択します



最後に、このままだとまだ、画面外に画像が出た時、スタンプが表示されたままなので、スタンプも非表示にします


⑦　cha-hanx <= 0　の時、オブジェクトLIKEのOpacityレスポンスを**Change to 0**に選択して、オブジェクトNOPEのMoveレスポンスを**Change to 0**に選択します


⑧　cha-hanx >= 375　の時、オブジェクトLIKEのOpacityレスポンスを**Change to 0**に選択して、オブジェクトNOPEのMoveレスポンスを**Change to 0**に選択します


以上でおしまいです！




あとはこれをその他のcha-hanオブジェクトに対しても同様に設定することで、気持ちのいいTinderUIを実装することができます！

こちらに、完成したProtoPieファイルを触って、ダウンロードすることができるので、もし途中でつまずいてしまったら参考になるかと思います！

<img width="1280" alt="スクリーンショット 2017-12-04 5.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/83460/7f65e343-7fd0-581e-021f-bb8a8610c66c.png">


https://share.protopie.io/9zsFJzfKe5K


##まとめ
以上で、ProtoPieの紹介はおしまいです！
今回紹介したもの以上で難しい要素はProtoPieで出てきません。

基本である
**オブジェクト、トリガー、レスポンス**
が理解できていること。
条件分岐の**Condition**を活用すること
連動する時は **Chain** を活用すること

これらで、すでに大抵のことはできます！
あとは、ProtoPieのTutorialを学べば、ProtoPieの全てを理解したとしても過言ではないかと思います！
そのくらい学習コストの低いツールであることを実感してくだい！

ぜひ、ProtoPieを活用して、いろんなモックを制作して見てください！
お疲れ様でした！

次回の Life is Tech ! アドベントカレンダーは　@4geru　ですー！
よろしくお願いしますー！


![img_share.jpg](https://qiita-image-store.s3.amazonaws.com/0/83460/1029d553-25a0-de38-2953-42ab643b9832.jpeg)