/// <summary> /// Функция, описывающая процесс инициализации прямоугольника /// </summary> /// <param name="position">Позиция, в которой создается прямоугольник</param> public void InstantiateObject(Vector3 position) { //Создаем переменную под контроллер прямоугольника RectangleController rectangleController = null; //Если пул выключенных объектов пуст if (_poolOfDisabled.Count == 0) { //Создаем новый прямоугольник GameObject newItem = Instantiate(_poolObjectPrefab, transform); rectangleController = newItem.GetComponent <RectangleController>(); //Добавляем созданный прямоугольник в пул активных элементов _poolOfEnabled.Add(rectangleController); //Подписываемся на событие отключение только что созданного объекта rectangleController.ObjectDisabledEvent.AddListener(OnDisabledObj); } //Если в пуле выключенных объектов есть элементы else { //Переносим выключенный объект из пула неактивных элементов в пул активных _poolOfEnabled.Add(_poolOfDisabled[_poolOfDisabled.Count - 1]); _poolOfDisabled.RemoveAt(_poolOfDisabled.Count - 1); rectangleController = (RectangleController)_poolOfEnabled[_poolOfEnabled.Count - 1]; } //Устанавливаем позицию прямоугольника в указанную точку rectangleController.transform.position = new Vector3(position.x, position.y, 0); //Включить прямоугольник _poolOfEnabled[_poolOfEnabled.Count - 1].Enable(); }
/// <summary> /// Функция, сбрасывающая выделение выделенного прямоугольника, если он соответсвует переданному /// </summary> /// <param name="_rect">Прямоугольник для проверки</param> public void TryToClearCheckedRect(RectangleController _rect) { if (_rect1ToCreateConnection != null && _rect == _rect1ToCreateConnection) { _rect1ToCreateConnection = null; } }
/// <summary> /// Initiates all common controllers and objects /// </summary> private void Awake() { // Singleton Instance = this; // Cache main camera reference if (Camera.main != null) { mainCamera = Camera.main; } else { Debug.LogWarning("Main camera not found"); } // Create object pools with rectangles and lines var rectanglePrefab = Resources.Load <GameObject>("Rectangle"); var linePrefab = Resources.Load <GameObject>("Line"); objectPooler = new ObjectPooler { Pools = new ObjectPooler.Pool[2] }; objectPooler.Pools[0] = new ObjectPooler.Pool() { name = "Rectangles", prefab = rectanglePrefab, size = 50 }; objectPooler.Pools[1] = new ObjectPooler.Pool() { name = "Lines", prefab = linePrefab, size = 50 }; // Create all controllers inputController = new InputController(); rectangleController = new RectangleController(); lineController = new LineController(); // Create arrays with controllers for Start() and Update() calls _controllersToInit = new IInit[1]; _controllersToUpdate = new IUpdate[1]; _controllersToInit[0] = objectPooler; _controllersToUpdate[0] = inputController; }
/// <summary> /// Конструктор структуры /// </summary> /// <param name="_rect1">Первый прямоугольник</param> /// <param name="_rect2">Второй прямоугольник</param> public PoolOfConnectionObjectParameters(RectangleController _rect1, RectangleController _rect2) { rect1 = _rect1; rect2 = _rect2; }
IController IControllable.GetController() { return(_controller ?? (_controller = new RectangleController(this))); }
public IController GetController() { return(_controller ?? (_controller = new RectangleController(this))); }
/// <summary> /// Функция, выключающая объект /// </summary> /// <param name="_rect">Объект, который вызвал выключение связи</param> public void DisableObj(RectangleController _rect) { DisableObj(); }
/// <summary> /// Функция, создающая соединение между прямоугольниками (если это возможно). /// </summary> /// <param name="_rect">Прямоугольник для которого нужно создать связь</param> /// <returns>Успешность выполнения</returns> public bool TryToCreateConnection(RectangleController _rect) { //Если передан пустой параметр передать неуспешный результат if (_rect == null) { return(false); } //Если первый выделенный прямоугольник не пустой, но при этом он ссылается //на выключенный объект - очистить ссылку на первый выделенный прямоугольник if (_rect1ToCreateConnection != null && !_rect1ToCreateConnection.GetState()) { _rect1ToCreateConnection = null; } //Если пытаемся создать связь с одним и тем же прямоугольником if (_rect1ToCreateConnection == _rect) { //Снимаем выделение _rect.UncheckRect(); //Очищаем ссылку на первый выделенный прямоугольник _rect1ToCreateConnection = null; //Возвращаем неудачный результат return(false); } //Если ссылка на первый выделенный прямоугольник пуста if (_rect1ToCreateConnection == null) { //Сохраняем ссылку на первый выделенный прямоугольник _rect1ToCreateConnection = _rect; //Выделяем прямоугольник _rect1ToCreateConnection.CheckRect(); } //Если ссылка на первый выделенный прямоугольник не пуста else { //Создаем параметры для создания связи прямоугольников PoolObjectParameters tmpParameters = (PoolObjectParameters) new PoolOfConnectionObjectParameters(_rect1ToCreateConnection, _rect); //Если в пуле связей не существует связи со идентичными параметрами if (!_poolOfConnections.IsPoolObjectExist(tmpParameters)) { //Создадим объект связи _poolOfConnections.InstantiateObject(tmpParameters); //Снимаем выделение с прямоугольников, используемого для создания связи _rect1ToCreateConnection.UncheckRect(); _rect.UncheckRect(); //Очищаем ссылку на первый выделенный прямоугольник _rect1ToCreateConnection = null; } } //Возвратить успешный результат return(true); }
IController IControllable.GetController() { return(_controller ?? (_controller = new CommentBoxController(this))); }