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();    }}