うにてぃブログ

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

【Unity】LineRenderer を使って 波を作る

波を実装したいことがあったので、LineRenderer と Mathf.Sin を利用して波の動きを作ってみる

波をずらすために、現在の座標に応じた値を加算している

   private void Update()
    {
        _offset += Time.deltaTime;
        for (var i = 0; i < Divide; i++)
        {
            var pos = _lineRenderer.GetPosition(i);
            var value = pos.y + _offset + i / (float)Divide;
            pos.x = Mathf.Sin(Mathf.PI * 2 * value);
            _lineRenderer.SetPosition(i, pos);
        }
    }

最終的な波がこちら、パラメータを追加して周期や幅などを調整できる

f:id:hacchi_man:20210126010520g:plain

コード

using UnityEngine;
 
public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField]
    private LineRenderer _lineRenderer;
    /// <summary>
    /// 波の周期
    /// </summary>
    [SerializeField]
    private float _period = 1f;
    /// <summary>
    /// 波の幅
    /// </summary>
    [SerializeField]
    private float _width = 1f;
    /// <summary>
    /// 波の周期ずらし
    /// </summary>
    private float _offset;
    /// <summary>
    /// LineRenderer の分割数
    /// </summary>
    private const int Divide = 100;
 
    private void Start()
    {
        // LineRenderer を分割
        _lineRenderer.positionCount = Divide;
        for (var i = 0; i < Divide; i++)
            _lineRenderer.SetPosition(i, Vector3.up * i);
    }
 
    private void Update()
    {
        _offset += Time.deltaTime;
        for (var i = 0; i < Divide; i++)
        {
            var pos = _lineRenderer.GetPosition(i);
            var value = pos.y + _offset + i / (float)Divide * _period;
            pos.x = Mathf.Sin(Mathf.PI * 2 * value) * _width;
            _lineRenderer.SetPosition(i, pos);
        }
    }
}