Unity 自主学习之用设计模式模拟王者荣耀(三)-- Easytouch实现技能指示器
技能指示器就是王者荣耀里面的技能按钮,这个按钮在点击之前是一个按钮的样子,但是点击之后,技能图标会缩小一定大小,并且会出现一个可以拖动的范围按钮,更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实现技能指示器相关推荐
- Unity 自主学习之用设计模式模拟王者荣耀 (一)-- 状态模式实现张飞开大
前言:笔者最近由于学习了一些开发模式,觉得里面有很多模式非常有趣,而正好本人又喜欢玩儿王者荣耀,所以就想着复制一下,看能不能做出来,笔者并不是大牛,这个只是个人对于设计模式的应用学习,只是目标是为了实 ...
- Unity 之 模拟王者荣耀七日签到系统
Unity 之 模拟王者荣耀七日签到系统 一,效果图 二,制作思路 三,场景搭建 四,代码实现 五,拓展补签版本 一,效果图 不带补签版本: 二,制作思路 使用切换图片背景颜色的方式,进行状态转换[灰 ...
- Flex布局模拟王者荣耀皮肤抽奖
Flex布局模拟王者荣耀皮肤抽奖 实现效果 项目目录结构 index.html <!DOCTYPE html> <html><head><meta chars ...
- 爬虫爬取王者荣耀 英雄故事 和技能
初识爬虫 爬取王者荣耀英雄故事和技能 爬取王者荣耀英雄故事和技能 源码奉上 import requests import re import os from lxml import etree if ...
- unity怎么设置游戏页面_王者荣耀李小龙粤语语音包怎么得?李小龙粤语语音包获取与设置方法介绍[多图] - 游戏攻略...
王者荣耀游戏中,李小龙有他的专属粤语语音,想要使用粤语语音先要获取语音包后才能设置,以下是王者荣耀李小龙皮肤粤语语音包获取与设置方法介绍. 王者荣耀李小龙皮肤粤语语音包获取与设置方法介绍: 王者荣耀裴 ...
- 初夏小谈: 模拟王者荣耀_荣耀水晶抽奖活动
历时两星期,期间中断过,因为各种原因,不过还是坚持完成了.下来感觉很充实.话不多说看代码(约340行). //存在问题:当抽到荣耀水晶时,幸运值无法归0; //王者荣耀积分夺宝 #include< ...
- qlabel 边加载边更新_王者荣耀:这变态技能谁顶得住?游戏内更新机制优化!...
王者荣耀官微发布了即将优化的游戏内更新机制,以后版本更新我们可以更快的启动游戏了.张大仙定制活动语音包上线,语音包是限时的,可以用3个月,喜欢的玩家可以在王者营地领取. 体验服的小伙伴又给我发了一波觉 ...
- javascript模拟王者荣耀升段位
2019独角兽企业重金招聘Python工程师标准>>> 假设有100000个人参与游戏,每次按级别匹配,输赢随机,大概400局出至尊星耀I //author:zbg //2018-1 ...
- java 抽奖程序,自定义抽奖概率和奖品,模拟王者荣耀水晶抽奖
一.定义奖品实体类 @Data @Builder public class LuckDrawRules {/*** id*/private Long id;/*** 奖品名称*/private Str ...
最新文章
- bzoj3993 [SDOI2015]星际战争
- 检测你处于程序员的哪个层级
- jsp的九大内置对象和四大作用域
- 创建vue-cli项目
- 波士顿房价数据集解读
- oppoJava面试!传智播客java基础案例教程
- Python with和contextlib.closing配合使用(contextlib)
- IBM “第8格(Debug)”开发者技术沙龙首站招募中,有胆你就来!
- ShadeGraph教程之节点详解4:Master Nodes
- httpclient在获取response的entity时报异常
- 老李分享:《Linux Shell脚本攻略》 要点(二)
- centos配置linuxptp
- Ubuntu16.04、Ubuntu18.04、Ubuntu20.04分区方案
- 【重点】Selenium + Nightwatch 自动化测试环境搭建
- Code Review(自评)
- UVa-11292 Dragon of Loowater (贪心)
- java中文编程_Java中文编程开发
- 计算机考研408每日一题 day76
- java正则表达式提取字符串中的中文信息
- 品创数字使用协议和隐私权政策
热门文章
- org.apache.poi Excel列与行都是动态生成的_今天才知道,Word、Excel、PPT翻译的方法,涨知识了...
- MMdetection之train_detector 源码解析
- java判断五张牌中有一对,五张同花顺概率,52张扑克牌,任取5张牌,求出现一对、两对、同花顺的概率。 请帮忙解决一下这道概率题,求详细的列出式......
- 目前金融理财直播有哪些分类?怎么做?
- 产品设计——必备网站(持续更新)
- Redis未授权访问漏洞(四)SSH key免密登录
- 树莓派搭建网站,并免费内网穿透发布上线到公网
- 在vue中使用antV-G2展示基础环状图
- 服务器 不断电系统,内建 UPS 不断电系统 Aurender ACS100 音乐服务器
- 虚幻4的标准命名规则(规范)