Запуск сценариев только на нажатых объектах - PullRequest
0 голосов
/ 27 февраля 2020

Моя проблема, кажется, довольно легко решить в моей голове, но в единстве это кажется труднее. В основном я хочу сделать симуляцию системы 3-4 конвейеров. Прямо сейчас у меня есть конвейер в сцене, и я могу вставить, сколько конвейеров я хочу, нажав кнопку. Кроме того, у меня есть 2 ползунка, которые контролируют масштаб конвейера (длину и ширину), но когда я перемещаю их, все конвейеры масштабируются до одинакового размера. Что я хочу сделать, так это то, что весы работают только на одном конвейере одновременно, на конвейере, который я нажимаю после воспроизведения сцены. У кого-нибудь есть идеи, как мне это сделать? Заранее спасибо! Масштабный код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScaleWithSlider : MonoBehaviour
{
    public Slider z;

    public Slider x;





    // Update is called once per frame
    void Update()
    {
        transform.localScale = new Vector3(x.value, 25f, z.value);
    }
}

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вам нужно ограничить slider активным conveyor.

Существует миллион способов его реализации, вы можете реализовать какой-то подход контроллера, подобный этому.

Класс scale сообщает контроллеру, был ли на нем нажат. Это также может быть сделано любым другим классом. Масштабирование применяется только при выборе этого конвейера.

    public class ScaleWithSlider : MonoBehaviour
    {
        public Slider z;
        public Slider x;

        private bool _respondsToSlider;
        private ConveyorController _conveyorController;

        private void Start()
        {
            _conveyorController = GetComponentInParent<ConveyorController>();
        }

        void Update()
        {
            if (!_respondsToSlider) return;

            transform.localScale = new Vector3(x.value, 25f, z.value);
        }

        public void SetRespondsToSlider(bool respondsToSlider)
        {
            _respondsToSlider = respondsToSlider;
        }

        private void OnMouseDown()
        {
            // any other way of getting the active conveyor would also work
            _conveyorController.SetActiveConveyor(this);
        }

Класс Controller обеспечивает работу только одного конвейера:

    public class ConveyorController : MonoBehaviour
    {
        // this list must filled somehow. best would be right after Instantiating the conveyer.
        private List<ScaleWithSlider> _allSliderScalers;

        public void SetActiveConveyor(ScaleWithSlider scaleWithSlider)
        {
            foreach (var conveyor in _allSliderScalers)
            {
                conveyor.SetRespondsToSlider(conveyor == scaleWithSlider);
            }
        }
    }

0 голосов
/ 27 февраля 2020

как упомянуто @ aalmigthy , есть много способов сделать это. Самый простой из них - при каждом щелчке мыши сохранять ссылку на объект конвейера, по которому щелкнули, в scenemanager и при изменении значения ползунка. примените его к сохраненному экземпляру объекта конвейера из scenemanager (а не из экземпляра объекта конвейера, например, как это делается сейчас), сказав что-то вроде:

currentConveyer.transform.localScale = new Vector3(x.value, 25f, z.value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...