【2DSTG制作】の動画内で表示されるコード:#41 – #50
サムネイルをクリックすると、YouTubeの動画ページに移動します。
#42:ボスユニットの登場演出
LineRenderer_Animation
using UnityEngine; using DG.Tweening; // 表示する線 [SerializeField] LineRenderer lineRenderer; void Start() { var sequence = DOTween.Sequence(); // 線の幅を変更する(0 => 0.5) sequence.Append(DOTween.To(() => lineRenderer.startWidth, num => lineRenderer.startWidth = num, 0.5f, 1.0f)) .Join(DOTween.To(() => lineRenderer.endWidth, num => lineRenderer.endWidth = num, 0.5f, 1.0f)) // 1.5秒待機 .AppendInterval(1.5f) // 線の幅を0にする(非表示) .Append(DOTween.To(() => lineRenderer.startWidth, num => lineRenderer.startWidth = num, 0, 1.0f)) .Join(DOTween.To(() => lineRenderer.endWidth, num => lineRenderer.endWidth = num, 0, 1.0f)) // アニメーション終了後に削除 .AppendCallback(() => Destroy(gameObject)); }
#45:緊急回避の実装
指定した位置まで移動させる
using UnityEngine; using DG.Tweening; // 再生するアニメーションのトリガー static int dodgeParamHash = Animator.StringToHash("Dodge"); void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // スペースキーが押されたら、緊急回避のアニメーションを再生 animator.SetTrigger(dodgeParamHash); // 入力されていた方向キーに応じて相対的に移動 if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) { // 入力が右上であれば、右上に移動 transform.DOLocalMove(new Vector2(1, 1), 0.7f).SetRelative(true).SetEase(Ease.OutExpo); // 入力が右下であれば、右下に移動 } else if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.RightArrow)) { transform.DOLocalMove(new Vector2(1, -1), 0.7f).SetRelative(true).SetEase(Ease.OutExpo); // 中略 // } else { // 方向キーが押されていない場合は右に移動 transform.DOLocalMove(new Vector2(1, 0), 0.7f).SetRelative(true).SetEase(Ease.OutExpo); } } }
#46:敵ユニットの移動経路
移動経路の設定
using UnityEngine; using DG.Tweening; // ユニットが通過する座標 [SerializeField] Vector3[] wayPoint; // 移動時間 [SerializeField] float moveTime; void Start() { // 生成したパスに沿って移動させる transform.DOPath(wayPoint, moveTime, PathType.Linear) // 等速移動 .SetEase(Ease.Linear) // 撃破されたらアニメーションを停止 .SetLink(gameObject); }
#47:ボスの移動パターン
移動経路の切り替え
using UnityEngine; using DG.Tweening; // ボスユニットが通過する座標 [SerializeField] Vector3[] wayPointA; [SerializeField] Vector3[] wayPointB; // 移動時間 [SerializeField] float moveTime; Sequence sequence1; Sequence sequence2; void Start() { sequence1 = DOTween.Sequence() // パスに沿って移動 .Append(transform.DOPath(wayPointA, moveTime, PathType.Linear).SetOptions(true)) // パスを1周したら少し待機 .AppendInterval(0.5f) // 無限ループ .SetLoops(-1) // 自動で破棄しない .SetAutoKill(false) // 自動で再生しない .Pause() // オブジェクトが削除されたタイミングで破棄 .SetLink(gameObject); sequence2 = DOTween.Sequnece() ... } public void MovePath1() { // 別のパスを停止 sequence2.Pause(); var path1 = DOTween.Sequence(); // パスのスタート地点に移動 path1.Append(transform.DOMove(new Vector3(2.0f, 0, 0), 1.0f)) // アニメーションを再生 .AppendCallback(() => sequence1.Restart()) .SetLink(gameObject); }