feat(charselect): 캐릭터 선택 UI 동작 배선 (초상화·흰 테두리·직업 정보·Art 클리핑)
사용자가 메이커에서 재구성한 CharacterSelectHud(SelectedClass/Eng/Status·
SelectedCharacterArt 신설, ThiefButton→BanditButton 개명)에 컨트롤러 연결.
RenderCharacterSelect:
- 버튼 클릭 시 해당 버튼 하위 Art의 ImageRUID를 SelectedCharacterArt로 복사(큰 그림)
- 선택 버튼 테두리 흰색(1,1,1,1)·비선택 디밍
- SelectedClass(한글)·SelectedClassEng(Warrior/Thief/Magician)·SelectedClassStatus
("직업군 · 모험가" + 설명) 갱신. 개행은 string.char(10) 연결(Lua 문자열 raw 개행 문법오류 회피)
- 각 Button에 MaskComponent(기본 Shape Rect) 런타임 부착 → Art를 Button 영역으로
클리핑(Art 크기 불변, 넘치는 부분 숨김)
경로 교정: BindMenuButtons ThiefButton→BanditButton, StartNewGame Status→SelectedClassStatus.
UI(메이커 저작): CharacterSelectHud 재구성 + MageButton/BanditButton Art 위치 미세조정,
char-select 배경 에셋 01_blue_background_clean(sprite ac448e…) 추가.
산출물 재생성: SlayDeckController.codeblock + common.gamelogic.
검증: cbgap GAP 0, JS 미러 41/41, 인게임(초상화·테두리·텍스트·Art 클리핑) 확인.
(map01·타 UIGroup의 메이커 재직렬화 churn은 revert.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1090,7 +1090,7 @@
|
||||
"Name": null
|
||||
},
|
||||
"Arguments": [],
|
||||
"Code": "local buttonEntity = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MainMenu/NewGameButton\")\nif buttonEntity ~= nil and (buttonEntity.ButtonComponent ~= nil or buttonEntity:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.NewGameHandler ~= nil then\n\t\tbuttonEntity:DisconnectEvent(ButtonClickEvent, self.NewGameHandler)\n\t\tself.NewGameHandler = nil\n\tend\n\tself.NewGameHandler = buttonEntity:ConnectEvent(ButtonClickEvent, function() self:ShowLobby() end)\nend\nlocal warrior = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/WarriorButton\")\nif warrior ~= nil and (warrior.ButtonComponent ~= nil or warrior:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.WarriorSelectHandler ~= nil then\n\t\twarrior:DisconnectEvent(ButtonClickEvent, self.WarriorSelectHandler)\n\t\tself.WarriorSelectHandler = nil\n\tend\n\tself.WarriorSelectHandler = warrior:ConnectEvent(ButtonClickEvent, function() self:SelectClass(\"warrior\") end)\nend\nlocal thief = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/ThiefButton\")\nif thief ~= nil and (thief.ButtonComponent ~= nil or thief:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.ThiefSelectHandler ~= nil then\n\t\tthief:DisconnectEvent(ButtonClickEvent, self.ThiefSelectHandler)\n\t\tself.ThiefSelectHandler = nil\n\tend\n\tself.ThiefSelectHandler = thief:ConnectEvent(ButtonClickEvent, function() self:SelectClass(\"bandit\") end)\nend\nlocal mage = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/MageButton\")\nif mage ~= nil and (mage.ButtonComponent ~= nil or mage:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.MageSelectHandler ~= nil then\n\t\tmage:DisconnectEvent(ButtonClickEvent, self.MageSelectHandler)\n\t\tself.MageSelectHandler = nil\n\tend\n\tself.MageSelectHandler = mage:ConnectEvent(ButtonClickEvent, function() self:SelectClass(\"magician\") end)\nend\nlocal allDeckClose = _EntityService:GetEntityByPath(\"/ui/DeckUIGroup/DeckAllHud/Close\")\nif allDeckClose ~= nil and (allDeckClose.ButtonComponent ~= nil or allDeckClose:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.AllDeckCloseHandler ~= nil then\n\t\tallDeckClose:DisconnectEvent(ButtonClickEvent, self.AllDeckCloseHandler)\n\t\tself.AllDeckCloseHandler = nil\n\tend\n\tself.AllDeckCloseHandler = allDeckClose:ConnectEvent(ButtonClickEvent, function() self:CloseAllDeck() end)\nend\nself:BindClassDeckTabs()\nlocal start = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/StartButton\")\nif start ~= nil and (start.ButtonComponent ~= nil or start:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.StartGameHandler ~= nil then\n\t\tstart:DisconnectEvent(ButtonClickEvent, self.StartGameHandler)\n\t\tself.StartGameHandler = nil\n\tend\n\tself.StartGameHandler = start:ConnectEvent(ButtonClickEvent, function() self:StartNewGame() end)\nend\nlocal charBack = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/BackButton\")\nif charBack ~= nil and (charBack.ButtonComponent ~= nil or charBack:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.CharBackHandler ~= nil then\n\t\tcharBack:DisconnectEvent(ButtonClickEvent, self.CharBackHandler)\n\t\tself.CharBackHandler = nil\n\tend\n\tself.CharBackHandler = charBack:ConnectEvent(ButtonClickEvent, function() self:ShowLobby() end)\nend\nlocal ascMinus = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MainMenu/AscMinus\")\nif ascMinus ~= nil and (ascMinus.ButtonComponent ~= nil or ascMinus:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.AscMinusHandler ~= nil then\n\t\tascMinus:DisconnectEvent(ButtonClickEvent, self.AscMinusHandler)\n\t\tself.AscMinusHandler = nil\n\tend\n\tself.AscMinusHandler = ascMinus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(-1) end)\nend\nlocal ascPlus = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MainMenu/AscPlus\")\nif ascPlus ~= nil and (ascPlus.ButtonComponent ~= nil or ascPlus:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.AscPlusHandler ~= nil then\n\t\tascPlus:DisconnectEvent(ButtonClickEvent, self.AscPlusHandler)\n\t\tself.AscPlusHandler = nil\n\tend\n\tself.AscPlusHandler = ascPlus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(1) end)\nend",
|
||||
"Code": "local buttonEntity = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MainMenu/NewGameButton\")\nif buttonEntity ~= nil and (buttonEntity.ButtonComponent ~= nil or buttonEntity:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.NewGameHandler ~= nil then\n\t\tbuttonEntity:DisconnectEvent(ButtonClickEvent, self.NewGameHandler)\n\t\tself.NewGameHandler = nil\n\tend\n\tself.NewGameHandler = buttonEntity:ConnectEvent(ButtonClickEvent, function() self:ShowLobby() end)\nend\nlocal warrior = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/WarriorButton\")\nif warrior ~= nil and (warrior.ButtonComponent ~= nil or warrior:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.WarriorSelectHandler ~= nil then\n\t\twarrior:DisconnectEvent(ButtonClickEvent, self.WarriorSelectHandler)\n\t\tself.WarriorSelectHandler = nil\n\tend\n\tself.WarriorSelectHandler = warrior:ConnectEvent(ButtonClickEvent, function() self:SelectClass(\"warrior\") end)\nend\nlocal thief = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/BanditButton\")\nif thief ~= nil and (thief.ButtonComponent ~= nil or thief:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.ThiefSelectHandler ~= nil then\n\t\tthief:DisconnectEvent(ButtonClickEvent, self.ThiefSelectHandler)\n\t\tself.ThiefSelectHandler = nil\n\tend\n\tself.ThiefSelectHandler = thief:ConnectEvent(ButtonClickEvent, function() self:SelectClass(\"bandit\") end)\nend\nlocal mage = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/MageButton\")\nif mage ~= nil and (mage.ButtonComponent ~= nil or mage:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.MageSelectHandler ~= nil then\n\t\tmage:DisconnectEvent(ButtonClickEvent, self.MageSelectHandler)\n\t\tself.MageSelectHandler = nil\n\tend\n\tself.MageSelectHandler = mage:ConnectEvent(ButtonClickEvent, function() self:SelectClass(\"magician\") end)\nend\nlocal allDeckClose = _EntityService:GetEntityByPath(\"/ui/DeckUIGroup/DeckAllHud/Close\")\nif allDeckClose ~= nil and (allDeckClose.ButtonComponent ~= nil or allDeckClose:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.AllDeckCloseHandler ~= nil then\n\t\tallDeckClose:DisconnectEvent(ButtonClickEvent, self.AllDeckCloseHandler)\n\t\tself.AllDeckCloseHandler = nil\n\tend\n\tself.AllDeckCloseHandler = allDeckClose:ConnectEvent(ButtonClickEvent, function() self:CloseAllDeck() end)\nend\nself:BindClassDeckTabs()\nlocal start = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/StartButton\")\nif start ~= nil and (start.ButtonComponent ~= nil or start:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.StartGameHandler ~= nil then\n\t\tstart:DisconnectEvent(ButtonClickEvent, self.StartGameHandler)\n\t\tself.StartGameHandler = nil\n\tend\n\tself.StartGameHandler = start:ConnectEvent(ButtonClickEvent, function() self:StartNewGame() end)\nend\nlocal charBack = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/BackButton\")\nif charBack ~= nil and (charBack.ButtonComponent ~= nil or charBack:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.CharBackHandler ~= nil then\n\t\tcharBack:DisconnectEvent(ButtonClickEvent, self.CharBackHandler)\n\t\tself.CharBackHandler = nil\n\tend\n\tself.CharBackHandler = charBack:ConnectEvent(ButtonClickEvent, function() self:ShowLobby() end)\nend\nlocal ascMinus = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MainMenu/AscMinus\")\nif ascMinus ~= nil and (ascMinus.ButtonComponent ~= nil or ascMinus:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.AscMinusHandler ~= nil then\n\t\tascMinus:DisconnectEvent(ButtonClickEvent, self.AscMinusHandler)\n\t\tself.AscMinusHandler = nil\n\tend\n\tself.AscMinusHandler = ascMinus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(-1) end)\nend\nlocal ascPlus = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MainMenu/AscPlus\")\nif ascPlus ~= nil and (ascPlus.ButtonComponent ~= nil or ascPlus:AddComponent(\"ButtonComponent\") ~= nil) then\n\tif self.AscPlusHandler ~= nil then\n\t\tascPlus:DisconnectEvent(ButtonClickEvent, self.AscPlusHandler)\n\t\tself.AscPlusHandler = nil\n\tend\n\tself.AscPlusHandler = ascPlus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(1) end)\nend",
|
||||
"Scope": 2,
|
||||
"ExecSpace": 6,
|
||||
"Attributes": [],
|
||||
@@ -1504,7 +1504,7 @@
|
||||
"Name": null
|
||||
},
|
||||
"Arguments": [],
|
||||
"Code": "local warriorArt = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/WarriorButton/Art\")\nif warriorArt ~= nil and warriorArt.SpriteGUIRendererComponent ~= nil and self.ClassPortraits ~= nil and self.ClassPortraits[\"warrior\"] ~= nil then\n\twarriorArt.SpriteGUIRendererComponent.ImageRUID = self.ClassPortraits[\"warrior\"]\nend\nlocal mageArt = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/MageButton/Art\")\nif mageArt ~= nil and mageArt.SpriteGUIRendererComponent ~= nil and self.ClassPortraits ~= nil and self.ClassPortraits[\"magician\"] ~= nil then\n\tmageArt.SpriteGUIRendererComponent.ImageRUID = self.ClassPortraits[\"magician\"]\nend\nlocal thiefArt = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/ThiefButton/Art\")\nif thiefArt ~= nil and thiefArt.SpriteGUIRendererComponent ~= nil and self.ClassPortraits ~= nil and self.ClassPortraits[\"bandit\"] ~= nil then\n\tthiefArt.SpriteGUIRendererComponent.ImageRUID = self.ClassPortraits[\"bandit\"]\nend\nlocal warrior = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/WarriorButton\")\nif warrior ~= nil and warrior.SpriteGUIRendererComponent ~= nil then\n\tif self.SelectedClass == \"warrior\" then\n\t\twarrior.SpriteGUIRendererComponent.Color = Color(1, 0.82, 0.3, 1)\n\telse\n\t\twarrior.SpriteGUIRendererComponent.Color = Color(0.16, 0.2, 0.26, 1)\n\tend\nend\nlocal mage = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/MageButton\")\nif mage ~= nil and mage.SpriteGUIRendererComponent ~= nil then\n\tif self.SelectedClass == \"magician\" then\n\t\tmage.SpriteGUIRendererComponent.Color = Color(1, 0.82, 0.3, 1)\n\telse\n\t\tmage.SpriteGUIRendererComponent.Color = Color(0.16, 0.2, 0.26, 1)\n\tend\nend\nlocal thief = _EntityService:GetEntityByPath(\"/ui/SelectUIGroup/CharacterSelectHud/ThiefButton\")\nif thief ~= nil and thief.SpriteGUIRendererComponent ~= nil then\n\tif self.SelectedClass == \"bandit\" then\n\t\tthief.SpriteGUIRendererComponent.Color = Color(1, 0.82, 0.3, 1)\n\telse\n\t\tthief.SpriteGUIRendererComponent.Color = Color(0.16, 0.2, 0.26, 1)\n\tend\nend\nif self.SelectedClass == \"warrior\" then\n\tself:SetText(\"/ui/SelectUIGroup/CharacterSelectHud/Status\", \"전사 선택됨\")\nelseif self.SelectedClass == \"bandit\" then\n\tself:SetText(\"/ui/SelectUIGroup/CharacterSelectHud/Status\", \"도적 선택됨\")\nelseif self.SelectedClass == \"magician\" then\n\tself:SetText(\"/ui/SelectUIGroup/CharacterSelectHud/Status\", \"마법사 선택됨\")\nelse\n\tself:SetText(\"/ui/SelectUIGroup/CharacterSelectHud/Status\", \"직업을 선택하고 시작하세요\")\nend",
|
||||
"Code": "local base = \"/ui/SelectUIGroup/CharacterSelectHud\"\nlocal arts = { { p = \"/WarriorButton/Art\", c = \"warrior\" }, { p = \"/MageButton/Art\", c = \"magician\" }, { p = \"/BanditButton/Art\", c = \"bandit\" } }\nfor i = 1, #arts do\n\tlocal e = _EntityService:GetEntityByPath(base .. arts[i].p)\n\tif e ~= nil and e.SpriteGUIRendererComponent ~= nil and self.ClassPortraits ~= nil and self.ClassPortraits[arts[i].c] ~= nil then\n\t\te.SpriteGUIRendererComponent.ImageRUID = self.ClassPortraits[arts[i].c]\n\tend\nend\nlocal btns = { { p = \"/WarriorButton\", c = \"warrior\" }, { p = \"/MageButton\", c = \"magician\" }, { p = \"/BanditButton\", c = \"bandit\" } }\nfor i = 1, #btns do\n\tlocal e = _EntityService:GetEntityByPath(base .. btns[i].p)\n\tif e ~= nil then\n\t\tif e.MaskComponent == nil then\n\t\t\te:AddComponent(\"MaskComponent\")\n\t\tend\n\t\tif e.SpriteGUIRendererComponent ~= nil then\n\t\t\tif self.SelectedClass == btns[i].c then\n\t\t\t\te.SpriteGUIRendererComponent.Color = Color(1, 1, 1, 1)\n\t\t\telse\n\t\t\t\te.SpriteGUIRendererComponent.Color = Color(0.45, 0.5, 0.58, 1)\n\t\t\tend\n\t\tend\n\tend\nend\nlocal nl = string.char(10)\nlocal name = \"\"\nlocal eng = \"\"\nlocal desc = \"직업을 선택하고 시작하세요\"\nlocal btnName = \"\"\nif self.SelectedClass == \"warrior\" then\n\tname = \"전사\"\n\teng = \"Warrior\"\n\tbtnName = \"/WarriorButton\"\n\tdesc = \"직업군 · 모험가\" .. nl .. \"방어를 쌓고 버티다 강하게 역공하는 단단한 탱커.\"\nelseif self.SelectedClass == \"bandit\" then\n\tname = \"도적\"\n\teng = \"Thief\"\n\tbtnName = \"/BanditButton\"\n\tdesc = \"직업군 · 모험가\" .. nl .. \"표창 난사와 독으로 빠르게 몰아치는 민첩한 직업.\"\nelseif self.SelectedClass == \"magician\" then\n\tname = \"법사\"\n\teng = \"Magician\"\n\tbtnName = \"/MageButton\"\n\tdesc = \"직업군 · 모험가\" .. nl .. \"약하지만 게이지 운용으로 화력을 집중하는 원소 마법사.\"\nend\nif btnName ~= \"\" then\n\tlocal art = _EntityService:GetEntityByPath(base .. btnName .. \"/Art\")\n\tlocal target = _EntityService:GetEntityByPath(base .. \"/SelectedCharacterArt\")\n\tif art ~= nil and art.SpriteGUIRendererComponent ~= nil and target ~= nil and target.SpriteGUIRendererComponent ~= nil then\n\t\ttarget.SpriteGUIRendererComponent.ImageRUID = art.SpriteGUIRendererComponent.ImageRUID\n\tend\nend\nself:SetText(base .. \"/SelectedClass\", name)\nself:SetText(base .. \"/SelectedClass/SelectedClassEng\", eng)\nself:SetText(base .. \"/SelectedClassStatus\", desc)",
|
||||
"Scope": 2,
|
||||
"ExecSpace": 6,
|
||||
"Attributes": [],
|
||||
@@ -1519,7 +1519,7 @@
|
||||
"Name": null
|
||||
},
|
||||
"Arguments": [],
|
||||
"Code": "if self.SelectedClass ~= \"warrior\" and self.SelectedClass ~= \"bandit\" and self.SelectedClass ~= \"magician\" then\n\tself:SetText(\"/ui/SelectUIGroup/CharacterSelectHud/Status\", \"직업을 먼저 선택하세요\")\n\treturn\nend\nself:StartRun()",
|
||||
"Code": "if self.SelectedClass ~= \"warrior\" and self.SelectedClass ~= \"bandit\" and self.SelectedClass ~= \"magician\" then\n\tself:SetText(\"/ui/SelectUIGroup/CharacterSelectHud/SelectedClassStatus\", \"직업을 먼저 선택하세요\")\n\treturn\nend\nself:StartRun()",
|
||||
"Scope": 2,
|
||||
"ExecSpace": 6,
|
||||
"Attributes": [],
|
||||
|
||||
Reference in New Issue
Block a user