引入 UISerializationRoot 和 Item
- 完成 MenuForm 和 SelectRoleForm 的迁移
This commit is contained in:
@@ -26,6 +26,7 @@ namespace SepCore.UI
|
||||
{
|
||||
if (rawData == null)
|
||||
{
|
||||
Log.Error("DialogController.BuildContext() rawData is null.");
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -60,7 +61,6 @@ namespace SepCore.UI
|
||||
DialogContext context = BuildContext(rawData);
|
||||
if (context == null)
|
||||
{
|
||||
Log.Warning("DialogController.OpenUIAsync() rawData is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace SepCore.UI
|
||||
{
|
||||
if (useCase != null)
|
||||
{
|
||||
Log.Warning("DialogController does not use a use case.");
|
||||
Log.Error("DialogController does not use a use case.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace SepCore.UI
|
||||
|
||||
if (userData is not DialogContext context)
|
||||
{
|
||||
Log.Warning("DialogContext is invalid.");
|
||||
Log.Error("DialogForm requires DialogContext as userData.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -47,12 +47,6 @@ namespace SepCore.UI
|
||||
|
||||
public void RefreshUI(DialogContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
Log.Warning("DialogContext is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
_dialogMode = context.Mode;
|
||||
RefreshDialogMode();
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace SepCore.UI
|
||||
|
||||
private static string BuildPromptContext(InputActionId actionId)
|
||||
{
|
||||
if (GameEntry.InputModule == null || !GameEntry.InputModule.TryGetPrompt(actionId, out InputPrompt prompt))
|
||||
if (!GameEntry.InputModule.TryGetPrompt(actionId, out InputPrompt prompt))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -46,7 +46,7 @@ namespace SepCore.UI
|
||||
{
|
||||
if (userData != null)
|
||||
{
|
||||
Log.Warning("HudController.OpenUIAsync() userData type is invalid.");
|
||||
Log.Error("HudController.OpenUIAsync() userData type is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -60,11 +60,6 @@ namespace SepCore.UI
|
||||
|
||||
private void OnDeviceKindChanged(InputDeviceKind deviceKind)
|
||||
{
|
||||
if (Context == null || Form == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Context.MovePrompt = BuildPromptContext(InputActionId.Move);
|
||||
Form.RefreshMovePrompt(Context.MovePrompt);
|
||||
}
|
||||
|
||||
@@ -51,21 +51,14 @@ namespace SepCore.UI
|
||||
|
||||
public void RefreshUI(HudContext hudContext)
|
||||
{
|
||||
RefreshMovePrompt(hudContext?.MovePrompt);
|
||||
RefreshMovePrompt(hudContext.MovePrompt);
|
||||
}
|
||||
|
||||
public void RefreshMovePrompt(string prompt)
|
||||
{
|
||||
bool visible = !string.IsNullOrEmpty(prompt);
|
||||
if (_movePromptRoot != null)
|
||||
{
|
||||
_movePromptRoot.SetActive(visible);
|
||||
}
|
||||
|
||||
if (_movePromptText != null)
|
||||
{
|
||||
_movePromptText.text = prompt;
|
||||
}
|
||||
_movePromptRoot.SetActive(visible);
|
||||
_movePromptText.text = prompt;
|
||||
}
|
||||
|
||||
#region FSM
|
||||
@@ -182,8 +175,6 @@ namespace SepCore.UI
|
||||
|
||||
private void RefreshPerformanceStats()
|
||||
{
|
||||
if (_cpuTimeCostText == null) return;
|
||||
|
||||
bool hasCpuFrame = TryGetLastValue(_cpuTimeRecorder, out long cpuFrameNanoseconds);
|
||||
|
||||
if (!hasCpuFrame)
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace SepCore.UI
|
||||
ShowRecycleButton = false;
|
||||
}
|
||||
|
||||
public ItemTooltipContext(ItemTooltipRawData rawData)
|
||||
public ItemTooltipContext(ItemTooltipRawData rawData) : this()
|
||||
{
|
||||
Index = rawData.Index;
|
||||
ItemType = rawData.ItemType;
|
||||
@@ -37,19 +37,15 @@ namespace SepCore.UI
|
||||
Price = rawData.Price;
|
||||
TargetPos = rawData.TargetPos;
|
||||
ShowRecycleButton = rawData.OnRecycle != null;
|
||||
if (ItemType == ItemType.None)
|
||||
{
|
||||
IconAssetName = string.Empty;
|
||||
Title = string.Empty;
|
||||
}
|
||||
else if (ItemType == ItemType.Weapon)
|
||||
|
||||
if (ItemType == ItemType.Weapon)
|
||||
{
|
||||
var data = rawData.WeaponData;
|
||||
IconAssetName = data.IconAssetName;
|
||||
Title = data.Title;
|
||||
Description = ItemDescUtility.CreateWeaponDescription(data);
|
||||
}
|
||||
else
|
||||
else if (ItemType == ItemType.Prop)
|
||||
{
|
||||
var data = rawData.PropData;
|
||||
IconAssetName = data.IconAssetName;
|
||||
|
||||
@@ -71,7 +71,6 @@ namespace SepCore.UI
|
||||
ItemTooltipContext context = BuildContext(rawData);
|
||||
if (context == null)
|
||||
{
|
||||
Log.Warning("ItemTooltipController.OpenUIAsync() rawData is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -89,7 +88,7 @@ namespace SepCore.UI
|
||||
{
|
||||
if (useCase != null)
|
||||
{
|
||||
Log.Warning("ItemTooltipController does not use a use case.");
|
||||
Log.Error("ItemTooltipController does not use a use case.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,33 +40,21 @@ namespace SepCore.UI
|
||||
|
||||
public async UniTaskVoid RefreshUI(ItemTooltipContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
Log.Warning("ItemTooltipForm context is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
_context = context;
|
||||
|
||||
_targetPos = ConvertWorldToAnchored(_context.TargetPos);
|
||||
Log.Info($"{_context.TargetPos}->{_targetPos}");
|
||||
|
||||
if (_content != null)
|
||||
{
|
||||
_content.anchoredPosition3D = _targetPos;
|
||||
}
|
||||
_content.anchoredPosition3D = _targetPos;
|
||||
|
||||
_itemTitle.text = _context.Title ?? string.Empty;
|
||||
_itemTypeText.text = BuildTypeText(_context.ItemType) ?? string.Empty;
|
||||
_itemDescription.text = _context.Description ?? string.Empty;
|
||||
_itemTitle.text = _context.Title;
|
||||
_itemTypeText.text = BuildTypeText(_context.ItemType);
|
||||
_itemDescription.text = _context.Description;
|
||||
_itemPrice.text = $"{_context.Price} <sprite name=\"coin\" index=0>";
|
||||
|
||||
if (_recycleButton != null)
|
||||
{
|
||||
_recycleButton.gameObject.SetActive(_context.ShowRecycleButton);
|
||||
}
|
||||
_recycleButton.gameObject.SetActive(_context.ShowRecycleButton);
|
||||
|
||||
if (_iconArea != null && !string.IsNullOrEmpty(_context.IconAssetName))
|
||||
if (!string.IsNullOrEmpty(_context.IconAssetName))
|
||||
{
|
||||
string iconAssetName = _context.IconAssetName;
|
||||
var sprite = await SpriteLoader.LoadSpriteByKeyAsync(iconAssetName);
|
||||
@@ -103,12 +91,7 @@ namespace SepCore.UI
|
||||
|
||||
private void ResizeToFitContent()
|
||||
{
|
||||
if (!_autoResizeHeight || _content == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_itemDescription == null)
|
||||
if (!_autoResizeHeight)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -126,11 +109,6 @@ namespace SepCore.UI
|
||||
|
||||
private void ApplyClampedTargetPos()
|
||||
{
|
||||
if (_content == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RectTransform parent = _content.parent as RectTransform;
|
||||
if (parent == null)
|
||||
{
|
||||
@@ -160,11 +138,6 @@ namespace SepCore.UI
|
||||
|
||||
private Vector3 ConvertWorldToAnchored(Vector3 worldPos)
|
||||
{
|
||||
if (_content == null)
|
||||
{
|
||||
return worldPos;
|
||||
}
|
||||
|
||||
RectTransform parent = _content.parent as RectTransform;
|
||||
if (parent == null)
|
||||
{
|
||||
@@ -192,7 +165,6 @@ namespace SepCore.UI
|
||||
|
||||
public void OnRecycleButtonClick()
|
||||
{
|
||||
if (_context == null) return;
|
||||
GameEntry.Event.Fire(this, ItemTooltipRecycleEventArgs.Create(_context.Index, _context.Price));
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ namespace SepCore.UI
|
||||
private void OnCommandTriggered(InputCommand cmd)
|
||||
{
|
||||
if (cmd.ActionId != InputActionId.Move) return;
|
||||
if (Context == null || Form == null) return;
|
||||
|
||||
Context.Direction = cmd.Vector2Value;
|
||||
Context.Magnitude = cmd.Vector2Value.magnitude;
|
||||
|
||||
@@ -39,20 +39,9 @@ namespace SepCore.UI
|
||||
return null;
|
||||
}
|
||||
|
||||
if (rawData.Rewards == null)
|
||||
{
|
||||
Log.Error("LevelUpFormController.BuildContext() rewards are null.");
|
||||
return null;
|
||||
}
|
||||
|
||||
List<LevelUpRewardItemContext> props = new List<LevelUpRewardItemContext>(rawData.Rewards.Count);
|
||||
foreach (var reward in rawData.Rewards)
|
||||
{
|
||||
if (reward == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
props.Add(new LevelUpRewardItemContext
|
||||
{
|
||||
Title = reward.Title,
|
||||
@@ -80,7 +69,7 @@ namespace SepCore.UI
|
||||
|
||||
if (userData != null)
|
||||
{
|
||||
Log.Warning("LevelUpController.OpenUIAsync() userData type is invalid.");
|
||||
Log.Error("LevelUpController.OpenUIAsync() userData type is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ namespace SepCore.UI
|
||||
propItem.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
if (_context.Props == null) return;
|
||||
int count = Mathf.Min(_propItems.Length, _context.Props.Count);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
@@ -40,13 +39,13 @@ namespace SepCore.UI
|
||||
{
|
||||
base.OnOpen(userData);
|
||||
|
||||
if (userData is LevelUpContext context)
|
||||
if (userData is not LevelUpContext context)
|
||||
{
|
||||
RefreshUI(context);
|
||||
Log.Error("LevelUpForm requires LevelUpContext as userData.");
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Warning("LevelUpForm requires LevelUpFormContext as userData.");
|
||||
RefreshUI(context);
|
||||
}
|
||||
|
||||
protected override void OnClose(bool isShutdown, object userData)
|
||||
|
||||
@@ -30,17 +30,15 @@ namespace SepCore.UI
|
||||
|
||||
_context = context;
|
||||
|
||||
if (_titleText != null) _titleText.text = context.Title;
|
||||
if (_descriptionText != null) _descriptionText.text = context.Description;
|
||||
if (_iconArea != null) _iconArea.OnInit(context.Icon, context.Rarity);
|
||||
_titleText.text = context.Title;
|
||||
_descriptionText.text = context.Description;
|
||||
_iconArea.OnInit(context.Icon, context.Rarity);
|
||||
|
||||
LoadIcon(_context.IconAssetName).Forget();
|
||||
}
|
||||
|
||||
private async UniTaskVoid LoadIcon(string iconAssetName)
|
||||
{
|
||||
if (_iconArea == null) return;
|
||||
|
||||
if (string.IsNullOrEmpty(iconAssetName)) return;
|
||||
|
||||
var sprite = await SpriteLoader.LoadSpriteByKeyAsync(iconAssetName);
|
||||
|
||||
@@ -23,16 +23,11 @@ namespace SepCore.UI
|
||||
|
||||
public async UniTaskVoid OnInit(DisplayItemContext context, int index)
|
||||
{
|
||||
if (context == null) return;
|
||||
|
||||
_context = context;
|
||||
_index = index;
|
||||
|
||||
if (_iconArea != null)
|
||||
{
|
||||
var sprite = await SpriteLoader.LoadSpriteByKeyAsync(_context.IconAssetName);
|
||||
_iconArea.OnInit(sprite, context.Rarity);
|
||||
}
|
||||
var sprite = await SpriteLoader.LoadSpriteByKeyAsync(_context.IconAssetName);
|
||||
_iconArea.OnInit(sprite, _context.Rarity);
|
||||
}
|
||||
|
||||
public void OnReset()
|
||||
@@ -40,16 +35,12 @@ namespace SepCore.UI
|
||||
_context = null;
|
||||
_index = -1;
|
||||
|
||||
if (_iconArea != null)
|
||||
{
|
||||
_iconArea.OnReset();
|
||||
}
|
||||
_iconArea.OnReset();
|
||||
}
|
||||
|
||||
public void OnItemInfoShow()
|
||||
{
|
||||
if (_index < 0) return;
|
||||
if (_itemRect == null) return;
|
||||
|
||||
Rect rect = _itemRect.rect;
|
||||
Vector3 targetPos = _itemRect.TransformPoint(new Vector3(
|
||||
|
||||
@@ -44,20 +44,13 @@ namespace SepCore.UI
|
||||
|
||||
public void OnInit(DisplayListAreaContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
Log.Warning("DisplayListArea context is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
EnsurePool();
|
||||
_context = context;
|
||||
|
||||
if (_titleText != null) _titleText.text = context.Title;
|
||||
_titleText.text = context.Title;
|
||||
UpdateCountText(context.CurrentCount, context.MaxCount);
|
||||
|
||||
int itemCount = context.ItemContexts?.Length ?? 0;
|
||||
int targetCount = Mathf.Min(context.CurrentCount, itemCount);
|
||||
int targetCount = Mathf.Min(context.CurrentCount, context.ItemContexts.Length);
|
||||
EnsureItemCount(targetCount);
|
||||
for (int i = 0; i < targetCount; i++)
|
||||
{
|
||||
@@ -85,16 +78,8 @@ namespace SepCore.UI
|
||||
public DisplayItem AddItem(DisplayItemContext itemContext)
|
||||
{
|
||||
EnsurePool();
|
||||
if (_displayItemObjectPool == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
DisplayItem item = CreateItem();
|
||||
if (item == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
int index = _activeItems.Count;
|
||||
_activeItems.Add(item);
|
||||
@@ -105,13 +90,9 @@ namespace SepCore.UI
|
||||
LayoutItem(item, index, columnCount);
|
||||
|
||||
int currentCount = _activeItems.Count;
|
||||
int maxCount = _context != null ? _context.MaxCount : -1;
|
||||
if (_context != null)
|
||||
{
|
||||
_context.CurrentCount = currentCount;
|
||||
}
|
||||
_context.CurrentCount = currentCount;
|
||||
|
||||
UpdateCountText(currentCount, maxCount);
|
||||
UpdateCountText(currentCount, _context.MaxCount);
|
||||
|
||||
return item;
|
||||
}
|
||||
@@ -127,13 +108,9 @@ namespace SepCore.UI
|
||||
LayoutItems();
|
||||
|
||||
int currentCount = _activeItems.Count;
|
||||
int maxCount = _context != null ? _context.MaxCount : -1;
|
||||
if (_context != null)
|
||||
{
|
||||
_context.CurrentCount = currentCount;
|
||||
}
|
||||
_context.CurrentCount = currentCount;
|
||||
|
||||
UpdateCountText(currentCount, maxCount);
|
||||
UpdateCountText(currentCount, _context.MaxCount);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -142,11 +119,6 @@ namespace SepCore.UI
|
||||
{
|
||||
if (_displayItemObjectPool != null) return;
|
||||
|
||||
if (_displayItemRoot == null)
|
||||
{
|
||||
_displayItemRoot = transform;
|
||||
}
|
||||
|
||||
GridLayoutGroup gridLayout = _displayItemRoot.GetComponent<GridLayoutGroup>();
|
||||
if (gridLayout != null)
|
||||
{
|
||||
@@ -159,12 +131,6 @@ namespace SepCore.UI
|
||||
return;
|
||||
}
|
||||
|
||||
if (_displayItemTemplate == null)
|
||||
{
|
||||
Debug.LogError("DisplayListArea requires a DisplayItem template.");
|
||||
return;
|
||||
}
|
||||
|
||||
_displayItemObjectPool =
|
||||
GameEntry.ObjectPool.CreateSingleSpawnObjectPool<DisplayItemObject>(DisplayItemPoolName,
|
||||
_instancePoolCapacity);
|
||||
@@ -172,17 +138,9 @@ namespace SepCore.UI
|
||||
|
||||
private void EnsureItemCount(int count)
|
||||
{
|
||||
if (_displayItemObjectPool == null) return;
|
||||
|
||||
for (int i = _activeItems.Count; i < count; i++)
|
||||
{
|
||||
DisplayItem item = CreateItem();
|
||||
if (item == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
_activeItems.Add(item);
|
||||
_activeItems.Add(CreateItem());
|
||||
}
|
||||
|
||||
for (int i = _activeItems.Count - 1; i >= count; i--)
|
||||
@@ -193,7 +151,7 @@ namespace SepCore.UI
|
||||
|
||||
private DisplayItem CreateItem()
|
||||
{
|
||||
DisplayItem item = null;
|
||||
DisplayItem item;
|
||||
DisplayItemObject itemObject = _displayItemObjectPool.Spawn();
|
||||
if (itemObject != null)
|
||||
{
|
||||
@@ -201,39 +159,25 @@ namespace SepCore.UI
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_displayItemTemplate == null)
|
||||
{
|
||||
Debug.LogError("DisplayListArea requires a DisplayItem template.");
|
||||
return null;
|
||||
}
|
||||
|
||||
item = Instantiate(_displayItemTemplate);
|
||||
_displayItemObjectPool.Register(DisplayItemObject.Create(item), true);
|
||||
}
|
||||
|
||||
if (_displayItemRoot != null)
|
||||
{
|
||||
Transform itemTransform = item.transform;
|
||||
itemTransform.SetParent(_displayItemRoot, false);
|
||||
}
|
||||
|
||||
item.transform.SetParent(_displayItemRoot, false);
|
||||
item.gameObject.SetActive(true);
|
||||
return item;
|
||||
}
|
||||
|
||||
private void HideItem(DisplayItem item)
|
||||
{
|
||||
if (item == null) return;
|
||||
item.OnReset();
|
||||
_activeItems.Remove(item);
|
||||
item.gameObject.SetActive(false);
|
||||
_displayItemObjectPool?.Unspawn(item);
|
||||
_displayItemObjectPool.Unspawn(item);
|
||||
}
|
||||
|
||||
private void LayoutItems()
|
||||
{
|
||||
if (_displayItemRoot == null) return;
|
||||
|
||||
int columnCount = _fixedColumnCount > 0 ? _fixedColumnCount : CalculateColumnCount(GetRootWidth());
|
||||
|
||||
for (int i = 0; i < _activeItems.Count; i++)
|
||||
@@ -246,9 +190,7 @@ namespace SepCore.UI
|
||||
|
||||
private void LayoutItem(DisplayItem item, int index, int columnCount)
|
||||
{
|
||||
if (item == null) return;
|
||||
RectTransform itemRect = item.GetComponent<RectTransform>();
|
||||
if (itemRect == null) return;
|
||||
|
||||
float step = _itemSize + _itemSpacing;
|
||||
int row = index / columnCount;
|
||||
@@ -263,8 +205,8 @@ namespace SepCore.UI
|
||||
|
||||
private float GetRootWidth()
|
||||
{
|
||||
RectTransform rootRect = _displayItemRoot as RectTransform;
|
||||
return rootRect != null ? rootRect.rect.width : 0f;
|
||||
RectTransform rootRect = (RectTransform)_displayItemRoot;
|
||||
return rootRect.rect.width;
|
||||
}
|
||||
|
||||
private int CalculateColumnCount(float rootWidth)
|
||||
@@ -278,7 +220,6 @@ namespace SepCore.UI
|
||||
|
||||
private void UpdateCountText(int currentCount, int maxCount)
|
||||
{
|
||||
if (_countText == null) return;
|
||||
_countText.text = maxCount == -1 ? $"({currentCount})" : $"({currentCount}/{maxCount})";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,29 +25,13 @@ namespace SepCore.UI
|
||||
ItemType = ItemType.Weapon;
|
||||
}
|
||||
|
||||
public GoodsItemContext(GoodsItemRawData rawData)
|
||||
public GoodsItemContext(GoodsItemRawData rawData) : this()
|
||||
{
|
||||
if (rawData == null)
|
||||
{
|
||||
Name = string.Empty;
|
||||
Description = string.Empty;
|
||||
Rarity = Rarity.White;
|
||||
Price = 0;
|
||||
Icon = null;
|
||||
ItemType = ItemType.Weapon;
|
||||
return;
|
||||
}
|
||||
|
||||
Price = rawData.Price;
|
||||
Rarity = rawData.Rarity;
|
||||
ItemType = rawData.ItemType;
|
||||
|
||||
if (rawData.DataRow == null)
|
||||
{
|
||||
Icon = null;
|
||||
Name = string.Empty;
|
||||
}
|
||||
else if (ItemType == ItemType.Weapon)
|
||||
if (ItemType == ItemType.Weapon)
|
||||
{
|
||||
if (rawData.DataRow is WeaponConfig weaponConfig)
|
||||
{
|
||||
|
||||
@@ -44,53 +44,32 @@ namespace SepCore.UI
|
||||
private static DisplayListAreaContext BuildDisplayListAreaContext(DisplayListAreaType listType,
|
||||
IReadOnlyList<object> items, int maxCount)
|
||||
{
|
||||
string title = GetDisplayListTitle(listType);
|
||||
if (items == null)
|
||||
{
|
||||
return new DisplayListAreaContext
|
||||
{
|
||||
Title = title,
|
||||
CurrentCount = 0,
|
||||
MaxCount = maxCount,
|
||||
ItemContexts = System.Array.Empty<DisplayItemContext>()
|
||||
};
|
||||
}
|
||||
|
||||
DisplayItemContext[] itemContexts = new DisplayItemContext[items.Count];
|
||||
switch (listType)
|
||||
{
|
||||
case DisplayListAreaType.Weapon:
|
||||
if (items is IReadOnlyList<WeaponBase> weapons)
|
||||
IReadOnlyList<WeaponBase> weapons = (IReadOnlyList<WeaponBase>)items;
|
||||
for (int i = 0; i < weapons.Count; i++)
|
||||
{
|
||||
for (int i = 0; i < weapons.Count; i++)
|
||||
{
|
||||
WeaponBase weapon = weapons[i];
|
||||
if (weapon == null) break;
|
||||
itemContexts[i] = BuildWeaponItem(weapon);
|
||||
}
|
||||
itemContexts[i] = BuildWeaponItem(weapons[i]);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case DisplayListAreaType.Prop:
|
||||
if (items is IReadOnlyList<PropItem> propItems)
|
||||
IReadOnlyList<PropItem> propItems = (IReadOnlyList<PropItem>)items;
|
||||
for (int i = 0; i < propItems.Count; i++)
|
||||
{
|
||||
for (int i = 0; i < propItems.Count; i++)
|
||||
{
|
||||
PropItem propItem = propItems[i];
|
||||
if (propItem == null) break;
|
||||
itemContexts[i] = BuildPropItem(propItem);
|
||||
}
|
||||
itemContexts[i] = BuildPropItem(propItems[i]);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
int currentCount = itemContexts.Length;
|
||||
return new DisplayListAreaContext
|
||||
{
|
||||
Title = title,
|
||||
CurrentCount = currentCount,
|
||||
Title = GetDisplayListTitle(listType),
|
||||
CurrentCount = itemContexts.Length,
|
||||
MaxCount = maxCount,
|
||||
ItemContexts = itemContexts
|
||||
};
|
||||
@@ -108,45 +87,27 @@ namespace SepCore.UI
|
||||
|
||||
private static DisplayItemContext BuildPropItem(PropItem propItem)
|
||||
{
|
||||
string iconAssetName = null;
|
||||
Rarity rarity = Rarity.None;
|
||||
|
||||
if (propItem != null)
|
||||
{
|
||||
iconAssetName = propItem.IconAssetName;
|
||||
rarity = propItem.Rarity;
|
||||
}
|
||||
|
||||
return new DisplayItemContext
|
||||
{
|
||||
IconAssetName = iconAssetName,
|
||||
Rarity = rarity,
|
||||
IconAssetName = propItem.IconAssetName,
|
||||
Rarity = propItem.Rarity,
|
||||
IsWeapon = false
|
||||
};
|
||||
}
|
||||
|
||||
private static DisplayItemContext BuildWeaponItem(WeaponBase weaponBase)
|
||||
{
|
||||
string iconAssetName = null;
|
||||
Rarity rarity = Rarity.None;
|
||||
|
||||
if (weaponBase != null && weaponBase.WeaponData != null)
|
||||
{
|
||||
iconAssetName = weaponBase.WeaponData.IconAssetName;
|
||||
rarity = weaponBase.WeaponData.Rarity;
|
||||
}
|
||||
|
||||
return new DisplayItemContext
|
||||
{
|
||||
IconAssetName = iconAssetName,
|
||||
Rarity = rarity,
|
||||
IconAssetName = weaponBase.WeaponData.IconAssetName,
|
||||
Rarity = weaponBase.WeaponData.Rarity,
|
||||
IsWeapon = true
|
||||
};
|
||||
}
|
||||
|
||||
private static void AppendDisplayItemContext(DisplayListAreaContext listContext, DisplayItemContext newItem)
|
||||
{
|
||||
int oldCount = listContext.ItemContexts != null ? listContext.ItemContexts.Length : 0;
|
||||
int oldCount = listContext.ItemContexts.Length;
|
||||
DisplayItemContext[] newContexts = new DisplayItemContext[oldCount + 1];
|
||||
if (oldCount > 0)
|
||||
{
|
||||
|
||||
@@ -126,25 +126,22 @@ namespace SepCore.UI
|
||||
|
||||
private void ApplyGoodsPurchased(ShopPurchaseResult result)
|
||||
{
|
||||
if (Context.GoodsItems != null && result.GoodsIndex >= 0 && result.GoodsIndex < Context.GoodsItems.Count)
|
||||
if (result.GoodsIndex >= 0 && result.GoodsIndex < Context.GoodsItems.Count)
|
||||
{
|
||||
Context.GoodsItems[result.GoodsIndex] = null;
|
||||
}
|
||||
|
||||
DisplayItemContext context = new DisplayItemContext(result.DisplayItem);
|
||||
|
||||
if (result.DisplayItem != null)
|
||||
if (result.DisplayItem.IsWeapon)
|
||||
{
|
||||
if (result.DisplayItem.IsWeapon)
|
||||
{
|
||||
AppendDisplayItemContext(Context.WeaponListContext, context);
|
||||
Context.NeedRefreshWeaponList = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendDisplayItemContext(Context.PropListContext, context);
|
||||
Context.NeedRefreshPropList = true;
|
||||
}
|
||||
AppendDisplayItemContext(Context.WeaponListContext, context);
|
||||
Context.NeedRefreshWeaponList = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendDisplayItemContext(Context.PropListContext, context);
|
||||
Context.NeedRefreshPropList = true;
|
||||
}
|
||||
|
||||
Context.NeedRefreshGoodsItems = true;
|
||||
@@ -242,11 +239,8 @@ namespace SepCore.UI
|
||||
return;
|
||||
}
|
||||
|
||||
if (Context.WeaponListContext != null)
|
||||
{
|
||||
int currentCount = Mathf.Max(0, Context.WeaponListContext.CurrentCount - 1);
|
||||
Context.WeaponListContext.CurrentCount = currentCount;
|
||||
}
|
||||
int currentCount = Mathf.Max(0, Context.WeaponListContext.CurrentCount - 1);
|
||||
Context.WeaponListContext.CurrentCount = currentCount;
|
||||
|
||||
Context.NeedRefreshWeaponList = true;
|
||||
RefreshUI(Form, Context);
|
||||
@@ -301,7 +295,7 @@ namespace SepCore.UI
|
||||
return;
|
||||
}
|
||||
|
||||
_useCase?.Continue();
|
||||
_useCase.Continue();
|
||||
}
|
||||
|
||||
private void DisplayItemHover(object sender, GameEventArgs e)
|
||||
@@ -359,7 +353,6 @@ namespace SepCore.UI
|
||||
private void PlayerCoinChange(object sender, GameEventArgs e)
|
||||
{
|
||||
if (e is not PlayerCoinChangeEventArgs args) return;
|
||||
if (Context == null) return;
|
||||
|
||||
Context.PlayerCoin = args.CoinCount;
|
||||
Context.NeedRefreshPlayerCoin = true;
|
||||
|
||||
@@ -54,13 +54,13 @@ namespace SepCore.UI
|
||||
context.NeedRefreshPlayerCoin = false;
|
||||
}
|
||||
|
||||
if (context.NeedRefreshPropList && _propListArea != null && context.PropListContext != null)
|
||||
if (context.NeedRefreshPropList)
|
||||
{
|
||||
_propListArea.OnInit(context.PropListContext);
|
||||
context.NeedRefreshPropList = false;
|
||||
}
|
||||
|
||||
if (context.NeedRefreshWeaponList && _weaponListArea != null && context.WeaponListContext != null)
|
||||
if (context.NeedRefreshWeaponList)
|
||||
{
|
||||
_weaponListArea.OnInit(context.WeaponListContext);
|
||||
context.NeedRefreshWeaponList = false;
|
||||
@@ -74,11 +74,6 @@ namespace SepCore.UI
|
||||
item.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
if (goodsItems == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int count = Mathf.Min(_goodsItems.Length, goodsItems.Count);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
@@ -94,54 +89,6 @@ namespace SepCore.UI
|
||||
_refreshPriceText.text = $"刷新 -{refreshPrice} <sprite name=\"coin\">";
|
||||
}
|
||||
|
||||
private void ApplyGoodsPurchased(int goodsIndex, DisplayItemContext displayItem)
|
||||
{
|
||||
SetGoodsItemVisible(goodsIndex, false);
|
||||
|
||||
if (displayItem == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (displayItem.IsWeapon)
|
||||
{
|
||||
AddWeaponDisplayItem(displayItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddPropDisplayItem(displayItem);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetGoodsItemVisible(int index, bool visible)
|
||||
{
|
||||
if (_goodsItems == null || index < 0 || index >= _goodsItems.Length)
|
||||
{
|
||||
Log.Warning("ShopForm.SetGoodsItemVisible: Invalid index.");
|
||||
return;
|
||||
}
|
||||
|
||||
_goodsItems[index].gameObject.SetActive(visible);
|
||||
}
|
||||
|
||||
private void AddPropDisplayItem(DisplayItemContext context)
|
||||
{
|
||||
if (_propListArea == null || context == null) return;
|
||||
_propListArea.AddItem(context);
|
||||
}
|
||||
|
||||
private void AddWeaponDisplayItem(DisplayItemContext context)
|
||||
{
|
||||
if (_weaponListArea == null || context == null) return;
|
||||
_weaponListArea.AddItem(context);
|
||||
}
|
||||
|
||||
internal void RemoveWeaponDisplayItem(int index)
|
||||
{
|
||||
if (_weaponListArea == null) return;
|
||||
_weaponListArea.RemoveItemAt(index);
|
||||
}
|
||||
|
||||
#region ButtonClick
|
||||
|
||||
public void OnContinueButtonClick()
|
||||
@@ -167,21 +114,21 @@ namespace SepCore.UI
|
||||
{
|
||||
base.OnOpen(userData);
|
||||
|
||||
if (userData is ShopContext context)
|
||||
if (userData is not ShopContext context)
|
||||
{
|
||||
RefreshUI(context);
|
||||
Log.Error("ShopForm requires ShopContext as userData.");
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Warning("ShopForm requires ShopFormContext as userData.");
|
||||
RefreshUI(context);
|
||||
}
|
||||
|
||||
protected override void OnClose(bool isShutdown, object userData)
|
||||
{
|
||||
_context = null;
|
||||
|
||||
_propListArea?.OnReset();
|
||||
_weaponListArea?.OnReset();
|
||||
_propListArea.OnReset();
|
||||
_weaponListArea.OnReset();
|
||||
|
||||
base.OnClose(isShutdown, userData);
|
||||
}
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
using SepCore.Definition;
|
||||
using SepCore.Event;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public class MenuForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private GameObject _defaultButton;
|
||||
|
||||
public void RefreshUI(MenuContext context)
|
||||
{
|
||||
if (EventSystem.current.currentSelectedGameObject != _defaultButton)
|
||||
{
|
||||
EventSystem.current.SetSelectedGameObject(this._defaultButton);
|
||||
}
|
||||
}
|
||||
|
||||
#region Lifecycle
|
||||
|
||||
protected override void OnOpen(object userData)
|
||||
{
|
||||
base.OnOpen(userData);
|
||||
|
||||
if (userData is MenuContext context)
|
||||
{
|
||||
RefreshUI(context);
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Warning("MenuForm requires MenuFormContext as userData.");
|
||||
}
|
||||
|
||||
protected override void OnClose(bool isShutdown, object userData)
|
||||
{
|
||||
base.OnClose(isShutdown, userData);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
// 以下方法被 MenuForm.prefab 中的 Button.onClick 通过名称反射绑定。
|
||||
// 重命名前需同步修改 prefab 中的 m_MethodName 引用。
|
||||
public void OnStartButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.StartGame);
|
||||
}
|
||||
|
||||
public void OnFileButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.File);
|
||||
}
|
||||
|
||||
public void OnGuideButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.Guide);
|
||||
}
|
||||
|
||||
public void OnSettingButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.Setting);
|
||||
}
|
||||
|
||||
public void OnQuitButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.Quit);
|
||||
}
|
||||
|
||||
public void OnAboutButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.About);
|
||||
}
|
||||
|
||||
private void FireButtonClick(MenuButtonId button)
|
||||
{
|
||||
GameEntry.Event.Fire(this, MenuButtonClickEventArgs.Create(button));
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -34,7 +34,7 @@ namespace SepCore.UI
|
||||
{
|
||||
if (userData != null)
|
||||
{
|
||||
Log.Warning("MenuController.OpenUIAsync() userData type is invalid.");
|
||||
Log.Error("MenuController.OpenUIAsync() userData type is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
using SepCore.Definition;
|
||||
using SepCore.Event;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public partial class MenuForm
|
||||
{
|
||||
private bool _listenersBound;
|
||||
|
||||
public void RefreshUI(MenuContext context)
|
||||
{
|
||||
EnsureButtonListeners();
|
||||
|
||||
if (EventSystem.current.currentSelectedGameObject != View.startButton.gameObject)
|
||||
{
|
||||
EventSystem.current.SetSelectedGameObject(View.startButton.gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
#region Lifecycle
|
||||
|
||||
protected override void OnOpen(object userData)
|
||||
{
|
||||
base.OnOpen(userData);
|
||||
|
||||
if (userData is not MenuContext context)
|
||||
{
|
||||
Log.Error("MenuForm requires MenuContext as userData.");
|
||||
return;
|
||||
}
|
||||
|
||||
RefreshUI(context);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void EnsureButtonListeners()
|
||||
{
|
||||
if (_listenersBound)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_listenersBound = true;
|
||||
|
||||
View.startButton.onClick.AddListener(OnStartButtonClick);
|
||||
View.fileButton.onClick.AddListener(OnFileButtonClick);
|
||||
View.guideButton.onClick.AddListener(OnGuideButtonClick);
|
||||
View.settingButton.onClick.AddListener(OnSettingButtonClick);
|
||||
View.quitButton.onClick.AddListener(OnQuitButtonClick);
|
||||
View.aboutButton.onClick.AddListener(OnAboutButtonClick);
|
||||
}
|
||||
|
||||
private void OnStartButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.StartGame);
|
||||
}
|
||||
|
||||
private void OnFileButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.File);
|
||||
}
|
||||
|
||||
private void OnGuideButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.Guide);
|
||||
}
|
||||
|
||||
private void OnSettingButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.Setting);
|
||||
}
|
||||
|
||||
private void OnQuitButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.Quit);
|
||||
}
|
||||
|
||||
private void OnAboutButtonClick()
|
||||
{
|
||||
FireButtonClick(MenuButtonId.About);
|
||||
}
|
||||
|
||||
private void FireButtonClick(MenuButtonId button)
|
||||
{
|
||||
GameEntry.Event.Fire(this, MenuButtonClickEventArgs.Create(button));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class MenuForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private MenuView _view = null;
|
||||
|
||||
public MenuView View => _view;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e82dc413a4cd277429ec1e3f2de69434
|
||||
guid: 8b02c5e7bddd2ab418026de1527b5e25
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -0,0 +1,16 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class MenuView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] public global::SepCore.UI.CommonButton startButton;
|
||||
[SerializeField] public global::SepCore.UI.CommonButton fileButton;
|
||||
[SerializeField] public global::SepCore.UI.CommonButton guideButton;
|
||||
[SerializeField] public global::SepCore.UI.CommonButton settingButton;
|
||||
[SerializeField] public global::SepCore.UI.CommonButton quitButton;
|
||||
[SerializeField] public global::SepCore.UI.CommonButton aboutButton;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 47c8b7ced811ef448ad8b07d5cafdfc7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,37 +0,0 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public class RolePropertyArea : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private TMP_Text _roleNameText;
|
||||
|
||||
[SerializeField] private RawImage _roleAvatar;
|
||||
|
||||
[SerializeField] private TMP_Text _roleInitialPropertyText;
|
||||
|
||||
[SerializeField] private Transform _roleInitialItemParent;
|
||||
|
||||
private RolePropertyAreaContext _context;
|
||||
|
||||
public void OnInit(RolePropertyAreaContext context)
|
||||
{
|
||||
_context = context;
|
||||
if (_context == null)
|
||||
{
|
||||
OnReset();
|
||||
return;
|
||||
}
|
||||
|
||||
_roleNameText.text = _context.RoleName;
|
||||
_roleInitialPropertyText.text = _context.InitialPropertyText;
|
||||
}
|
||||
|
||||
public void OnReset(object userData = null)
|
||||
{
|
||||
_context = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+17
-4
@@ -12,10 +12,14 @@ namespace SepCore.UI
|
||||
|
||||
private RoleItemContext _context = null;
|
||||
|
||||
private bool _listenersBound;
|
||||
|
||||
public async UniTaskVoid OnInit(RoleItemContext context)
|
||||
{
|
||||
EnsureListeners();
|
||||
|
||||
_context = context;
|
||||
if (_context == null || string.IsNullOrEmpty(_context.IconName))
|
||||
if (string.IsNullOrEmpty(_context.IconName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -28,17 +32,26 @@ namespace SepCore.UI
|
||||
_context = null;
|
||||
}
|
||||
|
||||
public void OnHoverEnter()
|
||||
private void EnsureListeners()
|
||||
{
|
||||
if (_context == null)
|
||||
if (_listenersBound)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_listenersBound = true;
|
||||
|
||||
CommonButton button = GetComponent<CommonButton>();
|
||||
button.onClick.AddListener(OnConfirmRoleClick);
|
||||
button.RegisterPointerEnterAction(OnHoverEnter);
|
||||
}
|
||||
|
||||
private void OnHoverEnter()
|
||||
{
|
||||
GameEntry.Event.Fire(this, SelectRoleHoverEventArgs.Create(_context.RoleName));
|
||||
}
|
||||
|
||||
public void OnConfirmRoleClick()
|
||||
private void OnConfirmRoleClick()
|
||||
{
|
||||
GameEntry.Event.Fire(this, SelectRoleConfirmEventArgs.Create());
|
||||
}
|
||||
+1
-1
@@ -3,7 +3,7 @@ namespace SepCore.UI
|
||||
public class SelectRoleContext : UIContext
|
||||
{
|
||||
public RoleItemContext[] RoleItemContexts;
|
||||
public RolePropertyAreaContext RolePropertyAreaContext;
|
||||
public ShowAreaContext ShowAreaContext;
|
||||
public bool ShowRoleProperty;
|
||||
}
|
||||
}
|
||||
+6
-7
@@ -43,7 +43,7 @@ namespace SepCore.UI
|
||||
return null;
|
||||
}
|
||||
|
||||
int count = rawData.RoleItems?.Length ?? 0;
|
||||
int count = rawData.RoleItems.Length;
|
||||
RoleItemContext[] roleItems = new RoleItemContext[count];
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
@@ -55,22 +55,21 @@ namespace SepCore.UI
|
||||
};
|
||||
}
|
||||
|
||||
RolePropertyAreaContext propertyContext = null;
|
||||
ShowAreaContext showAreaContext = null;
|
||||
if (rawData.SelectedRole != null)
|
||||
{
|
||||
propertyContext = new RolePropertyAreaContext
|
||||
showAreaContext = new ShowAreaContext
|
||||
{
|
||||
RoleName = rawData.SelectedRole.Name,
|
||||
InitialPropertyText = ItemDescUtility.CreatePropDescription(rawData.SelectedRole.InitialProperties)
|
||||
?? string.Empty
|
||||
};
|
||||
}
|
||||
|
||||
return new SelectRoleContext
|
||||
{
|
||||
RoleItemContexts = roleItems,
|
||||
RolePropertyAreaContext = propertyContext,
|
||||
ShowRoleProperty = propertyContext != null
|
||||
ShowAreaContext = showAreaContext,
|
||||
ShowRoleProperty = showAreaContext != null
|
||||
};
|
||||
}
|
||||
|
||||
@@ -84,7 +83,7 @@ namespace SepCore.UI
|
||||
|
||||
if (userData != null)
|
||||
{
|
||||
Log.Warning("SelectRoleController.OpenUIAsync() userData type is invalid.");
|
||||
Log.Error("SelectRoleController.OpenUIAsync() userData type is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
+40
-32
@@ -1,27 +1,27 @@
|
||||
using System.Collections.Generic;
|
||||
using SepCore.Event;
|
||||
using UnityEngine;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public class SelectRoleForm : UGuiForm
|
||||
public partial class SelectRoleForm
|
||||
{
|
||||
[SerializeField] private GameObject _randomRoleCard = null;
|
||||
|
||||
[SerializeField] private GameObject _roleCard = null;
|
||||
|
||||
[SerializeField] private RolePropertyArea _propertyArea = null;
|
||||
private readonly List<RoleItem> _roleItems = new List<RoleItem>();
|
||||
|
||||
private SelectRoleContext _context = null;
|
||||
|
||||
private RoleItem[] _roleItems = null;
|
||||
private bool _listenersBound;
|
||||
|
||||
public void RefreshUI(SelectRoleContext context)
|
||||
{
|
||||
EnsureButtonListeners();
|
||||
|
||||
_context = context;
|
||||
|
||||
EnsureRoleItemCount(context.RoleItemContexts.Length);
|
||||
|
||||
RoleItemContext[] roleContexts = _context.RoleItemContexts;
|
||||
for (int i = 0; i < _roleItems.Length; i++)
|
||||
for (int i = 0; i < _roleItems.Count; i++)
|
||||
{
|
||||
RoleItem item = _roleItems[i];
|
||||
if (i < roleContexts.Length)
|
||||
@@ -36,16 +36,17 @@ namespace SepCore.UI
|
||||
}
|
||||
}
|
||||
|
||||
UpdateShowRole(_context.ShowRoleProperty, _context.RolePropertyAreaContext);
|
||||
if (_context.ShowRoleProperty)
|
||||
{
|
||||
View.showAreaForm.ShowRoleProperty(_context.ShowAreaContext);
|
||||
}
|
||||
else
|
||||
{
|
||||
View.showAreaForm.ShowRandomRole();
|
||||
}
|
||||
}
|
||||
|
||||
#region FSM
|
||||
|
||||
protected override void OnInit(object userData)
|
||||
{
|
||||
base.OnInit(userData);
|
||||
_roleItems = this.transform.GetComponentsInChildren<RoleItem>();
|
||||
}
|
||||
#region Lifecycle
|
||||
|
||||
protected override void OnOpen(object userData)
|
||||
{
|
||||
@@ -57,7 +58,7 @@ namespace SepCore.UI
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Warning("SelectRoleForm requires SelectRoleFormContext as userData.");
|
||||
Log.Error("SelectRoleForm requires SelectRoleContext as userData.");
|
||||
}
|
||||
|
||||
protected override void OnClose(bool isShutdown, object userData)
|
||||
@@ -65,41 +66,48 @@ namespace SepCore.UI
|
||||
base.OnClose(isShutdown, userData);
|
||||
|
||||
_context = null;
|
||||
foreach (var item in _roleItems)
|
||||
for (int i = 0; i < _roleItems.Count; i++)
|
||||
{
|
||||
item.OnReset();
|
||||
_roleItems[i].OnReset();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void UpdateShowRole(bool showRoleProperty, RolePropertyAreaContext propertyAreaContext)
|
||||
private void EnsureButtonListeners()
|
||||
{
|
||||
if (!showRoleProperty)
|
||||
if (_listenersBound)
|
||||
{
|
||||
_randomRoleCard.SetActive(true);
|
||||
_roleCard.SetActive(false);
|
||||
_propertyArea.OnReset();
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
_listenersBound = true;
|
||||
|
||||
View.returnButton.onClick.AddListener(OnReturnButtonClick);
|
||||
View.randomRoleItem.onClick.AddListener(OnRandomConfirmClick);
|
||||
View.randomRoleItem.RegisterPointerEnterAction(OnRandomHoverEnter);
|
||||
}
|
||||
|
||||
private void EnsureRoleItemCount(int count)
|
||||
{
|
||||
while (_roleItems.Count < count)
|
||||
{
|
||||
_randomRoleCard.SetActive(false);
|
||||
_propertyArea.OnInit(propertyAreaContext);
|
||||
_roleCard.SetActive(true);
|
||||
RoleItem item = Instantiate(View.roleItemTemplate, View.roleListRoot);
|
||||
_roleItems.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnReturnButtonClick()
|
||||
private void OnReturnButtonClick()
|
||||
{
|
||||
GameEntry.Event.Fire(this, SelectRoleReturnEventArgs.Create());
|
||||
}
|
||||
|
||||
public void OnRandomConfirmClick()
|
||||
private void OnRandomConfirmClick()
|
||||
{
|
||||
GameEntry.Event.Fire(this, SelectRoleConfirmEventArgs.Create());
|
||||
}
|
||||
|
||||
public void OnRandomHoverEnter()
|
||||
private void OnRandomHoverEnter()
|
||||
{
|
||||
GameEntry.Event.Fire(this, SelectRoleClearEventArgs.Create());
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad9c806bb95be684cb75ae84394f8cd0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,13 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class SelectRoleForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private SelectRoleView _view = null;
|
||||
|
||||
public SelectRoleView View => _view;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class SelectRoleView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] public global::SepCore.UI.CommonButton returnButton;
|
||||
[SerializeField] public global::UnityEngine.RectTransform roleListRoot;
|
||||
[SerializeField] public global::SepCore.UI.CommonButton randomRoleItem;
|
||||
[SerializeField] public global::SepCore.UI.RoleItem roleItemTemplate;
|
||||
[SerializeField] public global::SepCore.UI.ShowAreaForm showAreaForm;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69fadbcf4f76eb4499b21ac72f667fc0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 88a351268ca28c14fb18659fe3d042d3
|
||||
guid: a0f180c7a5bba1f44af212a1a8d6f328
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -0,0 +1,230 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[ExecuteAlways]
|
||||
[DisallowMultipleComponent]
|
||||
public sealed class UISerializationItem : MonoBehaviour
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ComponentReference
|
||||
{
|
||||
[SerializeField] private Component component;
|
||||
[SerializeField] private bool generateReference;
|
||||
[SerializeField] private string variableName;
|
||||
|
||||
public Component Component => component;
|
||||
public bool GenerateReference => generateReference;
|
||||
public string VariableName => variableName;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
internal ComponentReference(Component target, string defaultVariableName)
|
||||
{
|
||||
component = target;
|
||||
generateReference = false;
|
||||
variableName = defaultVariableName;
|
||||
}
|
||||
|
||||
internal void Configure(bool shouldGenerate, string generatedVariableName)
|
||||
{
|
||||
generateReference = shouldGenerate;
|
||||
variableName = generatedVariableName;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
[SerializeField, HideInInspector]
|
||||
private List<ComponentReference> componentReferences = new List<ComponentReference>();
|
||||
|
||||
public IReadOnlyList<ComponentReference> ComponentReferences => componentReferences;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
private bool refreshQueued;
|
||||
|
||||
public bool RefreshComponents()
|
||||
{
|
||||
Component[] attachedComponents = GetComponents<Component>();
|
||||
var next = new List<ComponentReference>(attachedComponents.Length);
|
||||
|
||||
for (int i = 0; i < attachedComponents.Length; i++)
|
||||
{
|
||||
Component attached = attachedComponents[i];
|
||||
if (attached == null || attached == this || attached is UISerializationRoot)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ComponentReference existing = FindReference(attached);
|
||||
next.Add(existing ?? new ComponentReference(attached, CreateDefaultVariableName(gameObject, attached)));
|
||||
}
|
||||
|
||||
if (HasSameComponents(next))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
componentReferences = next;
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool SetReference(Component component, bool shouldGenerate, string variableName)
|
||||
{
|
||||
if (component == null || component.gameObject != gameObject)
|
||||
{
|
||||
throw new ArgumentException("The component must be attached to the same GameObject as the serialization item.", nameof(component));
|
||||
}
|
||||
|
||||
RefreshComponents();
|
||||
ComponentReference reference = FindReference(component);
|
||||
if (reference == null)
|
||||
{
|
||||
throw new InvalidOperationException("The component is not available for UI serialization.");
|
||||
}
|
||||
|
||||
string normalizedName = variableName == null ? string.Empty : variableName.Trim();
|
||||
if (reference.GenerateReference == shouldGenerate && reference.VariableName == normalizedName)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
reference.Configure(shouldGenerate, normalizedName);
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
NotifyRoot();
|
||||
return true;
|
||||
}
|
||||
|
||||
public static string CreateDefaultVariableName(GameObject owner, Component component)
|
||||
{
|
||||
string ownerName = ToCamelIdentifier(owner == null ? "uiItem" : owner.name);
|
||||
string typeName = component == null ? "Component" : component.GetType().Name;
|
||||
|
||||
if (component is RectTransform)
|
||||
{
|
||||
typeName = "RectTransform";
|
||||
}
|
||||
|
||||
if (ownerName.EndsWith(typeName, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return ownerName;
|
||||
}
|
||||
|
||||
return ownerName + typeName;
|
||||
}
|
||||
|
||||
internal void QueueRefresh()
|
||||
{
|
||||
if (refreshQueued || Application.isPlaying)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
refreshQueued = true;
|
||||
UnityEditor.EditorApplication.delayCall += RefreshDelayed;
|
||||
}
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
RefreshComponents();
|
||||
NotifyRoot();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
QueueRefresh();
|
||||
}
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
QueueRefresh();
|
||||
}
|
||||
|
||||
private void RefreshDelayed()
|
||||
{
|
||||
refreshQueued = false;
|
||||
if (this == null || Application.isPlaying)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RefreshComponents();
|
||||
NotifyRoot();
|
||||
}
|
||||
|
||||
private void NotifyRoot()
|
||||
{
|
||||
UISerializationRoot root = GetComponentInParent<UISerializationRoot>(true);
|
||||
if (root != null)
|
||||
{
|
||||
root.QueueRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
private ComponentReference FindReference(Component component)
|
||||
{
|
||||
for (int i = 0; i < componentReferences.Count; i++)
|
||||
{
|
||||
ComponentReference reference = componentReferences[i];
|
||||
if (reference != null && reference.Component == component)
|
||||
{
|
||||
return reference;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private bool HasSameComponents(List<ComponentReference> next)
|
||||
{
|
||||
if (componentReferences.Count != next.Count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < next.Count; i++)
|
||||
{
|
||||
if (componentReferences[i] == null || componentReferences[i].Component != next[i].Component)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static string ToCamelIdentifier(string value)
|
||||
{
|
||||
var builder = new StringBuilder(value.Length + 8);
|
||||
bool capitalizeNext = false;
|
||||
|
||||
for (int i = 0; i < value.Length; i++)
|
||||
{
|
||||
char current = value[i];
|
||||
if (!char.IsLetterOrDigit(current) && current != '_')
|
||||
{
|
||||
capitalizeNext = builder.Length > 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (builder.Length == 0)
|
||||
{
|
||||
if (char.IsDigit(current))
|
||||
{
|
||||
builder.Append('_');
|
||||
}
|
||||
builder.Append(char.ToLowerInvariant(current));
|
||||
continue;
|
||||
}
|
||||
|
||||
builder.Append(capitalizeNext ? char.ToUpperInvariant(current) : current);
|
||||
capitalizeNext = false;
|
||||
}
|
||||
|
||||
return builder.Length == 0 ? "uiItem" : builder.ToString();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fbaa237e23f7d4d3f85f73e0acd7eaec
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,337 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[ExecuteAlways]
|
||||
[DisallowMultipleComponent]
|
||||
public sealed class UISerializationRoot : MonoBehaviour
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class NestedFormReference
|
||||
{
|
||||
[SerializeField] private UISerializationRoot root;
|
||||
[SerializeField] private bool generateReference;
|
||||
[SerializeField] private string variableName;
|
||||
|
||||
public UISerializationRoot Root => root;
|
||||
public bool GenerateReference => generateReference;
|
||||
public string VariableName => variableName;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
internal NestedFormReference(UISerializationRoot nestedRoot, string defaultVariableName)
|
||||
{
|
||||
root = nestedRoot;
|
||||
generateReference = true;
|
||||
variableName = defaultVariableName;
|
||||
}
|
||||
|
||||
internal void Configure(bool shouldGenerate, string generatedVariableName)
|
||||
{
|
||||
generateReference = shouldGenerate;
|
||||
variableName = generatedVariableName;
|
||||
}
|
||||
|
||||
internal bool MigrateLegacyVariableName()
|
||||
{
|
||||
if (string.IsNullOrEmpty(variableName) ||
|
||||
!variableName.EndsWith("View", StringComparison.Ordinal) ||
|
||||
variableName.Length <= 4)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
variableName = variableName.Substring(0, variableName.Length - 4) + "Form";
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
[SerializeField, HideInInspector]
|
||||
private List<UISerializationItem> serializationItems = new List<UISerializationItem>();
|
||||
|
||||
[SerializeField, HideInInspector]
|
||||
[FormerlySerializedAs("nestedViewReferences")]
|
||||
private List<NestedFormReference> nestedFormReferences = new List<NestedFormReference>();
|
||||
|
||||
public IReadOnlyList<UISerializationItem> SerializationItems => serializationItems;
|
||||
public IReadOnlyList<NestedFormReference> NestedFormReferences => nestedFormReferences;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
private bool refreshQueued;
|
||||
|
||||
public bool RefreshItems()
|
||||
{
|
||||
UISerializationItem[] allItems = GetComponentsInChildren<UISerializationItem>(true);
|
||||
var ownedItems = new List<UISerializationItem>(allItems.Length);
|
||||
for (int i = 0; i < allItems.Length; i++)
|
||||
{
|
||||
UISerializationItem item = allItems[i];
|
||||
if (item == null || FindNearestRoot(item.transform) != this)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
item.RefreshComponents();
|
||||
ownedItems.Add(item);
|
||||
}
|
||||
|
||||
UISerializationRoot[] allRoots = GetComponentsInChildren<UISerializationRoot>(true);
|
||||
var directNestedRoots = new List<UISerializationRoot>(allRoots.Length);
|
||||
for (int i = 0; i < allRoots.Length; i++)
|
||||
{
|
||||
UISerializationRoot candidate = allRoots[i];
|
||||
if (candidate != null && candidate != this && FindNearestParentRoot(candidate.transform) == this)
|
||||
{
|
||||
directNestedRoots.Add(candidate);
|
||||
}
|
||||
}
|
||||
|
||||
bool itemsChanged = !HasSameItems(ownedItems);
|
||||
bool nestedFormsChanged = !HasSameNestedForms(directNestedRoots);
|
||||
bool nestedNamesChanged = false;
|
||||
for (int i = 0; i < directNestedRoots.Count; i++)
|
||||
{
|
||||
NestedFormReference existing = FindNestedForm(directNestedRoots[i]);
|
||||
if (existing != null)
|
||||
{
|
||||
nestedNamesChanged |= existing.MigrateLegacyVariableName();
|
||||
}
|
||||
}
|
||||
|
||||
if (!itemsChanged && !nestedFormsChanged && !nestedNamesChanged)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (itemsChanged)
|
||||
{
|
||||
serializationItems.Clear();
|
||||
serializationItems.AddRange(ownedItems);
|
||||
}
|
||||
|
||||
if (nestedFormsChanged)
|
||||
{
|
||||
var next = new List<NestedFormReference>(directNestedRoots.Count);
|
||||
for (int i = 0; i < directNestedRoots.Count; i++)
|
||||
{
|
||||
UISerializationRoot nestedRoot = directNestedRoots[i];
|
||||
NestedFormReference existing = FindNestedForm(nestedRoot);
|
||||
next.Add(existing ?? new NestedFormReference(nestedRoot, CreateDefaultNestedFormVariableName(nestedRoot)));
|
||||
}
|
||||
|
||||
nestedFormReferences = next;
|
||||
}
|
||||
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool SetNestedFormReference(UISerializationRoot nestedRoot, bool shouldGenerate, string variableName)
|
||||
{
|
||||
if (nestedRoot == null || FindNearestParentRoot(nestedRoot.transform) != this)
|
||||
{
|
||||
throw new ArgumentException("The nested root must be directly owned by this serialization root.", nameof(nestedRoot));
|
||||
}
|
||||
|
||||
RefreshItems();
|
||||
NestedFormReference reference = FindNestedForm(nestedRoot);
|
||||
if (reference == null)
|
||||
{
|
||||
throw new InvalidOperationException("The nested root is not registered.");
|
||||
}
|
||||
|
||||
string normalizedName = variableName == null ? string.Empty : variableName.Trim();
|
||||
if (reference.GenerateReference == shouldGenerate && reference.VariableName == normalizedName)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
reference.Configure(shouldGenerate, normalizedName);
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static string CreateDefaultNestedFormVariableName(UISerializationRoot nestedRoot)
|
||||
{
|
||||
string sourceName = nestedRoot == null ? "nested" : nestedRoot.gameObject.name.Replace("(Clone)", string.Empty).Trim();
|
||||
if (sourceName.EndsWith("Form", StringComparison.Ordinal) && sourceName.Length > 4)
|
||||
{
|
||||
sourceName = sourceName.Substring(0, sourceName.Length - 4);
|
||||
}
|
||||
else if (sourceName.EndsWith("UI", StringComparison.Ordinal) && sourceName.Length > 2)
|
||||
{
|
||||
sourceName = sourceName.Substring(0, sourceName.Length - 2);
|
||||
}
|
||||
|
||||
string identifier = ToPascalIdentifier(sourceName);
|
||||
if (string.IsNullOrEmpty(identifier))
|
||||
{
|
||||
identifier = "Nested";
|
||||
}
|
||||
|
||||
return char.ToLowerInvariant(identifier[0]) + identifier.Substring(1) + "Form";
|
||||
}
|
||||
|
||||
internal void QueueRefresh()
|
||||
{
|
||||
if (refreshQueued || Application.isPlaying)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
refreshQueued = true;
|
||||
UnityEditor.EditorApplication.delayCall += RefreshDelayed;
|
||||
}
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
RefreshItems();
|
||||
NotifyParentRoot();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
QueueRefresh();
|
||||
NotifyParentRoot();
|
||||
}
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
QueueRefresh();
|
||||
NotifyParentRoot();
|
||||
}
|
||||
|
||||
private void OnTransformChildrenChanged()
|
||||
{
|
||||
QueueRefresh();
|
||||
}
|
||||
|
||||
private void OnTransformParentChanged()
|
||||
{
|
||||
QueueRefresh();
|
||||
NotifyParentRoot();
|
||||
}
|
||||
|
||||
private void RefreshDelayed()
|
||||
{
|
||||
refreshQueued = false;
|
||||
if (this == null || Application.isPlaying)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RefreshItems();
|
||||
}
|
||||
|
||||
private bool HasSameItems(List<UISerializationItem> found)
|
||||
{
|
||||
if (serializationItems.Count != found.Count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < found.Count; i++)
|
||||
{
|
||||
if (serializationItems[i] != found[i])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool HasSameNestedForms(List<UISerializationRoot> found)
|
||||
{
|
||||
if (nestedFormReferences.Count != found.Count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < found.Count; i++)
|
||||
{
|
||||
if (nestedFormReferences[i] == null || nestedFormReferences[i].Root != found[i])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private NestedFormReference FindNestedForm(UISerializationRoot nestedRoot)
|
||||
{
|
||||
for (int i = 0; i < nestedFormReferences.Count; i++)
|
||||
{
|
||||
NestedFormReference reference = nestedFormReferences[i];
|
||||
if (reference != null && reference.Root == nestedRoot)
|
||||
{
|
||||
return reference;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void NotifyParentRoot()
|
||||
{
|
||||
UISerializationRoot parentRoot = FindNearestParentRoot(transform);
|
||||
if (parentRoot != null)
|
||||
{
|
||||
parentRoot.QueueRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
private static UISerializationRoot FindNearestRoot(Transform target)
|
||||
{
|
||||
Transform current = target;
|
||||
while (current != null)
|
||||
{
|
||||
UISerializationRoot root = current.GetComponent<UISerializationRoot>();
|
||||
if (root != null)
|
||||
{
|
||||
return root;
|
||||
}
|
||||
|
||||
current = current.parent;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static UISerializationRoot FindNearestParentRoot(Transform target)
|
||||
{
|
||||
return target == null ? null : FindNearestRoot(target.parent);
|
||||
}
|
||||
|
||||
private static string ToPascalIdentifier(string value)
|
||||
{
|
||||
var builder = new StringBuilder(value.Length + 8);
|
||||
bool capitalizeNext = true;
|
||||
for (int i = 0; i < value.Length; i++)
|
||||
{
|
||||
char current = value[i];
|
||||
if (!char.IsLetterOrDigit(current) && current != '_')
|
||||
{
|
||||
capitalizeNext = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (builder.Length == 0 && char.IsDigit(current))
|
||||
{
|
||||
builder.Append('_');
|
||||
}
|
||||
|
||||
builder.Append(capitalizeNext ? char.ToUpperInvariant(current) : current);
|
||||
capitalizeNext = false;
|
||||
}
|
||||
|
||||
return builder.ToString();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 335062b0d81ae40f49c923ef4bf19dd7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: debba566f996cf14cae850a4a9d461ed
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public class RolePropertyAreaContext : UIContext
|
||||
public class ShowAreaContext : UIContext
|
||||
{
|
||||
public string RoleName;
|
||||
public string InitialPropertyText;
|
||||
@@ -0,0 +1,20 @@
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public partial class ShowAreaForm
|
||||
{
|
||||
public void ShowRandomRole()
|
||||
{
|
||||
View.randomRoleCardObject.gameObject.SetActive(true);
|
||||
View.roleCardObject.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public void ShowRoleProperty(ShowAreaContext context)
|
||||
{
|
||||
View.roleNameText.text = context.RoleName;
|
||||
View.initialPropertyText.text = context.InitialPropertyText;
|
||||
|
||||
View.randomRoleCardObject.gameObject.SetActive(false);
|
||||
View.roleCardObject.gameObject.SetActive(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 342797c2a9cf0364aaf7fe4688e3f460
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,13 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class ShowAreaForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private ShowAreaView _view = null;
|
||||
|
||||
public ShowAreaView View => _view;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f77da2a257f3eb44fbb67351780d84df
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class ShowAreaView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] public global::UnityEngine.RectTransform randomRoleCardObject;
|
||||
[SerializeField] public global::UnityEngine.RectTransform roleCardObject;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI roleNameText;
|
||||
[SerializeField] public global::UnityEngine.UI.RawImage roleAvatarRawImage;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI initialPropertyText;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65d79ca5fd70cef4abd5169b1621200b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user