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(); }}
阅读全文
0 0
- Unity_FPS游戏_Boss模块_03
- Unity_FPS游戏_Boss模块流程_01
- Unity_FPS游戏_Boss模块流程01脚本
- Unity_FPS游戏_Xml文件读取流程_01
- Unity_FPS游戏中设置子弹轨迹和红外线瞄准
- 小型游戏《笑傲江湖之精忠报国》全过程_03
- 初始化_03
- 整理_03
- 游戏保护模块
- cocos2dx 游戏模块
- HTML5+JS游戏开发模块----按键模块
- JAVA3D游戏人物模块代码
- 游戏mvc框架与模块
- 游戏mvc框架与模块
- 观点:游戏模块分析总结
- 游戏客户端中的常用模块
- 03_03.cs
- Java线程_03
- List 循环中出现的问题
- web前端之自动判断访问设备
- nodejs 安装以及配置
- 利用before和after设置三角边框
- bzoj_1003 物流运输
- Unity_FPS游戏_Boss模块_03
- 阿里移动安全_浅谈Android应用保护(零):出发点和背景
- 6.selenium 浏览器窗口切换
- Delegate Notification KVO 整理
- C#梳理【不安全代码】
- 鼠标拖拽的实现
- 转载:ConcurrentHashMap解析
- 跨域资源共享cors详解
- BZOJ1111: [POI2007]四进制的天平Wag