You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Feel/MMTools/Tools/MMSprites/MMLineRendererDriver.cs

95 lines
2.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MoreMountains.Tools
{
/// <summary>
/// This component, added to a line renderer, will let you fill a list of transforms, and bind their positions to the linerenderer's positions.
/// </summary>
[RequireComponent(typeof(LineRenderer))]
public class MMLineRendererDriver : MonoBehaviour
{
[Header("Position Drivers")]
/// the list of targets - their quantity has to match the LineRenderer's positions count
public List<Transform> Targets;
/// whether or not to keep both in sync at update
public bool BindPositionsToTargetsAtUpdate = true;
[Header("Binding")]
/// a test button
[MMInspectorButton("Bind")]
public bool BindButton;
protected LineRenderer _lineRenderer;
protected bool _countsMatch = false;
/// <summary>
/// On Awake we initialize our driver
/// </summary>
protected virtual void Awake()
{
Initialization();
}
/// <summary>
/// Grabs the line renderer, tests counts
/// </summary>
protected virtual void Initialization()
{
_lineRenderer = this.gameObject.GetComponent<LineRenderer>();
_countsMatch = CheckPositionCounts();
if (!_countsMatch)
{
Debug.LogWarning(this.name + ", MMLineRendererDriver's Targets list doesn't have the same amount of entries as the LineRender's Positions array. It won't work.");
}
}
/// <summary>
/// On Update we bind our positions to targets if needed
/// </summary>
protected virtual void Update()
{
if (BindPositionsToTargetsAtUpdate)
{
BindPositionsToTargets();
}
}
/// <summary>
/// A method meant to be called by the inspector button
/// </summary>
protected virtual void Bind()
{
Initialization();
BindPositionsToTargets();
}
/// <summary>
/// Goes through all the targets and assigns their positions to the LineRenderer's positions
/// </summary>
public virtual void BindPositionsToTargets()
{
if (!_countsMatch)
{
return;
}
for (int i = 0; i < Targets.Count; i++)
{
_lineRenderer.SetPosition(i, Targets[i].position);
}
}
/// <summary>
/// Makes sure the counts match
/// </summary>
/// <returns></returns>
protected virtual bool CheckPositionCounts()
{
return Targets.Count == _lineRenderer.positionCount;
}
}
}