【unity 保卫星城】--- 开发笔记

  • 一、武器轮盘
    • 1.轮盘的旋转
    • 2.选择的武器
    • 3.完成轮盘隐藏和显示

-做完前三个武器,第四个武器准备在前三个武器测试完成没问题后再添加,但再测试前,武器直接是可以切换的。
-没错,通过轮盘拨动来切换你想要的武器。

-美术素材有了,咱先来分析下轮盘都要实现的功能吧
·1.轮盘能够向上和向下旋转
·2.粉框里的为你想选中的武器
·3.轮盘在不点击的时候

一、武器轮盘

1.轮盘的旋转

一开始,我是想轮盘旋转嘛,就控制transform旋转不就行了,但在看完大佬们的博客后。。。(都感觉好难啊~)不是太复杂要用到一些插件要学,就是和我想要的功能不一样。
于是,放弃了我哪幼稚的想法,但偶然见到一位大佬的下拉列表,让我突发奇想,对哦,不让他真旋转,但我可以让他伪旋转啊~
至于什么是伪旋转:看上面的图,是由最底层(那个圆环地面和周围几个线)、中层(圆环上 8 个武器图标)、上层(那个粉色的武器选择图标)组成的。事实上,中层和上层是不会动的,动的是底层背景的旋转,而中层只需要更改每个武器图标image 里 的精灵素材 就能达到伪旋转,而武器选择永远选的都是右上角第二的武器,只需要根据这个图片的精灵名字就能得到当前你要选择的武器。

有了思路,做起来就简单多了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;namespace ns
{///<summary>//////</summary>public class AttackScenePanel : UIBasePanel{private Image Image_Roate;private Image Image_Corona;private Image[] Image_Weapons = new Image[8];private Text[] Text_Weapons = new Text[8];private Image Image_Select;void Start(){Image_Corona = GetControl<Image>("Image_Corona");for(int i = 0; i < 8; i++){Image_Weapons[i] = GetControl<Image>("Image_" + (i + 1).ToString());}for (int i = 0; i < 8; i++){Text_Weapons[i] = Image_Weapons[i].gameObject.transform.GetComponentInChildren<Text>();}Image_Select = GetControl<Image>("Image_Select");EventCenter.GetInstance().AddEventListener<int>("鼠标某键点击UI", GetMouseButtonDown);EventCenter.GetInstance().AddEventListener<int>("鼠标某键抬起", GetMouseButtonUp);ChangePanelColor(isMouseDown);// TODO 每种弹药的数量初始化SwitchPalyerWeapon();}void Update(){DargToMove();}#region 转盘 旋转 隐藏private Vector3 lastMousePosition = Vector3.zero;private bool isMouseDown = false;private float angleSpeed = 500f;private void DargToMove(){if (isMouseDown){if (lastMousePosition != Vector3.zero){//取得两次滑鼠的坐标相减Vector3 offset = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastMousePosition;if(offset.y > 0.08){ChangePanelColor(isMouseDown);// 轮盘向上旋转Sprite temp = null;string text = null;for (int i = 0; i < 7; i++){if (i == 0){temp = Image_Weapons[i].sprite;text = Text_Weapons[i].text;}Image_Weapons[i].sprite = Image_Weapons[i + 1].sprite;Text_Weapons[i].text = Text_Weapons[i + 1].text;if (i == 6){Image_Weapons[i + 1].sprite = temp;Text_Weapons[i + 1].text = text;}}Image_Corona.gameObject.transform.Rotate(Vector3.forward * Time.deltaTime * angleSpeed, Space.Self);// 屏幕坐标改变成世界坐标lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);}else if(offset.y < -0.08){ChangePanelColor(isMouseDown);// 轮盘向下旋转Sprite temp = null;string text = null;for (int i = 7; i > 0 ; i--){if (i == 7){temp = Image_Weapons[i].sprite;text = Text_Weapons[i].text;}Image_Weapons[i].sprite = Image_Weapons[i - 1].sprite;Text_Weapons[i].text = Text_Weapons[i - 1].text;if (i == 1){Image_Weapons[i - 1].sprite = temp;Text_Weapons[i - 1].text = text;}}Image_Corona.gameObject.transform.Rotate(Vector3.forward * Time.deltaTime * -angleSpeed, Space.Self);// 屏幕坐标改变成世界坐标lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);} }}}private void GetMouseButtonDown(int key){isMouseDown = true;// 屏幕坐标改变成世界坐标lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);}private void GetMouseButtonUp(int key){isMouseDown = false;ChangePanelColor(isMouseDown);SwitchPalyerWeapon();lastMousePosition = Vector3.zero;}private void SwitchPalyerWeapon(){int i = int.Parse(Image_Weapons[1].sprite.name);WeaponsManager.GetInstance().SwitchWeapon(i);}private float colorA = 0.3f;private void ChangePanelColor(bool isOn){if (isOn){Image_Corona.color = new Color(Image_Corona.color.r, Image_Corona.color.g, Image_Corona.color.b, 1);for (int i = 0; i < 8; i++){Image_Weapons[i].color = new Color(Image_Weapons[i].color.r, Image_Weapons[i].color.g, Image_Weapons[i].color.b, 1);Text_Weapons[i].color = new Color(Text_Weapons[i].color.r, Text_Weapons[i].color.g, Text_Weapons[i].color.b, 1);}Image_Select.color = new Color(Image_Select.color.r, Image_Select.color.g, Image_Select.color.b, 1);}else{Image_Corona.color = new Color(Image_Corona.color.r, Image_Corona.color.g, Image_Corona.color.b, colorA);for (int i = 0; i < 8; i++){Image_Weapons[i].color = new Color(Image_Weapons[i].color.r, Image_Weapons[i].color.g, Image_Weapons[i].color.b, colorA);Text_Weapons[i].color = new Color(Text_Weapons[i].color.r, Text_Weapons[i].color.g, Text_Weapons[i].color.b, colorA);}Image_Select.color = new Color(Image_Select.color.r, Image_Select.color.g, Image_Select.color.b, colorA);}}#endregion    }}

2.选择的武器

是在鼠标抬起的时候,获得武器图标的精灵名字,约定精灵名字为对应武器的数字,在通过武器系统调用。

private void GetMouseButtonUp(int key){isMouseDown = false;ChangePanelColor(isMouseDown);SwitchPalyerWeapon();lastMousePosition = Vector3.zero;}private void SwitchPalyerWeapon(){int i = int.Parse(Image_Weapons[1].sprite.name);WeaponsManager.GetInstance().SwitchWeapon(i);}

3.完成轮盘隐藏和显示

在旋转时和鼠标抬起时,调用改变轮盘颜色的函数,改变轮盘image -> Color 里的 a 的值。

private float colorA = 0.3f;private void ChangePanelColor(bool isOn){if (isOn){Image_Corona.color = new Color(Image_Corona.color.r, Image_Corona.color.g, Image_Corona.color.b, 1);for (int i = 0; i < 8; i++){Image_Weapons[i].color = new Color(Image_Weapons[i].color.r, Image_Weapons[i].color.g, Image_Weapons[i].color.b, 1);Text_Weapons[i].color = new Color(Text_Weapons[i].color.r, Text_Weapons[i].color.g, Text_Weapons[i].color.b, 1);}Image_Select.color = new Color(Image_Select.color.r, Image_Select.color.g, Image_Select.color.b, 1);}else{Image_Corona.color = new Color(Image_Corona.color.r, Image_Corona.color.g, Image_Corona.color.b, colorA);for (int i = 0; i < 8; i++){Image_Weapons[i].color = new Color(Image_Weapons[i].color.r, Image_Weapons[i].color.g, Image_Weapons[i].color.b, colorA);Text_Weapons[i].color = new Color(Text_Weapons[i].color.r, Text_Weapons[i].color.g, Text_Weapons[i].color.b, colorA);}Image_Select.color = new Color(Image_Select.color.r, Image_Select.color.g, Image_Select.color.b, colorA);}

最后再完善上其他的UI:

这是完整的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;namespace ns
{///<summary>//////</summary>public class AttackScenePanel : UIBasePanel{private Button Button_Pause;private Button Button_SwitchMove;private Button Button_CloseMusic;private Text Text_Money;private Slider Slider_Energy;private Image Image_Roate;private Image Image_Corona;private Image[] Image_Weapons = new Image[8];private Text[] Text_Weapons = new Text[8];private Image Image_Select;void Start(){Button_Pause = GetControl<Button>("Button_Pause");Button_SwitchMove = GetControl<Button>("Button_SwitchMove");Button_CloseMusic = GetControl<Button>("Button_CloseMusic");Text_Money = GetControl<Text>("Text_Money");Slider_Energy = GetControl<Slider>("Slider_Energy");Image_Roate = GetControl<Image>("Image_Roate");Image_Corona = GetControl<Image>("Image_Corona");for(int i = 0; i < 8; i++){Image_Weapons[i] = GetControl<Image>("Image_" + (i + 1).ToString());Debug.Log(Image_Weapons[i].gameObject.name);}for (int i = 0; i < 8; i++){Text_Weapons[i] = Image_Weapons[i].gameObject.transform.GetComponentInChildren<Text>();}Image_Select = GetControl<Image>("Image_Select");Button_Pause.onClick.AddListener(OnClick_Button_Pause);Button_SwitchMove.onClick.AddListener(OnClick_Button_SwitchMove);Button_CloseMusic.onClick.AddListener(OnClick_Button_CloseMusic);EventCenter.GetInstance().AddEventListener<int>("鼠标某键点击UI", GetMouseButtonDown);EventCenter.GetInstance().AddEventListener<int>("鼠标某键抬起", GetMouseButtonUp);EventCenter.GetInstance().AddEventListener<int>("子弹数减少", ChangeUIText);ChangePanelColor(isMouseDown);// TODO 每种弹药的数量初始化SwitchPalyerWeapon();}void Update(){if (Image_Roate != null)Image_Roate.transform.Rotate(Vector3.forward * -100 * Time.deltaTime);DargToMove();}#region 转盘 旋转 隐藏private Vector3 lastMousePosition = Vector3.zero;private bool isMouseDown = false;private float angleSpeed = 500f;private void DargToMove(){if (isMouseDown){if (lastMousePosition != Vector3.zero){//取得两次滑鼠的坐标相减Vector3 offset = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastMousePosition;if(offset.y > 0.08){ChangePanelColor(isMouseDown);// 轮盘向上旋转Sprite temp = null;string text = null;for (int i = 0; i < 7; i++){if (i == 0){temp = Image_Weapons[i].sprite;text = Text_Weapons[i].text;}Image_Weapons[i].sprite = Image_Weapons[i + 1].sprite;Text_Weapons[i].text = Text_Weapons[i + 1].text;if (i == 6){Image_Weapons[i + 1].sprite = temp;Text_Weapons[i + 1].text = text;}}Image_Corona.gameObject.transform.Rotate(Vector3.forward * Time.deltaTime * angleSpeed, Space.Self);// 屏幕坐标改变成世界坐标lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);}else if(offset.y < -0.08){ChangePanelColor(isMouseDown);// 轮盘向下旋转Sprite temp = null;string text = null;for (int i = 7; i > 0 ; i--){if (i == 7){temp = Image_Weapons[i].sprite;text = Text_Weapons[i].text;}Image_Weapons[i].sprite = Image_Weapons[i - 1].sprite;Text_Weapons[i].text = Text_Weapons[i - 1].text;if (i == 1){Image_Weapons[i - 1].sprite = temp;Text_Weapons[i - 1].text = text;}}Image_Corona.gameObject.transform.Rotate(Vector3.forward * Time.deltaTime * -angleSpeed, Space.Self);// 屏幕坐标改变成世界坐标lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);} }}}private void GetMouseButtonDown(int key){isMouseDown = true;// 屏幕坐标改变成世界坐标lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);}private void GetMouseButtonUp(int key){isMouseDown = false;ChangePanelColor(isMouseDown);SwitchPalyerWeapon();lastMousePosition = Vector3.zero;}private void SwitchPalyerWeapon(){int i = int.Parse(Image_Weapons[1].sprite.name);WeaponsManager.GetInstance().SwitchWeapon(i);}private float colorA = 0.3f;private void ChangePanelColor(bool isOn){if (isOn){Image_Corona.color = new Color(Image_Corona.color.r, Image_Corona.color.g, Image_Corona.color.b, 1);for (int i = 0; i < 8; i++){Image_Weapons[i].color = new Color(Image_Weapons[i].color.r, Image_Weapons[i].color.g, Image_Weapons[i].color.b, 1);Text_Weapons[i].color = new Color(Text_Weapons[i].color.r, Text_Weapons[i].color.g, Text_Weapons[i].color.b, 1);}Image_Select.color = new Color(Image_Select.color.r, Image_Select.color.g, Image_Select.color.b, 1);}else{Image_Corona.color = new Color(Image_Corona.color.r, Image_Corona.color.g, Image_Corona.color.b, colorA);for (int i = 0; i < 8; i++){Image_Weapons[i].color = new Color(Image_Weapons[i].color.r, Image_Weapons[i].color.g, Image_Weapons[i].color.b, colorA);Text_Weapons[i].color = new Color(Text_Weapons[i].color.r, Text_Weapons[i].color.g, Text_Weapons[i].color.b, colorA);}Image_Select.color = new Color(Image_Select.color.r, Image_Select.color.g, Image_Select.color.b, colorA);}}#endregion/// <summary>/// 改变发射子弹数 减少/// </summary>/// <param name="i"></param>private void ChangeUIText(int i){if (isMouseDown)return;if (i > 999)Text_Weapons[1].text = "999+";elseText_Weapons[1].text = i.ToString();}/// <summary>/// 游戏暂停按钮/// </summary>private bool isPause = false;private void OnClick_Button_Pause(){//TODO 游戏暂停isPause = isPause ? false : true;if(isPause)Time.timeScale = 0;elseTime.timeScale = 1;}/// <summary>/// 飞机移动切换按钮/// </summary>private void OnClick_Button_SwitchMove(){MovementManager.GetInstance().SwitchMoveMethod();}/// <summary>/// 关闭音乐按钮/// </summary>private void OnClick_Button_CloseMusic(){MusicManager.GetInstance().ChangeBKValue(0);MusicManager.GetInstance().ChangeSoundValue(0);}}}

【unity 保卫星城】--- 开发笔记08(UI轮盘)相关推荐

  1. 【unity 保卫星城】--- 开发笔记08(太空站篇)

    [unity 保卫星城]--- 开发笔记 保卫星城-太空站篇 一.太空站的功能 二.功能的实现 说起来保卫星城最重要的星城还没讲,其实星城就是一个太空站,而我们的任务就是保护太空站不被敌人破坏. 保卫 ...

  2. 【unity 保卫星城】--- 开发笔记01(飞机移动)

    [unity 保卫星城]--- 开发笔记 一.在UnityHub中创建2D项目,取名Defend_Star_City 二.导入MangerOfManger框架 三.在打包中,切换安卓开发模式 四.创建 ...

  3. 【unity 保卫星城】--- 开发笔记02(陀螺仪移动)

    [unity 保卫星城]--- 开发笔记 六.完善类图中的类的功能 1.飞机移动模块 第二版(完善了陀螺仪移动) 六.完善类图中的类的功能 1.飞机移动模块 第二版(完善了陀螺仪移动) using S ...

  4. 【unity 保卫星城】--- 开发笔记04(武器管理系统)

    [unity 保卫星城]--- 开发笔记 六.完善类图中的类的功能 3.武器管理的类 4.武器抽象类 六.完善类图中的类的功能 3.武器管理的类 using System.Collections; u ...

  5. 【unity 保卫星城】--- 开发笔记03(飞机类第一版)

    [unity 保卫星城]--- 开发笔记 六.完善类图中的类的功能 2.飞机的类 六.完善类图中的类的功能 2.飞机的类 先放到这后面再慢慢完善~ using System.Collections; ...

  6. 【unity 保卫星城】--- 开发笔记06(散弹 武器)

    [unity 保卫星城]--- 开发笔记 ~~ 战机武器库 ~~ 2.散弹 · 感觉把好多类,都写再 六 这个主题里,感觉主题会撑爆,所有还是再开个小框架吧. · 就叫战机武器库吧~ ~~ 战机武器库 ...

  7. 【unity 保卫星城】--- 开发笔记07(追踪导弹武器)

    [unity 保卫星城]--- 开发笔记 ~~ 战机武器库 ~~ 3.追踪导弹 ~~ 战机武器库 ~~ 3.追踪导弹 参考大佬的博客:https://blog.csdn.net/sdhexu/arti ...

  8. 【unity 保卫星城】--- 开发笔记05(普通子弹武器)

    [unity 保卫星城]--- 开发笔记 ~~ 战机武器库 ~~ 1.普通的子弹 · 感觉把好多类,都写再 六 这个主题里,感觉主题会撑爆,所有还是再开个小框架吧. · 就叫战机武器库吧~ ~~ 战机 ...

  9. 【unity 保卫星城】--- 开发笔记(Demo演示篇)

    [unity 保卫星城]- 开发笔记 保卫星城 一.游戏介绍 <保卫星城>是一款移动端2D横板射击类游戏,使用Unity3D引擎开,与一般的打飞机需要躲避子弹不同,本游戏需要玩家控制小飞机 ...

最新文章

  1. Java 一组温度从摄氏到华氏的转换
  2. 当系统扩展遇到违背OO的里氏原则(LSP)的时候怎么办 ?
  3. 【学习笔记】11、循环语句—while
  4. Notepad++ 插件之 TextFX (安装及作用)
  5. 找不到在标准的SAP C4C system字段里新增entry的办法
  6. Java消息队列总结只需一篇解决ActiveMQ、RabbitMQ、ZeroMQ、Kafka
  7. YbtOJ#763-攻城略池【线段树合并】
  8. java输入行数打印菱形_JAVA题,输入行数,输入列数,输出一个菱形
  9. Redis缓存组件开发规范
  10. HTML实现学习网站首页
  11. httpd-2.4实现虚拟主机、访问控制及https功能
  12. 从零开始学Android!渣本毕业两年经验,附超全教程文档
  13. oracle与mysql语法区别_mysql和oracle语法异同
  14. 【数学建模】基于matlab银行多机排队论模型【含Matlab源码 1096期】
  15. 2001年李彦宏DoNews三篇搜索引擎Blog
  16. 用74ls90组成二十四进制计数器_六十进制应该怎么怎么设计呢?
  17. BZOJ3689: 异或之
  18. 关闭浏览器自动退出账号
  19. 去百度还是去创新工厂? 信开复还是信彦宏?
  20. 图表制作办公首选--实用图表工具Echars

热门文章

  1. 详细区分offsetX,clientX,pageX,screenX,layerX和X的区别
  2. 解决Virtualbox安装系统界面显示不全问题
  3. 1.11——Go语言适合做什么
  4. Android 12原生壁纸下载
  5. 做Android开发摸鱼是要付出代价的,被主管劝退,我后悔了!
  6. 开源软件 商业软件_如何销售开源软件
  7. Matlab sim函数的用法
  8. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数
  9. 机器学习 - 人脸识别
  10. Spring Boot统一日志框架