This commit is contained in:
MuHua-123
2025-07-18 18:00:52 +08:00
parent 4c66f3a5a2
commit d4574f4bd7
30 changed files with 656 additions and 41 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f600b7e509b166244a37c240ffee12ba
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,64 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 属性 - 数据
/// </summary>
public class DataAttribute {
/// <summary> 力量(strength) </summary>
public int Str;
/// <summary> 敏捷(dexterity) </summary>
public int Dex;
/// <summary> 体质(constitution) </summary>
public int Con;
/// <summary> 智力(intelligence) </summary>
public int Int;
/// <summary> 感知(wisdom) </summary>
public int Wis;
/// <summary> 魅力(charisma) </summary>
public int Cha;
/// <summary> 创建初始属性 </summary>
public static DataAttribute Initial() {
DataAttribute attribute = new DataAttribute();
attribute.Str = Dice.RollAttribute();
attribute.Dex = Dice.RollAttribute();
attribute.Con = Dice.RollAttribute();
attribute.Int = Dice.RollAttribute();
attribute.Wis = Dice.RollAttribute();
attribute.Cha = Dice.RollAttribute();
return attribute;
}
// 计算属性调整值(属性值-10)/2 向下取整
public int Modifier(int value) {
return (int)System.Math.Floor((value - 10) / 2.0);
}
/// <summary> 添加属性 </summary>
public void Add(DataAttribute value) {
Str += value.Str;
Dex += value.Dex;
Con += value.Con;
Int += value.Int;
Wis += value.Wis;
Cha += value.Cha;
}
/// <summary> 减少属性 </summary>
public void Sub(DataAttribute value) {
Str -= value.Str;
Dex -= value.Dex;
Con -= value.Con;
Int -= value.Int;
Wis -= value.Wis;
Cha -= value.Cha;
}
/// <summary> 覆盖属性 </summary>
public void Cover(DataAttribute value) {
Str = value.Str;
Dex = value.Dex;
Con = value.Con;
Int = value.Int;
Wis = value.Wis;
Cha = value.Cha;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fb070bc540efae048ae79c8319c0c0e2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,87 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 角色 - 数据
/// </summary>
public class DataCharacter : DataAttribute {
/// <summary> 角色名字 </summary>
public string name;
/// <summary> 战斗等级 </summary>
public int level = 0;
/// <summary> 护甲等级 </summary>
public int armorClass = 0;
/// <summary> 经验点 </summary>
public Vector2Int expPoint;
/// <summary> 生命点 </summary>
public Vector2Int hitPoint;
/// <summary> 基础属性 </summary>
public DataAttribute basic = Initial();
/// <summary> 种族 </summary>
public DataRace race = DataRace.None();
/// <summary> 职业 </summary>
public DataProfession profession = DataProfession.None();
/// <summary> 装备栏 </summary>
public DataEquipmentSlot equipmentSlot = new DataEquipmentSlot();
/// <summary> 力量调整值(strength) </summary>
public int StrModifier => Modifier(Str);
/// <summary> 敏捷调整值(dexterity) </summary>
public int DexModifier => Modifier(Dex);
/// <summary> 体质调整值(constitution) </summary>
public int ConModifier => Modifier(Con);
/// <summary> 智力调整值(intelligence) </summary>
public int IntModifier => Modifier(Int);
/// <summary> 感知调整值(wisdom) </summary>
public int WisModifier => Modifier(Wis);
/// <summary> 魅力调整值(charisma) </summary>
public int ChaModifier => Modifier(Cha);
/// <summary> 更新角色状态 </summary>
public void Update() {
// 更新属性
Cover(basic);
// 添加种族属性
Add(race);
// 添加职业属性
Add(profession);
// 战斗等级
level = profession.level;
// 护甲等级
armorClass = 10 + DexModifier;
// 升级经验 = 100 * 3^level
expPoint.y = 100 * (int)Mathf.Pow(3, level);
// 最大生命值
hitPoint.y = race.HitPoint() + profession.HitPoint();
}
// 计算护甲等级(AC
// 无甲基础AC = 10
// 护甲
// 重甲 敏捷加值无效‌
// 中甲 敏捷加值上限‌+2
// 轻甲 敏捷加值全额生效
// 盾牌 直接增加
// 法术 直接增加
// 打印角色卡
public void PrintCharacterSheet() {
Debug.Log($"=== {name} LV{level} ===");
Debug.Log($"种族: {race.name}");
Debug.Log($"职业: {profession.name}");
Debug.Log($"力量: {Str} ({StrModifier.ToString("+#;-#;+0")})");
Debug.Log($"敏捷: {Dex} ({DexModifier.ToString("+#;-#;+0")})");
Debug.Log($"体质: {Con} ({ConModifier.ToString("+#;-#;+0")})");
Debug.Log($"智力: {Int} ({IntModifier.ToString("+#;-#;+0")})");
Debug.Log($"感知: {Wis} ({WisModifier.ToString("+#;-#;+0")})");
Debug.Log($"魅力: {Cha} ({ChaModifier.ToString("+#;-#;+0")})");
Debug.Log($"经验值: {expPoint}");
Debug.Log($"生命值: {hitPoint}");
Debug.Log($"护甲等级: {armorClass})");
}
}
@@ -0,0 +1,73 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// 职业 - 数据
/// </summary>
public class DataProfession : DataAttribute {
/// <summary> 职业名称 </summary>
public string name;
/// <summary> 职业等级 </summary>
public int level = 0;
/// <summary> 生命骰子 </summary>
public int hitDice = 0;
/// <summary> 累计生命点 </summary>
public List<int> hitPoints = new List<int>();
/// <summary> 升级:骰生命骰子+体质调整值 </summary>
public void Upgrade(int modifier) {
level++;
int hitPoint = Dice.Roll(hitDice) + modifier;
hitPoints.Add(hitPoint);
}
/// <summary> 生命点:每级生命点总和 </summary>
public int HitPoint() {
return hitPoints.Sum();
}
/// <summary> 无职业 </summary>
public static DataProfession None() {
return new DataProfession() { name = "无" };
}
/// <summary> 战士职业 </summary>
public static DataProfession Warrior(int modifier) {
DataProfession profession = new DataProfession();
// 战士,初始1级,1d10生命骰子,初始生命=满生命骰子+体质调整值
profession.name = "战士";
profession.level = 1;
profession.hitDice = 10;
profession.hitPoints.Add(profession.hitDice + modifier);
// 职业属性加成
profession.Str = 2;
profession.Con = 1;
return profession;
}
/// <summary> 法师职业 </summary>
public static DataProfession Wizard(int modifier) {
DataProfession profession = new DataProfession();
// 法师,初始1级,1d6生命骰子,初始生命=满生命骰子+体质调整值
profession.name = "法师";
profession.level = 1;
profession.hitDice = 6;
profession.hitPoints.Add(profession.hitDice + modifier);
// 职业属性加成
profession.Int = 2;
profession.Dex = 1;
return profession;
}
/// <summary> 牧师职业 </summary>
public static DataProfession Cleric(int modifier) {
DataProfession profession = new DataProfession();
// 牧师,初始1级,1d8生命骰子,初始生命=满生命骰子+体质调整值
profession.name = "牧师";
profession.level = 1;
profession.hitDice = 8;
profession.hitPoints.Add(profession.hitDice + modifier);
// 职业属性加成
profession.Wis = 2;
profession.Con = 1;
return profession;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9fd9942ce333fa94aa2297f3569a4939
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,24 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 种族 - 数据
/// </summary>
public class DataRace : DataAttribute {
/// <summary> 种族名称 </summary>
public string name;
/// <summary> 基础生命点 </summary>
public int hitPoint = 10;
/// <summary> 生命点:每级生命点总和 </summary>
public int HitPoint() {
return hitPoint;
}
/// <summary> 无种族 </summary>
public static DataRace None() {
// 初始生命值10点
return new DataRace() { name = "无" };
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e444293bdefc67346a3d80901305e4c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-38
View File
@@ -1,38 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 角色 - 数据
/// </summary>
public class DataCharacter {
/// <summary> 角色名字 </summary>
public string name;
/// <summary> 基础属性 </summary>
public DataAttribute basic;
/// <summary> 角色职业 </summary>
public DataProfession profession;
}
/// <summary>
/// 属性 - 数据
/// </summary>
public class DataAttribute {
/// <summary> 力量(strength) </summary>
public int Str;
/// <summary> 敏捷(dexterity) </summary>
public int Dex;
/// <summary> 体质(constitution) </summary>
public int Con;
/// <summary> 智力(intelligence) </summary>
public int Int;
/// <summary> 感知(wisdom) </summary>
public int Wis;
/// <summary> 魅力(charisma) </summary>
public int Cha;
}
/// <summary>
/// 职业 - 数据
/// </summary>
public class DataProfession : DataAttribute {
}
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 31e213ee804e43848b56cd336a8025d4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DataBackpack : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6f54ab1b3cd1a8f4d9ec1fb975e05ef6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,49 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 装备栏 - 数据
/// </summary>
public class DataEquipmentSlot : DataInventory {
/// <summary> 武器1 </summary>
public DataWeapon Weapon1;
/// <summary> 武器2 </summary>
public DataWeapon Weapon2;
/// <summary> 护甲 </summary>
public DataArmor Armor;
/// <summary> 头盔 </summary>
public DataEquipment Helmets;
/// <summary> 手套 </summary>
public DataEquipment Gloves;
/// <summary> 鞋子 </summary>
public DataEquipment Shoes;
public override bool Add(DataItem item) {
// 如果是武器,则尝试装备
if (item is DataWeapon weapon) { return Wear(weapon); }
// 如果是护甲,则尝试装备
if (item is DataArmor armor) { return Wear(armor); }
// 如果是其他,则尝试装备
if (item is DataEquipment equipment) { return Wear(equipment); }
return false;
}
public override bool Remove(DataItem item) {
throw new System.NotImplementedException();
}
private bool Wear(DataWeapon weapon) {
Weapon1 = weapon;
return true;
}
private bool Wear(DataArmor armor) {
Armor = armor;
return true;
}
private bool Wear(DataEquipment equipment) {
if (equipment.equipmentType == EquipmentType.Helmets) { Helmets = equipment; return true; }
if (equipment.equipmentType == EquipmentType.Gloves) { Gloves = equipment; return true; }
if (equipment.equipmentType == EquipmentType.Shoes) { Shoes = equipment; return true; }
return false;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 83edeb48630d62a44a8d7c7551e9f0fb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 物品库存 - 数据
/// </summary>
public abstract class DataInventory {
/// <summary> 库存类型 </summary>
public InventoryType inventoryType;
/// <summary> 添加物品 </summary>
public abstract bool Add(DataItem item);
/// <summary> 移除物品 </summary>
public abstract bool Remove(DataItem item);
}
/// <summary>
/// 库存类型枚举,区分背包、仓库等不同库存。
/// </summary>
public enum InventoryType { EquipmentSlot, Backpack, Storage }
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 278351779c3c1514bbcce18723dd500c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DataStorage : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 943f05d3866fd8e4cb463a4f0597d0c5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: da6831802283b3643bf03d784ccc5813
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 装备 - 数据
/// </summary>
public class DataEquipment : DataItem {
/// <summary> 装备类型 </summary>
public EquipmentType equipmentType;
}
/// <summary>
/// 武器 - 数据
/// </summary>
public class DataWeapon : DataEquipment {
/// <summary> 武器类型 </summary>
public WeaponType weaponType;
}
/// <summary>
/// 护甲 - 数据
/// </summary>
public class DataArmor : DataEquipment {
/// <summary> 护甲类型 </summary>
public ArmorType armorType;
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c500c73626d889c4c8cac76a53f95b2d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+48
View File
@@ -0,0 +1,48 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 物品 - 数据
/// </summary>
public class DataItem {
/// <summary> 物品名称 </summary>
public string name;
/// <summary> 物品类型 </summary>
public ItemType itemType;
}
/// <summary>
/// 物品类型。
/// </summary>
public enum ItemType {
Material, // 材料
Equipment // 装备
}
/// <summary>
/// 装备类型。
/// </summary>
public enum EquipmentType {
Weapon, // 武器
Armor, // 护甲
Helmets, //头盔
Gloves, // 手套
Shoes, // 鞋子
}
/// <summary>
/// 武器类型。
/// </summary>
public enum WeaponType {
LightWeapon, // 轻型武器
MediumWeapon, // 中型武器
HeavyWeapon, //重型武器
Shield, // 盾牌
}
/// <summary>
/// 护甲类型。
/// </summary>
public enum ArmorType {
ClothArmor, // 布甲
LightArmor, // 轻甲
MediumArmor, // 中甲
HeavyArmor, // 重甲
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 557ad290ccf27454baad3a04e41aec95
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,13 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 材料 - 数据
/// </summary>
public class DataMaterial : DataItem {
/// <summary> 物品数量 </summary>
public int quantity;
/// <summary> 堆叠上限 </summary>
public int maxStack;
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d8fb2ebbb537271478ec399677a1b08a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MuHua;
/// <summary>
/// 模拟器 - 管理
/// </summary>
public class ManagerSimulator : ModuleSingle<ManagerSimulator> {
public DataCharacter character;
protected override void Awake() => NoReplace(false);
private void Start() {
character = new DataCharacter();
character.Update();
character.PrintCharacterSheet();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3ce4cafcd40fff3428928289fa060de4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+6 -2
View File
@@ -8,9 +8,13 @@ using Random = UnityEngine.Random;
/// 骰子
/// </summary>
public static class Dice {
// 生成4d6弃最低的随机属性值
/// <summary> 掷一次骰子 </summary>
public static int Roll(int value) {
return Random.Range(1, value + 1);
}
/// <summary> Attribute规则:投4次d6,去掉最低值 </summary>
public static int RollAttribute() {
int[] rolls = { Random.Range(1, 7), Random.Range(1, 7), Random.Range(1, 7), Random.Range(1, 7) };
int[] rolls = { Roll(6), Roll(6), Roll(6), Roll(6) };
Array.Sort(rolls);
return rolls[1] + rolls[2] + rolls[3]; // 弃最低值
}
@@ -122,6 +122,50 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &169597751
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 169597752}
- component: {fileID: 169597753}
m_Layer: 0
m_Name: ManagerSimulator
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &169597752
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 169597751}
serializedVersion: 2
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: []
m_Father: {fileID: 1439912283}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &169597753
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 169597751}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3ce4cafcd40fff3428928289fa060de4, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &670296962
GameObject:
m_ObjectHideFlags: 0
@@ -140,7 +184,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!114 &670296963
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -417,6 +461,7 @@ Transform:
- {fileID: 963194228}
- {fileID: 705507995}
- {fileID: 1586181182}
- {fileID: 169597752}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1439912284