当前位置:网站首页>unity初学6——简易的UI制作(血条制作)和音频加入以及NPC的对话气泡(2d)
unity初学6——简易的UI制作(血条制作)和音频加入以及NPC的对话气泡(2d)
2022-07-30 11:38:00 【林浮生】
该文来是学习chutianbo老师的笔记,链接b站
UI的创建
1.右键Hierarchy空白处 UIcanvas
2.这里一共使用了三个素材

层级结构
UI:初始画布
characters:头像
Mask:遮罩层
healthbar:血条
这里我们先回到UI(也就是一开始创建的Canvas)
我们一开始有用的应该只有渲染模式render Mode,他有三种模式
Screen Space - Overlay:这是默认模式,可以让 Unity 在始终在游戏的上层绘制 UI。大多数应用程序使用此模式,因为它们希望 UI 始终位于最上层以便提供所有信息。
Screen Space - Camera:这种模式在与摄像机对齐的平面上绘制 UI。平面的大小确定为始终填充整个屏幕,这样你就可以四处移动摄像机,并且平面将随摄像机一起移动,从而显示与 Overlay 图形相同的形状。但是,由于平面是在世界中绘制的,而不是在屏幕上层绘制的,因此世界中的对象可以绘制在 UI 的上层。
World Space:这种模式可在世界中的任何位置绘制平面。例如,你可以将此平面用作游戏中的计算机屏幕,或者用作墙壁,或者放在角色的上层。这在 3D 游戏中更有用,因为 UI 会随着距离变小。
3.关于拉动之后图像没有随着一起变化
这里就要使用锚点
就是头像四周的小三角形,它可以使我们的子物体在父物体固定的位置上随着父物体变化
4.遮罩层
第一步
第二步
第三步
把这个勾去掉
当然记得把锚点设好
这里
可以使用alt+右下角那个直接填充父物体,血条填充到遮罩层
5.bug时间
这样子做的话,在后面使用代码控制遮罩层缩减时会出现两端缩小,而不是血条向右减少的过程。
所以记得把Mask的pivot(就是中间那个蓝点)拉到left center(左边中间);
关于代码控制血条变化
主要思路是当血条变化时,遮罩层减少,使血条变短;
官方解释:遮罩是 UI 系统中的一种技术,利用这种技术可以将一张图像用作其他图像的“遮罩”。我们可以看成是第一张图像充当一个模板。第二张图像中与第一张图像重叠的部分是可见的,但另一部分则是隐藏的
创建一个UI脚本下挂到我们的HealthFrame
public class UIHealthBar : MonoBehaviour
{
// Start is called before the first frame update
//创建共有静态对象。获取血条本身
public static UIHealthBar Instance { get; private set; }
public Image Mask;
float orignalSize;
private void Awake()
{
Instance = this;
}
void Start()
{
//设置静态实例为当前类对象
orignalSize = Mask.rectTransform.rect.width;
}
//创建一个方法,用来设置现在mask遮罩层的宽度
public void SetValue(float value)
{
//设置更改mask遮罩层宽度,根据传输过来的宽度进行更改
Mask.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, orignalSize * value);
}
}
之后在我们主角血量变化函数中调用即可
UIHealthBar.Instance.SetValue(currentHealth / (float)maxHealth);
简易的音频使用
这里我们就会用到 Audio Source的组件
下面说起来比较重要的
AudioClip——加入的音乐素材
Mute——禁音
volume——音量
Play on awake——在游戏开始时播放
Spatial Blend 2d——3d 2d就是全图播放都是一个音量,可以用作bgm,越拉向3d就越立体,会出现方位和位置距离的差别
底下那个函数,指的就是最小距离1时音量达到最大,500时听不见音乐;
关于代码控制音频
和使用其他组件一样
- AudioSource audioSource;
- 在start中实例化 audioSource = GetComponent();
3.播放即可,clip即为音频,需要可以自己公开一个加进去;
public void PlaySound(AudioClip clip)
{
//可以有第二个参数音量0-1.0f
audioSource.PlayOneShot(clip);
}
关于NPC的气泡实现

这里主要使用了TextMeshPro 创建方式也是在UI中找到就行
下为结构图
Dialog:canvas
Image:外面那个背景画
Text:TextMeshPro
问题1:关于字数过长会溢出
在overflow中改为page即可
问题2:无法显示中文:
需要自己下字体包,或者去文章底部看老师的gitee中有下载链接
问题3:如何翻页:
使用代码控制,下附代码
脚本挂给NPC,事件发起交给主角;
public class NonPlayerCharacter : MonoBehaviour
{
public float displaytime=4.0f;
public GameObject dialogBox;
float timerDisplay;
public GameObject dlgTMP;
TextMeshProUGUI tmTxtBox;
int totalPages;
int currentPage = 1;
void Start()
{
dialogBox.SetActive(false);
timerDisplay = -1.0f;
tmTxtBox = dlgTMP.GetComponent<TextMeshProUGUI>();
}
private void Update()
{
totalPages = tmTxtBox.textInfo.pageCount;
if (timerDisplay >= 0)
{
timerDisplay -= Time.deltaTime;
if (Input.GetKeyUp(KeyCode.Space))
{
if (currentPage < totalPages)
{
currentPage++;
}
else
{
currentPage = 1;
}
tmTxtBox.pageToDisplay = currentPage;
}
}
else
{
dialogBox.SetActive(false);
}
}
public void DisplayDialog()
{
timerDisplay = displaytime;
dialogBox.SetActive(true);
}
关于和NPC的互动实现
使用射线碰撞对象实现,我们的NPC对象需要放到NPC层(自己创一个layer);
if (Input.GetKeyDown(KeyCode.F))
{
RaycastHit2D hit =Physics2D.Raycast(rigidbody2dRuby.position+Vector2.up*0.2f,lookDirection,1.5f,LayerMask.GetMask("NPC"));
if(hit.collider!=null)
{
Debug.Log($"对象是{hit.collider.gameObject}");
NonPlayerCharacter npc = hit.collider.GetComponent<NonPlayerCharacter>();
if (npc != null)
{
npc.DisplayDialog();
}
}
}
边栏推荐
- 概率论的学习和整理7:理解期望和方差还是要回到随机试验本身,期望不是平均值,方差的公式不同情况不同
- The battle-hardened programmer was also deceived by a fake programmer from a certain fish. The trust between programmers should be the highest, and he alone destroyed this sense of trust
- 开源出来的fuse版pfs文件系统主要就是解决缓存问题吧。nfs挂载参数带sync规避缓存问题是不是
- 基于加权灰色关联投影的Bagging-Blending多模型融合短期电力负荷预测
- Verilog grammar basics HDL Bits training 07
- 牛客-TOP101-BM42
- Redis master-slave replication
- Scheduling of combined electric-heating system based on multi-objective two-stage stochastic programming method
- Redis 主从复制
- Assembly to implement bubble sort
猜你喜欢

概率论得学习整理--番外3:二项式定理和 二项式系数

High energy output!Tencent's internal MyCat middleware manual, both theoretical and practical

概率论的学习和整理7:理解期望和方差还是要回到随机试验本身,期望不是平均值,方差的公式不同情况不同

24. 两两交换链表中的节点

The battle-hardened programmer was also deceived by a fake programmer from a certain fish. The trust between programmers should be the highest, and he alone destroyed this sense of trust

概率论的学习整理--番外2:和二项式,组合相关的杨辉三角

久经沙场的程序员居然也被某鱼的假程序员骗了,程序员之间的信任应该是最高的,他一个人毁了这种信任感

C language - bitwise operations

Apifox 生成接口文档 教程与操作步骤

反转链表-迭代反转法
随机推荐
English line break
概率论的学习整理5:贝叶斯(bayes)法则和贝叶斯概率
Verilog语法基础HDL Bits训练 08
原生js 创建表格
SCM engineers written questions induction summary
又爆神作!阿里爆款MySQL高级宝典开源,直抵P7
2022-07-29 Gu Yujia Study Notes Exception Handling
Bagging-Blending Multi-Model Fusion Short-Term Electricity Load Forecasting Based on Weighted Grey Correlation Projection
HJY-F931A/YJ three-phase voltage relay
柔性机械系统分布参数建模及其控制的研究与进展
HJY-F931A/YJ三相电压继电器
小心 transmittable-thread-local 的这个坑
contentDocument contentWindow,canvas 、svg,iframe
Verilog grammar basics HDL Bits training 07
基于空间特征选择的水下目标检测方法
How to add data to the request header when feign is called remotely
微信视频号视频如何下载提取?视频号直播回放如何下载?方法很简单!
C# 时间戳与时间的互相转换
Js - 内置对象
Voltage relay h2d SRMUVS - 100 vac - 2