Browse Source

Transport UI Part 3

bolt_update
laurids 3 years ago
parent
commit
f912fa280a
13 changed files with 340 additions and 103 deletions
  1. +17
    -2
      Assets/GWConquest/Prefabs/UI/TransportUI/ItemIcon.prefab
  2. +16
    -2
      Assets/GWConquest/Prefabs/UI/TransportUI/UnitIcon.prefab
  3. +6
    -5
      Assets/GWConquest/Scenes/GalaxyMap.unity
  4. +1
    -0
      Assets/GWConquest/Scripts/GameManager.cs
  5. +45
    -1
      Assets/GWConquest/Scripts/Inventory.cs
  6. +58
    -0
      Assets/GWConquest/Scripts/UI/GWLayout.cs
  7. +49
    -44
      Assets/GWConquest/Scripts/UI/TransportUI.cs
  8. +68
    -49
      Assets/GWConquest/Scripts/UI/TransportUIElement.cs
  9. +30
    -0
      Assets/GWConquest/Scripts/UI/TransportUIItemIcon.cs
  10. +11
    -0
      Assets/GWConquest/Scripts/UI/TransportUIItemIcon.cs.meta
  11. +26
    -0
      Assets/GWConquest/Scripts/UI/TransportUIUnitIcon.cs
  12. +11
    -0
      Assets/GWConquest/Scripts/UI/TransportUIUnitIcon.cs.meta
  13. +2
    -0
      Assets/GWConquest/Scripts/Util.cs

+ 17
- 2
Assets/GWConquest/Prefabs/UI/TransportUI/ItemIcon.prefab View File

@ -107,6 +107,7 @@ GameObject:
- component: {fileID: 6815987390155653560}
- component: {fileID: 6815987390155653558}
- component: {fileID: 1138806303401438636}
- component: {fileID: 2625037691328288990}
m_Layer: 5
m_Name: ItemIcon
m_TagString: Untagged
@ -133,8 +134,8 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 10, y: 0}
m_SizeDelta: {x: 70, y: 35}
m_Pivot: {x: 0, y: 0.5}
m_SizeDelta: {x: 35, y: 35}
m_Pivot: {x: 0, y: 1}
--- !u!222 &6815987390155653558
CanvasRenderer:
m_ObjectHideFlags: 0
@ -158,6 +159,20 @@ MonoBehaviour:
Padding: 0
Horizontal: 1
Vertical: 0
--- !u!114 &2625037691328288990
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6815987390155653563}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b2d51b1b7888cf746a92268bf10b8826, type: 3}
m_Name:
m_EditorClassIdentifier:
Icon: {fileID: 6815987390313110545}
Amount: {fileID: 6815987389502116016}
--- !u!1 &6815987390313110547
GameObject:
m_ObjectHideFlags: 0


+ 16
- 2
Assets/GWConquest/Prefabs/UI/TransportUI/UnitIcon.prefab View File

@ -11,6 +11,7 @@ GameObject:
- component: {fileID: 7040377985677660588}
- component: {fileID: 7040377985677661732}
- component: {fileID: 7040377985677660403}
- component: {fileID: -4965173851359396094}
m_Layer: 5
m_Name: UnitIcon
m_TagString: Untagged
@ -34,9 +35,9 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: -25}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 50, y: 50}
m_Pivot: {x: 0, y: 0.5}
m_Pivot: {x: 0, y: 1}
--- !u!222 &7040377985677661732
CanvasRenderer:
m_ObjectHideFlags: 0
@ -74,3 +75,16 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &-4965173851359396094
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7040377985677661857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f80b781d245838f4a87b3ba82178d152, type: 3}
m_Name:
m_EditorClassIdentifier:
Icon: {fileID: 7040377985677660403}

+ 6
- 5
Assets/GWConquest/Scenes/GalaxyMap.unity View File

@ -25706,7 +25706,8 @@ MonoBehaviour:
MoveToFlankCooldown: 15
MoveToReserveCooldown: 15
UnitDeathCooldown: 60
DefaultStorageCapacity: 1000
DefaultStorageCapacity: 10000
MaxStackSize: 500
DefaultProductionCooldown: 1
SpawnAIPlayer: 1
--- !u!4 &426309784
@ -42623,7 +42624,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &765894939
RectTransform:
m_ObjectHideFlags: 0
@ -68000,7 +68001,7 @@ RectTransform:
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 4, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
@ -80195,7 +80196,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &1437555322
RectTransform:
m_ObjectHideFlags: 0
@ -90641,7 +90642,7 @@ RectTransform:
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 4, y: 20}
m_Pivot: {x: 0.5, y: 0.5}


+ 1
- 0
Assets/GWConquest/Scripts/GameManager.cs View File

@ -20,6 +20,7 @@ namespace GWConquest
public float UnitDeathCooldown;
public int DefaultStorageCapacity;
public int MaxStackSize;
public float DefaultProductionCooldown;


+ 45
- 1
Assets/GWConquest/Scripts/Inventory.cs View File

@ -1,6 +1,7 @@
using UdpKit;
using Bolt;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
namespace GWConquest
@ -8,7 +9,9 @@ namespace GWConquest
[System.Serializable]
public class ItemStack : IIconObject
{
public const int MaxStackSize = 50;
public static int MaxStackSize {
get => GameManager.Instance.MaxStackSize;
}
public bool IsUnit;
public string ItemName;
@ -77,6 +80,24 @@ namespace GWConquest
};
}
public ItemStack Copy() {
return new ItemStack() {
IsUnit = IsUnit,
Unit = Unit,
ItemName = ItemName,
Stackable = Stackable,
Amount = Amount
};
}
public static bool ItemsEqual(ItemStack stack1, ItemStack stack2)
{
return stack1.IsUnit == stack2.IsUnit
&& (stack1.IsUnit ?
(stack1.Unit == stack2.Unit) :
(stack1.ItemName == stack2.ItemName));
}
}
public class InventoryToken : BoltListToken<ItemStack>
@ -173,5 +194,28 @@ namespace GWConquest
}
}
public static IEnumerable<ItemStack> AddAllItems(IEnumerable<ItemStack> items)
{
//TODO Unit Items
Dictionary<string, ItemStack> dict = new Dictionary<string, ItemStack>();
foreach(var stack in items)
{
if(stack.IsUnit)
continue;
if(dict.ContainsKey(stack.ItemName))
{
dict[stack.ItemName].Amount += stack.Amount;
}
else {
dict[stack.ItemName] = stack.Copy();
}
}
return dict.Values;
}
}
}

+ 58
- 0
Assets/GWConquest/Scripts/UI/GWLayout.cs View File

@ -1,4 +1,7 @@
using UnityEngine;
using System.Collections.Generic;
using System;
using System.Linq;
namespace GWConquest
{
@ -6,6 +9,11 @@ namespace GWConquest
void UpdateLayout();
}
public interface IUpdatable<T> {
T GetObject();
void UpdateDisplay(T obj);
}
public class GWLayout
{
public static void UpdateLayout(RectTransform rt) {
@ -37,5 +45,55 @@ namespace GWConquest
anchoredPosition[axis] = (axis == 0) ? (pos + rect.sizeDelta[axis] * rect.pivot[axis] * scaleFactor) : (-pos - rect.sizeDelta[axis] * (1f - rect.pivot[axis]) * scaleFactor);
rect.anchoredPosition = anchoredPosition;
}
public static void UpdateGameObjects<T,V>(List<V> updatables, List<T> objects, Func<T,V> updatableConstructor, Func<T,T,bool> objectComparer = null) where V : IUpdatable<T>{
if(objectComparer == null)
{
objectComparer = (o1,o2) => o1.Equals(o2);
}
List<V> toDestroyList = new List<V>();
List<T> objectsCopy = new List<T>();
objectsCopy.AddRange(objects);
foreach(var updatable in updatables)
{
var obj = updatable.GetObject();
if(objectsCopy.Exists(o => objectComparer(o, obj)))
{
var newObj = objectsCopy.First(o => objectComparer(o, obj));
updatable.UpdateDisplay(newObj);
objectsCopy.Remove(newObj);
}
else {
toDestroyList.Add(updatable);
}
}
foreach(var updatable in toDestroyList)
{
var comp = updatable as Component;
UnityEngine.Object.Destroy(comp.gameObject);
updatables.Remove(updatable);
}
foreach(var obj in objectsCopy)
{
var updatable = updatableConstructor(obj);
updatables.Add(updatable);
}
updatables.Sort((a, b) => {
return objects.IndexOf(a.GetObject()) - objects.IndexOf(b.GetObject());
});
for(int i = 0; i < updatables.Count; i++)
{
var comp = updatables[i] as Component;
comp.transform.SetSiblingIndex(i);
}
}
}
}

+ 49
- 44
Assets/GWConquest/Scripts/UI/TransportUI.cs View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
namespace GWConquest
{
@ -12,6 +13,12 @@ namespace GWConquest
public RectTransform ContentTransform;
public RectTransform ItemsTransform;
public Text PlanetNameText;
[System.NonSerialized]
public List<TransportUIElement> SubElementList = new List<TransportUIElement>();
[System.NonSerialized]
public List<TransportUIItemIcon> ItemIconList = new List<TransportUIItemIcon>();
}
public TransportUIPanel GroundPanel;
@ -35,6 +42,10 @@ namespace GWConquest
GWLayout.UpdateLayout(GroundPanel.ContentTransform);
}
private void FixedUpdate() {
UpdatePanel(GroundPanel);
}
private TransportUIElement AddElement(RectTransform parent) {
var elementGO = Instantiate(ElementPrefab);
@ -51,66 +62,60 @@ namespace GWConquest
return elementComp;
}
private void RebuildItemsPanel(RectTransform parent, Dictionary<string, int> items)
public void RebuildPanel(TransportUIPanel panel)
{
Util.DestroyAllChildren(parent);
foreach(var itemType in items)
{
var item = ItemRegistry.Instance.GetEntry(itemType.Key);
var amount = itemType.Value;
Util.DestroyAllChildren(panel.ContentTransform);
panel.SubElementList.Clear();
var itemIconGO = Instantiate(ItemIconPrefab);
GWLayout.UpdateLayout(panel.ContentTransform);
itemIconGO.GetComponentInChildren<Image>().sprite = item.Icon;
itemIconGO.GetComponentInChildren<Image>().color = item.Color;
itemIconGO.GetComponentInChildren<Text>().text = amount.ToString();
Util.DestroyAllChildren(panel.ItemsTransform);
panel.ItemIconList.Clear();
itemIconGO.GetComponent<RectTransform>().SetParent(parent);
itemIconGO.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
}
GWLayout.UpdateLayout(panel.ItemsTransform);
GWLayout.UpdateLayout(parent);
panel.PlanetNameText.text = CurrentPlanet.planetName;
}
public void RebuildPanel(TransportUIPanel panel)
public void UpdatePanel(TransportUIPanel panel)
{
Util.DestroyAllChildren(panel.ContentTransform);
IEnumerable<object> objects = null;
Dictionary<string, int> allItems = new Dictionary<string, int>();
IEnumerable<ItemStack> itemStacks = null;
if(panel == GroundPanel)
{
foreach(Zone z in CurrentPlanet.groundZones)
{
District d = z.GetComponent<District>();
if(d != null)
{
var elementComp = AddElement(panel.ContentTransform);
elementComp.IsDistrict = true;
elementComp.District = d;
elementComp.Rebuild();
foreach(ItemStack stack in d.Inventory)
{
if(allItems.ContainsKey(stack.ItemName))
{
allItems[stack.ItemName] += stack.Amount;
}
else {
allItems[stack.ItemName] = stack.Amount;
}
}
}
}
var districts = CurrentPlanet.groundZones.Where(z => z.GetComponent<District>() != null).Select((z,i) => z.GetComponent<District>());
itemStacks = districts.SelectMany(d => d.Inventory);
objects = districts.Cast<object>();
}
GWLayout.UpdateLayout(panel.ContentTransform);
GWLayout.UpdateGameObjects(panel.SubElementList, objects.ToList(), d => {
var elementComp = AddElement(panel.ContentTransform);
RebuildItemsPanel(panel.ItemsTransform, allItems);
elementComp.IsDistrict = true;
elementComp.District = d as District;
elementComp.Rebuild();
panel.PlanetNameText.text = CurrentPlanet.planetName;
return elementComp;
});
var addedItems = Inventory.AddAllItems(itemStacks);
GWLayout.UpdateGameObjects(panel.ItemIconList, addedItems.ToList(), item => {
var itemIconGO = Instantiate(ItemIconPrefab);
itemIconGO.GetComponent<RectTransform>().SetParent(panel.ItemsTransform);
itemIconGO.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
var itemIconComp = itemIconGO.GetComponent<TransportUIItemIcon>();
itemIconComp.UpdateDisplay(item);
return itemIconComp;
}, (i1,i2) => ItemStack.ItemsEqual(i1,i2));
}
}
}


+ 68
- 49
Assets/GWConquest/Scripts/UI/TransportUIElement.cs View File

@ -1,10 +1,11 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
namespace GWConquest
{
public class TransportUIElement : MonoBehaviour
public class TransportUIElement : MonoBehaviour, IUpdatable<object>
{
public Image SpriteImage;
public Text NameText;
@ -27,6 +28,10 @@ namespace GWConquest
private List<TransportUIElement> ChildrenList = new List<TransportUIElement>();
private List<TransportUIUnitIcon> UnitIconList = new List<TransportUIUnitIcon>();
private List<TransportUIItemIcon> ItemIconList = new List<TransportUIItemIcon>();
[System.NonSerialized]
public bool IsDistrict;
@ -69,7 +74,7 @@ namespace GWConquest
}
else {
//TODO
return null;
return new List<Formation>();
}
}
@ -82,83 +87,97 @@ namespace GWConquest
}
ChildrenList.Clear();
Util.DestroyAllChildren(UnitIconsTransform);
UnitIconList.Clear();
Util.DestroyAllChildren(ItemIconsTransform);
ItemIconList.Clear();
var AllItems = GetAllItems();
var SubFormations = GetSubFormations();
if(SubFormations != null)
if(IsDistrict)
{
foreach(Formation f in SubFormations)
{
var subElGO = Instantiate(SubElementPrefab);
SpriteImage.sprite = District.GetCurrentSprite();
NameText.text = District.GetDistrictName();
}
else {
NameText.text = Formation.FormationName;
}
UpdateDisplay(null);
}
var elementRT = subElGO.GetComponent<RectTransform>();
public void UpdateDisplay(object obj)
{
var SubFormations = GetSubFormations().Cast<object>();
elementRT.SetParent(ChildrenTransform);
elementRT.anchoredPosition = Vector2.zero;
var size = elementRT.sizeDelta;
size.x = 0f;
elementRT.sizeDelta = size;
GWLayout.UpdateGameObjects(ChildrenList, SubFormations.ToList(), d => {
var subElGO = Instantiate(SubElementPrefab);
var elementComp = subElGO.GetComponent<TransportUIElement>();
elementComp.IsDistrict = false;
elementComp.Formation = f;
elementComp.Rebuild();
var elementRT = subElGO.GetComponent<RectTransform>();
ChildrenList.Add(elementComp);
}
}
elementRT.SetParent(ChildrenTransform);
elementRT.anchoredPosition = Vector2.zero;
var size = elementRT.sizeDelta;
size.x = 0f;
elementRT.sizeDelta = size;
UnitIconsTransform.SetAsLastSibling();
ItemIconsTransform.SetAsLastSibling();
var elementComp = subElGO.GetComponent<TransportUIElement>();
elementComp.IsDistrict = false;
elementComp.Formation = d as Formation;
elementComp.Rebuild();
Util.DestroyAllChildren(UnitIconsTransform);
return elementComp;
});
if(!IsDistrict)
{
var AllUnits = Formation.Units;
foreach(Unit unit in AllUnits)
{
GWLayout.UpdateGameObjects(UnitIconList, AllUnits.ToList(), unit => {
var unitIconGO = Instantiate(UnitIconPrefab);
unitIconGO.GetComponentInChildren<Image>().sprite = unit.Icon;
unitIconGO.GetComponent<RectTransform>().SetParent(UnitIconsTransform);
unitIconGO.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
}
}
Util.DestroyAllChildren(ItemIconsTransform);
var unitIconComp = unitIconGO.GetComponent<TransportUIUnitIcon>();
var AllItems = GetAllItems();
unitIconComp.UpdateDisplay(unit);
foreach(ItemStack stack in AllItems)
{
var itemIconGO = Instantiate(ItemIconPrefab);
return unitIconComp;
});
}
itemIconGO.GetComponentInChildren<Image>().sprite = stack.Icon;
itemIconGO.GetComponentInChildren<Image>().color = stack.IconColor;
itemIconGO.GetComponentInChildren<Text>().text = stack.Amount.ToString();
var AllItems = GetAllItems();
GWLayout.UpdateGameObjects(ItemIconList, AllItems.ToList(), item => {
var itemIconGO = Instantiate(ItemIconPrefab);
itemIconGO.GetComponent<RectTransform>().SetParent(ItemIconsTransform);
itemIconGO.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
}
//LayoutRebuilder.MarkLayoutForRebuild(ItemIconsTransform);
var itemIconComp = itemIconGO.GetComponent<TransportUIItemIcon>();
itemIconComp.UpdateDisplay(item);
return itemIconComp;
}, (i1,i2) => ItemStack.ItemsEqual(i1,i2));
UnitIconsTransform.SetAsLastSibling();
ItemIconsTransform.SetAsLastSibling();
}
public object GetObject()
{
if(IsDistrict)
{
SpriteImage.sprite = District.GetCurrentSprite();
NameText.text = District.GetDistrictName();
return District;
}
else {
NameText.text = Formation.FormationName;
return Formation;
}
//LayoutRebuilder.MarkLayoutForRebuild(GetComponent<RectTransform>());
//LayoutRebuilder.ForceRebuildLayoutImmediate(GetComponent<RectTransform>());
}


+ 30
- 0
Assets/GWConquest/Scripts/UI/TransportUIItemIcon.cs View File

@ -0,0 +1,30 @@
using UnityEngine.UI;
using UnityEngine;
namespace GWConquest {
public class TransportUIItemIcon : MonoBehaviour, IUpdatable<ItemStack> {
public Image Icon;
public Text Amount;
[System.NonSerialized]
private ItemStack Stack;
public void UpdateDisplay(ItemStack stack)
{
Stack = stack;
Icon.sprite = Stack.Icon;
Icon.color = Stack.IconColor;
Amount.text = Stack.Amount.ToString();
}
public ItemStack GetObject()
{
return Stack;
}
}
}

+ 11
- 0
Assets/GWConquest/Scripts/UI/TransportUIItemIcon.cs.meta View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b2d51b1b7888cf746a92268bf10b8826
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

+ 26
- 0
Assets/GWConquest/Scripts/UI/TransportUIUnitIcon.cs View File

@ -0,0 +1,26 @@
using UnityEngine;
using UnityEngine.UI;
namespace GWConquest
{
public class TransportUIUnitIcon : MonoBehaviour, IUpdatable<Unit>
{
public Image Icon;
[System.NonSerialized]
private Unit Unit;
public void UpdateDisplay(Unit unit)
{
Unit = unit;
Icon.sprite = Unit.Icon;
}
public Unit GetObject()
{
return Unit;
}
}
}

+ 11
- 0
Assets/GWConquest/Scripts/UI/TransportUIUnitIcon.cs.meta View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f80b781d245838f4a87b3ba82178d152
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

+ 2
- 0
Assets/GWConquest/Scripts/Util.cs View File

@ -183,6 +183,8 @@ namespace GWConquest
return str == null || str == "";
}
}
}

Loading…
Cancel
Save