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

天河网站建设外包广州免费打hpv疫苗预约条件

天河网站建设外包,广州免费打hpv疫苗预约条件,做网站服务器是什么,濮阳中强网站建设本文仅作学习交流#xff0c;不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本#xff1a;Unity6 模板#xff1a;3D 核心 渲染管线#xff1a;URP ------------------------------…         本文仅作学习交流不做任何商业用途         郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴                                                           版本Unity6                                                                                 模板3D 核心                                                                                 渲染管线URP  ------------------------------------------------------------------------------------------------------------------------------ 在此之前你应该对新输入系统有一定的了解关于新输入系统的用法与解释Unity新输入系统 之 InputAction输入配置文件最基本的单位_unity inputaction-CSDN博客 关于新输入系统的简单实战Unity 新输入系统实战 控制2D角色移动动画俯视-CSDN博客 目录 实现功能与逻辑拆解 1.获取WASD的基础输入​编辑 2.自定义操作按键 3.按键重绑 4 .重绑定后的保存与读取 全局概览 我将输入管理类命名为GameInput 其创建时候就写为了单例模式因为但凡是拥有全局唯一实例的类 或者 是该类的生命周期占据了整个场景 就应该写为单例模式  实现功能与逻辑拆解 1.获取WASD的基础输入 对于新输入系统的创建与生成C#文件我便不再赘述Unity6自带 你可以在InputAction看到其已经定义好了很多内容 首先声明输入系统的C#类 然后开启 action new InputSystem_Actions();action.Enable(); 直接读取输入值 可以看到Move这一Action是Value的动作类型以及Vector2的控制类型 因此代码就可以直接这么写  public Vector3 GetInputKeyboard() {Vector2 direcation action.Player.Move.ReadValueVector2();//float x Input.GetAxisRaw(Horizontal);//float z Input.GetAxisRaw(Vertical);Vector3 move new Vector3(direcation.x, 0, direcation.y);move move.normalized;return move;} 至于为什么返回单位化后的向量可以看这一篇其并不是本文的重点 Unity中的数学应用 之 角色移动中单位化向量的妙用 小学难度-CSDN博客 2.自定义操作按键 这里有个前置知识点发布者-订阅模式的特点就是发布者发布事件与调用 订阅者只需要订阅上就完事了 对于此部分可以自定义Action为Button类型 对于具体按键可以勾选分类  代码是这么写的 private static GameInput instance;public static GameInput Instance instance;private InputSystem_Actions action;public EventHandler interact;public EventHandler operater;public EventHandler pause;private void Awake() {if (instance null) {instance this;}else {Destroy(instance);}action new InputSystem_Actions();if (PlayerPrefs.HasKey(PLAYERBDINGINFO))action.LoadBindingOverridesFromJson(PlayerPrefs.GetString(PLAYERBDINGINFO));action.Enable();//触发订阅—Eaction.Player.Interact.started Interact_started;//触发订阅-Faction.Player.Operater.started Operater_started;//触发订阅-ESCaction.Player.Pause.started Pause_started;}private void OnDestroy() {action.Player.Interact.started - Interact_started;action.Player.Operater.started - Operater_started;action.Player.Pause.started - Pause_started;action.Dispose();}private void Pause_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {pause?.Invoke(this, EventArgs.Empty);}private void Operater_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {operater?.Invoke(this, EventArgs.Empty);}private void Interact_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {interact?.Invoke(this, EventArgs.Empty);} 解释下面部分是对按键手势(Action)的订阅 action.Enable();//触发订阅—Eaction.Player.Interact.started Interact_started;//触发订阅-Faction.Player.Operater.started Operater_started;//触发订阅-ESCaction.Player.Pause.started Pause_started; 订阅的谁呢是如下三个函数 注意其参数都是自动生成的 private void Pause_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {pause?.Invoke(this, EventArgs.Empty);}private void Operater_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {operater?.Invoke(this, EventArgs.Empty);}private void Interact_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {interact?.Invoke(this, EventArgs.Empty);} 而三个函数内又包裹了一层C#提供可传参委托 其参数sender代表事件的发布者 也就是GameIput类本身 e是EventArgs类型或者派生自EventArgs的类型,通常用于传递和事件相关的信息,这里传值为EventArgs.Empty 也就是空 也就是他们三个 public EventHandler interact;public EventHandler operater;public EventHandler pause; 所以对于他们三个的调用也就嵌在了对新输入系统手势的订阅上 那么谁去订阅呢Player 你会发现Player这里又是一层封装但不是委托与事件  BaseCounter 是柜台基类 我们以后会讲curCounter用于存储当前玩家获得的柜台 private BaseCounter curCounter;void Start() {//Application.targetFrameRate 60;this.HoldPoints transform.Find(PlayerHoldPoint);GameInput.Instance.interact OnInterAction;GameInput.Instance.operater OnOperaterAction;}private void OnInterAction(object sender, EventArgs s) {curCounter?.Interact(this);}private void OnOperaterAction(object sender, EventArgs e) {curCounter?.InteractOperater(this);} Interact与InteractOperater的定义在柜台类基类之中是两个虚方法由子类去实现 using UnityEngine;public class BaseCounter : FoodObjcetHolder {[SerializeField] protected Transform SelectPrefab;public void SelectPrefabSecureAssign(string name) {if (SelectPrefab null) {SelectPrefab transform.Find(name);}}public virtual void Interact(Player player) {Debug.Log(未对父类进行重写);}public virtual void InteractOperater(Player player) {}public void CounterSelect() {SelectPrefab.gameObject?.SetActive(true);}public void CounterUnSelect() {SelectPrefab.gameObject?.SetActive(false);}} 子类实现我们不去考虑目前对于一个按键的订阅链我们已经整理完了 由下图所示 你要说这不是脱了裤子放p吗其实不然 其道理在于 如果只是GameInput类自我消化 只需要第一条黑线 但是GameInput类要与Player类进行交互 而事件的发布订阅解决了这个问题所以有了第二条黑线 Player也不负责执行柜台的逻辑 所以就需要第三条黑线 3.按键重绑 这个的原理如下 1.获取对应的Action下的按键 action.Player.Move;action.Player.Interact;action.Player.Operater;action.Player.Pause; 2.通过对应的索引去得到对应值键 也就是下图           在回调函数中执行其他办法注意最后那个Start方法一定要开启不然没有任何反应 actionKey.PerformInteractiveRebinding(index).OnComplete((callback) {Debug.Log(重新绑定完成);action.Player.Enable();SettingUI.Instance.UpdateUI();SettingUI.Instance.HideBindingInfo();PlayerPrefs.SetString(PLAYERBDINGINFO,action.SaveBindingOverridesAsJson());}).Start(); 先别管actionKey也别管函数块内部做了什么重点下面这个API是重绑定的关键 PerformInteractiveRebinding(index).OnComplete 做了一个枚举去得到所有不同的输入 public enum E_BindingKey{ w,a,s,d,e,f,esc } 重新绑定只需要传入一个枚举值就可以 public void ReBinding(E_BindingKey e_BindingKey){Debug.Log(进入重新绑定);action.Player.Disable(); InputAction actionKey null;int index -1;switch (e_BindingKey) {case E_BindingKey.w:index 2;actionKey action.Player.Move;break;case E_BindingKey.a:index 6;actionKey action.Player.Move;break;case E_BindingKey.s:index 4;actionKey action.Player.Move;break;case E_BindingKey.d:index 8;actionKey action.Player.Move;break;case E_BindingKey.e:index 0;actionKey action.Player.Interact;break;case E_BindingKey.f:index 0;actionKey action.Player.Operater;break;case E_BindingKey.esc:index 0;actionKey action.Player.Pause;break;default:break;}if(actionKey ! null) {actionKey.PerformInteractiveRebinding(index).OnComplete((callback) {Debug.Log(重新绑定完成);action.Player.Enable();SettingUI.Instance.UpdateUI();SettingUI.Instance.HideBindingInfo();PlayerPrefs.SetString(PLAYERBDINGINFO,action.SaveBindingOverridesAsJson());}).Start();}else{Debug.Log(actionKey为空);}//actionKey.Dispose();} 4 .重绑定后的保存与读取 重新加载会将场景所有类的内存回收但是存在本地的可以持久化因此无论是何种持久化方式都可以通过如下两个API去存取成json字符串 这里用PlayerPrefs演示 写入 PlayerPrefs.SetString(PLAYERBDINGINFO,action.SaveBindingOverridesAsJson()); 读取  action.LoadBindingOverridesFromJson(PlayerPrefs.GetString(PLAYERBDINGINFO));至于放在哪里 不用我多说了相信你对unity的生命周期并不陌生  全局概览 using System; using UnityEngine; using UnityEngine.InputSystem; public enum E_BindingKey{ w,a,s,d,e,f,esc } public class GameInput : MonoBehaviour {private const string PLAYERBDINGINFO PLAYERBDINGINFO;private static GameInput instance;public static GameInput Instance instance;private InputSystem_Actions action;public EventHandler interact;public EventHandler operater;public EventHandler pause;private void Awake() {if (instance null) {instance this;}else {Destroy(instance);}action new InputSystem_Actions();if (PlayerPrefs.HasKey(PLAYERBDINGINFO))action.LoadBindingOverridesFromJson(PlayerPrefs.GetString(PLAYERBDINGINFO));action.Enable();//触发订阅—Eaction.Player.Interact.started Interact_started;//触发订阅-Faction.Player.Operater.started Operater_started;//触发订阅-ESCaction.Player.Pause.started Pause_started;}private void OnDestroy() {action.Player.Interact.started - Interact_started;action.Player.Operater.started - Operater_started;action.Player.Pause.started - Pause_started;action.Dispose();}private void Pause_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {pause?.Invoke(this, EventArgs.Empty);}private void Operater_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {operater?.Invoke(this, EventArgs.Empty);}private void Interact_started(UnityEngine.InputSystem.InputAction.CallbackContext obj) {interact?.Invoke(this, EventArgs.Empty);}/// summary/// 读取输入/// /summary/// returns移动朝向/returnspublic Vector3 GetInputKeyboard() {Vector2 direcation action.Player.Move.ReadValueVector2();//float x Input.GetAxisRaw(Horizontal);//float z Input.GetAxisRaw(Vertical);Vector3 move new Vector3(direcation.x, 0, direcation.y);move move.normalized;return move;}public void ReBinding(E_BindingKey e_BindingKey){Debug.Log(进入重新绑定);action.Player.Disable(); InputAction actionKey null;int index -1;switch (e_BindingKey) {case E_BindingKey.w:index 2;actionKey action.Player.Move;break;case E_BindingKey.a:index 6;actionKey action.Player.Move;break;case E_BindingKey.s:index 4;actionKey action.Player.Move;break;case E_BindingKey.d:index 8;actionKey action.Player.Move;break;case E_BindingKey.e:index 0;actionKey action.Player.Interact;break;case E_BindingKey.f:index 0;actionKey action.Player.Operater;break;case E_BindingKey.esc:index 0;actionKey action.Player.Pause;break;default:break;}if(actionKey ! null) {actionKey.PerformInteractiveRebinding(index).OnComplete((callback) {Debug.Log(重新绑定完成);action.Player.Enable();SettingUI.Instance.UpdateUI();SettingUI.Instance.HideBindingInfo();PlayerPrefs.SetString(PLAYERBDINGINFO,action.SaveBindingOverridesAsJson());}).Start();}else{Debug.Log(actionKey为空);}//actionKey.Dispose();}public string GetBindingKey(E_BindingKey e_BindingKey){switch (e_BindingKey) {case E_BindingKey.w:return action.Player.Move.bindings[2].ToDisplayString();case E_BindingKey.a:return action.Player.Move.bindings[6].ToDisplayString();case E_BindingKey.s:return action.Player.Move.bindings[4].ToDisplayString();case E_BindingKey.d:return action.Player.Move.bindings[8].ToDisplayString();case E_BindingKey.e:return action.Player.Interact.bindings[0].ToDisplayString();case E_BindingKey.f:return action.Player.Operater.bindings[0].ToDisplayString();case E_BindingKey.esc:return action.Player.Pause.bindings[0].ToDisplayString();default:return ;}} }
http://www.w-s-a.com/news/647386/

相关文章:

  • 成都网站建设公司盈利吗专门做二手手机的网站有哪些
  • 手机网站设计需要学什么wordpress读法
  • WordPress pajx天津短视频seo
  • 检察院门户网站建设情况总结深圳网站制作长沙
  • 单页导航网站模板搜索量查询
  • 如何在一个地方建设网站营销型定制网站
  • 保定网站建设方案维护动易网站中添加邮箱
  • 简易网站的html代码wordpress音乐html
  • 四川住房和城乡建设厅网站打不开海山网站建设
  • 深圳设计功能网站如何用html制作网站
  • 网络优化软件下载竞价排名和seo的区别
  • 龙华新区做网站中高端网站建设
  • 网站开发小图标大全手机网站设计开发
  • 网页设计设计一个网站口碑营销的优点
  • 枣庄建网站的公司唐山企业网络推广培训
  • 张家界建设企业网站学校资源网站建设方案
  • 网站制作教程书籍业务管理系统
  • 上传网站空间的建站程序怎么删除c 网站开发案例详解下载
  • 企业网站维护兼职丹阳网站优化
  • 秦皇岛网站开发公司怎么注册自己的公司
  • 写作网站哪个能得稿费绿色环保企业网站模板
  • 牡丹江网站建设定制开发安徽建设工程信息网官网入口
  • 有什么好的网站建设的书适合在家做的网站工作
  • wordpress情侣源码西安网站快速优化
  • 昆明网站建设高端定制100种班服设计图
  • 网站开发程序说明html网页制作接单
  • 企业网站货物查询怎么做制作文件的软件
  • 怎么做网站的防盗链北京门户企业网站建设
  • 网站推广的主流方法淘客网站 源码
  • 网站海外推广怎么做多用户商城系统源码教程