Files
MMORPG/Packages/com.unity.inputsystem/InputSystem/Editor/UITKAssetEditor/Views/CompositeBindingPropertiesView.cs
cooney ce83f21c93 UI 자동화를 위해 바인딩 기능 구현
- 유니티 에셋 인증 오류로 meta 재생성
2026-01-25 01:31:34 +09:00

109 lines
4.5 KiB
C#

#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine.InputSystem.Editor.Lists;
using UnityEngine.InputSystem.Utilities;
using UnityEngine.UIElements;
namespace UnityEngine.InputSystem.Editor
{
internal class CompositeBindingPropertiesView : ViewBase<CompositeBindingPropertiesView.ViewState>
{
private readonly DropdownField m_CompositeTypeField;
private EventCallback<ChangeEvent<string>> m_CompositeTypeFieldChangedHandler;
private const string UxmlName = InputActionsEditorConstants.PackagePath +
InputActionsEditorConstants.ResourcesPath +
InputActionsEditorConstants.CompositeBindingPropertiesViewUxml;
public CompositeBindingPropertiesView(VisualElement root, StateContainer stateContainer)
: base(root, stateContainer)
{
var visualTreeAsset = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(UxmlName);
var container = visualTreeAsset.CloneTree();
rootElement.Add(container);
m_CompositeTypeField = container.Q<DropdownField>("composite-type-dropdown");
CreateSelector(Selectors.GetSelectedBinding,
(binding, state) => binding == null ? null : Selectors.GetCompositeBindingViewState(state, binding.Value));
}
public override void RedrawUI(ViewState viewState)
{
m_CompositeTypeField.choices.Clear();
m_CompositeTypeField.choices.AddRange(viewState.compositeNames);
m_CompositeTypeField.SetValueWithoutNotify(viewState.selectedCompositeName);
m_CompositeTypeFieldChangedHandler = _ => OnCompositeTypeFieldChanged(viewState);
m_CompositeTypeField.RegisterValueChangedCallback(m_CompositeTypeFieldChangedHandler);
viewState.parameterListView.onChange = () =>
{
Dispatch(Commands.UpdatePathNameAndValues(viewState.parameterListView.GetParameters(), viewState.selectedBindingPath), UIRebuildMode.None);
};
viewState.parameterListView.OnDrawVisualElements(rootElement);
}
public override void DestroyView()
{
m_CompositeTypeField.UnregisterValueChangedCallback(m_CompositeTypeFieldChangedHandler);
}
private void OnCompositeTypeFieldChanged(ViewState viewState)
{
Dispatch(
Commands.SetCompositeBindingType(
viewState.selectedBinding,
viewState.compositeTypes,
viewState.parameterListView,
m_CompositeTypeField.index));
}
internal class ViewState
{
public SerializedInputBinding selectedBinding;
public IEnumerable<string> compositeTypes;
public SerializedProperty selectedBindingPath;
public ParameterListView parameterListView;
public string selectedCompositeName;
public IEnumerable<string> compositeNames;
}
}
internal static partial class Selectors
{
public static CompositeBindingPropertiesView.ViewState GetCompositeBindingViewState(in InputActionsEditorState state,
SerializedInputBinding binding)
{
var inputAction = GetSelectedAction(state);
var compositeNameAndParameters = NameAndParameters.Parse(binding.path);
var compositeName = compositeNameAndParameters.name;
var compositeType = InputBindingComposite.s_Composites.LookupTypeRegistration(compositeName);
var parameterListView = new ParameterListView();
if (compositeType != null)
parameterListView.Initialize(compositeType, compositeNameAndParameters.parameters);
var compositeTypes = GetCompositeTypes(binding.path, inputAction?.expectedControlType).ToList();
var compositeNames = compositeTypes.Select(ObjectNames.NicifyVariableName).ToList();
var selectedCompositeName = compositeNames[compositeTypes.FindIndex(str =>
InputBindingComposite.s_Composites.LookupTypeRegistration(str) == compositeType)];
return new CompositeBindingPropertiesView.ViewState
{
selectedBinding = binding,
selectedBindingPath = GetSelectedBindingPath(state),
compositeTypes = compositeTypes,
compositeNames = compositeNames,
parameterListView = parameterListView,
selectedCompositeName = selectedCompositeName
};
}
}
}
#endif