【PlayCanvas】Tips
2018/04/25にPlayCanvas1.0がリリースされました。
しばらく触ってない&下記情報は古い(2018年1月頃)可能性があるので、注意してください。
間違ってる可能性は大いにある。
AttributeでEntityのArrayを設定できない
ロードマップにはあるみたいだけど、この書き込みはもう3年前・・・
pc.EVENT_MOUSEUPとかあるけどmouse leaveの定義は無い
Element Compoenentsのイベントにはmouse leaveがちゃんとある→ソース 現状"mouseleave"と文字列指定するしか無いっぽい
pc.ElementComponentが最近から追加されたけど、ここで使えるイベントの定義が未だされていないのだと思う
UnityでいうGetComponentみたいなアクセスをする方法
code:js
// こういう感じのがあったとして
var MyComponent = pc.createScript('myComponent');
MyComponent.prototype.HogeFunc = function() {
console.log("hogehoge");
};
// HogeFuncを別のコンポーネントから呼び出す
temp.script.myComponent.HogeFunc();
tempにはMyComponentがアタッチされたEntityが入ってるとする
当然のごとくインテリセンスは機能しない
子となるEntityを全部破棄する
スマートな書き方かはわからないけど、こんな感じ
code:js
while ( this.entity.children.length > 0 ) {
this.entity.children0.destroy(); }
forで回す場合はindexに注意しなきゃいけないと思う
これで正常に動くのでUnityみたいにEntityの破棄に1frame待つ必要とかは無いっぽい(ぽいだけで保証はしない)
スクリプトでEntityを生成している場合、swapが走ると追加で生成してしまうので一括削除はよく使う気がする
2D ScreenのImage Elementだと上手く動作しない
Image Elementだと子にpc.GraphNodeがいるためdestroyが呼べずエラーとなる
Group Elementだと子にpc.GraphNodeがいないため動作する
なぜ同じElementComponentでタイプが違うだけなのにこういう動作の違いが出るかわからない
英語スキル&技術力が不足していてよくわからない
indexに注意しながら対象がentityかどうかを確認しつつdestroyするしかなさそう
良いところ
JSファイル1つ入れるだけで導入完了
メソッドチェーン方式で書ける
微妙なところはあるけどソースがあるから自分で変えることはできるっちゃできる
微妙な所
実装手法的にTween関連のインテリセンスが全く機能しない
pc(playcanvasのRootオブジェクト)に追加で作る
Unityで言うとUnityEngineの中に全部入れてる感じ
easingの指定がpc.SineInみたいな感じになる。tween.SineInみたいにしたい
easingの初期化にバグがあり、Tween作成時にeasingの指定を省略するとエラーが発生する
code:tween.js
// line.84
- this.easing = pc.EASE_LINEAR;
+ this.easing = pc.Linear;
pull reqとかしてあげれば良いんだろうけど、githubに疎いのでスルー
FPSを表示する
fps.jsをプロジェクト内に入れて、RootにアタッチすればOK
独自にCanvasを生成してそこでFPS表示しているっぽいのでHierarchy上ならRootに限らずどこでも動作する
Debug用の空Entityを用意し、そこにアタッチしておけばリリース時にこのEntityを無効にするだけでOK
Texture Atlas(Sprite Sheets)を使う
Materialを使う手法
Materialを使わない手法(pc.ElementComponent用)
2D Screen(pc.ElementComponent)はTextureがそのまま使える
そもそもUI関連には2D Screenが向いており、数値を表示する場合などを考えるとこっちの方がシンプルだと思う
rectの指定が0~1のNumberなので場合によっては浮動小数点誤差が出て隣のSpriteが少し見える現象が発生する気がする
画像をパッキングする際に余白1pxを入れた方が良い気もするけど未検証
initializeの呼ばれるタイミング
起動時にenabledがfalseとなっているentityはinitializeが呼ばれない
enabledがtrueとなるタイミングで初めてinitializeが呼ばれる
scaleに0を入れると警告が出る
pc.Mat4#invertTo3x3: Matrix not invertibleという警告
たぶん、行列の情報が失われるよ的な内容(表面上3次元だけど内部では4次元で管理してるからかな?)
論理的には間違っていないけど、scale = 0として見えないようにする手法は実装上ではよくあるので警告は邪魔じゃね?的な話題
対策
警告を無視する(できればは避けたい)
scaleを0.001にする(見えちゃう)
editor上では0.001未満の値にはできないっぽい?