Unity_FPS游戏_Boss模块_03

来源:互联网 发布:杭州seo公司哪家好 编辑:程序博客网 时间:2024/06/03 17:38

接下来我们就要对状态机进行填充:
using UnityEngine;
using System.Collections.Generic;
public class BossStateMachine {

//字典用来储存状态(方便调用)private Dictionary<StateType, BossState> _dic = new Dictionary<StateType, BossState>();private BossState _currentState;private BossState _lastState;
我们需要在Boss类中补写要继承的对象    public class BossState  {    public BossStateMachine machine;}
public Boss boss;public BossStateMachine(Boss boss){    this.boss = boss;}public void Register(StateType key,BossState value){    if(!_dic.ContainsKey(key))    {        value.machine = this;        _dic.Add(key, value);    }}public void ChangeState(StateType 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();    }}

}
接下来因为需要到玩家对象的位置信息(用寻路决定移动),所以选中场景里的对象进行烘焙,
此时运行游戏我们会发现,因为没有刚体Boss会发生重叠,所以我们可以考虑添加寻路组件(Nav),和相对应的动画。

    在Boss类中添加以下组件    protected Animation _ani;    public Animation Ani { get { return _ani; } }    protected NavMeshAgent _nav;    public NavMeshAgent Nav { get { return _nav; } }    并添加到在构造器中        _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();        }

此时因为考虑到要与玩家进行交互,所以添加一个Player类

using UnityEngine;using System.Collections;public class Player : Singleton<Player> {    private Transform _transform;    public Vector3 Pos { get { return _transform.position; } }    /// <summary>    /// 初始化;    /// </summary>    public void Init()    {        _transform = GameObject.Find("Player").transform;          }    public void Update()    {        Foo();        PlayerInput();        ShowLineRenderer();        CheckWeaponTime();    } 

我们动画状态机补充一下

    在BossStateMachine中补充    public Boss boss;    public BossStateMachine(Boss boss)    {        this.boss = boss;    }    在Boss中补充   public class BossRunState : BossState{    public override void EnterState()    {         machine.boss.Ani.CrossFade(machine.boss.Cfg.AniRun);     }    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( StateType.Attack);        }    }    public override void ExitState()    {        machine.boss.Nav.SetDestination(machine.boss.Transform.position);    }}public class BossAttackState : BossState{    private bool _inBefaoreHit = true;    public override void EnterState()    {        machine.boss.Ani.CrossFade(machine.boss.Cfg.AniAttack);    }    public override void UpdateState()    {        machine.boss.Transform.LookAt(Player.Instance.Pos);        _usedTime += Time.deltaTime;        if (_usedTime > machine.boss.Cfg.AttackBeforeTime && _inBefaoreHit == true)        {            machine.boss.Attack();            _inBefaoreHit = false;        }        if (_usedTime > machine.boss.Cfg.AttackTotalTime)        {            _inBefaoreHit = true;            _usedTime = 0;        }    }    public override void ExitState()    {        _usedTime = 0;    }}再更新LandBoss类:using UnityEngine;using System.Collections;public class LandBoss : Boss {    public LandBoss(BossCfg cfg) : base(cfg)    {        //Debug.Log("反射创建了" + cfg.Name);        //此时我们是补充了一个枚举代替了字符串概念;        _machine.Register(StateType.Run, new BossRunState());        _machine.Register( StateType.Attack, new BossAttackState());        _machine.Register( StateType.Die, new BossDieState());        _machine.ChangeState( StateType.Run);    }    public override void Init()    {        base.Init();    }    public override void Attack()    {        Debug.Log("地面怪攻击");    }    public override void Update()    {        base.Update();    }}

此时我们就可以先测试一下了。(为了Boss方便观察从生成点到视线的运动轨迹,我们可以暂时在Boss类public Boss(BossCfg cfg)下添加一句 _transform.position =new Vector3()来观察)

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();          }}
原创粉丝点击