1.环形进度条

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

2.图形匹配

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI; /// <summary>
/// 被拖拽的慷慨块
/// </summary>
public class DragBrick : MonoBehaviour { private List<Transform> childrenTra = new List<Transform>();//慷慨块下的小方块
private List<GameObject> targetGo = new List<GameObject>();//小方块匹配的空方块
private GameObject[] tempGo;
private Vector3 posOffset; void Start()
{
Transform[] tra = transform.GetComponentsInChildren<Transform>();
for (int i = 1; i < tra.Length; i++)//tra[0]是自身。故不算上
childrenTra.Add(tra[i]);
} public void DragStart()
{
posOffset = transform.position - Input.mousePosition;
transform.SetAsLastSibling();
} public void DragUpdate()
{
transform.position = Input.mousePosition + posOffset;
} /// <summary>
/// 注意点:
/// 1.被射线检測的物体要带有Collider
/// 2.被射线检測的物体的z轴 > 发出射线检測的物体的z轴
/// 3.当没有给Raycast函数传layerMask參数时,只只忽略使用IgnoreRaycast层的碰撞器。 /// </summary>
public void DragEnd()
{
tempGo = new GameObject[childrenTra.Count];
int suitableBrickAmount = 0;//能正确匹配的砖块数目 for (int i = 0; i < childrenTra.Count; i++)
{
RaycastHit hit;
if (Physics.Raycast(childrenTra[i].position, Vector3.forward, out hit))
{
tempGo[i] = hit.transform.gameObject;
suitableBrickAmount++;
}
else break;
} if (suitableBrickAmount == childrenTra.Count)//全然匹配
{
if (targetGo.Count == 0)//初次全然匹配
{
Match();
}
else//已经全然匹配,再次全然匹配
{
Clear();
Match();
}
}
else//不能全然匹配
{
Clear();
}
} void Match()
{
for (int i = 0; i < tempGo.Length; i++)
{
targetGo.Add(tempGo[i]);
targetGo[i].layer = 2;//忽略射线碰撞
Vector3 pos = targetGo[i].transform.position;
pos.z--;
childrenTra[i].position = pos;
childrenTra[i].GetComponent<Outline>().enabled = true;
}
} void Clear()
{
for (int i = 0; i < targetGo.Count; i++)
targetGo[i].layer = 0;
targetGo.Clear(); for(int i = 0;i < childrenTra.Count;i++)
childrenTra[i].GetComponent<Outline>().enabled = false;
}
}

3.多重血条

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

描写叙述:

1.当受到伤害较小时,出现“残血”效果

2.当受到伤害较大时,出现“流水”效果

3.多重血条主要由四种血条组成:

a.最底层血条

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

b.当前血条与下一血条,就像下图中的紫色和红色

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

c.过渡血条,一般为深红色

using UnityEngine;
using System.Collections;
using UnityEngine.UI; //假设仅仅有一条血。那么一条血就是全部的血量
//假设有多条血。那么一条血就设定为一个固定值
public class MultiplyBloodBar : MonoBehaviour { public Image nowBar;//当前血条
public Image middleBar;//过渡血条
public Image nextBar;//下一血条
public Text countText;//剩下的血条数text private int count;//剩下的血条数(不包含当前血量)
private float nowBlood;//在一条血中的当前血量。如:100/1000则为100
private float oneBarBlood = 10000f;//一条血的容量,如:100/1000则为1000 private int colorIndex = 0;
public Color[] colors;//血条的颜色,注意Alpha值。默觉得0 private float slowSpeed = 0.1f;//受到重伤时( >oneBarBlood)或者处于加血状态,当前血条的流动速度
private float quickSpeed = 1f;//受到轻伤时( <oneBarBlood),当前血条的流动速度
private float speed;//当前血条採用的速度
private float middleBarSpeed = 0.1f;//过渡血条的流动速度 private float nowTargetValue;//当前血条移动的目标点
private float middleTargetValue;//过渡血条移动的目标点
private bool isBloodMove = false;//控制血条的移动 void Update()
{
MoveNowBar();//当前血条的流动
MoveMiddleBar();//过渡血条的流动
} /// <summary>
/// 传入总血量。初始化血条
/// </summary>
/// <param name="number"></param>
public void InitBlood(float number)
{
count = (int)(number / oneBarBlood);
nowBlood = number % oneBarBlood;
if (nowBlood == 0)
{
nowBlood = oneBarBlood;
count--;
} colorIndex = count % colors.Length;
nowBar.color = colors[colorIndex];
nowBar.fillAmount = nowBlood / oneBarBlood; if (count != 0)
{
int nextColorIndex = (colorIndex - 1 + colors.Length) % colors.Length;
nextBar.color = colors[nextColorIndex];
nextBar.gameObject.SetActive(true);
}
else
{
nextBar.gameObject.SetActive(false);
} middleBar.gameObject.SetActive(false); countText.text = count + "";
} /// <summary>
/// 血量变化,并依据伤害推断是否使用过渡血条
/// </summary>
/// <param name="number"></param>
public void ChangeBlood(float number)
{
nowBlood += number;
nowTargetValue = nowBlood / oneBarBlood;
isBloodMove = true; if ((number < 0) && (Mathf.Abs(number) <= oneBarBlood))//处于受伤状态而且伤害量较低时
{
speed = quickSpeed;
middleBar.gameObject.SetActive(true);
middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 1);
middleBar.fillAmount = nowBar.fillAmount;
middleTargetValue = nowTargetValue;
}
else//处于受伤状态而且伤害量较大时。或者处于加血状态
{
speed = slowSpeed;
middleBar.gameObject.SetActive(false);
}
} /// <summary>
/// 普通血条的流动
/// </summary>
void MoveNowBar()
{
if (!isBloodMove) return; nowBar.fillAmount = Mathf.Lerp(nowBar.fillAmount, nowTargetValue, speed); if (Mathf.Abs(nowBar.fillAmount - nowTargetValue) < 0.01f)//到达目标点
isBloodMove = false; if (count == 0)
nextBar.gameObject.SetActive(false);
else
nextBar.gameObject.SetActive(true); if (nowBar.fillAmount >= nowTargetValue)
SubBlood();
else
AddBlood();
} /// <summary>
/// 过渡血条的流动
/// </summary>
void MoveMiddleBar()
{
//受到轻伤时( <oneBarBlood)。才会出现过渡血条
if (speed == quickSpeed)
{
middleBar.fillAmount = Mathf.Lerp(middleBar.fillAmount, middleTargetValue, middleBarSpeed);
if (Mathf.Abs(middleBar.fillAmount - 0) < 0.01f)
{
middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 1);
middleBar.fillAmount = 1;
middleTargetValue++;
}
}
} void AddBlood()
{
float subValue = Mathf.Abs(nowBar.fillAmount - 1);
if (subValue < 0.01f)//到达1
{
count++;
countText.text = count.ToString(); nowBar.fillAmount = 0;
nowTargetValue -= 1;
nowBlood -= oneBarBlood; nextBar.color = colors[colorIndex]; colorIndex++;
colorIndex %= colors.Length;
nowBar.color = colors[colorIndex];
}
} void SubBlood()
{
float subValue = Mathf.Abs(nowBar.fillAmount - 0);
if (subValue < 0.01f)//到达0
{
//当前血条已经流动完,将过渡血条放置最前
middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 2); if (count <= 0)
{
middleBar.gameObject.SetActive(false);
Destroy(this);
return;
};
count--;
countText.text = count.ToString(); nowBar.fillAmount = 1;
nowTargetValue += 1;
nowBlood += oneBarBlood; colorIndex--;
colorIndex += colors.Length;
colorIndex %= colors.Length;
nowBar.color = colors[colorIndex]; int nextColorIndex = colorIndex - 1 + colors.Length;
nextColorIndex %= colors.Length;
nextBar.color = colors[nextColorIndex];
}
} }

[UnityUI]一些有趣的UI样例的更多相关文章

  1. bootstrap ui样例

    http://demo.codedefault.com/demo/ui/theadmin/samples/invoicer/settings.html

  2. JAVA简单Swing图形界面应用演示样例

    JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...

  3. C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  4. shell脚本实例-菜单样例

    1.9.1 实例需求 用户在进行Linux系统管理的过程中,经常需要用到查看进程的信息.用户的信息等常用的功能.本例针对这一需求,使用shell编程实现基本的系统管理 功能.通过本程序,可以按照要求实 ...

  5. Android平台调用Web Service:演示样例

    近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ...

  6. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  7. JavaFX 简单3D演示样例

    从Java8開始,在JavaFX中便添加了3D部分的内容,包含Camera,Material,Light,Shape3D等基础内容. 当然,JavaFX 3D应该是OpenJFX里眼下正在补充和完好的 ...

  8. [持续交付实践] pipeline使用:项目样例

    项目说明 本文将以一个微服务项目的具体pipeline样例进行脚本编写说明.一条完整的pipeline交付流水线通常会包括代码获取.单元测试.静态检查.打包部署.接口层测试.UI层测试.性能专项测试( ...

  9. Android中MVP模式与MVC模式比較(含演示样例)

    原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...

随机推荐

  1. Centos7 安装python3详细教程,解决升级后不兼容问题

    一.确认当前python版本 [root@centos Python-3.6.1]# python Python 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC ...

  2. Builder(构造者)

    Builder(构造者) <?php class Product { private $name; public function setName($name) { $this->name ...

  3. centos 7安装libreoffice

    centos 7安装libreoffice Centos下的LibreOffice安装: 关键字: LibreOffice , sdk ,汉化  ,解压 安装Centos7之后,系统安装了libreo ...

  4. nginx报错504

    Nginx 504错误(Gateway time-out  网关超时)的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的f ...

  5. Python 频繁读取Mysql相关问题

    1.需要频繁select大量数据,时间长.消耗内存大,如何解决mysql性能问题? 如果对返回的结果数量没有要求,可以控制返回的数量: cursor.fetchmany(size=1000) 这样是只 ...

  6. nginx进程属主问题讨论

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6107096.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点,如 ...

  7. BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治

    时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...

  8. [luoguP2219] [HAOI2007]修筑绿化带(单调队列)

    传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B- ...

  9. [luoguP2053] [SCOI2007]修车(最小费用最大流)

    传送门 网络流的建图真的好难! 将一个点拆分成多个点的思想还需要加强. 题解 代码和题解中的图略不一样. #include <queue> #include <cstdio> ...

  10. 刷题总结——shortest(ssoi)

    题目: 题目背景 SOURCE:NOIP2015-SHY-3 题目描述 给定一张 n 个点的有向带权完全图,和一个数组 a[] ,请按顺序删除数组中的点,请求出在删除点 a[i] 以前,所有未删除点对 ...