PlayCanvasのAnim State Graph

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/4b89aea0-57bc-017a-43c5-5171de4241fa.png)
今まで、PlayCanvasではアニメーションを制御するのに本格的なスクリプトを書く必要がありました。
このAnimStateGraphはノードベースでアニメーションを再生することが可能です。切り替え用のスクリプトをちょっと書くだけで、簡単に複数のアニメーションを切り替えられます。
#アニメーションの切り替え
###必要な3Dデータ
https://launch.playcanvas.com/1138588?debug=true
走る、ジャンプ、歩くのアニメーションを切り替えられます。用意するデータはアイドリング、走る、ジャンプ、歩くの4つのアニメーション付きFBXデータです。
###Anim State Graphの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/200d7f74-2de3-73f3-e209-73c97ba839a5.png)
Assets欄で"New Assete"→"Anim State Graph"を新規に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/a9841451-1c18-140d-742f-d6cbed0fd730.png)
"New Anim State Graph"というアイコンが作成されます。
ダブルクリックで専用のエディターが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/929c79c0-ba6a-868d-f9a8-e24bbc3e5636.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/ef58a82d-3786-89c9-4bcb-0071e0b6cfba.png)
デフォルトで"Start"から"Initial State"が1つ接続されています。"Initial State"の名前を"Idle"に変更。

###3Dモデルに適用させる
"SD_base"という名前のキャラクターに適用させます。"ADD COMPONENT"から"Anim"を選択します。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/e4e48632-98ff-e89d-689f-c1203f30a0bb.png)
先程作成した"New Anim State Graph"をdrag＆dropで空きスロットルに適用させます。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/59e0bf36-88b8-7ae6-54ec-3f9b9d0b2f71.png)
###Add New Statの作成
ASSETS欄にある"New Anim State Graph"アイコンをダブルクリックし、ANIMATION STATE GRAPHエディターを出します。エディターのノードシーン上で、右クリックで新規に"Add new state"を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/2bf1adb8-3617-3595-8719-ee627295b5ac.png)
Walkという名前に変更し、Asset欄からインポートしたアニメーションデータ"walk.glb"を3Dモデルの"SD_base"にdrag＆dropで適用。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/d08c3365-4bff-40f8-9c64-8194b2371561.png)
右側の"LAYERS"と"PARAMETERS"を変更していきます。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/b0e3204b-be17-4796-ea71-ac5cbc67eb56.png)
"Default State"を何にするか決めます。"Idle"に設定します。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/4c4cb3f6-f0d2-0661-c629-4500da00e075.png)
"PARAMETERS"を"+"ボタンから追加し、Nameを先程追加した"Walk"に変更し、Typeを今回は"Trigger"に変更します。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/c83b9924-defc-c889-86aa-3678ce5ab9bf.png)
###Add transitionでStateを繋ぐ
Stateパネルの上で右クリックで"Add transition"を作成します。"Idle"と"Walk"で両方から繋ぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/657e2757-0eee-fd7f-a765-ffc80491c155.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/793d2288-c977-1970-7d59-00916b6282be.png)
"Idle"から"Walk"に繋いでる矢印を選択するとTransitionを設定していきます。
Duration:0.2
Exit Time:1
Condition:Walk
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/3f643c25-ee19-65c3-f2bc-d32c555ac8d9.png)
続いて、反対の矢印も設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/37d12b15-18e7-88ce-0e23-b1b4db4e9f9e.png)
###スクリプトの設定
ASSETS欄から新規スクリプトを"Walk"という名称で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/9b79c174-3457-815d-a2e0-69f7c437e09d.png)

```Walk.js
var Walk = pc.createScript('walk');

// initialize code called once per entity
Walk.prototype.initialize = function() {
    
};

// update code called every frame
Walk.prototype.update = function(dt) {
   if(this.app.keyboard.wasPressed(pc.KEY_W)){
        this.entity.anim.setTrigger('walk');
    } 
};
```
キーボードの"K"を押したらsetTrigger指定している"Walk"を再生します。

###アニメーションを追加してみる

同じ要領で[走る]、[ジャンプ]を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/6af37e8e-ce98-f14f-3ce1-a98f3bca7c20.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/a3e72a5c-2aa1-ec09-cddc-2b39e9e32ed7.png)

```Walk.js
var Walk = pc.createScript('walk');

// initialize code called once per entity
Walk.prototype.initialize = function() {  
};
// update code called every frame
Walk.prototype.update = function(dt) {
   if(this.app.keyboard.wasPressed(pc.KEY_W)){
        this.entity.anim.setTrigger('walk');
    }   
   if(this.app.keyboard.wasPressed(pc.KEY_J)){
        this.entity.anim.setTrigger('jamp');
    }   
   if(this.app.keyboard.wasPressed(pc.KEY_R)){
        this.entity.anim.setTrigger('run');
    } 
};
```
結果:　https://playcanv.as/p/RlUENaX4/

###まとめ
今まで、複数のアニメーション制御にはかなりプログラムを書く必要がありましたが、プログラミングが出来ないデザイナーレベルでも、シンプルなコードでアニメーションを制御することが可能になりました。キャラクターだけでなく、Blender上から作成した複数のオブジェクトアニメーションをボタンやキーボードから操作することが容易になったかと思います。皆さんも是非使ってみてください。

【PlayCanvas 公式サイト】
https://playcanvas.jp

【Twitter】
https://twitter.com/playcanvasJP

【日本 PlayCanvas ユーザ会 - Slack】
日本の PlayCanvas 開発者が集まったコミュニティがございます。PlayCanvas での開発に興味がある方はぜひこちらご参加ください。参加には Slackが必要となります。
https://playcanvas.jp/joincommunity