不慣れ
左手デバイスのボタンを右手で押してる不器用な皆さんこんにちは。購入して一週間以上経ちますが未だに不慣れで、ショートカットを登録したボタンを探す→右手でボタンを押す、の順で操作しており私の左手はちっとも活躍していません。まぁUnityでマウス操作をしながらキーを押す、というシチュエーションがあまり無い所為でもありますが。
フリーライドとリスペクトの間
フロムゲーが「ソウルライク」という名の下に多数の(特にインディー系の)ゲームから模倣されているように、ポケモンにおいても「ライク」としてカテゴライズされて一般化していれば、たとえ模倣の度合いが過ぎても大騒ぎには発展しなかったかもしれません。
しかし残念ながらこれまで「類似」とされてきたゲームの殆どが躓くか一時的なヒットに終わって「ライク」化するまでに至っていないので、今回のように「ぼくのかんがえたさいこうのポケモン」的ゲームが批判されるのは仕方のない事だなと思っています。
特に「ポケモン」に対して思い入れのあるファンにとっては、いくら制作側が「法的に問題ない」と強弁しても、日本で長らく愛されてきた強いIPをフリーライドしているようにしか見えないでしょうし、「ポケモン」に類似する「パル」に対して強制労働や虐待、殺害が行えるゲームデザインは許せないものでしょう。
私としては「クラフト要素のあるポケモン」「サバイバル要素のあるポケモン」というアイデアを具現化するというだけでもかなり凄い事だと思いますし、元ネタに対しても十分敬意を払っているように感じますが、今回の騒動は制作側がそれを世間一般に理解してもらえる為の努力が足りなかったのかなぁ、という感想です。
LitMotion
前回の記事で高速なTween系アセット「Magic Tween」を紹介しましたが、これと同じ作者の方が新しいTween系アセットを公開しています。
ECSを使用して高速化を実現した「Magic Tween」よりも更にECSの仕様に合わせて高速化を図ったアセットらしく、公開されたスペックでは「DOTweenの5倍以上、MagicTweenと比較しても1.5倍ほどと極めて高速」のようです。
このアセットの導入に必要な要件は以下の通り
- Unity 2021.3 以上
- Burst 1.6.0 以上
- Collection 1.5.1 以上
- Mathematics 1.0.0 以上
こちらのアセットもGitで公開されている為、導入する場合はGitURLを利用します。
UnityのWindowメニューからPackageManagerを開いて「+」ボタン > git URLからパッケージを追加してください
https://github.com/AnnulusGames/LitMotion/blob/main/README_JA.md
基本的な使い方
MagicTweenではDOTweenとほぼ変わりない使用法でTweenを生成することができましたが、こちらのLitMotionではECSのデータ指向に沿う為か全く違う指定の仕方でTweenを生成します。
具体的には
- floatやVector3等の値をTweenさせるMotionクラスを生成する
- MotionクラスでTweenされている値(floatやVector3等)の反映先を指定する
- LoopやEasing、完了コールバックなどのオプションはMotionの拡張メソッドで設定する
上記の手順でTweenを作成、実行します。
この為、ソースへの記述は以下のようになります。
var value = 0f; LMotion.Create(0f, 10f, 2f) // 開始値,終了値,動作時間 .WithEase(Ease.OutQuad) .WithComplete(() => Debug.Log("Complate!")) .Bind(x => value = x);
上のソースの「LMotion.Create(0f, 10f, 2f)」の部分が「値をTweenさせるMotion」を意味します。
拡張メソッドの「WithEase」「WithComplete」でEasing、完了コールバックを指定しています。
最後の「Bind」の箇所で「値の反映先を指定」する事になります。
よって上のソースでは「valueの値が2秒で0から10へ変化し、完了後に"Complate!"というログを出力する」という動作となります。
LMotion.CreateでTweenさせる事が出来る変数の型は以下の通りです。
- int
- long
- float
- double
- Vector2,Vector3,Vector4
- Quaternion
- Color
- Rect
GameObjectを動かしたい
もっと具体的にDOTweenのようにGameObjectを動かしたい場合は、「Bind」の箇所でGameObject.transformのpositionに値を設定する事になります。
Transform target; LMotion.Create(Vector3.zero, Vector3.one, 2f) .Bind(x => {target.position = x;});上のソースだと「targetの位置を2秒で(0,0,0)から(1,1,1)へ移動させる」という動作になります、
ただ逐一、Bindの中で反映処理を記述するのは面倒くさいので、positionを動かす場合は専用のBindメソッド「BindToPosition」を利用します。
Transform target; LMotion.Create(Vector3.zero, Vector3.one, 2f) .BindToPosition(target); // target.positionにバインドする
position以外にもLocalPositionやeularAngle,localScale等、専用のBindメソッドが幾つか用意されているので詳細は作者の方が公開しているドキュメントを確認してください。
注意点
特にSeqneuceは実装されておらず、今後も実装される事はないようなので、Tweenを組み合わせる場合はコルーチンやUniTask等を使用して自力で組み合わせる必要があります。
また、オプションについても残念ながら相対的(Relative)なTweenを指定するオプションはないので、相対的な動作をさせたい場合はそれを踏まえた値を指定するか、Bindの拡張メソッドを作成する事になります。
Bind拡張メソッドについて上記のドキュメントで具体的な実装方法が書かれているので、試しに相対的な移動(RelativeMotion)についてBind拡張メソッドを作ってみました。
まとめ
上記のように記述方法がDOTweenとは大きく異なるため、MagicTweenのようにDOTweenから直接的に移行するのは難しいかもしれません。
また、DOTweenと比較して機能は限定的であるため、使いどころ及び実装方法を事前に検討する必要があります。
それでも「DOTweenの5倍以上」というスペックは魅力的ですしドキュメント等も充実している為、これから新規にプロジェクトを起こす際には導入を検討しても良いのではないでしょうか。