Как нарисовать соединение меж списка объектов?
У меня есть класс двух построек который выглядит так
public class BuildingConnection
{
public readonly StorageBuilding StorageBuilding;
public readonly HouseBuilding HouseBuilding;
public BuildingConnection(StorageBuilding storageBuilding, HouseBuilding houseBuilding)
{
StorageBuilding = storageBuilding;
HouseBuilding = houseBuilding;
}
}
и есть класс соединения
public class DrawConnectionManager : MonoBehaviour
{
private LineRenderer line;
private List<BuildingConnection> Connections = new List<BuildingConnection>();
}
как мне из соединений достать объекты и объеденить их linerenderer'om?

Ответы (1 шт):
На кой тебе класс BuildingConnection, если он по факту является структурой и ничего не делает, кроме как хранит данные?
как мне из соединений достать объекты и объеденить их linerenderer'om?
Устанавливаешь нужное количество точек через LineRenderer.positionCount
Проходишься циклом по своему листу и добавляешь позиции в лайнрендерер, через LineRenderer.SetPosition/SetPositions
Есть здание:
using UnityEngine;
namespace Connections
{
public interface IBuilding
{
Vector3 Position { get; }
}
public class Building : MonoBehaviour, IBuilding
{
public Vector3 Position => transform.position;
}
}
Есть соединение:
namespace Connections
{
public interface IVisualization<in TView>
{
void Visualize(TView view);
}
public interface IConnection : IVisualization<IConnectionView>
{
}
public interface IConnectionView
{
void DrawLine(IBuilding start, IBuilding end);
void DrawLines(IBuilding[] buildings);
}
}
Соединение из двух элементов:
namespace Connections
{
public class BuildingConnection : IConnection
{
private readonly IBuilding _from;
private readonly IBuilding _to;
public BuildingConnection(IBuilding from, IBuilding to)
{
_from = from;
_to = to;
}
public void Visualize(IConnectionView view)
{
view.DrawLine(_from, _to);
}
}
}
Из множества элементов:
namespace Connections
{
public class MultipleConnection : IConnection
{
private readonly IBuilding[] _buildings;
public MultipleConnection(IBuilding[] buildings)
{
_buildings = buildings;
}
public void Visualize(IConnectionView view)
{
view.DrawLines(_buildings);
}
}
}
И рисование этих линий:
using UnityEngine;
namespace Connections
{
[RequireComponent(typeof(Renderer))]
public class ConnectionView : MonoBehaviour, IConnectionView
{
private LineRenderer _lineRenderer;
private void Awake()
{
_lineRenderer = GetComponent<LineRenderer>();
}
public void DrawLine(IBuilding start, IBuilding end)
{
_lineRenderer.positionCount = 2;
_lineRenderer.SetPositions(new Vector3[]
{
start.Position,
end.Position
});
}
public void DrawLines(IBuilding[] buildings)
{
_lineRenderer.positionCount = buildings.Length;
for (var i = 0; i < buildings.Length; i++)
{
_lineRenderer.SetPosition(i, buildings[i].Position);
}
}
}
}
Рендерер, чтобы отрисовать это все одной строкой:
namespace Connections
{
public interface IRenderer
{
void Render();
}
public class Renderer<TModel, TView> : IRenderer
where TModel : IVisualization<TView>
{
private readonly TModel _model;
private readonly TView _view;
public Renderer(TModel model, TView view)
{
_model = model;
_view = view;
}
public void Render()
{
_model.Visualize(_view);
}
}
}
Тест:
using UnityEngine;
namespace Connections
{
public class Application : MonoBehaviour
{
[SerializeField] private Building _first, _second, _third, _fourth;
[SerializeField] private Building[] _buildingsLine;
[SerializeField] private ConnectionView _firstView, _secondView, _thirdView, _fourthView;
[SerializeField] private ConnectionView _lineView;
private IRenderer[] _renders;
private IRenderer _lineRenderer;
private void Awake()
{
_renders = new IRenderer[]
{
new Renderer<IConnection, IConnectionView>(
new BuildingConnection(_first, _second),
_firstView),
new Renderer<IConnection, IConnectionView>(
new BuildingConnection(_second, _third),
_secondView),
new Renderer<IConnection, IConnectionView>(
new BuildingConnection(_third, _fourth),
_thirdView),
new Renderer<IConnection, IConnectionView>(
new BuildingConnection(_fourth, _first),
_fourthView)
};
_lineRenderer = new Renderer<IConnection, IConnectionView>(
new MultipleConnection(_buildingsLine), _lineView);
}
private void Update()
{
foreach (var render in _renders)
{
render.Render();
}
_lineRenderer.Render();
}
}
}
Результат:
