21.エネミーの移動用の MoveEventSO スクリプタブル・オブジェクトを作成する 22.エネミーの移動方法に応じて MoveEventSO スクリプタブル・オブジェクトに用意されたメソッドを UnityAction に登録して移動を実行する
・スクリプタブル・オブジェクトの新しい使い方 ・UnityAction(デリゲート)の使い方 ・DOAnchorPos メソッド
Microsoft const (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/lan...
1.EnemyController スクリプトに UnityActon 型の変数を用意する 2.EnemyController スクリプトから、MoveEventSO スクリプタブル・オブジェクトの GetMoveEvent メソッドを実行する。引数として、エネミーの移動方法(MoveType)を渡す この処理を実行するに際し、GetMoveEvent メソッドには戻り値として UnityActon 型で移動用のメソッドを取得して戻してくれるので、受け取って登録するための UnityActon 型の変数を左辺に用意しておく 3.EnemyController スクリプトにて、UnityActon 型の変数に登録された移動用のメソッドを実行する。エネミーの移動方法に応じた移動が処理される
Unity公式スクリプトリファレンス
UnityAction
https://docs.unity3d.com/ja/current/ScriptReferenc...
Kan のメモ帳 様
デリゲート(Delegate)やイベント(Event)とは【C#】
https://kan-kikuchi.hatenablog.com/entry/Delegate
// 変数を用意する private UnityAction<Transform, float> moveEvent;
// MoveEventSO スクリプタブル・オブジェクトの GetMoveEvent メソッドを実行し、戻り値で移動用のメソッドを受け取る。ここで移動方法を決定 moveEvent = this.enemyGenerator.moveEventSO.GetMoveEvent(enemyData.moveType);
public UnityAction<Transform, float> GetMoveEvent(MoveType moveType) { switch (moveType) { case MoveType.Straight: return MoveStraight; case MoveType.Meandering: return MoveMeandering; case MoveType.Boss_Horizontal: return MoveBossHorizontal; default: return Stop; } }
// MoveEventSO スクリプタブル・オブジェクトの GetMoveEvent メソッドを実行し、戻り値で移動用のメソッドを受け取る。ここで移動方法を決定 // どちらも UnityAction<Transform, float> であるので、代入が成立する moveEvent = UnityAction<Transform, float> 型のメソッドが1つ戻ってくる
// Invoke メソッドを実行すると、moveEvent 変数に登録されたメソッド(今回は移動用のメソッド)を実行する。UnityActon <Transform, float>型なので、実行にあたって、指定された型の情報を指定する moveEvent.Invoke(transform, enemyData.moveDuration);
public void MoveStraight(Transform tran, float duration) { //Debug.Log(tran); Debug.Log("直進"); tran.DOLocalMoveY(moveLimit, duration); }
private void MoveMeandering(UnityEngine.Transform tran, float duration) { Debug.Log("蛇行"); tran.DOLocalMoveX(tran.position.x + 150, 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear); //<= ここ。DOLocalMoveX(tran.position.x + 150, 1f)で動く距離は固定している tran.DOLocalMoveY(moveLimit, duration); }
tran.DOLocalMoveX(tran.position.x + 150, 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);
tran.DOLocalMoveX(tran.localPosition.x + 150, 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);
private void MoveMeandering(UnityEngine.Transform tran, float duration) { Debug.Log("蛇行"); // DOAnchorPosX、DOAnchorPosY の場合 RectTransform rectTran = tran.GetComponent<RectTransform>(); rectTran.DOAnchorPosX(tran.localPosition.x + 150, 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear); rectTran.DOAnchorPosY(moveLimit, duration); // DOLocalMoveX の場合 //tran.DOLocalMoveX(tran.localPosition.x + 150, 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear); //tran.DOLocalMoveY(moveLimit, duration); }
原カバンは鞄のお店ではありません。 様
【Unity】DOTweenを使ったuGUIアニメーション
Zenn オオバ@ohbashunsuke 様
uGUI - RectTransformのトゥイーン|【Unity】DOTweenの教科書〜スクリプトでアニメーションを操るバイブル〜