うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】UnityEngine.UI.Image をアピールさせるコンポーネント

Image にコンポーネントを追加するだけで以下のようなアピール演出をできるコンポーネントを作成しました

f:id:hacchi_man:20200823023105g:plain

アピールの大きさ、時間、リピート、インターバルを設定できます

f:id:hacchi_man:20200823023219p:plain

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);
    }
}