refactored items

This commit is contained in:
dddushesss 2022-01-11 06:36:00 +03:00
parent 2528c3e4dd
commit d7424ed972
23 changed files with 240 additions and 182 deletions

View File

@ -12,31 +12,21 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: effbc11b6ae8444c8d20e929ce28183e, type: 3}
m_Name: ItemData
m_EditorClassIdentifier:
itemInfos:
- prefab: {fileID: 3197816592181874056, guid: f0b68f1afd77d7741a0fe8ff5ba25a77,
items:
- item: {fileID: 11400000, guid: e7adbedb55c5db341a823370b696f709, type: 2}
iconPrefab: {fileID: 3197816592181874056, guid: 2704c4f795b0d7748a3e3fa53be4d893,
type: 3}
isInstantUse: 0
type: Tower
icon: {fileID: 21300000, guid: 543c4732bd2d47a41bdbbf2156eb358c, type: 3}
spawnablePrefab: {fileID: 3496656575117217171, guid: 38edd53c7f09f41409153241c78268f9,
type: 3}
values:
spawnChance: 1
- prefab: {fileID: 3197816592181874056, guid: 2704c4f795b0d7748a3e3fa53be4d893,
type: 3}
isInstantUse: 1
type: AttackBonus
icon: {fileID: 21300000, guid: caf8bc0311dd2fc4ca1528a82a063754, type: 3}
spawnablePrefab: {fileID: 0}
values: 0300000064000000
spawnChance: 0
- prefab: {fileID: 8639522512577941448, guid: 7b6a7f64e52da514d88aa97ad8f863df,
_spawnChance: 0.581
- item: {fileID: 11400000, guid: 62849ddbcd32e834887aac5eb3d98db0, type: 2}
iconPrefab: {fileID: 8639522512577941448, guid: 7b6a7f64e52da514d88aa97ad8f863df,
type: 3}
isInstantUse: 1
type: DefenceBonus
icon: {fileID: 21300000, guid: 35be128594dcdce48b5d8e5317b38ed9, type: 3}
spawnablePrefab: {fileID: 0}
values: 0a0000001e000000
spawnChance: 0
fromTimeSpawn: 3
_spawnChance: 0.67
- item: {fileID: 11400000, guid: ef628c3158b0ea34bb919ca105507009, type: 2}
iconPrefab: {fileID: 3197816592181874056, guid: f0b68f1afd77d7741a0fe8ff5ba25a77,
type: 3}
icon: {fileID: 21300000, guid: b7771b47a72ca7947bf18f664e53a983, type: 3}
_spawnChance: 0.921
fromTimeSpawn: 2.93
toTimeSpawn: 10

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c6b240b41035a1a49a6eb7919af5882e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,20 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2b016eba27de41629261b965b3e2be0c, type: 3}
m_Name: AttackBonus
m_EditorClassIdentifier:
iconPrefab: {fileID: 3197816592181874056, guid: 2704c4f795b0d7748a3e3fa53be4d893,
type: 3}
icon: {fileID: 21300000, guid: caf8bc0311dd2fc4ca1528a82a063754, type: 3}
duration: 3
value: 100
type: 0

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e7adbedb55c5db341a823370b696f709
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,20 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2b016eba27de41629261b965b3e2be0c, type: 3}
m_Name: DefenceBonus
m_EditorClassIdentifier:
iconPrefab: {fileID: 8639522512577941448, guid: 7b6a7f64e52da514d88aa97ad8f863df,
type: 3}
icon: {fileID: 21300000, guid: 35be128594dcdce48b5d8e5317b38ed9, type: 3}
duration: 15
value: 50
type: 1

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 62849ddbcd32e834887aac5eb3d98db0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,19 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f23a091c5733400f8f0092a4c0f33c6e, type: 3}
m_Name: Tower
m_EditorClassIdentifier:
iconPrefab: {fileID: 3197816592181874056, guid: f0b68f1afd77d7741a0fe8ff5ba25a77,
type: 3}
icon: {fileID: 21300000, guid: b7771b47a72ca7947bf18f664e53a983, type: 3}
buildingPrefab: {fileID: 3496656575117217171, guid: 38edd53c7f09f41409153241c78268f9,
type: 3}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ef628c3158b0ea34bb919ca105507009
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -33,7 +33,7 @@ namespace Controller
data.WeaponsData.WeaponsList.ForEach(x => x.SetModifiedDamage(0));
ItemFabric itemFabric = new ItemFabric(data.ItemsData, SetUpItems());
ItemFabric itemFabric = new ItemFabric(data.ItemsData);
controllers.Add(itemFabric);
UIController uiController = new UIController(data.UIData);
@ -86,7 +86,7 @@ namespace Controller
private List<Type> SetUpItems()
{
return new List<Type>() { typeof(Building), typeof(AttackBonus), typeof(DefenceBonus) };
return new List<Type>() { typeof(Building), typeof(Bonus)};
}
}
}

View File

@ -10,34 +10,27 @@ namespace Data
public class ItemsData : ScriptableObject
{
[SerializeField]
private List<ItemInfo> itemInfos;
private List<ItemInfos> items;
[SerializeField] private float fromTimeSpawn;
[SerializeField] private float toTimeSpawn;
public List<ItemInfo> ItemInfos => itemInfos;
public List<ItemInfos> ItemInfos => items;
public (float from, float to) SpawnTime => (fromTimeSpawn, toTimeSpawn);
}
[Serializable]
public struct ItemInfo
public struct ItemInfos
{
[SerializeField] private GameObject prefab;
[SerializeField] private bool isInstantUse;
[SerializeField] private string type;
[SerializeField] private Sprite icon;
[SerializeField] private GameObject spawnablePrefab;
[SerializeField] private int[] values;
[SerializeField][Range(0,1)] private float spawnChance;
public GameObject Prefab => prefab;
public string Type => type;
[SerializeField] private Item item;
[SerializeField][Range(0,1)] private float _spawnChance;
public Sprite Icon => icon;
public GameObject SpawnablePrefab => spawnablePrefab;
public bool IsInstanceUse => isInstantUse;
public int[] Values => values;
public float SpawnChance => spawnChance;
public Item Item => item;
public float SpawnChance => _spawnChance;
}
}

View File

@ -11,7 +11,7 @@ namespace GameUI
[SerializeField] private GameObject item;
[SerializeField] private GameObject grid;
public Action<Item> OnItemInvoked;
public Action<Building> OnBuildingInvoked;
private List<Button> _buttons;
private Button[] _freeButtons;
@ -66,23 +66,26 @@ namespace GameUI
button.image.sprite = item.Icon;
button.onClick.AddListener(() =>
{
if (item.IsInstantUse)
switch (item)
{
button.onClick.RemoveAllListeners();
item.InstanceInvoke();
for (int i = 0; i < _freeButtons.Length; i++)
case Bonus _bonus:
{
if (_freeButtons[i] != null) continue;
_freeButtons[i] = button;
button.onClick.RemoveAllListeners();
_bonus.Invoke();
for (int i = 0; i < _freeButtons.Length; i++)
{
if (_freeButtons[i] != null) continue;
_freeButtons[i] = button;
break;
}
button.onClick.RemoveAllListeners();
button.gameObject.SetActive(false);
break;
}
button.onClick.RemoveAllListeners();
button.gameObject.SetActive(false);
}
else
{
item.Invoke(SwitchButton);
OnItemInvoked?.Invoke(item);
case Building _building:
_building.Invoke(SwitchButton);
OnBuildingInvoked?.Invoke(_building);
break;
}
});
}

View File

@ -1,29 +0,0 @@
using System;
using Data;
using HexFiled;
namespace Items
{
public class AttackBonus : Item
{
public AttackBonus(ItemInfo data) : base(data)
{
}
public override void Invoke(Action<Item> item)
{
throw new NotImplementedException();
}
public override void InstanceInvoke()
{
Unit.SetAttackBonus(Data.Values[0], Data.Values[1]);
Unit.UseItem(this);
}
public override void PlaceItem(HexCell cell)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,28 @@
using System;
using Data;
using HexFiled;
using UnityEngine;
namespace Items
{
public enum BonusType
{
Attack,
Defence
}
[CreateAssetMenu(fileName = "BonusItem", menuName = "Item/Bonus")]
public class Bonus : Item
{
[SerializeField] private float duration;
[SerializeField] private int value;
[SerializeField] private BonusType type;
public void Invoke()
{
Unit.SetUpBonus(duration, value, type);
Unit.UseItem(this);
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using Data;
using DefaultNamespace;
using HexFiled;
using UnityEngine;
using UnityEngine.UI;
@ -7,29 +8,23 @@ using Object = UnityEngine.Object;
namespace Items
{
[CreateAssetMenu(fileName = "BuildingItem", menuName = "Item/Building")]
public class Building : Item
{
[SerializeField] private GameObject buildingPrefab;
public Building(ItemInfo data) : base(data)
{
}
public override void Invoke(Action<Item> action)
public void Invoke(Action<Item> action)
{
Unit.UseItem(this);
OnItemUsed += action;
}
public override void InstanceInvoke()
public void PlaceItem(HexCell cell)
{
Unit.UseItem(this);
}
public override void PlaceItem(HexCell cell)
{
Unit.UseItem(this);
var obj = Object.Instantiate(Data.SpawnablePrefab, cell.transform.position + Data.SpawnablePrefab.transform.position, Quaternion.identity);
var obj = SpawnHelper.Spawn(buildingPrefab, cell.transform.position + buildingPrefab.transform.position);
obj.GetComponent<TowerView>().SetUp(Unit.Color);
cell.Building = obj.GetComponent<TowerView>();
OnItemUsed?.Invoke(this);

View File

@ -1,29 +0,0 @@
using System;
using Data;
using HexFiled;
namespace Items
{
public class DefenceBonus : Item
{
public DefenceBonus(ItemInfo data) : base(data)
{
}
public override void Invoke(Action<Item> item)
{
throw new NotImplementedException();
}
public override void InstanceInvoke()
{
Unit.SetDefenceBonus(Data.Values[0], Data.Values[1]);
Unit.UseItem(this);
}
public override void PlaceItem(HexCell cell)
{
throw new NotImplementedException();
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: c518da097b3645c491c6a4cc61b3d493
timeCreated: 1641382317

View File

@ -1,5 +1,6 @@
using System;
using Data;
using DefaultNamespace;
using HexFiled;
using Units;
using UnityEngine;
@ -8,42 +9,30 @@ using Object = UnityEngine.Object;
namespace Items
{
public abstract class Item : IDisposable
public abstract class Item : ScriptableObject
{
private GameObject _instance;
protected ItemInfo Data;
[SerializeField] private GameObject iconPrefab;
[SerializeField] private Sprite icon;
public Sprite Icon => icon;
public GameObject IconPrefab => iconPrefab;
protected Unit Unit;
protected Action<Item> OnItemUsed;
public bool IsInstantUse => Data.IsInstanceUse;
public Sprite Icon => Data.Icon;
public UnitColor Color => Unit.Color;
protected Item(ItemInfo data)
public GameObject Spawn(HexCell cell)
{
Data = data;
var obj = SpawnHelper.Spawn(iconPrefab, cell.transform.position + new Vector3(0, 1, 0));
obj.AddComponent<ItemView>().SetUp(this);
obj.AddComponent<CapsuleCollider>().isTrigger = true;
return obj;
}
public void PickUp(Unit unit)
{
Unit = unit;
}
public GameObject Spawn(HexCell cell)
{
_instance = Object.Instantiate(Data.Prefab, cell.transform.position + new Vector3(0, 1, 0),
Quaternion.identity);
return _instance;
}
public abstract void Invoke(Action<Item> item);
public abstract void InstanceInvoke();
public abstract void PlaceItem(HexCell cell);
public void Dispose()
{
Object.Destroy(_instance);
}
}
}

View File

@ -15,15 +15,13 @@ namespace Items
private ItemsData _data;
private List<HexCell> _openList;
private List<Type> _itemTypes;
private Dictionary<string, ItemInfo> _itemInfos;
private float _spawnTime;
private float time;
public ItemFabric(ItemsData data, List<Type> dictionary)
public ItemFabric(ItemsData data)
{
_itemInfos = new Dictionary<string, ItemInfo>();
data.ItemInfos.ForEach(info => { _itemInfos.Add(info.Type, info); });
_itemTypes = dictionary;
_data = data;
_openList = new List<HexCell>();
_spawnTime = Random.Range(data.SpawnTime.from, data.SpawnTime.to);
@ -55,36 +53,37 @@ namespace Items
return;
}
var type = GetWeightedType();
if (type == null)
var i = GetWeightedItemIndex();
if (i < 0)
{
return;
}
var info = _itemInfos[type.ToString().Replace("Items.", "")];
var obj = (Item)Activator.CreateInstance(type, info);
var go = obj.Spawn(cell);
go.AddComponent<CapsuleCollider>().isTrigger = true;
var itemView = go.AddComponent<ItemView>();
itemView.SetUp(obj);
cell.SetItem(obj);
_data.ItemInfos[i].Item.Spawn(cell);
cell.SetItem(_data.ItemInfos[i].Item);
_spawnTime = Random.Range(_data.SpawnTime.from, _data.SpawnTime.to);
}
}
private Type GetWeightedType()
private int GetWeightedItemIndex()
{
float randomNum = Random.Range(1, 101)/100f;
List<Type> possibleTypes = new List<Type>();
List<ItemInfos> possibleTypes = new List<ItemInfos>();
_itemTypes.ForEach(type =>
_data.ItemInfos.ForEach(item =>
{
if (_itemInfos[type.ToString().Replace("Items.", "")].SpawnChance >= randomNum)
if (item.SpawnChance >= randomNum)
{
possibleTypes.Add(type);
possibleTypes.Add(item);
}
});
return possibleTypes.Count > 0 ? possibleTypes[Random.Range(0, possibleTypes.Count - 1)] : null;
if (possibleTypes.Count > 0)
{
return Random.Range(0, possibleTypes.Count - 1);
}
return -1;
}
}
}

View File

@ -0,0 +1,12 @@
using UnityEngine;
namespace DefaultNamespace
{
public static class SpawnHelper
{
public static GameObject Spawn(GameObject gameObject, Vector3 pos)
{
return Object.Instantiate(gameObject, pos, Quaternion.identity);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6ec94f8447ef4582be47e726718b30b5
timeCreated: 1641866607

View File

@ -23,7 +23,7 @@ namespace Chars
private Vector2 _attackDircetion;
private HexDirection _placeDirection;
private PlayerInventoryView _inventoryView;
private Item _itemToPlace;
private Building _itemToPlace;
private HexCell _cellToPlace;
@ -43,13 +43,13 @@ namespace Chars
inventoryView.SetUpUI(unit.InventoryCapacity);
_unit.OnItemPickUp += PickUp;
_inventoryView = inventoryView;
inventoryView.OnItemInvoked += AimPlaceItem;
inventoryView.OnBuildingInvoked += AimPlaceItem;
_placeJoystick.OnTouchDown += AimCanvas;
_placeJoystick.OnTouchUp += PlaceItem;
}
private void AimPlaceItem(Item item)
private void AimPlaceItem(Building item)
{
if (!_unit.IsBusy)
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Chars;
using Data;
using DefaultNamespace;
@ -65,7 +66,22 @@ namespace Units
_isCapturing = false;
}
public void SetAttackBonus(int duration, int value)
public void SetUpBonus(float duration, int value, BonusType type)
{
switch (type)
{
case BonusType.Attack:
SetAttackBonus(duration, value);
break;
case BonusType.Defence:
SetDefenceBonus(duration, value);
break;
default:
break;
}
}
private void SetAttackBonus(float duration, int value)
{
TimerHelper.Instance.StartTimer(StopAttackBonus, duration);
_weapon.SetModifiedDamage(value);
@ -76,7 +92,7 @@ namespace Units
_weapon.SetModifiedDamage(0);
}
public void SetDefenceBonus(int duration, int value)
private void SetDefenceBonus(float duration, int value)
{
TimerHelper.Instance.StartTimer(StopDefenceBonus, duration);
_defenceBonus = value;