提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
hello大家好久没见,之所以隔了这么久才更新并不是因为我又放弃了这个项目,而是接下来要制作的工作太忙碌了,每次我都花了很长的时间解决完一个部分,然后就没力气打开CSDN写文章就直接睡觉去了,而且还有就是我上上一期写了一万字的内容结果系统出BUG给我没保存直接气晕了,现在刚刚醒来终于有时间整理下我新制作的内容了,还有就是感谢兄弟们的评论支持,我看到评论区有个哥们说让我讲讲游戏的车站系统,我只能说哥们如果你想看的话我还没那么快写这部分的文章,如果你真想看的话可以到我的github下载,我刚好已上传到最新:
GitHub - ForestDango/Hollow-Knight-Demo: A new Hollow Knight Demo after 2 years!
这一期我们就顺着上一期继续讲我们的HUD部分,那就是我们的对话系统,游戏中除了NPC,还有很多东西都是可以产生对话的,所以我们先从简单的物品举例,接下来在下一期我会讲解如何制作NPC系统。
一、制作游戏的对话系统
1.通过转移点的门讲解制作对话系统
别看这一篇只有两个小节,内容还是量大管饱的,所以我才决定分两期来讲对话系统和NPC系统。
在第十四集中,我说过转移点除了上下左右以外还有一个门,也就是玩家要按额外的按键(比如上键)才能进入的,但你总不可能什么UI提示都不给让玩家不知道这是一个可以进的门,因此我才决定制作一个包含多个文字提示的对话框名字叫Arrow Prompt New,可以看到它非常简单,它有一个名字叫Prompt Cln的tk2dsprite和tk2dspriteAnimator,我们先去做好它:
动画我就挑这期要用到的几个片段来讲吧:
下面是车站相关的动画:
这个是选择是与否的对话框的底部:
这个是选择是与否的对话框的头部:
回到Arrow Prompt New来,我们来看看它的子对象,首先是一个阴影的Shadow会让这个对话提示框看起来更立体点,
然后Labels则是我上面说的显示哪个文字提示的文件夹,可以看到我已经制作了Enter进入,Inspect监视....Travel旅行等文字,然后它们使用的场合也是不一样的,以Enter为例,如果你进入门他就会选择这个文字而不是其它文字到对话框中,
然后Labels有一个脚本叫.cs可以根据时间参数渐变的显示文字和spriterenderer的内容:
using System;
using TMPro;
using UnityEngine;
public class FadeGroup : MonoBehaviour
{
public SpriteRenderer[] spriteRenderers;
public TextMeshPro[] texts;
public InvAnimateUpAndDown[] animators;
public float fadeInTime = 0.2f;
public float fadeOutTime = 0.2f;
public float fadeOutTimeFast = 0.2f;
public float fullAlpha = 1f;
public float downAlpha;
public bool activateTexts;
private int state;
private float timer;
private Color currentColour;
private Color fadeOutColour = new Color(1f, 1f, 1f, 0f);
private Color fadeInColour = new Color(1f, 1f, 1f, 1f);
private float currentAlpha;
public bool disableRenderersOnEnable;
private void OnEnable()
{
if (disableRenderersOnEnable)
{
DisableRenderers();
}
}
private void Update()
{
if (state != 0)
{
float t = 0f;
if (state == 1) //将所有spriteRenderers和texts的alpha设置为upalpha
{
timer += Time.deltaTime;
if (timer > fadeInTime)
{
timer = fadeInTime;
state = 0;
for (int i = 0; i < spriteRenderers.Length; i++)
{
if (spriteRenderers[i] != null)
{
Color color = spriteRenderers[i].color;
color.a = fullAlpha;
spriteRenderers[i].color = color;
}
}
for (int j = 0; j < texts.Length; j++)
{
if (texts[j] != null)
{
Color color2 = texts[j].color;
color2.a = fullAlpha;
texts[j].color = color2;
}
}
}
t = timer / fadeInTime;
}
else if (state == 2) //将所有spriteRenderers和texts的alpha设置为downalpha
{
timer -= Time.deltaTime;
if (timer < 0f)
{
timer = 0f;
state = 0;
if (downAlpha > 0f)
{
for (int k = 0; k < spriteRenderers.Length; k++)
{
if (spriteRenderers[k] != null)
{
Color color3 = spriteRenderers[k].color;
color3.a = downAlpha;
spriteRenderers[k].color = color3;
}
}
for (int l = 0; l < texts.Length; l++)
{
if (texts[l] != null)
{
Color color4 = texts[l].color;
color4.a = downAlpha;
texts[l].color = color4;
}
}
}
else
{
DisableRenderers();
}
}
t = timer / fadeOutTime;
}
if (state != 0)
{
currentAlpha = Mathf.Lerp(downAlpha, fullAlpha, t);
for (int m = 0; m < spriteRenderers.Length; m++)
{
if (spriteRenderers[m] != null)
{
Color color5 = spriteRenderers[m].color;
color5.a = currentAlpha;
spriteRenderers[m].color = color5;
}
}
for (int n = 0; n < texts.Length; n++)
{
if (texts[n] != null)
{
Color color6 = texts[n].color;
color6.a = currentAlpha;
texts[n].color = color6;
}
}
}
}
}
/// <summary>
/// 将所有的spriterender和text都设置为透明alpha = 0
/// </summary>
public void FadeUp()
{
timer = 0f;
state = 1;
for (int i = 0; i < spriteRenderers.Length; i++)
{
if (spriteRenderers[i] != null)
{
Color color = spriteRenderers[i].color;
color.a = 0f;
spriteRenderers[i].color = color;
spriteRenderers[i].enabled = true;
}
}
for (int j = 0; j < texts.Length; j++)
{
if (texts[j] != null)
{
Color color2 = texts[j].color;
color2.a = 0f;
texts[j].color = color2;
texts[j].gameObject.GetComponent<MeshRenderer>().SetActiveWithChildren(true);
}
}
for (int k = 0; k < animators.Length; k++)
{
if (animators[k] != null)
{
animators[k].AnimateUp();
}
}
}
/// <summary>
/// 将所有的spriterender和text都设置为透明alpha = 1
/// </summary>
public void FadeDown()
{
timer = fadeOutTime;
state = 2;
for (int i = 0; i < animators.Length; i++)
{
if (animators[i] != null)
{
animators[i].AnimateDown();
}
}
}
/// <summary>
/// 将所有的spriterender和text都快速的设置为透明alpha = 1
/// </summary>
public void FadeDownFast()
{
timer = fadeOutTimeFast;
state = 2;
for (int i = 0; i < animators.Length; i++)
{
if (animators[i] != null)
{
animators[i].AnimateDown();
}
}
}
private void DisableRenderers()
{
for (int i = 0; i < spriteRenderers.Length; i++)
{
if (spriteR