15 #region Serialized fields
18 [Tooltip(
"Invoke AdUnit.Load() when clicked.")]
19 [SerializeField]
private bool load;
22 [Tooltip(
"Invoke AdUnit.Show() when clicked.")]
23 [SerializeField]
private bool show;
26 [Tooltip(
"Invoke Hide() on the controller if it implements IConcealableAd.")]
27 [SerializeField]
private bool hide;
30 [Tooltip(
"Ad controller that hosts the current AdUnit (auto-filled in Editor).")]
34 [Tooltip(
"Specific AdUnit handler; if null, will be taken from controller.Ad (auto-filled in Editor).")]
38 [Tooltip(
"UIDocument containing the target button; auto-filled from this GameObject if missing.")]
39 [SerializeField]
private UIDocument uiDocument;
41#if UNITY_6000_5_OR_NEWER
43 [Tooltip(
"PanelRenderer containing the target button; used when no UIDocument is available.")]
44 [SerializeField]
private PanelRenderer panelRenderer;
48 [Tooltip(
"Name of the UI Toolkit Button in the visual tree (Q<Button> by name).")]
49 [SerializeField]
private string buttonName =
"AdButton";
53 #region Non-serialized state
56 private Button _button;
58#if UNITY_6000_5_OR_NEWER
59 private PanelRenderer registeredPanelRenderer;
60 private VisualElement currentRoot;
61 private int lastPanelReloadVersion = -1;
66 #region Unity lifecycle
75 protected virtual void OnValidate()
77#pragma warning disable UNT0039
78 unitController = unitController ? unitController : GetComponent<AdControllerBase>();
79 adUnit = adUnit ? adUnit : GetComponent<AdUnitHandlerBase>();
80 uiDocument = uiDocument ? uiDocument : GetComponent<UIDocument>();
81#if UNITY_6000_5_OR_NEWER
82 panelRenderer = panelRenderer ? panelRenderer : GetComponent<PanelRenderer>();
84#pragma warning restore UNT0039
95#if UNITY_6000_5_OR_NEWER
98#pragma warning disable UNT0039
99 uiDocument = uiDocument ? uiDocument : GetComponent<UIDocument>();
100#pragma warning restore UNT0039
103 if (uiDocument !=
null)
105 RebindButton(uiDocument.rootVisualElement);
107#if UNITY_6000_5_OR_NEWER
108 else if (registeredPanelRenderer ==
null)
109 Debug.LogWarning($
"{nameof(AdButtonToolkit)}: UIDocument or PanelRenderer not found.");
113 Debug.LogWarning($
"{nameof(AdButtonToolkit)}: UIDocument not found.");
127#if UNITY_6000_5_OR_NEWER
128 UnregisterPanelRenderer();
142 if (!isActiveAndEnabled)
145#if UNITY_6000_5_OR_NEWER
148#pragma warning disable UNT0039
149 uiDocument = uiDocument ? uiDocument : GetComponent<UIDocument>();
150#pragma warning restore UNT0039
154 if (uiDocument !=
null)
156 RebindButton(uiDocument.rootVisualElement);
161#if UNITY_6000_5_OR_NEWER
162 RebindButton(currentRoot);
174 if (adUnit ==
null && unitController !=
null)
178 throw new System.NullReferenceException(nameof(adUnit));
180 if (load) adUnit.
Load();
181 if (show) adUnit.Show();
195 private void RebindButton(VisualElement root)
201 Debug.LogWarning($
"{nameof(AdButtonToolkit)}: rootVisualElement is null.");
205 _button = root.Q<Button>(buttonName);
208 Debug.LogWarning($
"{nameof(AdButtonToolkit)}: Button '{buttonName}' not found.");
215 private void ClearButton()
223#if UNITY_6000_5_OR_NEWER
224 private void SynchronizeSource()
226 var resolvedDocument = uiDocument;
227 if (resolvedDocument ==
null)
228 TryGetComponent(out resolvedDocument);
230 var resolvedRenderer = resolvedDocument ==
null ? panelRenderer :
null;
231 if (resolvedDocument ==
null && resolvedRenderer ==
null)
232 TryGetComponent(out resolvedRenderer);
234 var sourceChanged = uiDocument != resolvedDocument || registeredPanelRenderer != resolvedRenderer;
239 lastPanelReloadVersion = -1;
242 uiDocument = resolvedDocument;
244 if (uiDocument !=
null)
246 UnregisterPanelRenderer();
250 if (registeredPanelRenderer == resolvedRenderer)
253 UnregisterPanelRenderer();
254 registeredPanelRenderer = resolvedRenderer;
255 if (registeredPanelRenderer ==
null)
return;
256 registeredPanelRenderer.RegisterUIReloadCallback(OnUIReload);
257 ((IPanelComponent)registeredPanelRenderer).PerformUpdate();
260 private void UnregisterPanelRenderer()
262 if (registeredPanelRenderer ==
null)
265 registeredPanelRenderer.UnregisterUIReloadCallback(OnUIReload);
266 registeredPanelRenderer =
null;
271#if UNITY_6000_5_OR_NEWER
279 private void OnUIReload(PanelRenderer renderer, VisualElement root,
int version)
281 if (!isActiveAndEnabled)
285 if (uiDocument !=
null)
287 RebindButton(uiDocument.rootVisualElement);
291 if (renderer != registeredPanelRenderer || version == lastPanelReloadVersion)
294 lastPanelReloadVersion = version;
296 RebindButton(currentRoot);