Как создать компонент единого пользовательского интерфейса, который можно использовать в разных сценах - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу создать модальный интерфейс в Unity, который можно использовать в нескольких сценах, как мне этого добиться, а позже, вероятно, построить его как автономную библиотеку, которую люди смогут использовать в своих проектах Unity. Есть ли учебники по этому вопросу?

1 Ответ

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

Исследуйте это репо . Это полезно, но пока экспериментально. Элементы UIE становятся новым стандартом для Unity, поэтому через несколько недель / месяц будет создан пакет предварительного просмотра.

Если вы хотите использовать текущий пользовательский интерфейс, вы можете создавать отдельные сцены для каждого повторно используемого окна и открывать их аддитивно. Передача параметров и обратных вызовов в методы stati c, см. мой пример

Линия

public class ResultLineEntity {
    public int Place;
    public readonly string Title;
    public readonly TimeSpan Time;
    public ResultLineEntity(string title, TimeSpan time, int? place = null) {
        if (place != null) Place = place.Value;
        Title = title;
        Time = time;
    }
}

Окно

public class ResultsUi : MonoBehaviour {
    public static ResultLineEntity[] Lines
    {
        get => _lines;
        set
        {
            _lines = value;
            OnLinesChange?.Invoke();
        }
    }
    private static ResultLineEntity[] _lines;

    public static UnityEvent OnLinesChange { get; private set; } = new UnityEvent();

    [SerializeField] private Transform root;
    [SerializeField] private ResultLineUi prefab;

    private void Awake() {
        SetLines();
        OnLinesChange?.AddListener(SetLines);
    }

    public void SetLines() {
        if (Lines==null || Lines.Length < 1) return;

        foreach (var child in root.GetComponentsInChildren<ResultLineUi>()) {
            Destroy(child.gameObject);
        }

        var resultsOrdered = Lines.OrderBy(x => x.Time).ToArray();
        for (var index = 0; index < resultsOrdered.Length; index++) {
            var line = resultsOrdered[index];
            line.Place = index + 1;
            var currentLine = Instantiate(prefab, root);
            currentLine.SetLine(line);
        }
    }
}   

Пример

ResultsUi.Lines = lines;
SceneManager.LoadScene(ResultsSceneName, LoadSceneMode.Additive);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...