当前位置: 首页 > news >正文

网站风格设计的选择做网站怎么添加背景图片

网站风格设计的选择,做网站怎么添加背景图片,潍坊网站制作江门公司,网站开发可以入无形资产吗目录 1、状态模式 2、使用工具 3、状态模式适用范围 4、实现内容 5、代码及思路 Enemy.cs EnemyState.cs 6、unity里的设置 7、运行效果展示 1、状态模式 “允许一个对象在其内部状态改变时改变自身的行为。对象看起来好像是在修改自身类。” 就是一个对象能随着自己…目录 1、状态模式 2、使用工具 3、状态模式适用范围 4、实现内容 5、代码及思路  Enemy.cs EnemyState.cs 6、unity里的设置 7、运行效果展示 1、状态模式 “允许一个对象在其内部状态改变时改变自身的行为。对象看起来好像是在修改自身类。” 就是一个对象能随着自己的状态改变执行不同的方法吧而这个方法和状态并不是写在这个对象类里的却能达到像是对象修改自身类的效果。 2、使用工具 Unity2022.3.51f1c1、visual studio code 3、状态模式适用范围 1你有一个游戏实体它的行为基于它的内部状态而改变 2这些状态被严格分为相对数目较少的小集合 3游戏实体随着时间的变化会响应用户输入或一些游戏事件 在游戏里广泛使用在ai里也经常被应用于用户输入处理、浏览菜单屏幕、解析文件、网络协议和其他异步的行为 4、实现内容 实现敌人能在这几个状态之间根据距离远近自动切换hp为0时死亡 三段距离一段距离内攻击一段距离内追逐更远的距离会暂停 但是暂停、防御的触发、检验技能是否释放完毕等功能并没有实现这里只是搭框架原理都差不多只要学会一个条件的状态转移其他的都很好做就不赘述了。 5、代码及思路  书上的代码看着太复杂了写的时候没有完全参考我更倾向于围绕状态模式的目标——将每个状态相关的所有数据和行为封装到对应状态类里面 来写。 状态模式的基本模式参考状态模式 | 菜鸟教程 上下文类(Enemy):它持有一个状态的引用并在状态改变时更新其行为状态类(EnemyState):定义所有可能的状态并为它们提供行为接口具体状态类(IdleState\StandState...)实现状态接口的具体类表示对象的某一具体状态。 具体来说在我的代码里结构是这样的 Enemy.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; // 每个敌人身上都该有 public class Enemy : MonoBehaviour {[HideInInspector]public EnemyState state;public int distance;// 距离public int thresholdA10;// 阈值Apublic int thresholdB20;// 阈值Bpublic int hp10;// 血量UnityEventEnemy stateChangeEvent new UnityEventEnemy();//状态改变事件void Start(){ChangeState(EnemyState.IdleState);//设置为初始状态}public void ChangeState(EnemyState newState){if (state ! null){stateChangeEvent.RemoveListener(state.handleData);//移除原本的方法引用}state newState;//切换至新状态stateChangeEvent.AddListener(state.handleData);//添加新状态的方法引用stateChangeEvent.Invoke(this);//调用下一个状态的handleData}}在Start方法中初始化了敌人的状态并调用初始状态的handleData方法这样在开始时敌人就会执行与IdleState状态相关的行为。当敌人的状态改变时ChangeState方法通过 stateChangeEvent.Invoke(this)触发事件从而调用切换后状态的 handleData方法。有一个坑是在使用AddListener的时候里面的参数传的其实是一个方法引用地址值因此在改变state的值以前一定要把原本注册的方法移除再添加新的不然调用的还会是之前状态的方法/空引用异常。 这本书这部分写得真不咋滴啊对象类的函数不清不楚没写如果把条件判断也加到状态类里去了对象要怎么切换状态这部分是我自己想的。 EnemyState.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using Unity.VisualScripting.Antlr3.Runtime; using UnityEditor; using UnityEditor.EditorTools; using UnityEngine;public class EnemyState :MonoBehaviour {// 定义所有可能的状态public static IdleState IdleState; // 空闲状态public static StandState StandState; // 站立状态public static MoveState MoveState; // 移动状态public static AttackState AttackState; // 攻击状态public static DieState DieState; // 死亡状态public static DefenseState DefenseState;// 防御状态void Awake(){// Awake方法在对象被激活时调用且会被派生类继承// 派生类生成时也会被调用所以一定要加条件防止重复添加if (gameObject.GetComponentIdleState() null){// 添加各个状态的组件实例// 用add的原因是继承自MonoBehaviour的类不能直接newIdleState gameObject.AddComponentIdleState();StandState gameObject.AddComponentStandState();MoveState gameObject.AddComponentMoveState();AttackState gameObject.AddComponentAttackState();DieState gameObject.AddComponentDieState();DefenseState gameObject.AddComponentDefenseState();}}// 虚拟的handleData方法用于每个状态具体的处理逻辑public virtual void HandleData(Enemy enemy){// 检查敌人的血量StartCoroutine(UpdateDieState(enemy));}// 虚拟的状态更新方法每个状态可以自定义自己的更新逻辑public virtual IEnumerator UpdateState(Enemy enemy){yield return null;}// 死亡状态的更新方法持续检查敌人的血量是否小于等于零public IEnumerator UpdateDieState(Enemy enemy)//这个只需要在初始状态调一次{while (true){if (enemy.hp 0){enemy.ChangeState(EnemyState.DieState);break;}yield return null;}}} public class IdleState :EnemyState {public override void HandleData(Enemy enemy){base.HandleData(enemy);// 调用基类的处理方法检查死亡状态Debug.Log(初始状态);enemy.ChangeState(EnemyState.StandState);} } public class StandState : EnemyState {public override void HandleData(Enemy enemy){Debug.Log(站立状态);StartCoroutine(UpdateState(enemy));// 开始更新状态判断是否切换到其他状态}public override IEnumerator UpdateState(Enemy enemy){while (true){if (enemy.distance enemy.thresholdA) // 距离小于阈值A进入攻击状态{enemy.ChangeState(EnemyState.AttackState);yield break; // 结束当前协程}else if (enemy.distance enemy.thresholdA) // 距离大于阈值A进入移动状态{enemy.ChangeState(EnemyState.MoveState);yield break; // 结束当前协程}yield return null; // 每帧检查一次}} } public class MoveState : EnemyState {public override void HandleData(Enemy enemy){Debug.Log(追逐状态);StartCoroutine(UpdateState(enemy)); // 开始更新状态判断是否切换到其他状态}public override IEnumerator UpdateState(Enemy enemy){while (true){if (enemy.distance enemy.thresholdA) // 距离小于阈值A进入站立状态{enemy.ChangeState(EnemyState.StandState);break; // 结束当前协程}yield return null; // 每帧检查一次}}} public class AttackState : EnemyState {public override void HandleData(Enemy enemy){Debug.Log(攻击状态);StartCoroutine(UpdateState(enemy));// 开始更新状态判断是否切换到其他状态}public override IEnumerator UpdateState(Enemy enemy){while (true){if (enemy.distance enemy.thresholdA) // 距离大于阈值A进入移动状态{enemy.ChangeState(EnemyState.MoveState);break; // 结束当前协程}yield return null; // 每帧检查一次}} } public class DieState : EnemyState {public override void HandleData(Enemy enemy){GameObject.Destroy(enemy.gameObject);// 销毁敌人对象表示死亡Debug.Log(死亡状态);} } public class DefenseState : EnemyState {public override void HandleData(Enemy enemy){Debug.Log(防御状态);StartCoroutine(UpdateState(enemy));// 开始更新状态判断是否切换到其他状态}public override IEnumerator UpdateState(Enemy enemy){while (true){//如果是释放过程中注意都要等防御技能结束才行//防御状态要切换到其他状态的条件应是被打断/成功防住if (enemy.distance enemy.thresholdA)// 距离大于阈值A进入移动状态{enemy.ChangeState(EnemyState.MoveState);break;// 结束当前协程}else if (enemy.distance enemy.thresholdA)// 距离小于阈值A进入攻击状态{enemy.ChangeState(EnemyState.AttackState);break;// 结束当前协程}yield return null;// 每帧检查一次}} } 通过EnemyState 作为基类来定义所有可能的敌人状态如 IdleState、MoveState、AttackState 等。每个状态类都会实现 handleData方法和 UpdateState 协程方法这样每个状态都可以自定义自己的行为和状态转移条件。状态切换通过 enemy.ChangeState(EnemyState.XXX) 来切换敌人的状态每个状态都有自己的逻辑来判断何时切换到下一个状态。血量和死亡判断EnemyState类中的 UpdateDieState 协程用于实时检查敌人的血量一旦血量降至 0 或以下就会触发死亡状态并销毁敌人对象。状态更新handleData 方法负责初始化和启动状态检查UpdateState 协程负责检查条件并更新状态。 6、unity里的设置 建一个空物体挂上EnemyState类继承自monobehavior类的都需要挂到某物体上才能用 建两个胶囊体挂上Enemy类阈值和血量可以根据敌人的不同自定义这里我随便设的值。 7、运行效果展示 由于这只是框架所以我检查效果的方式就是直接在Inspector里调Distance来观察状态转换是否成功。对照着这个状态转移图来看 运行后两个胶囊体分别从初始进入站立状态又由于da而进入攻击状态 将其中一个胶囊体的Distance调为11a,攻击-追逐。另外可观察到另一个胶囊体状态不受影响 将胶囊体Distance调回0按照状态转移图从追逐-站立-攻击 最后将胶囊体的Hp调为0 该胶囊体切换至死亡状态后执行销毁行为另一胶囊体不受影响。
http://www.hkea.cn/news/14346567/

相关文章:

  • 大尺度做爰网站在线成都微信小程序开发平台
  • 智能建站收费标准岚庭装饰公司口碑怎么样
  • 凡高网站建设宠物网站建设策划方案
  • 网站开发项目外包宁夏建网站报价
  • 网站可以用cdr做吗阜蒙县建设学校官网网站
  • 网站建设与网页制作的实验目的阜宁城乡建设局网站
  • 怎样找人做网站软件定制解决方案
  • 网站开发人员需要去做原型吗做毕业设计网站教程
  • 站点与网站有什么区别wordpress图片打叉
  • 服务器可以做网站网站怎么上线
  • 齐河专业企业网站建设微股东微网站制作平台
  • 孝感公司做网站wordpress主题网店
  • iis 访问网站需要进行身份验证网站建设用户核心
  • 帝国cms下载类网站怎么做wordpress 外贸
  • 适合毕设做的简单网站网站搭建好有什么内容可以修改
  • 福州网站建设名列前茅国外网站建设企业
  • 网站怎么做一级域名跳转网站兼容ie代码
  • 东莞市建设局网站首页广州外贸网站建设推广
  • 济南学网站建设哪里好rss订阅wordpress
  • 企业建设营销型网站有哪些步骤进口网站建设
  • 网站开发学生鉴定表网站分页效果
  • 龙之向导外贸网站asp.net网站制作步骤
  • 服装设计有哪些网站网站月流量
  • 集团网站推广旅游网站系统建设方案
  • 怎么做提卡密网站万游昆明做网站哪家好
  • 网站建设中可能升级河北网诚网站建设
  • 免费建站工具网站原型图是什么
  • 哪个网站做员工增员做响应式网站哪家公司好
  • 成都专业网站建设公司重庆营销型网站开发
  • 定制开发网站如何报价wordpress4.8漏洞