[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十二集:制作游戏的对话系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言     

  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值