第一批重构,主要是物理迁移脚本和部分命名空间的调整

- 结构上迁移文件,将脚本分成 Base/Runtime/Presentation/Procedure/Editor 五大文件夹
- 调整 DataTable 和 Definition 下脚本的命名空间
- 依据 UI-5层架构设计规范 拆分原先的 UI 到 Runtime 和 Presentation 下
This commit is contained in:
SepComet
2026-06-02 19:12:34 +08:00
parent 56f74eee9a
commit 34c0784190
655 changed files with 1272 additions and 516 deletions
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 35199cfd0c69c8c42895c16263b21b7b
folderAsset: yes
timeCreated: 1528026146
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,49 @@
using System;
using System.IO;
using UnityEngine;
namespace SepCore.DataTable
{
public static class BinaryReaderExtension
{
public static Color32 ReadColor32(this BinaryReader binaryReader)
{
return new Color32(binaryReader.ReadByte(), binaryReader.ReadByte(), binaryReader.ReadByte(), binaryReader.ReadByte());
}
public static Color ReadColor(this BinaryReader binaryReader)
{
return new Color(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static DateTime ReadDateTime(this BinaryReader binaryReader)
{
return new DateTime(binaryReader.ReadInt64());
}
public static Quaternion ReadQuaternion(this BinaryReader binaryReader)
{
return new Quaternion(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Rect ReadRect(this BinaryReader binaryReader)
{
return new Rect(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Vector2 ReadVector2(this BinaryReader binaryReader)
{
return new Vector2(binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Vector3 ReadVector3(this BinaryReader binaryReader)
{
return new Vector3(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Vector4 ReadVector4(this BinaryReader binaryReader)
{
return new Vector4(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f303871e05cae2d489d6ba3adb6e39d3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,44 @@
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// Bullet config table.
/// Id uses BulletType value.
/// </summary>
public class DRBullet : DataRowBase
{
private int m_Id;
public override int Id => m_Id;
/// <summary>
/// 子弹实体 Id,用于在 DREntity 中查询资源路径
/// </summary>
public int EntityTypeId { get; private set; }
/// <summary>
/// 子弹速度
/// </summary>
public float Speed { get; private set; }
/// <summary>
/// 子弹生存时间
/// </summary>
public float MaxAliveTime { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
EntityTypeId = int.Parse(columnStrings[index++]);
Speed = float.Parse(columnStrings[index++]);
MaxAliveTime = float.Parse(columnStrings[index++]);
return true;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 537419cc75316184b84b9f806b114976
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DREnemy : DataRowBase
{
private int m_id;
public override int Id => m_id;
public int EntityTypeId { get; private set; }
public int MaxHealth { get; private set; }
public int HpAddPerLevel { get; private set; }
public int AttackDamage { get; private set; }
public float AttackCooldown { get; private set; }
public float AttackRange { get; private set; }
public float Speed { get; private set; }
public int DropCoin { get; private set; }
public int DropExp { get; private set; }
public float DropPercent { get; private set; }
public Dictionary<string, string> Params { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_id = int.Parse(columnStrings[index++]);
index++;
EntityTypeId = int.Parse(columnStrings[index++]);
MaxHealth = int.Parse(columnStrings[index++]);
HpAddPerLevel = int.Parse(columnStrings[index++]);
AttackDamage = int.Parse(columnStrings[index++]);
AttackCooldown = float.Parse(columnStrings[index++]);
AttackRange = float.Parse(columnStrings[index++]);
Speed = float.Parse(columnStrings[index++]);
DropCoin = int.Parse(columnStrings[index++]);
DropExp = int.Parse(columnStrings[index++]);
DropPercent = float.Parse(columnStrings[index++]);
Params = DeserializeParams(columnStrings[index++]);
return true;
}
/// <summary>
/// 解参数
/// </summary>
/// <param name="rawParams"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
private Dictionary<string, string> DeserializeParams(string rawParams)
{
if (!rawParams.StartsWith('[') || !rawParams.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
var dict = new Dictionary<string, string>();
if (string.IsNullOrEmpty(rawParams)) return dict;
string[] items = rawParams.Substring(1, rawParams.Length - 2).Split(";");
foreach (var item in items)
{
string entry = item.Trim();
if (string.IsNullOrEmpty(entry)) continue;
string[] pair = entry.Split(':', StringSplitOptions.RemoveEmptyEntries);
if (pair.Length != 2) continue;
dict.Add(pair[0].ToLower(), pair[1]);
}
return dict;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 65140fe454964f14951a73965686fb0e
timeCreated: 1769221617
@@ -0,0 +1,64 @@
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 实体表。
/// </summary>
public class DREntity : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取实体编号。
/// </summary>
public override int Id
{
get { return m_Id; }
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 98387342fa09ebd46a2ab54100d80c2f
timeCreated: 1528026146
guid: a48a9c6b974d6674f8a0421fc603dc56
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
@@ -0,0 +1,41 @@
using SepCore.Definition;
using CustomUtility;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DRGoods : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取商品Id。
/// </summary>
public override int Id => m_Id;
/// <summary>
/// 获取商品类型。
/// </summary>
public GoodsType GoodsType { get; private set; }
/// <summary>
/// 获取商品对应具体类型的表Id
/// </summary>
public int GoodsTypeId { get; set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] fields = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(fields[index++]);
index++;
GoodsType = EnumUtility<GoodsType>.Get(fields[index++]);
GoodsTypeId = int.Parse(fields[index++]);
return true;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 595bda561b5491c4e878f071ceb31089
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,109 @@
using System;
using CustomUtility;
using SepCore.Definition;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DRLevel : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取关卡编号。
/// </summary>
public override int Id => m_Id;
/// <summary>
/// 获取关卡内会生成的实体编号
/// </summary>
public EnemyType[] EntityTypes { get; private set; }
/// <summary>
/// 获取关卡内每次生成实体的数量
/// </summary>
public int[] EntityCounts { get; private set; }
/// <summary>
/// 获取关卡内生成实体的间隔时间
/// </summary>
public float[] Intervals { get; private set; }
/// <summary>
/// 获取关卡时间。
/// </summary>
public int Duration { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
GenerateEntityTypes(columnStrings[index++]);
GenerateEntityCounts(columnStrings[index++]);
GenerateIntervals(columnStrings[index++]);
Duration = int.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
private void GenerateEntityTypes(string raw)
{
if (!raw.StartsWith('[') || !raw.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
if (raw.Length == 2) return;
string[] entityIds = raw.Substring(1, raw.Length - 2).Split(",");
int length = entityIds.Length;
EntityTypes = new EnemyType[length];
for (int i = 0; i < length; i++)
{
EntityTypes[i] = EnumUtility<EnemyType>.Get(entityIds[i]);
}
}
private void GenerateEntityCounts(string raw)
{
if (!raw.StartsWith('[') || !raw.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
if (raw.Length == 2) return;
string[] entityCounts = raw.Substring(1, raw.Length - 2).Split(",");
int length = entityCounts.Length;
EntityCounts = new int[length];
for (int i = 0; i < length; i++)
{
EntityCounts[i] = int.Parse(entityCounts[i]);
}
}
private void GenerateIntervals(string raw)
{
if (!raw.StartsWith('[') || !raw.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
if (raw.Length == 2) return;
string[] intervals = raw.Substring(1, raw.Length - 2).Split(",");
int length = intervals.Length;
Intervals = new float[length];
for (int i = 0; i < length; i++)
{
Intervals[i] = float.Parse(intervals[i]);
}
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d2c6e5a5e57b464397483dd1f164ddf8
timeCreated: 1769159930
@@ -0,0 +1,39 @@
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DRLevelRarity : DataRowBase
{
private int m_Id;
public override int Id => m_Id;
public int LevelMin { get; private set; }
public int LevelMax { get; private set; }
public int WhiteWeight { get; private set; }
public int GreenWeight { get; private set; }
public int BlueWeight { get; private set; }
public int PurpleWeight { get; private set; }
public int RedWeight { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] fields = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(fields[index++]);
index++;
LevelMin = int.Parse(fields[index++]);
LevelMax = int.Parse(fields[index++]);
WhiteWeight = int.Parse(fields[index++]);
GreenWeight = int.Parse(fields[index++]);
BlueWeight = int.Parse(fields[index++]);
PurpleWeight = int.Parse(fields[index++]);
RedWeight = int.Parse(fields[index++]);
return true;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2be3a3c9896a441496abfb07467e9e19
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,38 @@
using SepCore.Definition;
using Newtonsoft.Json;
using CustomUtility;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DRLevelUpReward : DataRowBase
{
private int m_Id;
public override int Id => m_Id;
public string Title { get; private set; }
public string IconAssetName { get; private set; }
public ItemRarity Rarity { get; private set; }
public StatModifier[] Modifiers { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] fields = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(fields[index++]);
index++;
Title = fields[index++];
IconAssetName = fields[index++];
Rarity = EnumUtility<ItemRarity>.Get(fields[index++]);
Modifiers = JsonConvert.DeserializeObject<StatModifier[]>(fields[index++]);
return true;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d84933d61f76d7942a903b8db26a3ad6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,64 @@
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 音乐配置表。
/// </summary>
public class DRMusic : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取音乐编号。
/// </summary>
public override int Id
{
get { return m_Id; }
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: f95ee7b97daca3f44a2f5cf743bb39ac
timeCreated: 1528026146
guid: 5539646031a664344b90aeb64f92930d
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
@@ -0,0 +1,38 @@
using SepCore.Definition;
using Newtonsoft.Json;
using CustomUtility;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DRProp : DataRowBase
{
private int m_Id;
public override int Id => m_Id;
public string Title { get; private set; }
public string IconAssetName { get; private set; }
public ItemRarity Rarity { get; private set; }
public int Price { get; private set; }
public float PriceRandomPercent { get; private set; }
public StatModifier[] Modifiers { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] fields = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(fields[index++]);
index++;
Title = fields[index++];
IconAssetName = fields[index++];
Rarity = EnumUtility<ItemRarity>.Get(fields[index++]);
Price = int.Parse(fields[index++]);
PriceRandomPercent = float.Parse(fields[index++]);
Modifiers = JsonConvert.DeserializeObject<StatModifier[]>(fields[index++]);
return true;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 84edcc54b1524344a9f7b36d1bf55419
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using SepCore.Definition;
using GameFramework;
using StarForce;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public class DRRole : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取角色编号。
/// </summary>
public override int Id => m_Id;
/// <summary>
/// 获取资源名称。
/// </summary>
public string RoleName { get; private set; }
/// <summary>
/// 获取图标名称。
/// </summary>
public string IconName { get; private set; }
/// <summary>
/// 获取初始最大生命。
/// </summary>
public int MaxHealth { get; private set; }
/// <summary>
/// 获取初始速度。
/// </summary>
public float Speed { get; private set; }
/// <summary>
/// 获取初始金币。
/// </summary>
public int Coin { get; private set; }
/// <summary>
/// 获取最大持有武器数。
/// </summary>
public int WeaponCapacity { get; private set; }
/// <summary>
/// 获取初始属性。
/// </summary>
public StatModifier[] InitialProperties { get; private set; }
/// <summary>
/// 获取初始物品。
/// </summary>
public KeyValuePair<int, int>[] InitialItemIds { get; private set; }
public int[] ExpRequires { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
RoleName = columnStrings[index++];
IconName = columnStrings[index++];
MaxHealth = int.Parse(columnStrings[index++]);
Speed = float.Parse(columnStrings[index++]);
Coin = int.Parse(columnStrings[index++]);
WeaponCapacity = int.Parse(columnStrings[index++]);
InitialProperties = Utility.Json.ToObject<StatModifier[]>(columnStrings[index++]);
GenerateItems(columnStrings[index++]);
GenerateExpRequires(ref columnStrings, index);
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
private void GenerateItems(string raw)
{
if (!raw.StartsWith('[') || !raw.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
if (raw.Length <= 2) return;
string[] items = raw.Substring(1, raw.Length - 2).Split(";");
int length = items.Length;
InitialItemIds = new KeyValuePair<int, int>[length];
for (int i = 0; i < length; i++)
{
string input = items[i];
if (string.IsNullOrEmpty(input))
{
Log.Warning("Invalid item: {0}", input);
continue;
}
if (!input.StartsWith('[') || !input.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
string inner = input.Substring(1, input.Length - 2);
// 如果是空列表 "[]"
if (inner.Length == 0) continue;
string[] index = inner.Split(",");
var item = new KeyValuePair<int, int>(int.Parse(index[0]), int.Parse(index[1]));
InitialItemIds[i] = item;
}
}
private void GenerateExpRequires(ref string[] columnStrings, int index)
{
List<int> expRequires = new List<int>();
int baseExp = int.Parse(columnStrings[index]);
for (int i = index; i < columnStrings.Length; i++)
{
expRequires.Add(int.Parse(columnStrings[i]) - baseExp);
}
ExpRequires = expRequires.ToArray();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d596bc33ed84659449059b972a2c4e26
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,71 @@
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 场景配置表。
/// </summary>
public class DRScene : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取场景编号。
/// </summary>
public override int Id
{
get { return m_Id; }
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName { get; private set; }
/// <summary>
/// 获取背景音乐编号。
/// </summary>
public int BackgroundMusicId { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
BackgroundMusicId = int.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
BackgroundMusicId = binaryReader.Read7BitEncodedInt32();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 3d09b8a3e8c0e7e4dbcfd2fa52bf69ea
timeCreated: 1528026145
guid: 0ce61902e6e3c23409f9ef10ccc8c550
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: -100
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
@@ -0,0 +1,99 @@
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 声音配置表。
/// </summary>
public class DRSound : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取声音编号。
/// </summary>
public override int Id
{
get { return m_Id; }
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName { get; private set; }
/// <summary>
/// 获取优先级(默认0,128最高,-128最低)。
/// </summary>
public int Priority { get; private set; }
/// <summary>
/// 获取是否循环。
/// </summary>
public bool Loop { get; private set; }
/// <summary>
/// 获取音量(0~1)。
/// </summary>
public float Volume { get; private set; }
/// <summary>
/// 获取声音空间混合量(0为2D,1为3D,中间值混合效果)。
/// </summary>
public float SpatialBlend { get; private set; }
/// <summary>
/// 获取声音最大距离。
/// </summary>
public float MaxDistance { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
Priority = int.Parse(columnStrings[index++]);
Loop = bool.Parse(columnStrings[index++]);
Volume = float.Parse(columnStrings[index++]);
SpatialBlend = float.Parse(columnStrings[index++]);
MaxDistance = float.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
Priority = binaryReader.Read7BitEncodedInt32();
Loop = binaryReader.ReadBoolean();
Volume = binaryReader.ReadSingle();
SpatialBlend = binaryReader.ReadSingle();
MaxDistance = binaryReader.ReadSingle();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: fc0abcc42a26c844d91d422da22eb94d
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,85 @@
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 界面配置表。
/// </summary>
public class DRUIForm : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取界面编号。
/// </summary>
public override int Id
{
get { return m_Id; }
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName { get; private set; }
/// <summary>
/// 获取界面组名称。
/// </summary>
public string UIGroupName { get; private set; }
/// <summary>
/// 获取是否允许多个界面实例。
/// </summary>
public bool AllowMultiInstance { get; private set; }
/// <summary>
/// 获取是否暂停被其覆盖的界面。
/// </summary>
public bool PauseCoveredUIForm { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
UIGroupName = columnStrings[index++];
AllowMultiInstance = bool.Parse(columnStrings[index++]);
PauseCoveredUIForm = bool.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
UIGroupName = binaryReader.ReadString();
AllowMultiInstance = binaryReader.ReadBoolean();
PauseCoveredUIForm = binaryReader.ReadBoolean();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f28db9f996bc3d04eb73541b1f8b1036
timeCreated: 1528026148
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,78 @@
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 声音配置表。
/// </summary>
public class DRUISound : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取声音编号。
/// </summary>
public override int Id
{
get { return m_Id; }
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName { get; private set; }
/// <summary>
/// 获取优先级(默认0,128最高,-128最低)。
/// </summary>
public int Priority { get; private set; }
/// <summary>
/// 获取音量(0~1)。
/// </summary>
public float Volume { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
Priority = int.Parse(columnStrings[index++]);
Volume = float.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
Priority = binaryReader.Read7BitEncodedInt32();
Volume = binaryReader.ReadSingle();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d69c673440234c24a9718897060d4e14
timeCreated: 1528026148
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,155 @@
using System;
using System.Collections.Generic;
using SepCore.Definition;
using GameFramework;
using CustomUtility;
using Newtonsoft.Json.Linq;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
/// <summary>
/// 武器表。
/// </summary>
public class DRWeapon : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取武器编号。
/// </summary>
public override int Id => m_Id;
public int EntityTypeId { get; private set; }
/// <summary>
/// 获取武器名称。
/// </summary>
public string Title { get; private set; }
/// <summary>
/// 获取图标资源名称。
/// </summary>
public string IconAssetName { get; private set; }
/// <summary>
/// 获取武器稀有度
/// </summary>
public ItemRarity Rarity { get; private set; }
/// <summary>
/// 获取武器价值
/// </summary>
public int Price { get; private set; }
/// <summary>
/// 获取武器价值浮动率
/// </summary>
public float PriceRandomPercent { get; private set; }
/// <summary>
/// 获取武器伤害。
/// </summary>
public int Attack { get; private set; }
/// <summary>
/// 获取武器冷却。
/// </summary>
public float Cooldown { get; private set; }
/// <summary>
/// 获取武器攻击范围。
/// </summary>
public float AttackRange { get; private set; }
/// <summary>
/// 获取武器攻击音效。
/// </summary>
public int AttackSoundId { get; private set; }
/// <summary>
/// 获取武器额外参数。
/// </summary>
public Dictionary<string, string> Pramas { get; private set; }
/// <summary>
/// 获取武器额外参数 Json。
/// </summary>
public string ParamsJson { get; private set; }
/// <summary>
/// 获取武器额外属性。
/// </summary>
public StatModifier[] Modifiers { get; private set; }
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
EntityTypeId = int.Parse(columnStrings[index++]);
Title = columnStrings[index++];
IconAssetName = columnStrings[index++];
Rarity = EnumUtility<ItemRarity>.Get(columnStrings[index++]);
Price = int.Parse(columnStrings[index++]);
PriceRandomPercent = float.Parse(columnStrings[index++]);
Attack = int.Parse(columnStrings[index++]);
Cooldown = float.Parse(columnStrings[index++]);
AttackRange = float.Parse(columnStrings[index++]);
AttackSoundId = int.Parse(columnStrings[index++]);
ParamsJson = columnStrings[index++];
Pramas = DeserializeParams(ParamsJson);
Modifiers = Utility.Json.ToObject<StatModifier[]>(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
/// <summary>
/// 解参数
/// </summary>
/// <param name="rawParams"></param>
/// <returns></returns>
private Dictionary<string, string> DeserializeParams(string rawParams)
{
var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
if (string.IsNullOrWhiteSpace(rawParams))
{
return dict;
}
try
{
JObject paramObject = Utility.Json.ToObject<JObject>(rawParams);
if (paramObject == null)
{
return dict;
}
foreach (var pair in paramObject)
{
if (string.IsNullOrWhiteSpace(pair.Key) || pair.Value == null)
{
continue;
}
dict[pair.Key] = pair.Value.ToString();
}
}
catch (Exception exception)
{
Log.Warning("Failed to parse weapon params json '{0}'. Error: {1}", rawParams, exception.Message);
}
return dict;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 9b386151345d3f14ab9b7dc5ed6dd864
timeCreated: 1528026148
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,97 @@
using GameFramework.DataTable;
using System;
using SepCore.Definition;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace SepCore.DataTable
{
public static class DataTableExtension
{
private const string DataRowClassPrefixName = "SepCore.DataTable.DR";
internal static readonly char[] DataSplitSeparators = new char[] { '\t' };
internal static readonly char[] DataTrimSeparators = new char[] { '\"' };
public static void LoadDataTable(this DataTableComponent dataTableComponent, string dataTableName,
string dataTableAssetName, object userData)
{
if (string.IsNullOrEmpty(dataTableName))
{
Log.Warning("Data table name is invalid.");
return;
}
string[] splitedNames = dataTableName.Split('_');
if (splitedNames.Length > 2)
{
Log.Warning("Data table name is invalid.");
return;
}
string dataRowClassName = DataRowClassPrefixName + splitedNames[0];
Type dataRowType = Type.GetType(dataRowClassName);
if (dataRowType == null)
{
Log.Warning("Can not get data row type with class name '{0}'.", dataRowClassName);
return;
}
string name = splitedNames.Length > 1 ? splitedNames[1] : null;
DataTableBase dataTable = dataTableComponent.CreateDataTable(dataRowType, name);
dataTable.ReadData(dataTableAssetName, Constant.AssetPriority.DataTableAsset, userData);
}
public static Color32 ParseColor32(string value)
{
string[] splitedValue = value.Split(',');
return new Color32(byte.Parse(splitedValue[0]), byte.Parse(splitedValue[1]), byte.Parse(splitedValue[2]),
byte.Parse(splitedValue[3]));
}
public static Color ParseColor(string value)
{
string[] splitedValue = value.Split(',');
return new Color(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]),
float.Parse(splitedValue[3]));
}
public static Quaternion ParseQuaternion(string value)
{
string[] splitedValue = value.Split(',');
return new Quaternion(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]),
float.Parse(splitedValue[2]), float.Parse(splitedValue[3]));
}
public static Rect ParseRect(string value)
{
string[] splitedValue = value.Split(',');
return new Rect(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]),
float.Parse(splitedValue[3]));
}
public static Vector2 ParseVector2(string value)
{
string[] splitedValue = value.Split(',');
return new Vector2(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]));
}
public static Vector3 ParseVector3(string value)
{
string[] splitedValue = value.Split(',');
return new Vector3(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]),
float.Parse(splitedValue[2]));
}
public static Vector4 ParseVector4(string value)
{
string[] splitedValue = value.Split(',');
return new Vector4(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]),
float.Parse(splitedValue[3]));
}
public static T GetDataTableRow<T>(this DataTableComponent dataTableComponent, int id) where T : DataRowBase
{
return dataTableComponent.GetDataTable<T>().GetDataRow(id);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 23740ffb8ecb90b48ad986504e1d2474
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 2d30f1c0886d45b40b4497064082c7f1
folderAsset: yes
timeCreated: 1528026148
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: c9bfd67d99634cc45a60985500514160
folderAsset: yes
timeCreated: 1528026148
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,39 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
public static partial class Constant
{
/// <summary>
/// 资源优先级。
/// </summary>
public static class AssetPriority
{
public const int ConfigAsset = 100;
public const int DataTableAsset = 100;
public const int DictionaryAsset = 100;
public const int FontAsset = 50;
public const int MusicAsset = 20;
public const int SceneAsset = 0;
public const int SoundAsset = 30;
public const int UIFormAsset = 50;
public const int UISoundAsset = 30;
public const int MyAircraftAsset = 90;
public const int PlayerAsset = 90;
public const int AircraftAsset = 80;
public const int ThrusterAsset = 30;
public const int WeaponAsset = 30;
public const int ArmorAsset = 30;
public const int BulletAsset = 80;
public const int AsteroiAsset = 80;
public const int EnemyAsset = 80;
public const int EffectAsset = 80;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: be044f4c80eead74cb105ed3c02de870
timeCreated: 1528830649
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using UnityEngine;
namespace SepCore.Definition
{
public static partial class Constant
{
/// <summary>
/// 层。
/// </summary>
public static class Layer
{
public const string DefaultLayerName = "Default";
public static readonly int DefaultLayerId = LayerMask.NameToLayer(DefaultLayerName);
public const string UILayerName = "UI";
public static readonly int UILayerId = LayerMask.NameToLayer(UILayerName);
public const string TargetableObjectLayerName = "Targetable Object";
public static readonly int TargetableObjectLayerId = LayerMask.NameToLayer(TargetableObjectLayerName);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: a43e7bbaf538cc045aaacf091c7d612e
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
public static partial class Constant
{
public static class Setting
{
public const string Language = "Setting.Language";
public const string SoundGroupMuted = "Setting.{0}Muted";
public const string SoundGroupVolume = "Setting.{0}Volume";
public const string MusicMuted = "Setting.MusicMuted";
public const string MusicVolume = "Setting.MusicVolume";
public const string SoundMuted = "Setting.SoundMuted";
public const string SoundVolume = "Setting.SoundVolume";
public const string UISoundMuted = "Setting.UISoundMuted";
public const string UISoundVolume = "Setting.UISoundVolume";
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 28dc5d8fb274e45429ff40494dedac8a
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: af9011f89c35904448c0225db21e8266
folderAsset: yes
timeCreated: 1528026149
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,54 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
public class BuildInfo
{
public string GameVersion
{
get;
set;
}
public int InternalGameVersion
{
get;
set;
}
public string CheckVersionUrl
{
get;
set;
}
public string WindowsAppUrl
{
get;
set;
}
public string MacOSAppUrl
{
get;
set;
}
public string IOSAppUrl
{
get;
set;
}
public string AndroidAppUrl
{
get;
set;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 265686b0408d79949a657768398c72cc
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,37 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System.Runtime.InteropServices;
using SepCore.Definition;
namespace SepCore.Definition
{
[StructLayout(LayoutKind.Auto)]
public struct ImpactData
{
public ImpactData(CampType camp /*, int health*/, int attackBase, StatProperty attackStat = null,
StatProperty defenseStat = null, StatProperty dodgeStat = null)
{
Camp = camp;
//Health = health;
AttackBase = attackBase;
AttackStat = attackStat;
DefenseStat = defenseStat;
DodgeStat = dodgeStat;
}
public CampType Camp { get; }
public int AttackBase { get; }
public StatProperty AttackStat { get; }
public StatProperty DefenseStat { get; }
public StatProperty DodgeStat { get; }
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 22538aa3f76228d48819a9942febb66d
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,56 @@
using Components;
using SepCore.DataTable;
using SepCore.Definition;
namespace SepCore.Definition
{
public class PropItem
{
private readonly StatModifier[] _modifiers;
public string Title { get; private set; }
public string IconAssetName { get; private set; }
public ItemRarity Rarity { get; private set; }
public StatModifier[] Modifiers => _modifiers;
public PropItem(DRProp prop)
{
if (prop == null) return;
_modifiers = prop.Modifiers;
Title = prop.Title;
Rarity = prop.Rarity;
IconAssetName = prop.IconAssetName;
}
public PropItem(StatModifier[] modifiers)
{
_modifiers = modifiers;
}
public PropItem(StatModifier[] modifiers, ItemRarity rarity, string title, string iconAssetName)
{
_modifiers = modifiers;
Title = title;
Rarity = rarity;
IconAssetName = iconAssetName;
}
public void OnAttach(StatComponent statComponent)
{
if (_modifiers == null || statComponent == null) return;
foreach (var modifier in _modifiers)
{
statComponent.AddModifier(modifier);
}
}
public void OnDetach(StatComponent statComponent)
{
if (_modifiers == null || statComponent == null) return;
foreach (var modifier in _modifiers)
{
statComponent.RemoveModifier(modifier);
}
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 135b5ab1b6f5491989f080cf8b949201
timeCreated: 1770212750
@@ -0,0 +1,93 @@
using System;
using SepCore.Definition;
using CustomUtility;
using UnityGameFramework.Runtime;
namespace SepCore.Definition
{
public class StatModifier
{
// None = 0,
// MaxHealth = 1,
// MovementSpeed = 2,
// Attack = 3,
// Defense = 4,
// AttackSpeed = 5,
// Critical = 6,
// CriticalDamage = 7,
// Dodge = 8,
// AbsorbRange = 9
private readonly string[] _statTypeNames =
{
"无效",
"最大生命",
"移动速度",
"伤害",
"防御",
"冷却",
"暴击率",
"暴击伤害",
"闪避",
"金币/经验吸收范围"
};
public StatType StatType;
public float Value;
public bool IsPercent;
public override string ToString()
{
if (IsPercent)
{
if (Value > 0)
{
return $"{_statTypeNames[(int)StatType]}: <color=green>+{Value * 100}%</color>";
}
else
{
return $"{_statTypeNames[(int)StatType]}: <color=red>+{Value * 100}%</color>";
}
}
else
{
if (Value > 0)
{
return $"{_statTypeNames[(int)StatType]}: <color=green>+{Value}</color>";
}
else
{
return $"{_statTypeNames[(int)StatType]}: <color=red>+{Value}</color>";
}
}
}
public static StatModifier StringToModifier(string input)
{
if (string.IsNullOrEmpty(input))
{
Log.Warning("Invalid modifier: {0}", input);
return null;
}
if (!input.StartsWith('[') || !input.EndsWith(']'))
{
throw new ArgumentException("Input must be enclosed in square brackets.");
}
string inner = input.Substring(1, input.Length - 2);
// 如果是空列表 "[]"
if (inner.Length == 0) return null;
string[] property = inner.Split(",");
int propertyIndex = 0;
return new StatModifier
{
StatType = EnumUtility<StatType>.Get(property[propertyIndex++]),
Value = float.Parse(property[propertyIndex++]),
IsPercent = bool.Parse(property[propertyIndex++])
};
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4f70088ee3846934796f2cacb72fd920
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
namespace SepCore.Definition
{
public class StatProperty
{
public float Value;
public float Percent;
public StatProperty()
{
Value = 0f;
Percent = 1f;
}
public StatProperty(float value, float percent)
{
Value = value;
Percent = percent;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 18e7bc9587114ae4a91c70f829543de8
timeCreated: 1770353735
@@ -0,0 +1,75 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
public class VersionInfo
{
// 是否需要强制更新游戏应用
public bool ForceUpdateGame
{
get;
set;
}
// 最新的游戏版本号
public string LatestGameVersion
{
get;
set;
}
// 最新的游戏内部版本号
public int InternalGameVersion
{
get;
set;
}
// 最新的资源内部版本号
public int InternalResourceVersion
{
get;
set;
}
// 资源更新下载地址
public string UpdatePrefixUri
{
get;
set;
}
// 资源版本列表长度
public int VersionListLength
{
get;
set;
}
// 资源版本列表哈希值
public int VersionListHashCode
{
get;
set;
}
// 资源版本列表压缩后长度
public int VersionListCompressedLength
{
get;
set;
}
// 资源版本列表压缩后哈希值
public int VersionListCompressedHashCode
{
get;
set;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f1245482e9f20354796d50d6d85d2fe0
timeCreated: 1528026150
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 2fc27161191c61549a74f80fd54e9645
folderAsset: yes
timeCreated: 1528026150
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
namespace SepCore.Definition
{
public enum BulletType : byte
{
None = 0,
BulletHandgun = 1
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2248c02c2c5529445992a2c2fef799dd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,47 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
/// <summary>
/// 阵营类型。
/// </summary>
public enum CampType : byte
{
Unknown = 0,
/// <summary>
/// 第一玩家阵营。
/// </summary>
Player,
/// <summary>
/// 第一敌人阵营。
/// </summary>
Enemy,
/// <summary>
/// 第一中立阵营。
/// </summary>
Neutral,
/// <summary>
/// 第二玩家阵营。
/// </summary>
Player2,
/// <summary>
/// 第二敌人阵营。
/// </summary>
Enemy2,
/// <summary>
/// 第二中立阵营
/// </summary>
Neutral2,
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 61f18b2b0752f32449d9978f481a75fc
timeCreated: 1528026150
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
namespace SepCore.Definition
{
public enum EnemyType : byte
{
None = 0,
MeleeEnemy = 1,
RemoteEnemy = 2,
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2aa817d65bcc425a9e015f3c1de7c9a9
timeCreated: 1770209105
@@ -0,0 +1,9 @@
namespace SepCore.Definition
{
public enum GoodsType
{
None = 0,
Weapon,
Prop
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4b6d8e25599afc54bb6e29b09e606bbd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,12 @@
namespace SepCore.Definition
{
public enum ItemRarity
{
None,
White = 1,
Green = 2,
Blue,
Purple,
Red
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bb7ab0222a370b649956dacb56a122fc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,35 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
/// <summary>
/// 关系类型。
/// </summary>
public enum RelationType : byte
{
/// <summary>
/// 未知的。
/// </summary>
Unknown,
/// <summary>
/// 友好的。
/// </summary>
Friendly,
/// <summary>
/// 中立的。
/// </summary>
Neutral,
/// <summary>
/// 敌对的。
/// </summary>
Hostile
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 2c5c37ca396eb9d47a70999b5825152b
timeCreated: 1528026150
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,12 @@
namespace SepCore.Definition
{
public enum SceneId : byte
{
Launch = 0,
Menu = 1,
Main = 2,
StressTest = 3,
Game = 4,
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 20fc28f41ef04f8fa4fbfb9189b58d0d
timeCreated: 1768899171
@@ -0,0 +1,17 @@
namespace SepCore.Definition
{
public enum StatType
{
None = 0,
MaxHealth = 1,
MovementSpeed = 2,
Attack = 3,
Defense = 4,
AttackSpeed = 5,
Critical = 6,
CriticalDamage = 7,
Dodge = 8,
AbsorbRange = 9,
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 657fd4fd021a424397aa17c0359a1da1
timeCreated: 1768966119
@@ -0,0 +1,67 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace SepCore.Definition
{
/// <summary>
/// 界面编号。
/// </summary>
public enum UIFormType : byte
{
TUIForm = 0,
/// <summary>
/// 弹出框。
/// </summary>
DialogForm = 1,
/// <summary>
/// 主菜单。
/// </summary>
MenuForm = 100,
/// <summary>
/// 设置。
/// </summary>
SettingForm = 101,
/// <summary>
/// 关于。
/// </summary>
AboutForm = 102,
/// <summary>
/// 主菜单。
/// </summary>
StartMenuForm = 200,
/// <summary>
/// 选择角色。
/// </summary>
SelectRoleForm = 201,
/// <summary>
/// 游戏商店。
/// </summary>
ShopForm = 202,
/// <summary>
/// 游戏HUD。
/// </summary>
HudForm = 203,
/// <summary>
/// 升级选择。
/// </summary>
LevelUpForm = 204,
/// <summary>
/// 物品信息展示页
/// </summary>
DisplayItemInfoForm = 205,
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 75fd10c7585513846ab25372be0590b7
timeCreated: 1528026162
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,12 @@
namespace SepCore.Definition
{
public enum WeaponType : byte
{
None = 0,
WeaponKnife = 1,
WeaponHandgun = 2,
WeaponSlash = 3,
WeaponLightning = 4,
WeaponLance = 5,
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1e4fe53d087154645ad496d2f178c843
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: f7c4b051e63f0c2418a55e8817bf4ba9
folderAsset: yes
timeCreated: 1528026151
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 58efe0589d7e90f498c8bcbbf94c6be4
folderAsset: yes
timeCreated: 1528026151
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,53 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using SepCore.Definition;
using StarForce;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public abstract class AccessoryObjectData : EntityDataBase
{
[SerializeField]
private int m_OwnerId = 0;
[SerializeField]
private CampType m_OwnerCamp = CampType.Unknown;
public AccessoryObjectData(int entityId, int typeId, int ownerId, CampType ownerCamp)
: base(entityId, typeId)
{
m_OwnerId = ownerId;
m_OwnerCamp = ownerCamp;
}
/// <summary>
/// 拥有者编号。
/// </summary>
public int OwnerId
{
get
{
return m_OwnerId;
}
}
/// <summary>
/// 拥有者阵营。
/// </summary>
public CampType OwnerCamp
{
get
{
return m_OwnerCamp;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 83cb841b7411a844581691d5547bf866
timeCreated: 1528026151
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
namespace Entity.EntityData
{
public class CoinData : EntityDataBase
{
private int _value;
public CoinData(int value, int entityId, int typeId) : base(entityId, typeId)
{
_value = value;
}
public int Value
{
get => _value;
set => _value = value;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d9caee22d67a42018113acc77155d6ba
timeCreated: 1770292597
@@ -0,0 +1,33 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public class EffectData : EntityDataBase
{
[SerializeField]
private float m_KeepTime = 0f;
public EffectData(int entityId, int typeId)
: base(entityId, typeId)
{
m_KeepTime = 3f;
}
public float KeepTime
{
get
{
return m_KeepTime;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: e5b93dcbe30421a429c196bda0af31ed
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 611437bd292819b439512f684e13c7e3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using SepCore.DataTable;
using SepCore.Definition;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public class EnemyData : TargetableObjectData
{
[SerializeField] private DREnemy _drEnemy;
public EnemyData(int entityId, EnemyType enemyType, int level) : base(
entityId, (int)enemyType, CampType.Enemy)
{
DREnemy enemyRow = GameEntry.DataTable.GetDataTableRow<DREnemy>((int)enemyType);
if (enemyRow == null)
{
throw new Exception($"Enemy data table row is missing, EnemyType='{enemyType}'.");
}
else
{
_drEnemy = enemyRow;
}
int effectiveLevel = Mathf.Max(1, level);
MaxHealthBase = enemyRow.MaxHealth + enemyRow.HpAddPerLevel * (effectiveLevel - 1);
}
public EnemyType EnemyType => (EnemyType)_drEnemy.Id;
public int EntityTypeId => _drEnemy.EntityTypeId;
public override int MaxHealthBase { get; }
public int AttackDamage => _drEnemy.AttackDamage;
public float AttackCooldown => _drEnemy.AttackCooldown;
public float AttackRange => _drEnemy.AttackRange;
public float SpeedBase => _drEnemy.Speed;
public int DropCoin => _drEnemy.DropCoin;
public int DropExp => _drEnemy.DropExp;
public float DropPercent => _drEnemy.DropPercent;
public IReadOnlyDictionary<string, string> Params => _drEnemy.Params;
public bool TryGetParam(string key, out string value)
{
value = null;
if (string.IsNullOrEmpty(key) || _drEnemy?.Params == null)
{
return false;
}
return _drEnemy.Params.TryGetValue(key, out value);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1b802c30cc274e04929b8659ec631e84
timeCreated: 1768890974
@@ -0,0 +1,29 @@
using System;
using SepCore.Definition;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public class EnemyProjectileData : EntityDataBase
{
public EnemyProjectileData(int entityId, int ownerEntityId, CampType ownerCamp, int attackDamage,
float speed, float lifeTime, Vector3 direction)
: base(entityId, 0)
{
OwnerEntityId = ownerEntityId;
OwnerCamp = ownerCamp;
AttackDamage = attackDamage;
Speed = speed;
LifeTime = lifeTime;
Direction = direction;
}
public int OwnerEntityId { get; }
public CampType OwnerCamp { get; }
public int AttackDamage { get; }
public float Speed { get; }
public float LifeTime { get; }
public Vector3 Direction { get; }
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 52b38f83ab6c4029803d40c189db47c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,62 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public abstract class EntityDataBase
{
[SerializeField]
private int m_Id = 0;
[SerializeField]
private int m_TypeId = 0;
[SerializeField]
private Vector3 m_Position = Vector3.zero;
[SerializeField]
private Quaternion m_Rotation = Quaternion.identity;
public EntityDataBase(int entityId, int typeId)
{
m_Id = entityId;
m_TypeId = typeId;
}
/// <summary>
/// 实体编号。
/// </summary>
public int Id => m_Id;
/// <summary>
/// 实体类型编号。
/// </summary>
public int TypeId => m_TypeId;
/// <summary>
/// 实体位置。
/// </summary>
public Vector3 Position
{
get => m_Position;
set => m_Position = value;
}
/// <summary>
/// 实体朝向。
/// </summary>
public Quaternion Rotation
{
get => m_Rotation;
set => m_Rotation = value;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: afb91fe3ed8105e4a96b7bd5917ecc2b
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
namespace Entity.EntityData
{
public class ExpData : EntityDataBase
{
private int _value;
public ExpData(int value, int entityId, int typeId) : base(entityId, typeId)
{
_value = value;
}
public int Value
{
get => _value;
set => _value = value;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e0f6c8e117da49f1ad04fd8810882043
timeCreated: 1770292932
@@ -0,0 +1,19 @@
using System;
using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public class PlayerData : TargetableObjectData
{
private int _maxExp;
public PlayerData(int entityId, int typeId) : base(entityId, typeId, CampType.Player)
{
MaxHealthBase = MaxHealthBase;
}
public override int MaxHealthBase { get; }
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b69d3168ac4f442994f8dc4d906daa60
timeCreated: 1768890638
@@ -0,0 +1,40 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using SepCore.Definition;
using StarForce;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public abstract class TargetableObjectData : EntityDataBase
{
[SerializeField]
private CampType _camp = CampType.Unknown;
public TargetableObjectData(int entityId, int typeId, CampType camp)
: base(entityId, typeId)
{
_camp = camp;
}
/// <summary>
/// 角色阵营。
/// </summary>
public CampType Camp => _camp;
/// <summary>
/// 最大生命。
/// </summary>
public abstract int MaxHealthBase
{
get;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f866c15cf3f2a45429251d4a66f70c77
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d8b2591453b7f0841940c8e45528f465
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using SepCore.DataTable;
using SepCore.Definition;
using GameFramework;
namespace Entity.EntityData
{
[Serializable]
public class WeaponData : AccessoryObjectData
{
private DRWeapon _drWeapon;
private int _entityTypeId = 0;
public WeaponData(int entityId, WeaponType weaponType, int ownerId, CampType ownerCamp)
: base(entityId, (int)weaponType, ownerId, ownerCamp)
{
_drWeapon = GameEntry.DataTable.GetDataTableRow<DRWeapon>((int)weaponType);
if (_drWeapon == null)
{
throw new Exception($"Weapon data table row is missing, WeaponType='{weaponType}'.");
}
_entityTypeId = _drWeapon.EntityTypeId;
}
public WeaponType WeaponType => (WeaponType)_drWeapon.Id;
public bool TryGetParam(string key, out string value)
{
value = null;
if (string.IsNullOrEmpty(key) || Params == null)
{
return false;
}
return Params.TryGetValue(key, out value);
}
protected TParams ParseParams<TParams>() where TParams : new()
{
if (string.IsNullOrWhiteSpace(_drWeapon.ParamsJson))
{
return new TParams();
}
try
{
TParams parsed = Utility.Json.ToObject<TParams>(_drWeapon.ParamsJson);
return parsed ?? new TParams();
}
catch (Exception exception)
{
throw new Exception(
$"Failed to parse weapon params, WeaponType='{WeaponType}', Json='{_drWeapon.ParamsJson}'.",
exception);
}
}
/// <summary>
/// 攻击力。
/// </summary>
public int Attack => _drWeapon.Attack;
public int EntityTypeId => _entityTypeId;
/// <summary>
/// 武器名称。
/// </summary>
public string Title => _drWeapon.Title;
/// <summary>
/// 图标资源名称。
/// </summary>
public string IconAssetName => _drWeapon.IconAssetName;
public ItemRarity Rarity => _drWeapon.Rarity;
public int Price => _drWeapon.Price;
/// <summary>
/// 攻击间隔。
/// </summary>
public float Cooldown => _drWeapon.Cooldown;
/// <summary>
/// 攻击范围。
/// </summary>
public float AttackRange => _drWeapon.AttackRange;
/// <summary>
/// 攻击音效。
/// </summary>
public int AttackSoundId => _drWeapon.AttackSoundId;
/// <summary>
/// 额外参数。
/// </summary>
public Dictionary<string, string> Params => _drWeapon.Pramas;
public string ParamsJson => _drWeapon.ParamsJson;
/// <summary>
/// 额外属性。
/// </summary>
public StatModifier[] Modifiers => _drWeapon.Modifiers;
}
}

Some files were not shown because too many files have changed in this diff Show More