技能指示器就是王者荣耀里面的技能按钮,这个按钮在点击之前是一个按钮的样子,但是点击之后,技能图标会缩小一定大小,并且会出现一个可以拖动的范围按钮,更joystick一样,但是经过从尝试发现单纯使用Easytouch提供的Joystick并不能够符合要求,所以我通过对其进行一下封装来实现这个技能指示器。

UI结构如下:

最外层是一个空物体,用来当作技能指示器来挂载脚本,Icon用于显示 技能图标,以及实现技能按钮缩小的效果,SkillJoystick 就是Easytouch的遥感 组件,用来实现拖动。

代码结构:

我这里的遥感的事件与其他逻辑是相互分离的,我只提供按钮 相应事件的接口, 具体实现是在其它地方,这里相当于使用了桥接者模式。​​​​​​​

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;namespace WangZhe.UI
{public class SkillIndicator : MonoBehaviour{private static int s_skillJoysticNum = 0;private ETCJoystick m_skillJoystic;private Image m_skillBg;private Image m_thumbIcon;private Image m_skillIcon;private Color m_skillBgColorShow;private Color m_skillBgColorHide;private Sprite m_skillIconSprite;private Sprite m_thumbIconSprite;#region 对外交互的数据public float DragDisPersent { get; private set; }public string Name { get; set; }public int ID { get; private set; }public Vector2 DragDir { get; private set; }public UnityEvent OnDrag;public UnityEvent OnDragEnd;#endregionprivate void Awake(){s_skillJoysticNum++;m_skillJoystic = transform.GetComponentInChildren<ETCJoystick>();                         m_skillBg = m_skillJoystic.GetComponent<Image>();m_thumbIcon = m_skillJoystic.transform.Find("Thumb").GetComponent<Image>();m_skillIcon = transform.Find("Icon").GetComponent<Image>();m_skillBgColorShow = m_skillBg.color;m_skillBgColorHide = new Color(0, 0, 0, 0);m_skillIconSprite = m_skillIcon.sprite;m_thumbIconSprite = m_thumbIcon.sprite;#region 对外数据初始化DragDisPersent = 0;DragDir = Vector2.zero;Name = transform.name;ID = s_skillJoysticNum;#endregionm_skillIcon.gameObject.SetActive(false);m_skillBg.color = m_skillBgColorHide;m_thumbIcon.sprite = m_skillIconSprite;m_skillJoystic.onMove.AddListener(OnThumbMove);m_skillJoystic.onMoveEnd.AddListener(OnThumbMoveEnd);}public void OnThumbMove(Vector2 moveDir){m_skillIcon.gameObject.SetActive(true);                                                     //显示技能图标m_skillBg.color = m_skillBgColorShow;                                                       //显示拖动范围背景m_thumbIcon.sprite = m_thumbIconSprite;                                                     //修改拖动按钮的背景Vector3 thumbPos = m_thumbIcon.transform.localPosition;                                     //偏移位置Vector3 bgPos = m_skillBg.transform.localPosition;                                          //中心点位置DragDisPersent = Vector3.Distance(thumbPos, bgPos) / m_skillJoystic.GetRadius();            //偏移距离除以半径得到拖动偏移的百分比DragDir = moveDir;                                                                          //设置位移方向OnDrag.Invoke();                                                                            //提供接口做处理}public void OnThumbMoveEnd(){m_skillIcon.gameObject.SetActive(false);                            //隐藏技能图标m_skillBg.color = m_skillBgColorHide;                               //隐藏拖动范围图标m_thumbIcon.sprite = m_skillIconSprite;                             //修改拖动按钮图标DragDisPersent = 0;                                                 //设置拖动距离百分比为0DragDir = Vector2.zero;                                             //设置拖动方向为0OnDragEnd.Invoke();                                                 //提供接口}}
}

最上面的一些数据是控制按钮本身的UI显示用的变量,还有一部分是用来与外界交互的变量(后面可能会添加一些,后面不够用了再添就是)。

初始化里面就不说了, 都是些绑定操作,最后两句就是将joystick的move 事件与函数相绑定,重点在这 两个函数里面。

这两个函数里面主要都是对自身按钮UI显示的操作,而对外提供的接口就是OnDrag和OnDragEnd这两个委托函数,这两个使得我可以在其它地方去绑定具体的按钮事件。

使用:

这只是一个技能指示器按钮,相当于一个控制里面的 一个部分,而 王者荣耀的控制按钮中,左边的移动按钮永远是不变的,只是 右边的按钮会根据技能个数而改变,所以我讲右边的部分整体做成 一个预制体,根据技能个数来加载对应的预制体,所以控制 逻辑与实现逻辑分开是必要的。

这个使用如下:

using HedgehogTeam.EasyTouch;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using WydUtility.Extension;
using WangZhe.Battle.Charactor;
using WangZhe.UI;namespace WangZhe.Battle.UI
{public enum Skill_ID{ATK,Skill1,Skill2,Skill3,Skill4}public class BattleControlPanel : MonoBehaviour{protected ETCButton m_ATKBtn;protected ETCJoystick m_joystick;protected SkillIndicator[] m_skillIndicators;private void Awake(){m_joystick = GameObject.Find("CharaJoystic").GetComponent<ETCJoystick>();m_skillIndicators = transform.GetComponentsInChildren<SkillIndicator>();if (null == m_joystick)Debug.LogWarningFormat("未找到遥感");if (m_skillIndicators.Length <= 0)Debug.LogWarningFormat("未找到任何技能控制器");m_joystick.onMove.AddListener(OnJoysticMove);foreach(SkillIndicator si in m_skillIndicators){si.OnDrag.AddListener(new UnityAction(() => OnSkillStart(si)));}}protected virtual void OnJoysticMove(Vector2 moveDir){PlayerSystem.Instance.PlayerMove(moveDir);}protected virtual void OnSkillStart(SkillIndicator skillIndicator){Vector2 skillDir = skillIndicator.DragDir;float skillDisPercent = skillIndicator.DragDisPersent;PlayerSystem.Instance.SkillReleasBegin(skillDir, skillDisPercent);}protected virtual void OnSkillRelease(){}protected virtual void InitOnAwake() { }}
}

当这个按钮使用的时候回去通知PlayerSystem去实现相对应的技能效果。

效果:

​​​​​​​

Unity 自主学习之用设计模式模拟王者荣耀(三)-- Easytouch实现技能指示器相关推荐

  1. Unity 自主学习之用设计模式模拟王者荣耀 (一)-- 状态模式实现张飞开大

    前言:笔者最近由于学习了一些开发模式,觉得里面有很多模式非常有趣,而正好本人又喜欢玩儿王者荣耀,所以就想着复制一下,看能不能做出来,笔者并不是大牛,这个只是个人对于设计模式的应用学习,只是目标是为了实 ...

  2. Unity 之 模拟王者荣耀七日签到系统

    Unity 之 模拟王者荣耀七日签到系统 一,效果图 二,制作思路 三,场景搭建 四,代码实现 五,拓展补签版本 一,效果图 不带补签版本: 二,制作思路 使用切换图片背景颜色的方式,进行状态转换[灰 ...

  3. Flex布局模拟王者荣耀皮肤抽奖

    Flex布局模拟王者荣耀皮肤抽奖 实现效果 项目目录结构 index.html <!DOCTYPE html> <html><head><meta chars ...

  4. 爬虫爬取王者荣耀 英雄故事 和技能

    初识爬虫 爬取王者荣耀英雄故事和技能 爬取王者荣耀英雄故事和技能 源码奉上 import requests import re import os from lxml import etree if ...

  5. unity怎么设置游戏页面_王者荣耀李小龙粤语语音包怎么得?李小龙粤语语音包获取与设置方法介绍[多图] - 游戏攻略...

    王者荣耀游戏中,李小龙有他的专属粤语语音,想要使用粤语语音先要获取语音包后才能设置,以下是王者荣耀李小龙皮肤粤语语音包获取与设置方法介绍. 王者荣耀李小龙皮肤粤语语音包获取与设置方法介绍: 王者荣耀裴 ...

  6. 初夏小谈: 模拟王者荣耀_荣耀水晶抽奖活动

    历时两星期,期间中断过,因为各种原因,不过还是坚持完成了.下来感觉很充实.话不多说看代码(约340行). //存在问题:当抽到荣耀水晶时,幸运值无法归0; //王者荣耀积分夺宝 #include< ...

  7. qlabel 边加载边更新_王者荣耀:这变态技能谁顶得住?游戏内更新机制优化!...

    王者荣耀官微发布了即将优化的游戏内更新机制,以后版本更新我们可以更快的启动游戏了.张大仙定制活动语音包上线,语音包是限时的,可以用3个月,喜欢的玩家可以在王者营地领取. 体验服的小伙伴又给我发了一波觉 ...

  8. javascript模拟王者荣耀升段位

    2019独角兽企业重金招聘Python工程师标准>>> 假设有100000个人参与游戏,每次按级别匹配,输赢随机,大概400局出至尊星耀I //author:zbg //2018-1 ...

  9. java 抽奖程序,自定义抽奖概率和奖品,模拟王者荣耀水晶抽奖

    一.定义奖品实体类 @Data @Builder public class LuckDrawRules {/*** id*/private Long id;/*** 奖品名称*/private Str ...

最新文章

  1. bzoj3993 [SDOI2015]星际战争
  2. 检测你处于程序员的哪个层级
  3. jsp的九大内置对象和四大作用域
  4. 创建vue-cli项目
  5. 波士顿房价数据集解读
  6. oppoJava面试!传智播客java基础案例教程
  7. Python with和contextlib.closing配合使用(contextlib)
  8. IBM “第8格(Debug)”开发者技术沙龙首站招募中,有胆你就来!
  9. ShadeGraph教程之节点详解4:Master Nodes
  10. httpclient在获取response的entity时报异常
  11. 老李分享:《Linux Shell脚本攻略》 要点(二)
  12. centos配置linuxptp
  13. Ubuntu16.04、Ubuntu18.04、Ubuntu20.04分区方案
  14. 【重点】Selenium + Nightwatch 自动化测试环境搭建
  15. Code Review(自评)
  16. UVa-11292 Dragon of Loowater (贪心)
  17. java中文编程_Java中文编程开发
  18. 计算机考研408每日一题 day76
  19. java正则表达式提取字符串中的中文信息
  20. 品创数字使用协议和隐私权政策

热门文章

  1. org.apache.poi Excel列与行都是动态生成的_今天才知道,Word、Excel、PPT翻译的方法,涨知识了...
  2. MMdetection之train_detector 源码解析
  3. java判断五张牌中有一对,五张同花顺概率,52张扑克牌,任取5张牌,求出现一对、两对、同花顺的概率。 请帮忙解决一下这道概率题,求详细的列出式......
  4. 目前金融理财直播有哪些分类?怎么做?
  5. 产品设计——必备网站(持续更新)
  6. Redis未授权访问漏洞(四)SSH key免密登录
  7. 树莓派搭建网站,并免费内网穿透发布上线到公网
  8. 在vue中使用antV-G2展示基础环状图
  9. 服务器 不断电系统,内建 UPS 不断电系统 Aurender ACS100 音乐服务器
  10. 虚幻4的标准命名规则(规范)