Unity_FPS游戏_Boss模块流程01脚本
来源:互联网 发布:齐天大圣羽翼进阶数据 编辑:程序博客网 时间:2024/05/21 10:41
Boss:
using UnityEngine;using System.Collections;public class Boss { //模型 protected Transform _transform; public Transform Transform { get { return _transform; } } protected CapsuleCollider _collider; public CapsuleCollider Collider { get { return _collider; } } protected Animation _ani; public Animation Ani { get { return _ani; } } protected NavMeshAgent _nav; public NavMeshAgent Nav { get { return _nav; } } //配置(获取信息并处理行为); protected BossCfg _cfg; public BossCfg Cfg { get { return _cfg; } } protected int _hp; public int Hp { get { return _hp; } } protected BossStateMachine _machine; public BossStateMachine Machine { get { return _machine; } } public Boss(BossCfg cfg) { _cfg = cfg; _transform = GameObject.Instantiate(Resources.Load<GameObject>("Boss/" + _cfg.Model)).transform; int index = Random.Range(1, ConfigManager.Instance.CountOfBirthPointCfgDic + 1); BirthPointCfg birthCfg = ConfigManager.Instance.GetBirthPointCfgByID(index); _transform.position = ConfigManager.Instance.GetVector3(birthCfg.Position); _transform.eulerAngles = ConfigManager.Instance.GetVector3(birthCfg.EulerAngle); _collider = _transform.GetComponent<CapsuleCollider>(); if (_collider == null) { _collider = _transform.gameObject.AddComponent<CapsuleCollider>(); } _collider.center = ConfigManager.Instance.GetVector3(_cfg.ColliderCenter); _collider.radius = _cfg.ColliderRadius; _collider.height = _cfg.ColliderHeight; _collider.direction = _cfg.ColliderDirection; _ani = _transform.GetComponent<Animation>(); _nav = _transform.GetComponent<NavMeshAgent>(); if(_nav == null) { _nav = _transform.gameObject.AddComponent<NavMeshAgent>(); } _nav.enabled = true; if(_machine == null) { _machine = new BossStateMachine(this); } Init(); } //boss初始化 public virtual void Init() { _hp = _cfg.Hp; //Debug.Log("初始化怪物属性"); } //boss更新 public virtual void Update() { _machine.DoWork(); //Debug.Log(_cfg.Name + "更新怪物相关行为"); }}
BossManager
using UnityEngine;using System.Collections.Generic;using System;using System.Reflection;public class BossManager : Singleton<BossManager> { private List<Boss> _bossList = new List<Boss>(); /// <summary> /// 添加 /// </summary> /// <param name="boss"></param> public void Add(Boss boss) { if(!_bossList.Contains(boss)) { _bossList.Add(boss); } } /// <summary> /// 移除 /// </summary> public void Remove(Boss boss) { if (_bossList.Contains(boss)) { _bossList.Remove(boss); } } /// <summary> /// 创建怪物 /// </summary> /// <param name="cfg"></param> public void CreateBoss(BossCfg cfg) { Type type = Type.GetType(cfg.BossType.ToString()); object[] bossParams = new object[] { cfg }; Boss boss = Activator.CreateInstance(type, bossParams) as Boss; Add(boss); } /// <summary> /// 更新boss行为 /// </summary> public void Update() { for (int i = 0; i < _bossList.Count; i++) { _bossList[i].Update(); } }}
BossState
using UnityEngine;using System.Collections;public class BossState { public BossStateMachine machine; public virtual void EnterState() { } public virtual void UpdateState() { } public virtual void ExitState() { }}public class BossRunState : BossState{ public override void EnterState() { machine.boss.Ani.CrossFade(machine.boss.Cfg.AniRun); Debug.Log("死亡时间" + machine.boss.Ani.GetClip(machine.boss.Cfg.AniDie).length); } public override void UpdateState() { machine.boss.Nav.SetDestination(Player.Instance.Pos); float distance = Vector3.Distance(machine.boss.Transform.position, Player.Instance.Pos); if(distance <= machine.boss.Cfg.AttackDistance) { machine.ChangeState("Attack"); } } public override void ExitState() { machine.boss.Nav.SetDestination(machine.boss.Transform.position); }}public class BossAttackState : BossState{ private float _timer; private bool _endNav; public override void EnterState() { machine.boss.Ani.CrossFade(machine.boss.Cfg.AniAttack); } public override void UpdateState() { machine.boss.Transform.LookAt(Player.Instance.Pos); } public override void ExitState() { base.ExitState(); }}public class BossDieState : BossState{ public override void EnterState() { machine.boss.Ani.CrossFade(machine.boss.Cfg.AniDie); } public override void UpdateState() { base.UpdateState(); } public override void ExitState() { base.ExitState(); }}
BossStateMachine
using UnityEngine;using System.Collections.Generic;public class BossStateMachine { private Dictionary<string, BossState> _dic = new Dictionary<string, BossState>(); private BossState _currentState; private BossState _lastState; public Boss boss; public BossStateMachine(Boss boss) { this.boss = boss; } public void Register(string key,BossState value) { if(!_dic.ContainsKey(key)) { value.machine = this; _dic.Add(key, value); } } public void ChangeState(string key) { if (_dic.ContainsKey(key)) { _currentState = _dic[key]; } else { Debug.Log("转换失败"); } } public void DoWork() { if(_currentState != _lastState) { _currentState.EnterState(); _lastState = _currentState; } _lastState.UpdateState(); if(_lastState != _currentState) { _lastState.ExitState(); } }}
FlyBoss
using UnityEngine;using System.Collections;public class FlyBoss : Boss { public FlyBoss(BossCfg cfg) : base(cfg) { } public override void Init() { base.Init(); } public override void Update() { base.Update(); }}
LandBoss
using UnityEngine;using System.Collections;public class LandBoss : Boss { public LandBoss(BossCfg cfg) : base(cfg) { //Debug.Log("反射创建了" + cfg.Name); _machine.Register("Run", new BossRunState()); _machine.Register("Attack", new BossAttackState()); _machine.ChangeState("Run"); } public override void Init() { base.Init(); } public override void Update() { base.Update(); }}
Player
using UnityEngine;using System.Collections;public class Player : Singleton<Player> { private Transform _transform; public Vector3 Pos { get { return _transform.position; } } public void Init() { _transform = GameObject.Find("Player").transform; }}
ConfigManager
using UnityEngine;using System.Collections;using System.Xml;using System.Collections.Generic;using System;using System.Reflection;//逻辑相同 类型不同 ---- 泛型//处理加载,缓存,获取配置的管理器public class ConfigManager : Singleton<ConfigManager> { private Dictionary<int, BossCfg> _bossCfgDic = new Dictionary<int, BossCfg>(); private Dictionary<int, WeaponCfg> _weaponCfgDic = new Dictionary<int, WeaponCfg>(); private Dictionary<int, ShieldCfg> _shieldCfgDic = new Dictionary<int, ShieldCfg>(); private Dictionary<int, BirthPointCfg> _birthPointCfgDic = new Dictionary<int, BirthPointCfg>(); public int CountOfBirthPointCfgDic { get { return _birthPointCfgDic.Count; } } public void LoadAllConfig() { _bossCfgDic = LoadConfig<BossCfg>("BossConfig"); _weaponCfgDic = LoadConfig<WeaponCfg>("WeaponConfig"); _shieldCfgDic = LoadConfig<ShieldCfg>("ShieldConfig"); _birthPointCfgDic = LoadConfig<BirthPointCfg>("BirthPointConfig"); } private Dictionary<int,T> LoadConfig<T>(string fileName) where T : class,new() { Dictionary<int, T> dic = new Dictionary<int, T>(); TextAsset bossCfgInfo = Resources.Load<TextAsset>("Config/" + fileName); //新建xml文档对象 XmlDocument document = new XmlDocument(); //把字符串加载到对象中 document.LoadXml(bossCfgInfo.text); //获取根节点 XmlNode rootNode = document.SelectSingleNode("Root"); //获取根节点的子节点列表 XmlNodeList nodeList = rootNode.ChildNodes; //遍历 foreach (XmlNode node in nodeList) { //节点 转 元素类型 XmlElement element = node as XmlElement; T obj = CreateAndSetValue<T>(element); dic.Add(int.Parse( element.GetAttribute("ID")), obj); } return dic; } //创建映射对象 以及 设置对象的值 private T CreateAndSetValue<T>(XmlElement element) where T : class,new() { T obj = new T();// T obj1 = Activator.CreateInstance<T>(); FieldInfo[] fieldInfos = typeof(T).GetFields(); foreach (FieldInfo fieldInfo in fieldInfos) { string value = element.GetAttribute(fieldInfo.Name); ParsePropertyValue<T>(fieldInfo, obj, value); } return obj; } //转换对应的类型 private void ParsePropertyValue<T>(FieldInfo fieldInfo,T obj,string valueString) where T : class,new() { System.Object value = null; if (fieldInfo.FieldType.IsEnum) { value = Enum.Parse(fieldInfo.FieldType, valueString); } else { if (fieldInfo.FieldType == typeof(int)) { value = int.Parse(valueString); } if (fieldInfo.FieldType == typeof(float)) { value = float.Parse(valueString); } if (fieldInfo.FieldType == typeof(bool)) { value = bool.Parse(valueString); } if (fieldInfo.FieldType == typeof(string)) { value = valueString; } } fieldInfo.SetValue(obj, value); } //字符串转三位向量 public Vector3 GetVector3(string str) { string[] pos = str.Split(new char[] { ',' },System.StringSplitOptions.RemoveEmptyEntries); return new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2])); } //get public BossCfg GetBossCfgByID(int id) { if (_bossCfgDic.ContainsKey(id)) { return _bossCfgDic[id]; } return null; } public BirthPointCfg GetBirthPointCfgByID(int id) { if (_birthPointCfgDic.ContainsKey(id)) { return _birthPointCfgDic[id]; } return null; }}public enum BossType{ LandBoss, FlyBoss,}public enum AttackType{ Down, Up, All}//映射对象 + 字典 = savepublic class BossCfg{ public int ID; public string Name; public int Hp; public AttackType AttackType; public string Model; public string ColliderCenter; public float ColliderRadius; public float ColliderHeight; public int ColliderDirection; public BossType BossType; public string AniRun; public string AniAttack; public string AniDie; public float AttackTotalTime; public float AttackBeforeTime; public float AttackDistance;}//武器数据映射的对象模板public class WeaponCfg{ public int ID; public string Name; public int EffectiveBulletCount; public int EffectiveTime; public int Hurt; public float AttackDistance; public string Display;}//盾牌数据映射的对象模板public class ShieldCfg{ public int ID; public string Name; public int EffectiveParryTime; public int EffectiveTime; public string Display;}//出生位置数据映射对象模板public class BirthPointCfg{ public int ID; public string Position; public string EulerAngle;}
Singleton
using UnityEngine;using System.Collections;public class Singleton<T> where T : class,new() { private static T _instance; public static T Instance { get { if(_instance == null) { _instance = new T(); } return _instance; } }}
VRGameManager
using UnityEngine;using System.Collections;//游戏入口public class VRGameManager : MonoBehaviour { // Use this for initialization void Awake () { ConfigManager.Instance.LoadAllConfig(); Player.Instance.Init(); } // Update is called once per frame void Update () { BossManager.Instance.Update(); }}
阅读全文
0 0
- Unity_FPS游戏_Boss模块流程01脚本
- Unity_FPS游戏_Boss模块流程_01
- Unity_FPS游戏_Boss模块_03
- Unity_FPS游戏_Xml文件读取流程_01
- Unity_FPS游戏中设置子弹轨迹和红外线瞄准
- 游戏程序新模块添加流程
- [OBS] 模块调用关系 & AV数据流向 & 游戏捕获流程
- 模块流程
- 脚本流程
- 游戏流程
- 预览模块流程
- android phone模块流程
- 设置模块流程分析
- nginx模块开发流程
- 流程模块开发步骤
- nodejs 模块的流程
- BC95模块开发流程
- GSM模块启动流程
- HDU5421-Victor and String
- scrapy爬虫-爬取慕课网全部课程
- 049 极值及最大值,最小值
- windows系统使用小技巧
- 请定义一个交通工具(Vehicle)的类,其中有:
- Unity_FPS游戏_Boss模块流程01脚本
- Linux常用命令与快捷键
- 贪心算法解决活动安排问题
- SDUT 1591 交叉排序
- linux添加PATH环境变量
- 如何向CLASSPATH中添加MYSQL数据库驱动
- 九九乘法表
- 链表中的入口结点java实现
- POJ---3281 Dining【拆点最大流】