Compare commits

...
Author SHA1 Message Date
adminandClaude Opus 4.5 3f81b34f21 Add stale PR refs cleanup to iOS addressables build
Same fix as mac_build - prune stale PR refs before checkout to prevent
"Could not scan for Git LFS files" errors on self-hosted runners.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 06:59:34 -08:00
adminandClaude Opus 4.5 35ce2f7931 Give each modal panel its own dedicated modal blocker
Previously Settings, Bug Report, and What's New panels shared a single
modal blocker, which could cause state conflicts if one panel's blocker
state affected another.

Now each panel has its own dedicated blocker:
- Settings Panel Modal Blocker
- Bug Report Modal Blocker
- What's New Modal Blocker

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 06:45:39 -08:00
adminandClaude Opus 4.5 515be0b759 Add click-to-dismiss on modal blockers as safety net
If a modal panel somehow becomes invisible while its blocker remains
active, users can now tap the dimmed area to dismiss it. This prevents
getting stuck with an unresponsive UI.

Applied to all three controllers that share the modal blocker:
- WhatsNewPanelController
- BugReportPanelController
- SettingsPanelController

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 06:40:19 -08:00
6 changed files with 190 additions and 7 deletions
@@ -32,6 +32,16 @@ jobs:
runs-on: [self-hosted, macOS, unity-mac]
steps:
- name: Cleanup stale PR refs
run: |
# Prune stale PR refs from previous runs. These can accumulate on self-hosted runners
# and cause "reference broken" errors during checkout. Must be done
# before checkout to prevent "missing object" errors.
if [ -d ".git" ]; then
echo "Pruning stale PR refs..."
git for-each-ref --format='%(refname)' refs/remotes/pull/ 2>/dev/null | \
xargs -r git update-ref -d 2>/dev/null || true
fi
- uses: actions/checkout@v4
with:
lfs: true
@@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: 4458439bbfafa478b905417eff3c5741
m_currentHash:
serializedVersion: 2
Hash: 0e8900f37a8b7b1c88049de57e371339
Hash: 00000000000000000000000000000000
m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 1
m_CatalogRequestsTimeout: 0
@@ -7087,6 +7087,81 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &54827267
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 54827270}
- component: {fileID: 54827269}
- component: {fileID: 54827268}
m_Layer: 0
m_Name: What's New Modal Blocker
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 0
--- !u!114 &54827268
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 54827267}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.023529412, g: 0, b: 0, a: 0.2901961}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &54827269
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 54827267}
m_CullTransparentMesh: 1
--- !u!224 &54827270
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 54827267}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 300036923}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &55468809
GameObject:
m_ObjectHideFlags: 0
@@ -37238,7 +37313,9 @@ RectTransform:
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 718225975}
- {fileID: 1114577701}
- {fileID: 54827270}
- {fileID: 944316531}
- {fileID: 1566150938}
- {fileID: 894269895}
@@ -37327,7 +37404,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
panel: {fileID: 1566150937}
modalBlocker: {fileID: 1114577700}
modalBlocker: {fileID: 718225972}
soundEffectsSource: {fileID: 1226040489}
musicSource: {fileID: 1191713760}
soundEffectsSlider: {fileID: 75920628}
@@ -97922,6 +97999,81 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 717768290}
m_CullTransparentMesh: 1
--- !u!1 &718225972
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 718225975}
- component: {fileID: 718225974}
- component: {fileID: 718225973}
m_Layer: 0
m_Name: Settings Panel Modal Blocker
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 0
--- !u!114 &718225973
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 718225972}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.023529412, g: 0, b: 0, a: 0.2901961}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &718225974
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 718225972}
m_CullTransparentMesh: 1
--- !u!224 &718225975
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 718225972}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 300036923}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &718747548
GameObject:
m_ObjectHideFlags: 0
@@ -152816,7 +152968,7 @@ GameObject:
- component: {fileID: 1114577703}
- component: {fileID: 1114577702}
m_Layer: 0
m_Name: Modal Blocker
m_Name: Bug Report Modal Blocker
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -237050,7 +237202,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::common.WhatsNew.WhatsNewPanelController
panel: {fileID: 1734963782}
modalBlocker: {fileID: 1114577700}
modalBlocker: {fileID: 54827267}
contentContainer: {fileID: 1379103398}
entryPrefab: {fileID: 5544785402926622791, guid: a584af99dd4044d0486be61bf74b8dbe,
type: 3}
@@ -65,7 +65,14 @@ public class SettingsPanelController : MonoBehaviour {
void Start() {
_active = false;
panel.SetActive(false);
modalBlocker.SetActive(false);
if (modalBlocker != null) {
modalBlocker.SetActive(false);
// Add click-to-dismiss on modal blocker as safety net
var blockerButton = modalBlocker.GetComponent<Button>();
if (blockerButton == null) { blockerButton = modalBlocker.AddComponent<Button>(); }
blockerButton.onClick.AddListener(DismissButtonClicked);
}
soundEffectsSource.volume = PlayerPrefs.GetFloat(SoundEffectsVolumeKey, 0.5f);
musicSource.volume = PlayerPrefs.GetFloat(MusicVolumeKey, 0.5f);
@@ -35,7 +35,14 @@ namespace common.GUIUtils {
void Awake() {
panel.SetActive(false);
modalBlocker.SetActive(false);
if (modalBlocker != null) {
modalBlocker.SetActive(false);
// Add click-to-dismiss on modal blocker as safety net
var blockerButton = modalBlocker.GetComponent<Button>();
if (blockerButton == null) { blockerButton = modalBlocker.AddComponent<Button>(); }
blockerButton.onClick.AddListener(Hide);
}
submitButton.onClick.AddListener(OnSubmitClicked);
cancelButton.onClick.AddListener(OnCancelClicked);
@@ -41,7 +41,14 @@ namespace common.WhatsNew {
void Awake() {
if (panel != null) panel.SetActive(false);
if (modalBlocker != null) modalBlocker.SetActive(false);
if (modalBlocker != null) {
modalBlocker.SetActive(false);
// Add click-to-dismiss on modal blocker as safety net
var blockerButton = modalBlocker.GetComponent<Button>();
if (blockerButton == null) { blockerButton = modalBlocker.AddComponent<Button>(); }
blockerButton.onClick.AddListener(Hide);
}
if (gotItButton != null) gotItButton.onClick.AddListener(OnGotItClicked);
if (showOlderButton != null) showOlderButton.onClick.AddListener(OnShowOlderClicked);