์ด์ ๊น์ง๋ ๋ค์ ๊ตฌ์กฐ๊น์ง๋ ๋ง๋ค์ด๋ ์ํ์๋ค.
UI โ PlayerController โ Dispatcher โ Server โ Provider โ UI
UI์์ ์์ํด์ ์๋ฒ๋ฅผ ๊ฑฐ์ณ ๋ค์ UI๋ก ๋์์ค๋ ํ๋ฆ ์์ฒด๋ ์ ์์ ์ผ๋ก ๋์ํ๋ ์ํ์๋ค.
๋ค๋ง ์ค์ ํ๋ก์ ํธ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด ๋ช ๊ฐ์ง ๋น ์ง ๋ถ๋ถ์ด ์์๋ค.
| ๊ตฌ๋ถ | ๋ฌธ์ |
|---|---|
| ํ ์คํธ | ์ค์ Actor ๊ธฐ์ค ํ ์คํธ ๋ถ๊ฐ |
| Command | PlayerController ํ๋์ฝ๋ฉ |
| Context | ๊ตฌ์กฐ๋ง ์๊ณ UI ์ ํ ์์ |
| ์์ฐ | Queue ๊ฐ๋ ์์ |
| ๋ฐ์ดํฐ ํ๋ฆ | UI โ Gameplay ์ฐ๊ฒฐ ๋ถ์กฑ |
Selection โ ViewModel โ UI ํ์
Command โ ViewModel โ UI ํ์
UI๋ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ง๋ง
์ค์ ์ ๋์ด๋ ๊ฑด๋ฌผ๊ณผ ์ฐ๊ฒฐ๋ ์ํ๋ ์๋์๋ค.
๊ฒฐ๊ตญ ๋ฌธ์ ๋ ํ๋์๋ค.
๊ตฌ์กฐ๋ ๋ง๋ค์ด๋จ๋๋ฐ ์ค์ ๊ฒ์ ํ๋ฆ์ผ๋ก ์ด์ด์ง์ง ์๋๋ค.
[๊ธฐ์กด]
UI ๊ตฌ์กฐ โ
์ค์ ๊ฒ์ ํ๋ฆ โ
[๋ชฉํ]
UI ๊ตฌ์กฐ โ
์ค์ ๊ฒ์ ํ๋ฆ โ
// PlayerController.cpp
OutCommandIds = { TEXT("Move"), TEXT("Attack"), TEXT("Hold") };
Command๋ฅผ PlayerController์์ ์ง์ ๋ง๋ค์ด์ ๋ฃ๋ ๋ฐฉ์์ด์๋ค.
// PlayerController.cpp
OutCommandIds = Unit->GetAvailableCommandIds();
// UnitActor.cpp
TArray<FName> ATWTestUnitActor::GetAvailableCommandIds() const
{
return AvailableCommandIds;
}
[์ด์ ]
PlayerController โ Command ์์ฑ
[์ดํ]
Actor โ Command ์ ๊ณต โ PlayerController ์ ๋ฌ
Command๋ฅผ ์ง์ ๋ง๋๋ ๊ตฌ์กฐ์์
Actor๊ฐ ๋ค๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ๊ตฌ์กฐ๋ก ๋ฐ๊พผ ๊ฒ์ด๋ค.
Context ๊ตฌ์กฐ๋ง ์กด์ฌ
โ UI ๋ณํ ์์
if (InCommandId == TEXT("BuildMenu"))
{
SelectionProvider->PushContext("Build");
}
ContextCommandMap.Add(
TEXT("Build"),
{
TEXT("BuildBarracks"),
TEXT("BuildArcheryRange"),
TEXT("Back")
}
);
Engineer ์ ํ
โ CommandPanel
โ Build ํด๋ฆญ
โ Context ๋ณ๊ฒฝ
โ Build ๋ฉ๋ด ํ์
โ Back
โ ์ด์ ์ํ ๋ณต๊ท
Context๊ฐ ์ค์ UI ์ ํ๊น์ง ์ด์ด์ง๋๋ก ์ฐ๊ฒฐํ๋ค.
Train ๋ฒํผ โ ๋ฐ๋ก ์์ฑ
์์ ์
++FootmanQueueCount;
์๋ฃ ์
FootmanQueueCount--;
Command ํด๋ฆญ
โ Queue ์ฆ๊ฐ
โ Timer ๋์
โ Unit ์์ฑ
โ Queue ๊ฐ์
SlotVM.QueueCount = Building->GetQueueCountForCommand(SlotVM.CommandId);
Train Footman x2
Train Archer x1
๋ฒํผ ํด๋ฆญ โ ์ํ ๋ณ๊ฒฝ โ UI ๊ฐฑ์ ํ๋ฆ์ด ์ค์ ๋ก ์ด์ด์ง๋๋ก ๋ง๋ค์๋ค.
QueueCount๋ฅผ ์ด๋์์ ์ฒ๋ฆฌํ ์ง
Coordinator ์์ X
PlayerController์์ ํ์ฒ๋ฆฌ
TArray<FCommandSlotViewModel> BuiltCommands = HUDCoordinator->GetLastBuiltCommandViewModels();
for (FCommandSlotViewModel& SlotVM : BuiltCommands)
{
SlotVM.QueueCount = Building->GetQueueCountForCommand(SlotVM.CommandId);
}
HUDRootWidget->SetCommandData(BuiltCommands);
| ํญ๋ชฉ | ์ด์ |
|---|---|
| ์ฑ ์ ๋ถ๋ฆฌ | Coordinator๋ UI ๊ตฌ์ฑ๋ง ๋ด๋น |
| ํ์ฅ์ฑ | ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ์ํฅ ์ต์ํ |
| ์๋ | MVP ๋จ๊ณ์์ ๋น ๋ฅด๊ฒ ์ ์ฉ ๊ฐ๋ฅ |
UPROPERTY(EditAnywhere)
TArray<FName> AvailableCommandIds;
BP์์ Command ์์
โ UI ๋ฐ๋ก ๋ฐ์
ํ๋์ฝ๋ฉ ์ ๊ฑฐํ๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ ์ํ๋ค.
Actor ์ ํ
โ CommandIds ๊ฐ์ ธ์ค๊ธฐ
โ UI ํ์
โ ์
๋ ฅ ๋ฐ์
โ PlayerController ์คํ
โ ์ํ ๋ณ๊ฒฝ
โ UI ๊ฐฑ์
// 1. ํด๋ฆญ
Widget โ ExecuteCommandById
// 2. ์คํ
PlayerController โ ExecuteGameplayCommandById
// 3. ์ํ ๋ณ๊ฒฝ
Building โ Queue ์ฆ๊ฐ
// 4. UI ๊ฐฑ์
Coordinator โ CommandPanel ๊ฐฑ์
| ๊ธฐ๋ฅ | ์ํ |
|---|---|
| ์ ๋ ์ ํ | โ |
| ์ด๋ | โ |
| ๊ณต๊ฒฉ (placeholder) | โ |
| BuildMenu | โ |
| ๊ฑด๋ฌผ ์ ํ | โ |
| ์ ๋ ์์ฐ | โ |
| Queue ํ์ | โ |
UI ์ค์ฌ ๊ตฌ์กฐ
โ ํ์๋ง ๋๋ ์ํ
Actor ์ค์ฌ ๊ตฌ์กฐ
โ ์ค์ ๋์ ๊ฐ๋ฅ
| ํญ๋ชฉ | ์ด์ | ์ดํ |
|---|---|---|
| Command ์์ฑ | PlayerController | Actor |
| Context | ๊ตฌ์กฐ๋ง ์กด์ฌ | ์ค์ ๋์ |
| ์์ฐ | ์ฆ์ ์คํ | Queue ๊ธฐ๋ฐ |
| UI ๊ฐฑ์ | ์๋ | ์ํ ๊ธฐ๋ฐ |
| ํ ์คํธ | ์ ํ์ | ํ๋ ์ด ๊ฐ๋ฅ |
์ค๊ณ โ ์ค์ ํ๋ ์ด ํ๋ฆ๊น์ง ์ฐ๊ฒฐ ์๋ฃ
ํ๋์ฝ๋ฉ ์ ๊ฑฐ
โ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ํ
BuildMenu โ ์ค์ UI ์ ํ ๋์
Queue โ UI ์ฐ๊ฒฐ
์ ํ โ ๋ช
๋ น โ ์คํ โ UI ๊ฐฑ์
Actor
โ CommandIds ์ ๊ณต
โ PlayerController
โ ์คํ
โ ์ํ ๋ณ๊ฒฝ
โ Provider
โ Coordinator
โ UI
- ๊ตฌ์กฐ๋ง ์๋ ์ํ์์ ์ค์ ๊ฒ์ ํ๋ฆ๊น์ง ์ฐ๊ฒฐํ๋ค.
- Command๋ฅผ ์์ฑํ๋ ๋ฐฉ์์์ ๋ฐ์ดํฐ๋ก ๋ฐ์์ค๋ ๊ตฌ์กฐ๋ก ๋ฐ๊ฟจ๊ณ ,
- Context์ ์์ฐ Queue๊น์ง UI์ ์ค์ ๋ก ๋ฐ์๋๋๋ก ๋ถ์๋ค.