Как нарисовать соединение меж списка объектов?

У меня есть класс двух построек который выглядит так

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 шт):

Автор решения: KOTlK

На кой тебе класс 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();
        }
    }
}

Результат:

Result

→ Ссылка