[Unity-3D] Quest Log 公告牌

Unity3d - Quest Log 公告牌


先看看预览图吧~
预览图
(emmm不知道为什么csdn上传的gif有点问题,上传的gif中第三条公告内容的隐藏和显示本应是正常的.可以移步我的github浏览一下真·效果.)

第一步 建立场景

首先,新建canvas,在canvas下新建一个scoll view(滚动视图)。然后在Scroll View -> Viewport -> Content下添加垂直列表组件vertical layout group,再添加三个Button和Text用于显示公告。
新建canvas

然后调一调垂直列表Vertical Layout Group中的间距还有自适应宽高等的属性。
调整Vertical Layout Group

再调一调公告牌Scroll View的大小。
调整Scroll View

给canvas添加image组件,用来显示背景图片。注意的是,添加图片时要将其Texture Type变为Sprite(2D and UI),不然等下无法添加图片。此外,也可以给公告牌Scroll View添加背景图片。
添加image

接下来界面设计就差不多了,可以按照个人喜好调整一下button和text的文字颜色大小、button的图片等等,由于这次时间比较紧张就=_=随意一点了。另外如果文本没有完整显示的话可以调整一下text的高度,还有显示位置不够的话也可以调整Vertical Layout Group的高度。调整完后效果是这样的:
效果图

第二步 实现公告内容的显示和隐藏

这一部分的目的是实现公告内容的隐藏(收缩)和显示(展开)。从师兄的博客中,我了解到了C#一个很强大而且很实用的接口IEnumerator——协程。简单来说,协程就是:你可以写一段顺序的代码,然后标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码。具体使用方法如下:

IEnumerator LongComputation()
{
    while(someCondition)
    {
        /* 做一系列的工作 */
        // 在这里暂停然后在下一帧继续执行
        yield return null;
    }
}

IEnumerator迭代器和yield关键字需要配合使用,有兴趣的可以多了解一下:Unity3d IEnumerator 协程的理解
那么具体到这里的使用,我们可以通过逐一帧改变公告内容的高度来实现显示隐藏功能。废话不多说,直接上代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Board : MonoBehaviour {

    // 分别对应点击的按钮和缩放的文本内容
    private Button button;
    public Text text;

    // 公告文本的高度
    private float height;

    // 公告内容变化帧数
    private int frame = 20;


    void Start()
    {
        // 获取button,添加监听事件
        button = this.gameObject.GetComponent<Button>();
        button.onClick.AddListener(showOrHide);

        // 并获取公告文本的高度,以便还原
        height = text.rectTransform.sizeDelta.y;
    }

    void showOrHide()
    {
        // 判断公告文本是否激活,分别选择隐藏或显示
        if (text.gameObject.activeSelf)
            StartCoroutine(hide());
        else
            StartCoroutine(show());

    }

    IEnumerator hide()
    {
        float h = height;

        for (int i = 0; i < frame; i++)
        {
            h -= height / frame;
            text.rectTransform.sizeDelta = new Vector2(text.rectTransform.sizeDelta.x, h);
            // 在这停顿,下一帧再执行
            yield return null;
        }

        text.gameObject.SetActive(false);
        // 禁用文本
    }

    IEnumerator show()
    {
        float h = 0;
        text.gameObject.SetActive(true);
        // 激活文本

        for (int i = 0; i < frame; i++)
        {
            h += height / frame;            
            text.rectTransform.sizeDelta = new Vector2(text.rectTransform.sizeDelta.x, h);
            // 在这停顿,下一帧再执行
            yield return null;
        }

    }
}

这一部分的代码不多,而且比较容易理解。脚本完成之后挂在各个按钮上面,就大功告成了!


一些废话:公告牌的工作量相比其他几个可选任务其实少很多,本来想做背包系统的,但是发现留给毛概的时间不多了,六个学分的课还是不敢浪,还是赶紧做完去看书吧TAT。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值