unity状态模式
来源:互联网 发布:苹果6s只能用2g网络 编辑:程序博客网 时间:2024/06/18 14:24
开始的时候我写属性类时只写了一个类,当属性增多时我开始意识到这个类已经失败了,每一次修改都要滚动来滚动去的,更繁琐的是我不得不准备个记事本写上属性变量好查询。
记得我曾看过一篇有限状态机的文章,把if 或 switch 都改成枚举,用枚举去查询状态,那么我觉得一定也有一种方式提高可阅读性,我找到了状态模式,具体自行搜索
首先写个基础类,就是用来修改值得
public class BaseStat { private string _name; private int _baseValue; private int _buffValue; public BaseStat() { _baseValue = 0; } public string Name { get { return _name; } set { _name = value; } } public int BaesValue { get { return _baseValue + _buffValue; } } public int BuffValue { get { return _buffValue; } } public void AdjustBuffValue(int buff) { _buffValue = buff; } }
再写个属性类,顺便枚举几个属性
public class Attribute : BaseStat{ public Attribute(string name) { Name = name; }}public enum AttributeName{ Might, Constituion, Nimbleness, Speed, Concentration, Willpower, Charisma}
由于一个属性改变后,连带着有N个属性会被改变,所以加了个链表用来存储将会被改变的属性,由于C#不new地址并不会改变,所以可以放心修改
当修改Buff值的时候调用子类更新附属的值
using System.Collections.Generic;public class ModifiedStat : BaseStat{ public List<ModifyingAttribute> _mod { get; set; } public ModifiedStat() { _mod = new List<ModifyingAttribute>(); } public void AddModifying(ModifyingAttribute mod) { _mod.Add(mod); } public void ModifyBuffValue(int Value) { AdjustBuffValue(Value); Update(); } protected virtual void Update() { }}public struct ModifyingAttribute{ public Attribute _attr; public ModifyingAttribute(Attribute attr) { _attr = attr; }}
当然这只是示范一下,公式不一定只写在一个函数里
using System;public class Vital : ModifiedStat{ public Vital(string name) { Name = name; } protected override void Update() { foreach(ModifyingAttribute mod in _mod) { CalculationHealth(mod); } } void CalculationHealth(ModifyingAttribute mod) { //属性计算公式 if(mod._attr.Name == Enum.GetName(typeof(AttributeName),AttributeName.Might)) mod._attr.AdjustBuffValue(BuffValue*3); }}public enum VitalName{ Health, Energy, Mana}
public class Skill : ModifiedStat{ public Skill(string name) { Name = name; } protected override void Update() { foreach (ModifyingAttribute mod in _mod) { mod._attr.AdjustBuffValue(100); } }}public enum SkillName{ Melee_Offence, Melee_Defence, Ranged_Offence, Ranged_Defence, Magic_Offence, Magic_Defence,}
using UnityEngine;using System.Collections;using System;public class test : MonoBehaviour { Attribute[] _attribute; Vital []_vital; Skill []_skill;// Use this for initializationvoid Start () { _attribute = new Attribute[Enum.GetValues(typeof(AttributeName)).Length]; _vital = new Vital[Enum.GetValues(typeof(VitalName)).Length]; _skill = new Skill[Enum.GetValues(typeof(SkillName)).Length]; SetupAttribute(); SetupSkill(); SetupVital(); GetVital((int)VitalName.Health).ModifyBuffValue(10); GetSkill((int)SkillName.Magic_Defence).ModifyBuffValue(10); Output(); } void Output() { string tmp = ""; foreach(Attribute at in _attribute) { tmp += (at.Name + ":" + at.BaesValue+"\n"); } foreach (Vital at in _vital) { tmp += (at.Name + ":" + at.BaesValue + "\n"); } foreach (Skill at in _skill) { tmp += (at.Name + ":" + at.BaesValue + "\n"); } Debug.Log(tmp); } void SetupAttribute() { for(int i = 0; i < _attribute.Length; i++) { _attribute[i] = new Attribute(Enum.GetName(typeof(AttributeName),i)); } } void SetupVital() { for (int i = 0; i < _vital.Length; i++) { _vital[i] = new Vital(Enum.GetName(typeof(VitalName), i)); } VitalModified(); } void SetupSkill() { for (int i = 0; i < _skill.Length; i++) { _skill[i] = new Skill(Enum.GetName(typeof(SkillName), i)); } SkillModified(); } Attribute GetAttribut(int index) { return _attribute[index]; } Vital GetVital(int index) { return _vital[index]; } Skill GetSkill(int index) { return _skill[index]; } void VitalModified() { //如果_vital[VitalName.Health] 改变 则 _attribute[AttributeName.Might] 改变 GetVital((int)VitalName.Health).AddModifying(new ModifyingAttribute(GetAttribut((int)AttributeName.Might))); GetVital((int)VitalName.Energy).AddModifying(new ModifyingAttribute(GetAttribut((int)AttributeName.Concentration))); GetVital((int)VitalName.Mana).AddModifying(new ModifyingAttribute(GetAttribut((int)AttributeName.Willpower))); } void SkillModified() { GetSkill((int)SkillName.Magic_Defence).AddModifying(new ModifyingAttribute(GetAttribut((int)AttributeName.Willpower))); } }
1 0
- unity状态模式
- Unity游戏设计模式之状态模式实现
- 【设计模式】使用unity实现状态模式(State mode)
- Unity常用的设计模式_状态模式
- 【Unity】Unity 获取网络状态
- Unity客户端框架笔记(状态模式和策略模式在游戏中的应用)
- 【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现
- 【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现
- 【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现
- 【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现
- Unity客户端框架笔记(状态模式和策略模式在游戏中的应用)
- unity判断网络状态
- Unity 编辑模式下自定义快捷控制场景物体的显隐状态
- unity开发状态下2d与3d模式的转换
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- JavaScript基础知识(9)
- 剑指offer 二进制中1的个数
- 使用并设置urxvt终端
- Sicily Single-link Clustering
- 状态dp hdu1074
- unity状态模式
- vue 学习笔记二之vue2与vue1的选择
- ieee-explore文献免费下载办法
- 我在CSDN上的第一篇博客
- 常见的面向对象设计原则
- A值与B值的交换方法
- poj1723
- bzoj4390 Max Flow
- Search Insert Position问题及解法