添加 ShopForm 下的 StatForm,展示玩家属性
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
---
|
||||
name: code-hygiene
|
||||
description: >-
|
||||
Inspect and clean up code in the Seek-Battle-Evacuate (SBE) project according to AGENTS.md
|
||||
null-checking rules, error handling specifications, and anti-defensive programming guidelines.
|
||||
Use this skill whenever the user asks to format code per AGENTS.md, clean up redundant null checks,
|
||||
remove over-defensive fallbacks, or review code hygiene.
|
||||
---
|
||||
|
||||
# SBE Code Hygiene & Defensive Cleanup
|
||||
|
||||
本技能用于规范 SBE 项目中的 C# 代码质量,消除过度防御(Over-Defensive Programming)、冗余判空与静默吞错,严格对齐 `AGENTS.md` 规范与敏捷“Fail Fast”(快速失败)原则。
|
||||
|
||||
---
|
||||
|
||||
## 一、三项核心红线(AGENTS.md 必须遵守)
|
||||
|
||||
1. **声明处已初始化的变量,之后绝对不判空**
|
||||
- 坏:字段或局部变量已有 `= new List<T>()` / `= new Dictionary<...>()`,后续还写 `if (_list != null)`。
|
||||
- 好:直接使用 `_list.Add(...)`、`_list.Clear()`。
|
||||
|
||||
2. **严禁静态兜底与静默回退(Fail Fast 原则)**
|
||||
- 坏:找不到数据、缺少配置或解析异常时,返回硬编码默认值(如 `global != null ? global.Time : 250` 或 `if (cfg == null) return 10;`)。
|
||||
- 好:异常路径直接 `Log.Error(...)` 报错并中断执行(`return` / 抛异常),绝不用伪造数据让程序带病运行。
|
||||
|
||||
3. **UI 序列化字段与 View 自动绑定字段不做判空**
|
||||
- 坏:`if (View != null && View.sortButton != null)`、`[SerializeField] private Button _btn; ... if (_btn != null)`。
|
||||
- 好:默认信任 Inspector 和 `UIAssetsTools` 自动绑定。若没绑定本应报错暴露,不加空防御掩盖。
|
||||
|
||||
---
|
||||
|
||||
## 二、六项常见“没必要”的过度防御与坏味道
|
||||
|
||||
在 Unity / UGF / C# 实际开发中,以下写法通常是冗余、降低代码可读性且增加维护负担的:
|
||||
|
||||
### 1. 集合遍历前的非空/长度双重检查
|
||||
- **没必要**:
|
||||
```csharp
|
||||
if (list != null && list.Count > 0)
|
||||
{
|
||||
foreach (var item in list) { ... }
|
||||
}
|
||||
```
|
||||
- **原则**:若列表规范为非空对象(即使为空也是包含 0 个元素的空列表),`foreach` 会自动直接跳过,根本无需任何 `if` 守卫:
|
||||
```csharp
|
||||
foreach (var item in list) { ... }
|
||||
```
|
||||
|
||||
### 2. LINQ 与内建构造返回值的非空检查
|
||||
- **没必要**:
|
||||
```csharp
|
||||
var results = items.Where(x => x.Active).ToList();
|
||||
if (results != null) { ... } // ToList() 永远返回新 List 实例,永不为 null
|
||||
```
|
||||
- **原则**:直接使用 LINQ 投影/转换结果。
|
||||
|
||||
### 3. 内部私有辅助方法的层层重复防御
|
||||
- **没必要**:公有入口方法已经做了入参断言/校验,拆分出来的内部私有方法 `private void ApplyCore(Item item)` 每一层都再写一遍 `if (item == null) return;`。
|
||||
- **原则**:私有方法属于内部信任边界,保持干净直白,将校验集中在业务入口。
|
||||
|
||||
### 4. 字典的双重查找(Double Lookup)
|
||||
- **没必要**:
|
||||
```csharp
|
||||
if (_dict.ContainsKey(key))
|
||||
{
|
||||
var val = _dict[key];
|
||||
...
|
||||
}
|
||||
```
|
||||
- **原则**:统一使用 `TryGetValue`,减少一次哈希哈希计算与冗余判断:
|
||||
```csharp
|
||||
if (_dict.TryGetValue(key, out var val))
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 静默吞异常的空 Try-Catch
|
||||
- **没必要**:
|
||||
```csharp
|
||||
try { DoSomething(); }
|
||||
catch (Exception) { /* 留空,或者只 Log.Warning 假装没事 */ }
|
||||
```
|
||||
- **原则**:非预期异常必须 `Log.Error(...)` 暴露上下文并附带具体错误信息,绝不能掩盖致命逻辑错误或数据存盘缺失。
|
||||
|
||||
### 6. MonoBehaviour/实例方法内的自我判空
|
||||
- **没必要**:在普通实例方法内部写 `if (this == null)`,或对由 Unity 生命周期保证的对象进行反复探测。
|
||||
- **原则**:信任正常的组件调用生命周期。
|
||||
|
||||
---
|
||||
|
||||
## 三、代码排查与清理步骤(Runbook)
|
||||
|
||||
当用户发出整理请求时,按以下流程执行:
|
||||
|
||||
1. **识别范围**:
|
||||
- 检查 `git status` 涉及修改的文件,或针对用户指定的代码文件。
|
||||
2. **逐项审查**:
|
||||
- [ ] 检查是否有 `[SerializeField]`、`View.xxx` 的判空,有则移除。
|
||||
- [ ] 检查声明处赋值(如 `= new ...`)字段的二次判空,有则移除。
|
||||
- [ ] 检查是否有配置读取、存档读取的三元默认值回退(`?:` 魔法数字),改为 `Log.Error` 并中断。
|
||||
- [ ] 检查 `foreach` 外层是否有冗余的 `if (list != null && list.Count > 0)` 嵌套,若列表非空则拍平。
|
||||
- [ ] 检查是否有空 `catch` 吞错。
|
||||
3. **推演逻辑边界(静态检查)**:
|
||||
- 确认移除防御后不会导致不可预知的崩溃;
|
||||
- 确认异常路径是否确实按规范输出了 `Log.Error`。
|
||||
4. **汇报改动**:
|
||||
- 列出修改的文件路径;
|
||||
- 简要说明移除了哪些冗余防御或规范了哪些异常断言。
|
||||
@@ -10,6 +10,7 @@ namespace SepCore.UI
|
||||
public List<GoodsItemContext> GoodsItems;
|
||||
public DisplayListContext PropListContext;
|
||||
public DisplayListContext WeaponListContext;
|
||||
public StatContext StatContext;
|
||||
|
||||
// 控制字段
|
||||
public bool NeedRefreshGoodsItems;
|
||||
@@ -17,6 +18,7 @@ namespace SepCore.UI
|
||||
public bool NeedRefreshWeaponList;
|
||||
public bool NeedRefreshPropList;
|
||||
public bool NeedRefreshPrice;
|
||||
public bool NeedRefreshStat;
|
||||
|
||||
public ShopContext()
|
||||
{
|
||||
|
||||
@@ -40,14 +40,26 @@ namespace SepCore.UI
|
||||
BuildDisplayListContext(DisplayListAreaType.Prop, rawData.PropItems, rawData.PropMaxCount),
|
||||
WeaponListContext = BuildDisplayListContext(DisplayListAreaType.Weapon, rawData.WeaponItems,
|
||||
rawData.WeaponMaxCount),
|
||||
StatContext = BuildStatContext(rawData.StatRawData),
|
||||
NeedRefreshGoodsItems = true,
|
||||
NeedRefreshPlayerCoin = true,
|
||||
NeedRefreshPropList = true,
|
||||
NeedRefreshWeaponList = true,
|
||||
NeedRefreshStat = true,
|
||||
NeedRefreshPrice = true
|
||||
};
|
||||
}
|
||||
|
||||
private static StatContext BuildStatContext(StatRawData rawData)
|
||||
{
|
||||
if (rawData == null)
|
||||
{
|
||||
Log.Error("ShopController.BuildStatContext: rawData is null.");
|
||||
}
|
||||
|
||||
return new StatContext(rawData);
|
||||
}
|
||||
|
||||
private static DisplayListContext BuildDisplayListContext(DisplayListAreaType listType,
|
||||
IReadOnlyList<object> items, int maxCount)
|
||||
{
|
||||
|
||||
@@ -144,6 +144,12 @@ namespace SepCore.UI
|
||||
Context.NeedRefreshPropList = true;
|
||||
}
|
||||
|
||||
if (result.StatRawData != null)
|
||||
{
|
||||
Context.StatContext = BuildStatContext(result.StatRawData);
|
||||
Context.NeedRefreshStat = true;
|
||||
}
|
||||
|
||||
Context.NeedRefreshGoodsItems = true;
|
||||
RefreshUI(Form, Context);
|
||||
}
|
||||
@@ -243,6 +249,8 @@ namespace SepCore.UI
|
||||
Context.WeaponListContext.CurrentCount = currentCount;
|
||||
|
||||
Context.NeedRefreshWeaponList = true;
|
||||
Context.StatContext = BuildStatContext(_useCase.CreateStatRawData());
|
||||
Context.NeedRefreshStat = true;
|
||||
RefreshUI(Form, Context);
|
||||
GameEntry.UIRouter.CloseUIAsync(UIFormType.ItemTooltipForm).Forget();
|
||||
}
|
||||
|
||||
@@ -49,6 +49,12 @@ namespace SepCore.UI
|
||||
View.weaponList.OnInit(context.WeaponListContext);
|
||||
context.NeedRefreshWeaponList = false;
|
||||
}
|
||||
|
||||
if (context.NeedRefreshStat)
|
||||
{
|
||||
View.statForm.OnInit(context.StatContext);
|
||||
context.NeedRefreshStat = false;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnOpen(object userData)
|
||||
|
||||
@@ -16,5 +16,6 @@ namespace SepCore.UI
|
||||
[SerializeField] public global::SepCore.UI.FormatTextUI continueButtonFormatText;
|
||||
[SerializeField] public global::SepCore.UI.DisplayListForm weaponList;
|
||||
[SerializeField] public global::SepCore.UI.DisplayListForm propList;
|
||||
[SerializeField] public global::SepCore.UI.StatForm statForm;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 541f4dba32e55be469dcd6b180b94fdb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,92 @@
|
||||
using System.Collections.Generic;
|
||||
using SepCore.Definition;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public class StatContext : UIContext
|
||||
{
|
||||
public StatRawData RawData { get; }
|
||||
public Dictionary<StatType, string> FormattedValues { get; } = new Dictionary<StatType, string>();
|
||||
|
||||
public StatContext()
|
||||
{
|
||||
}
|
||||
|
||||
public StatContext(StatRawData rawData)
|
||||
{
|
||||
RawData = rawData;
|
||||
if (rawData != null)
|
||||
{
|
||||
foreach (KeyValuePair<StatType, float> pair in rawData.Values)
|
||||
{
|
||||
FormattedValues[pair.Key] = FormatStatValue(pair.Key, pair.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string GetFormattedValue(StatType statType)
|
||||
{
|
||||
return FormattedValues.TryGetValue(statType, out string text) ? text : string.Empty;
|
||||
}
|
||||
|
||||
public void SetFormattedValue(StatType statType, string text)
|
||||
{
|
||||
FormattedValues[statType] = text;
|
||||
}
|
||||
|
||||
public static string FormatStatValue(StatType statType, float value)
|
||||
{
|
||||
StatConfig config = (GameEntry.Luban != null && GameEntry.Luban.IsReady)
|
||||
? GameEntry.Luban.Get<StatConfig>((int)statType)
|
||||
: null;
|
||||
|
||||
float baseValue = config?.DefaultBaseValue ?? (statType is StatType.DamagePercent or StatType.AttackSpeed ? 1f : 0f);
|
||||
bool isPercent = config?.IsPercentDisplay ?? (statType is StatType.DamagePercent or StatType.AttackSpeed or StatType.CritChance or StatType.Dodge or StatType.LifeSteal);
|
||||
|
||||
string colorTag = null;
|
||||
if (value > baseValue + 1e-4f)
|
||||
{
|
||||
colorTag = "green";
|
||||
}
|
||||
else if (value < baseValue - 1e-4f)
|
||||
{
|
||||
colorTag = "red";
|
||||
}
|
||||
|
||||
string text;
|
||||
if (statType is StatType.DamagePercent or StatType.AttackSpeed)
|
||||
{
|
||||
// 增伤与攻速基准为 1.0(即 0% 加成)。面板显示相对基准的增量,如 0%、+5%、-10%
|
||||
float bonusPercent = (value - 1f) * 100f;
|
||||
string sign = bonusPercent > 0 ? "+" : "";
|
||||
text = $"{sign}{bonusPercent:0.##}%";
|
||||
}
|
||||
else if (isPercent || statType == StatType.LifeSteal)
|
||||
{
|
||||
// 概率/比率属性(暴击率、闪避率、生命窃取):以百分比形式呈现
|
||||
float displayPercent = value * 100f;
|
||||
string sign = (value > baseValue && baseValue != 0) ? "+" : "";
|
||||
text = $"{sign}{displayPercent:0.##}%";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Mathf.Approximately(value, Mathf.Round(value)))
|
||||
{
|
||||
text = Mathf.RoundToInt(value).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
text = value.ToString("0.##");
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(colorTag))
|
||||
{
|
||||
return $"<color={colorTag}>{text}</color>";
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4bca40033be046a49a3c1a253af9d6a3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,38 @@
|
||||
using SepCore.Definition;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public partial class StatForm
|
||||
{
|
||||
public void OnInit(StatContext context)
|
||||
{
|
||||
RefreshUI(context);
|
||||
}
|
||||
|
||||
public void RefreshUI(StatContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
UnityGameFramework.Runtime.Log.Error("StatForm.RefreshUI: context is null.");
|
||||
return;
|
||||
}
|
||||
|
||||
View.maxHpValue.text = context.GetFormattedValue(StatType.MaxHp);
|
||||
View.hpRegenValue.text = context.GetFormattedValue(StatType.HpRegen);
|
||||
View.lifeStealValue.text = context.GetFormattedValue(StatType.LifeSteal);
|
||||
View.damagePercentValue.text = context.GetFormattedValue(StatType.DamagePercent);
|
||||
View.meleeDamageValue.text = context.GetFormattedValue(StatType.MeleeDamage);
|
||||
View.rangedDamageValue.text = context.GetFormattedValue(StatType.RangedDamage);
|
||||
View.elementalDamageValue.text = context.GetFormattedValue(StatType.ElementalDamage);
|
||||
View.attackSpeedValue.text = context.GetFormattedValue(StatType.AttackSpeed);
|
||||
View.critChanceValue.text = context.GetFormattedValue(StatType.CritChance);
|
||||
View.engineeringValue.text = context.GetFormattedValue(StatType.Engineering);
|
||||
View.rangeValue.text = context.GetFormattedValue(StatType.Range);
|
||||
View.armorValue.text = context.GetFormattedValue(StatType.Armor);
|
||||
View.dodgeValue.text = context.GetFormattedValue(StatType.Dodge);
|
||||
View.moveSpeedValue.text = context.GetFormattedValue(StatType.MoveSpeed);
|
||||
View.harvestingValue.text = context.GetFormattedValue(StatType.Harvesting);
|
||||
View.luckValue.text = context.GetFormattedValue(StatType.Luck);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1a6aaf8b66f78da4a93a47566847e736
|
||||
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 StatForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private StatView _view = null;
|
||||
|
||||
public StatView View => _view;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e561792b1190bde4ba98bdc92b608801
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,26 @@
|
||||
// <auto-generated />
|
||||
using UnityEngine;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public partial class StatView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI maxHpValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI hpRegenValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI lifeStealValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI damagePercentValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI meleeDamageValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI rangedDamageValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI elementalDamageValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI attackSpeedValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI critChanceValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI engineeringValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI rangeValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI armorValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI dodgeValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI moveSpeedValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI harvestingValue;
|
||||
[SerializeField] public global::TMPro.TextMeshProUGUI luckValue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cfe0c98c2edc3244e982e2492aaa2edc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -84,6 +84,8 @@ namespace SepCore.Entity
|
||||
|
||||
public int PendingLevelPoints { get; set; }
|
||||
|
||||
public StatComponent StatComponent => _statComponent;
|
||||
|
||||
public IReadOnlyList<WeaponBase> Weapons => _backpackComponent.Weapons;
|
||||
public IReadOnlyList<PropItem> Props => _backpackComponent.Props;
|
||||
public int WeaponCapacity => _backpackComponent.WeaponCapacity;
|
||||
|
||||
@@ -4,5 +4,6 @@ namespace SepCore.UI
|
||||
{
|
||||
public int GoodsIndex;
|
||||
public DisplayItemRawData DisplayItem;
|
||||
public StatRawData StatRawData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,5 +14,6 @@ namespace SepCore.UI
|
||||
public int PropMaxCount = -1;
|
||||
public IReadOnlyList<WeaponBase> WeaponItems;
|
||||
public int WeaponMaxCount = -1;
|
||||
public StatRawData StatRawData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using SepCore.Components;
|
||||
using SepCore.Definition;
|
||||
using SepCore.Entity;
|
||||
using SepCore.CustomUtility;
|
||||
@@ -47,10 +48,34 @@ namespace SepCore.UI
|
||||
PropItems = _player.Props,
|
||||
PropMaxCount = GameEntry.Luban.Global.PropMaxCount,
|
||||
WeaponItems = _player.Weapons,
|
||||
WeaponMaxCount = _player.WeaponCapacity
|
||||
WeaponMaxCount = _player.WeaponCapacity,
|
||||
StatRawData = CreateStatRawData()
|
||||
};
|
||||
}
|
||||
|
||||
public StatRawData CreateStatRawData()
|
||||
{
|
||||
var rawData = new StatRawData();
|
||||
StatComponent statComponent = _player.StatComponent;
|
||||
if (statComponent == null)
|
||||
{
|
||||
Log.Error("ShopUseCase.CreateStatRawData: Player StatComponent is null.");
|
||||
return rawData;
|
||||
}
|
||||
|
||||
foreach (StatType statType in (StatType[])Enum.GetValues(typeof(StatType)))
|
||||
{
|
||||
if (statType == StatType.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
rawData.SetValue(statType, statComponent.GetStatValue(statType));
|
||||
}
|
||||
|
||||
return rawData;
|
||||
}
|
||||
|
||||
public ShopRefreshResult TryRefresh(int cost)
|
||||
{
|
||||
if (_player.Coin < cost)
|
||||
@@ -102,7 +127,8 @@ namespace SepCore.UI
|
||||
return new ShopPurchaseResult
|
||||
{
|
||||
GoodsIndex = goodsIndex,
|
||||
DisplayItem = displayItem
|
||||
DisplayItem = displayItem,
|
||||
StatRawData = CreateStatRawData()
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18502a1681d745e46817f0d75a73a7e3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Collections.Generic;
|
||||
using SepCore.Definition;
|
||||
|
||||
namespace SepCore.UI
|
||||
{
|
||||
public class StatRawData
|
||||
{
|
||||
public Dictionary<StatType, float> Values { get; } = new Dictionary<StatType, float>();
|
||||
|
||||
public float this[StatType statType]
|
||||
{
|
||||
get => GetValue(statType);
|
||||
set => SetValue(statType, value);
|
||||
}
|
||||
|
||||
public float GetValue(StatType statType)
|
||||
{
|
||||
return Values.TryGetValue(statType, out float val) ? val : 0f;
|
||||
}
|
||||
|
||||
public void SetValue(StatType statType, float value)
|
||||
{
|
||||
Values[statType] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4677fc5d940aebd40a5a55cdb8b29628
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -357,6 +357,9 @@ MonoBehaviour:
|
||||
- root: {fileID: 6139037316920262782}
|
||||
generateReference: 1
|
||||
variableName: propList
|
||||
- root: {fileID: 9015079493983826477}
|
||||
generateReference: 1
|
||||
variableName: statForm
|
||||
--- !u!114 &7138964402462000188
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -392,6 +395,7 @@ MonoBehaviour:
|
||||
continueButtonFormatText: {fileID: 4537820319422465099}
|
||||
weaponList: {fileID: 1842427826495371036}
|
||||
propList: {fileID: 398343698490516872}
|
||||
statForm: {fileID: 1326861770293265040}
|
||||
--- !u!1 &2599872763744672693
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -686,42 +690,6 @@ MonoBehaviour:
|
||||
- component: {fileID: 5873879027311029929}
|
||||
generateReference: 1
|
||||
variableName: playerCoinFormatText
|
||||
--- !u!1 &3963448221191384772
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 9205918789339949941}
|
||||
m_Layer: 5
|
||||
m_Name: RightArea
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &9205918789339949941
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3963448221191384772}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 6883346101882881878}
|
||||
m_Father: {fileID: 1904881530488092821}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 1, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: -250, y: 0}
|
||||
m_SizeDelta: {x: 500, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!1 &6965201405525023054
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -752,12 +720,13 @@ RectTransform:
|
||||
m_Children:
|
||||
- {fileID: 4605528212674255201}
|
||||
- {fileID: 2593143890336467957}
|
||||
- {fileID: 6883346101882881878}
|
||||
m_Father: {fileID: 1904881530488092821}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 0}
|
||||
m_AnchoredPosition: {x: -225, y: 300}
|
||||
m_SizeDelta: {x: -717.05, y: 400}
|
||||
m_AnchoredPosition: {x: 0, y: 300}
|
||||
m_SizeDelta: {x: -267.05014, y: 400}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!1 &8260361304478553399
|
||||
GameObject:
|
||||
@@ -795,7 +764,7 @@ RectTransform:
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: -225, y: -100}
|
||||
m_SizeDelta: {x: -550, y: 200}
|
||||
m_SizeDelta: {x: -717.05, y: 200}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!1001 &88658536662749817
|
||||
PrefabInstance:
|
||||
@@ -943,7 +912,7 @@ PrefabInstance:
|
||||
- target: {fileID: 4526370488341744408, guid: dd09af1a9a441da409e57f235fbff385,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
value: -463
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4526370488341744408, guid: dd09af1a9a441da409e57f235fbff385,
|
||||
type: 3}
|
||||
@@ -1219,7 +1188,7 @@ PrefabInstance:
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 9205918789339949941}
|
||||
m_TransformParent: {fileID: 3434143815555965409}
|
||||
m_Modifications:
|
||||
- target: {fileID: 3719248416810234768, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
@@ -1467,32 +1436,32 @@ PrefabInstance:
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_Pivot.x
|
||||
value: 0.5
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_Pivot.y
|
||||
value: 0.5
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.x
|
||||
value: 0.5
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.x
|
||||
value: 0.5
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
@@ -1562,7 +1531,7 @@ PrefabInstance:
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 400
|
||||
value: -20
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
|
||||
type: 3}
|
||||
@@ -1716,6 +1685,559 @@ MonoBehaviour:
|
||||
- component: {fileID: 1459358465442897105}
|
||||
generateReference: 1
|
||||
variableName: continueButton
|
||||
--- !u!1001 &6469510422838881286
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 1904881530488092821}
|
||||
m_Modifications:
|
||||
- target: {fileID: 801391275681076741, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 801391275681076741, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 801391275681076741, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 801391275681076741, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 801391275681076741, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1273303412358623983, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1273303412358623983, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1273303412358623983, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1273303412358623983, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1273303412358623983, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1910866906192787602, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1910866906192787602, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1910866906192787602, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1910866906192787602, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1910866906192787602, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2294273846794743590, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2294273846794743590, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2294273846794743590, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2294273846794743590, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2294273846794743590, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2519022175391765424, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2519022175391765424, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2519022175391765424, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2519022175391765424, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2519022175391765424, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_Pivot.x
|
||||
value: 0.5
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_Pivot.y
|
||||
value: 0.5
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.x
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.x
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 400
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.y
|
||||
value: -596.985
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: -333.52
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 268.4925
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2752899368670579706, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2752899368670579706, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2752899368670579706, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2752899368670579706, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2752899368670579706, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4408985436863736299, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4408985436863736299, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4408985436863736299, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4408985436863736299, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4408985436863736299, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4474615098340524746, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4474615098340524746, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4474615098340524746, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4474615098340524746, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4474615098340524746, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4594243935509852842, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4594243935509852842, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4594243935509852842, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4594243935509852842, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4594243935509852842, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5077074068508901563, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5077074068508901563, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5077074068508901563, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5077074068508901563, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5077074068508901563, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5720722134132490187, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5720722134132490187, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5720722134132490187, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5720722134132490187, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5720722134132490187, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6093896864165701108, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6093896864165701108, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6093896864165701108, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6093896864165701108, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6093896864165701108, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6235649043184284785, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6235649043184284785, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6235649043184284785, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6235649043184284785, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6235649043184284785, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6377727078038625605, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6377727078038625605, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6377727078038625605, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6377727078038625605, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6377727078038625605, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6642070976608110142, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6642070976608110142, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6642070976608110142, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6642070976608110142, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6642070976608110142, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7533195644719076588, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_Enabled
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7948844174580554989, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7948844174580554989, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7948844174580554989, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7948844174580554989, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7948844174580554989, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7982822048369705666, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
propertyPath: m_Name
|
||||
value: StatForm
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 8eb3237ed7dcd0641995c87d796dd386, type: 3}
|
||||
--- !u!114 &1326861770293265040 stripped
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 5449818116485803670, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
m_PrefabInstance: {fileID: 6469510422838881286}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e561792b1190bde4ba98bdc92b608801, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!114 &9015079493983826477 stripped
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 2653656448540597803, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
m_PrefabInstance: {fileID: 6469510422838881286}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 335062b0d81ae40f49c923ef4bf19dd7, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!224 &9205918789339949941 stripped
|
||||
RectTransform:
|
||||
m_CorrespondingSourceObject: {fileID: 2740914464534300531, guid: 8eb3237ed7dcd0641995c87d796dd386,
|
||||
type: 3}
|
||||
m_PrefabInstance: {fileID: 6469510422838881286}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1001 &6868384101991383953
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8eb3237ed7dcd0641995c87d796dd386
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,73 @@
|
||||
using NUnit.Framework;
|
||||
using SepCore.Definition;
|
||||
using SepCore.UI;
|
||||
|
||||
namespace VampireLike.Tests.Gameplay.EditMode
|
||||
{
|
||||
[TestFixture]
|
||||
public class StatPresentationTests
|
||||
{
|
||||
[Test]
|
||||
public void StatRawData_StoresAndRetrievesValues()
|
||||
{
|
||||
var rawData = new StatRawData();
|
||||
rawData.SetValue(StatType.MaxHp, 150f);
|
||||
rawData[StatType.MeleeDamage] = 12f;
|
||||
|
||||
Assert.AreEqual(150f, rawData.GetValue(StatType.MaxHp));
|
||||
Assert.AreEqual(12f, rawData[StatType.MeleeDamage]);
|
||||
Assert.AreEqual(0f, rawData.GetValue(StatType.Armor));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StatContext_FormatsDamagePercentAndAttackSpeedAsBonus()
|
||||
{
|
||||
var rawData = new StatRawData();
|
||||
rawData.SetValue(StatType.DamagePercent, 1.05f);
|
||||
rawData.SetValue(StatType.AttackSpeed, 1.19f);
|
||||
|
||||
var context = new StatContext(rawData);
|
||||
|
||||
string damageStr = context.GetFormattedValue(StatType.DamagePercent);
|
||||
string attackSpeedStr = context.GetFormattedValue(StatType.AttackSpeed);
|
||||
|
||||
Assert.IsTrue(damageStr.Contains("+5%"), $"Expected '+5%' in '{damageStr}'");
|
||||
Assert.IsTrue(attackSpeedStr.Contains("+19%"), $"Expected '+19%' in '{attackSpeedStr}'");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StatContext_FormatsProbabilityStatsAsPercent()
|
||||
{
|
||||
var rawData = new StatRawData();
|
||||
rawData.SetValue(StatType.CritChance, 0.25f);
|
||||
rawData.SetValue(StatType.Dodge, 0.15f);
|
||||
rawData.SetValue(StatType.LifeSteal, 0.05f);
|
||||
|
||||
var context = new StatContext(rawData);
|
||||
|
||||
string critStr = context.GetFormattedValue(StatType.CritChance);
|
||||
string dodgeStr = context.GetFormattedValue(StatType.Dodge);
|
||||
string lifeStealStr = context.GetFormattedValue(StatType.LifeSteal);
|
||||
|
||||
Assert.IsTrue(critStr.Contains("25%"), $"Expected '25%' in '{critStr}'");
|
||||
Assert.IsTrue(dodgeStr.Contains("15%"), $"Expected '15%' in '{dodgeStr}'");
|
||||
Assert.IsTrue(lifeStealStr.Contains("5%"), $"Expected '5%' in '{lifeStealStr}'");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StatContext_FormatsScalarStatsAccurately()
|
||||
{
|
||||
var rawData = new StatRawData();
|
||||
rawData.SetValue(StatType.MaxHp, 120f);
|
||||
rawData.SetValue(StatType.Armor, 8f);
|
||||
|
||||
var context = new StatContext(rawData);
|
||||
|
||||
string hpStr = context.GetFormattedValue(StatType.MaxHp);
|
||||
string armorStr = context.GetFormattedValue(StatType.Armor);
|
||||
|
||||
Assert.IsTrue(hpStr.Contains("120"), $"Expected '120' in '{hpStr}'");
|
||||
Assert.IsTrue(armorStr.Contains("8"), $"Expected '8' in '{armorStr}'");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c52ac6872fcd884381da96f37ab8cd8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.coplaydev.unity-mcp": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main",
|
||||
"com.unity.2d.sprite": "1.0.0",
|
||||
"com.unity.2d.tilemap": "1.0.0",
|
||||
"com.unity.ads": "4.4.2",
|
||||
|
||||
@@ -1,5 +1,22 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.coplaydev.unity-mcp": {
|
||||
"version": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main",
|
||||
"depth": 0,
|
||||
"source": "git",
|
||||
"dependencies": {
|
||||
"com.unity.modules.animation": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0",
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.physics2d": "1.0.0",
|
||||
"com.unity.modules.uielements": "1.0.0",
|
||||
"com.unity.modules.screencapture": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.nuget.newtonsoft-json": "3.0.2",
|
||||
"com.unity.test-framework": "1.1.31"
|
||||
},
|
||||
"hash": "30d22075093d1d35dfb0091c1c7550e9ad948577"
|
||||
},
|
||||
"com.unity.2d.sprite": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
@@ -139,7 +156,7 @@
|
||||
},
|
||||
"com.unity.nuget.newtonsoft-json": {
|
||||
"version": "3.2.1",
|
||||
"depth": 2,
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.cn"
|
||||
|
||||
Reference in New Issue
Block a user