Unityの物理エンジンを使用せずにバウンドの動作を行うためにジャンプ動作を移植してみました。計算式をCocos2d-xというゲームエンジンの「JumpBy」というアニメーションから持ってきたので動作は完全に同等です(DoTweenにもジャンプ動作がありますが個人的に少し動きが気に入らなかったので移植してみました。
確認環境
紹介内容の動作確認環境は以下の通りです。
- Windows10
- Unity 2019.4.0f1
- VisualStudio 2019
動作の紹介
このスクリプトを実行したときの動作は以下の通りです。この動きでは4個の減衰するジャンプ動作を連続で実行しています。
水平方向にジャンプ
少し上にジャンプ
少し下方向にジャンプ
使いかた
スクリプトから実行する
上記のgifのように動かす場合のコードは以下の通りです。
// テスト対象のオブジェクト [SerializeField] private Transform target = default; // テスト用のパラメータ [SerializeField] private float _dulation = 1.0f; [SerializeField] private Vector3 _delta; [SerializeField] private float _height = 1.0f; //[SerializeField] private int Jumps = 1; [Button] public void Execute() { // パラメーター: // Camera.size = 270 // _dulation // _desta.x = 50, .y=0, .z=0 // _height=75 var jump = target.JumpBy(_dulation, _delta, _height) .AppendJumpBy(_dulation * 0.5f, _delta * 0.5f, _height * 0.5f) .AppendJumpBy(_dulation * 0.2f, _delta * 0.2f, _height * 0.2f) .AppendJumpBy(_dulation * 0.1f, _delta * 0.1f, _height * 0.1f); // 全部終了したときにコールバックを受け取る jump.AnimationCompleted = () => { Debug.Log("Completed"); }; }
1回ジャンプ動作を設定した後、連続動作をAppendJumpByメソッドを連続で記述することで指定できます。これによってだんだん減衰する、だんだん大きくなるなどの動作が表現できます。
Transformの拡張メソッドとしてJumpByを定義しています。アニメーション終了時にイベントを受け取りたい場合AnimationCompletedにハンドラーを登録して実行します。
インスペクターから実行する
JumpByというスクリプトをGameObjectに追加するとインスペクターは以下表示になります。
JumpParameterListにパラメータを追加していきます。
[画像001]
終了時にコンポーネントを削除したい場合「Is Remove Component Finished」にチェックを入れておきます。
この状態でPlayメソッドを以下のとおりに呼び出すと登録内容の通り動作を行います。
// Playメソッドからインスペクターに登録した内容を呼び出せる Jumpby component = this.GetComponent<JumpBy>(); component.Play();
実装コード
各クラスの説明
実装コードはめちゃくちゃ長いのでGistにアップしました。以下Gistの引用となります。
3つのクラスから構成されています。
クラス | 概要 |
---|---|
JumpBy | ジャンプ動作を制御するクラス |
JumpByParameter | ジャンプパラメーターを保持する |
JumpByExtension | スクリプトから簡単に使用できるようにする拡張メソッドの定義 |
コード(Gist引用)
GistのURLは「https://gist.github.com/Taka414/cd2fdef49acd26f431a08f84c66463f9」です。