添加 ShopForm 下的 StatForm,展示玩家属性

This commit is contained in:
2026-09-25 00:03:39 +08:00
parent c61eb7fb68
commit 051c075183
29 changed files with 6574 additions and 51 deletions
+109
View File
@@ -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 List<GoodsItemContext> GoodsItems;
public DisplayListContext PropListContext; public DisplayListContext PropListContext;
public DisplayListContext WeaponListContext; public DisplayListContext WeaponListContext;
public StatContext StatContext;
// 控制字段 // 控制字段
public bool NeedRefreshGoodsItems; public bool NeedRefreshGoodsItems;
@@ -17,6 +18,7 @@ namespace SepCore.UI
public bool NeedRefreshWeaponList; public bool NeedRefreshWeaponList;
public bool NeedRefreshPropList; public bool NeedRefreshPropList;
public bool NeedRefreshPrice; public bool NeedRefreshPrice;
public bool NeedRefreshStat;
public ShopContext() public ShopContext()
{ {
@@ -40,14 +40,26 @@ namespace SepCore.UI
BuildDisplayListContext(DisplayListAreaType.Prop, rawData.PropItems, rawData.PropMaxCount), BuildDisplayListContext(DisplayListAreaType.Prop, rawData.PropItems, rawData.PropMaxCount),
WeaponListContext = BuildDisplayListContext(DisplayListAreaType.Weapon, rawData.WeaponItems, WeaponListContext = BuildDisplayListContext(DisplayListAreaType.Weapon, rawData.WeaponItems,
rawData.WeaponMaxCount), rawData.WeaponMaxCount),
StatContext = BuildStatContext(rawData.StatRawData),
NeedRefreshGoodsItems = true, NeedRefreshGoodsItems = true,
NeedRefreshPlayerCoin = true, NeedRefreshPlayerCoin = true,
NeedRefreshPropList = true, NeedRefreshPropList = true,
NeedRefreshWeaponList = true, NeedRefreshWeaponList = true,
NeedRefreshStat = true,
NeedRefreshPrice = 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, private static DisplayListContext BuildDisplayListContext(DisplayListAreaType listType,
IReadOnlyList<object> items, int maxCount) IReadOnlyList<object> items, int maxCount)
{ {
@@ -144,6 +144,12 @@ namespace SepCore.UI
Context.NeedRefreshPropList = true; Context.NeedRefreshPropList = true;
} }
if (result.StatRawData != null)
{
Context.StatContext = BuildStatContext(result.StatRawData);
Context.NeedRefreshStat = true;
}
Context.NeedRefreshGoodsItems = true; Context.NeedRefreshGoodsItems = true;
RefreshUI(Form, Context); RefreshUI(Form, Context);
} }
@@ -243,6 +249,8 @@ namespace SepCore.UI
Context.WeaponListContext.CurrentCount = currentCount; Context.WeaponListContext.CurrentCount = currentCount;
Context.NeedRefreshWeaponList = true; Context.NeedRefreshWeaponList = true;
Context.StatContext = BuildStatContext(_useCase.CreateStatRawData());
Context.NeedRefreshStat = true;
RefreshUI(Form, Context); RefreshUI(Form, Context);
GameEntry.UIRouter.CloseUIAsync(UIFormType.ItemTooltipForm).Forget(); GameEntry.UIRouter.CloseUIAsync(UIFormType.ItemTooltipForm).Forget();
} }
@@ -49,6 +49,12 @@ namespace SepCore.UI
View.weaponList.OnInit(context.WeaponListContext); View.weaponList.OnInit(context.WeaponListContext);
context.NeedRefreshWeaponList = false; context.NeedRefreshWeaponList = false;
} }
if (context.NeedRefreshStat)
{
View.statForm.OnInit(context.StatContext);
context.NeedRefreshStat = false;
}
} }
protected override void OnOpen(object userData) 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.FormatTextUI continueButtonFormatText;
[SerializeField] public global::SepCore.UI.DisplayListForm weaponList; [SerializeField] public global::SepCore.UI.DisplayListForm weaponList;
[SerializeField] public global::SepCore.UI.DisplayListForm propList; [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 int PendingLevelPoints { get; set; }
public StatComponent StatComponent => _statComponent;
public IReadOnlyList<WeaponBase> Weapons => _backpackComponent.Weapons; public IReadOnlyList<WeaponBase> Weapons => _backpackComponent.Weapons;
public IReadOnlyList<PropItem> Props => _backpackComponent.Props; public IReadOnlyList<PropItem> Props => _backpackComponent.Props;
public int WeaponCapacity => _backpackComponent.WeaponCapacity; public int WeaponCapacity => _backpackComponent.WeaponCapacity;
@@ -4,5 +4,6 @@ namespace SepCore.UI
{ {
public int GoodsIndex; public int GoodsIndex;
public DisplayItemRawData DisplayItem; public DisplayItemRawData DisplayItem;
public StatRawData StatRawData;
} }
} }
@@ -14,5 +14,6 @@ namespace SepCore.UI
public int PropMaxCount = -1; public int PropMaxCount = -1;
public IReadOnlyList<WeaponBase> WeaponItems; public IReadOnlyList<WeaponBase> WeaponItems;
public int WeaponMaxCount = -1; public int WeaponMaxCount = -1;
public StatRawData StatRawData;
} }
} }
@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
using SepCore.Components;
using SepCore.Definition; using SepCore.Definition;
using SepCore.Entity; using SepCore.Entity;
using SepCore.CustomUtility; using SepCore.CustomUtility;
@@ -47,10 +48,34 @@ namespace SepCore.UI
PropItems = _player.Props, PropItems = _player.Props,
PropMaxCount = GameEntry.Luban.Global.PropMaxCount, PropMaxCount = GameEntry.Luban.Global.PropMaxCount,
WeaponItems = _player.Weapons, 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) public ShopRefreshResult TryRefresh(int cost)
{ {
if (_player.Coin < cost) if (_player.Coin < cost)
@@ -102,7 +127,8 @@ namespace SepCore.UI
return new ShopPurchaseResult return new ShopPurchaseResult
{ {
GoodsIndex = goodsIndex, 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:
+570 -48
View File
@@ -357,6 +357,9 @@ MonoBehaviour:
- root: {fileID: 6139037316920262782} - root: {fileID: 6139037316920262782}
generateReference: 1 generateReference: 1
variableName: propList variableName: propList
- root: {fileID: 9015079493983826477}
generateReference: 1
variableName: statForm
--- !u!114 &7138964402462000188 --- !u!114 &7138964402462000188
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -392,6 +395,7 @@ MonoBehaviour:
continueButtonFormatText: {fileID: 4537820319422465099} continueButtonFormatText: {fileID: 4537820319422465099}
weaponList: {fileID: 1842427826495371036} weaponList: {fileID: 1842427826495371036}
propList: {fileID: 398343698490516872} propList: {fileID: 398343698490516872}
statForm: {fileID: 1326861770293265040}
--- !u!1 &2599872763744672693 --- !u!1 &2599872763744672693
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -686,42 +690,6 @@ MonoBehaviour:
- component: {fileID: 5873879027311029929} - component: {fileID: 5873879027311029929}
generateReference: 1 generateReference: 1
variableName: playerCoinFormatText 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 --- !u!1 &6965201405525023054
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -752,12 +720,13 @@ RectTransform:
m_Children: m_Children:
- {fileID: 4605528212674255201} - {fileID: 4605528212674255201}
- {fileID: 2593143890336467957} - {fileID: 2593143890336467957}
- {fileID: 6883346101882881878}
m_Father: {fileID: 1904881530488092821} m_Father: {fileID: 1904881530488092821}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -225, y: 300} m_AnchoredPosition: {x: 0, y: 300}
m_SizeDelta: {x: -717.05, y: 400} m_SizeDelta: {x: -267.05014, y: 400}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &8260361304478553399 --- !u!1 &8260361304478553399
GameObject: GameObject:
@@ -795,7 +764,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1} m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -225, y: -100} 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} m_Pivot: {x: 0.5, y: 0.5}
--- !u!1001 &88658536662749817 --- !u!1001 &88658536662749817
PrefabInstance: PrefabInstance:
@@ -943,7 +912,7 @@ PrefabInstance:
- target: {fileID: 4526370488341744408, guid: dd09af1a9a441da409e57f235fbff385, - target: {fileID: 4526370488341744408, guid: dd09af1a9a441da409e57f235fbff385,
type: 3} type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 0 value: -463
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4526370488341744408, guid: dd09af1a9a441da409e57f235fbff385, - target: {fileID: 4526370488341744408, guid: dd09af1a9a441da409e57f235fbff385,
type: 3} type: 3}
@@ -1219,7 +1188,7 @@ PrefabInstance:
serializedVersion: 2 serializedVersion: 2
m_Modification: m_Modification:
serializedVersion: 3 serializedVersion: 3
m_TransformParent: {fileID: 9205918789339949941} m_TransformParent: {fileID: 3434143815555965409}
m_Modifications: m_Modifications:
- target: {fileID: 3719248416810234768, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 3719248416810234768, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
@@ -1467,32 +1436,32 @@ PrefabInstance:
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_Pivot.x propertyPath: m_Pivot.x
value: 0.5 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_Pivot.y propertyPath: m_Pivot.y
value: 0.5 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_AnchorMax.x propertyPath: m_AnchorMax.x
value: 0.5 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_AnchorMax.y propertyPath: m_AnchorMax.y
value: 0 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_AnchorMin.x propertyPath: m_AnchorMin.x
value: 0.5 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_AnchorMin.y propertyPath: m_AnchorMin.y
value: 0 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
@@ -1562,7 +1531,7 @@ PrefabInstance:
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
value: 400 value: -20
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3, - target: {fileID: 8958121344393284127, guid: 0722cd253d6bf014eb4134a2151ec7e3,
type: 3} type: 3}
@@ -1716,6 +1685,559 @@ MonoBehaviour:
- component: {fileID: 1459358465442897105} - component: {fileID: 1459358465442897105}
generateReference: 1 generateReference: 1
variableName: continueButton 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 --- !u!1001 &6868384101991383953
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 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
View File
@@ -1,5 +1,6 @@
{ {
"dependencies": { "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.sprite": "1.0.0",
"com.unity.2d.tilemap": "1.0.0", "com.unity.2d.tilemap": "1.0.0",
"com.unity.ads": "4.4.2", "com.unity.ads": "4.4.2",
+18 -1
View File
@@ -1,5 +1,22 @@
{ {
"dependencies": { "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": { "com.unity.2d.sprite": {
"version": "1.0.0", "version": "1.0.0",
"depth": 0, "depth": 0,
@@ -139,7 +156,7 @@
}, },
"com.unity.nuget.newtonsoft-json": { "com.unity.nuget.newtonsoft-json": {
"version": "3.2.1", "version": "3.2.1",
"depth": 2, "depth": 1,
"source": "registry", "source": "registry",
"dependencies": {}, "dependencies": {},
"url": "https://packages.unity.cn" "url": "https://packages.unity.cn"