Image にコンポーネントを追加するだけで以下のようなアピール演出をできるコンポーネントを作成しました
アピールの大きさ、時間、リピート、インターバルを設定できます
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; [RequireComponent(typeof(Image))] public class AppealGraphic : BaseMeshEffect { [SerializeField] private bool _playOnAwake = true; [SerializeField] private float _power; [SerializeField] private float _time; [SerializeField] private bool _isRepeat; [SerializeField] private float _repeatInterval; private float _current; private float _t; private readonly List<UIVertex> _vertexList = new List<UIVertex>(); private static readonly Vector3[] normals = { new Vector3(-1, -1, 0).normalized, new Vector3(-1, 1, 0).normalized, new Vector3(1, 1, 0).normalized, new Vector3(1, 1, 0).normalized, new Vector3(1, -1, 0).normalized, new Vector3(-1, -1, 0).normalized, }; private void Awake() { _current = _playOnAwake ? 0 :_time; } private void Play() { _current = 0; } private void Update() { if (_current < 0) { _current += Time.deltaTime; return; } if (_current > _time) { if (_isRepeat) _current = -_repeatInterval; return; } _current += Time.deltaTime; _t = Mathf.Clamp(_current / _time, 0, 1); graphic.SetVerticesDirty(); } public override void ModifyMesh(VertexHelper helper) { if (_vertexList.Count != 6) { _vertexList.Clear(); helper.GetUIVertexStream(_vertexList); var count = _vertexList.Count; for (var i = 0; i < count; ++i) { var vertex = _vertexList[i]; var vertexDuplicate = _vertexList[i]; _vertexList[i] = vertex; _vertexList.Add(vertexDuplicate); } } for (int i = 0; i < 6; i++) { var vertex = _vertexList[i + 6]; vertex.position += normals[i] * _power * _t; var c = vertex.color; c.a = (byte) (255 * (1f - _t)); vertex.color = c; _vertexList[i + 6] = vertex; } helper.Clear(); helper.AddUIVertexTriangleStream(_vertexList); } }