unity制作一个可以自由滑动收缩的历史记录功能。

2023-11-20

公司在做一款模拟经营类的卖车游戏,需要一个简单的历史记录功能,放在左上角,记录最近20条的收入/支出记录。超过2秒不动则收起。收起时展示最近的一个消息记录。
用到的组件是ScrollView,使用方法可以参考我写过的一篇博客。ScrollView踩坑记录
要求:
1、像正常的聊天框那样,消息从上向下展示,界面最多展示五条,如果用户当前看的是最底部的消息,那么有新的收入/支出消息的时候,需要将最新一条添加到底部,并将其他消息向上移动一格。如果用户正在查询历史记录,那么正常添加即可。不需要添加到底部。
2、当用户两秒内对历史记录无任何操作时,收起历史记录,并展示最新一条消息,此后如果有最新记录,展示最新的记录。

先实现最简单的功能。
1、正常的添加历史记录。
在这里插入图片描述
先看下最简单的功能,可以正常添加,但是最新一条聊天记录并不会将其他消息顶上去。
如果想顶上去,需要加上几行代码

        Canvas.ForceUpdateCanvases();
        scrollRect.verticalNormalizedPosition = 0f;
        Canvas.ForceUpdateCanvases();

这个代码是强制刷新画布(不刷新会有延迟,出现错误的效果,此处为了简略就不掩饰了),并且将滑动条的垂直变量变成0(即到达底部)。
图2
如上图所示,现在虽然沉底了,但是当用户查询历史记录的时候,此时如果新加入一条记录,就会出现用户正翻着记录,却被沉底的情况,这种情况不符合要求,需要改。
此时可以加个判断,判断verticalNormalizedPosition 的值,注意不能和0对比,滑动后的verticalNormalizedPosition 会有一定的误差,可能是0.0000000几。
我这里觉得这样判断比较麻烦,没有深入研究。使用的是另一种方法。

第二种方法:
更改自身的中心点(pivot)。
当自身pivot点在中心时,自身变大,是向四周扩大,如果在上面,则向下面扩大,如果是在下面,那么则向上面扩大。
那么解决方法就出来了,当历史记录少于五条时,我们让他正常的向下增长。
当历史记录少于五条时,中心点在上方,当中心点大于等于五条时,中心点在上方,此时后续新增的历史记录需要调用SetAsLastSibling()方法,将最新的消息置于底部。
在这里插入图片描述
效果如上图所示。此处有一个注意点,当通过代码更改物体的中心点时,物体会发生抽搐,算是unity的一个BUG把,需要手动的给物的位置赋值。
完整代码:

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

public class HistoryView : MonoBehaviour
{
    /// <summary>
    /// 历史记录
    /// </summary>
    public List<string> historyStringList = new List<string>();

    public Button getButton1;

    public Button costButton1;

    public Button getButton2;

    public Button costButton2;

    /// <summary>
    /// 子类的父物体
    /// </summary>
    public Transform parentTransform;

    /// <summary>
    /// 预制体
    /// </summary>
    public GameObject historyItemPrefab;

    /// <summary>
    /// 滑动框
    /// </summary>
    public ScrollRect scrollRect;
    private void Awake()
    {
        getButton1.onClick.AddListener(() =>
        {
            AddHistory("+100");
        });
        getButton2.onClick.AddListener(() =>
        {
            AddHistory("+200");
        });
        costButton1.onClick.AddListener(() =>
        {
            AddHistory("-100");
        });
        costButton2.onClick.AddListener(() =>
        {
            AddHistory("-200");
        });
    }

    void AddHistory(string historyString)
    {
        historyStringList.Add(historyString);
        if (historyStringList.Count < 5)
        {
            scrollRect.content.pivot = new Vector2(0, 1);
        }
        else if (historyStringList.Count == 5)
        {
            scrollRect.content.pivot = new Vector2(0, 0);
            Canvas.ForceUpdateCanvases();
            scrollRect.verticalNormalizedPosition = 0f;
            Canvas.ForceUpdateCanvases();
        }
        else
        {
            scrollRect.content.pivot = new Vector2(0, 0);
        }
        GameObject go = Instantiate(historyItemPrefab, parentTransform);
        go.transform.SetAsLastSibling();
        var historyItem = go.GetComponent<HistoryItem>();
        historyItem.contentText.text = historyString;

    }
}

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


public class HistoryItem : MonoBehaviour
{
    public Text contentText;
}

隐藏功能:将Content的锚点改为下方,这样我们只需要改动ViewReport的下面大小,Content的坐标就会跟着改动。
在这里插入图片描述
隐藏的时候将scrollRect.verticalNormalizedPosition = 0f;然后根据实际情况调整ViewPort的大小就行,这里就偷个懒不做演示了。
至于显示,可以用一个透明的button贴在最上面,检测玩家是否按下,按下则改变大小,也可以通过Unity ScrollRect提供的onValueChanged去监听,这就看个人习惯了。
ps:onValueChanged在有新物体创建的时候有时会导致value改变,有时不会,是个小bug。
Demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity制作一个可以自由滑动收缩的历史记录功能。 的相关文章

  • UE4 解决景深效果闪烁问题

    原因 1 模型的垂直竖线 造成抗锯齿算法对竖线的渲染计算 处于一种不稳定的状态 因此闪烁 解决办法 使用LOD 用贴图去替代线条模型 2 材质的法线贴图 当法线贴图含有垂直竖线的纹理效果 也会造成闪烁 比如这种幕墙材质 解决办法 关闭或动态
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • React实现关键字高亮

    先看效果 实现很简单通过以下这个函数 highLight text keyword gt return text split keyword flatMap str gt span keyword span str slice 1 展示某段
  • SQLite3 获取最小可用ID,ID无需包含1

    SQLite3 获取最小可用ID ID无需包含1 一 语法 二 解析 1 判断最小ID是否为1 2 判断最小ID递增后是否存在 3 范围限定 三 总结 一 语法 获取1 到 500 范围间的最小可用ID select CASE WHEN s
  • Visual Studio 2017无法登录问题解决

    前两天登录VS2017的时候遇到无法登录问题 截图如下 期间试了各种方法 更新重启 添加一系列站点至信任域等等 还是没有效果 同时突然想起来自己的IE浏览器一直无法正常上网 不确定和VS无法登录是否有一定的联系 抱着试试看的心态上网搜索了一
  • IGWO-SVM:改良的灰狼优化算法改进支持向量机。 采用三种改进思路:两种Logistic和Tent混沌映射和采用DIH策略

    IGWO SVM 改良的灰狼优化算法改进支持向量机 采用三种改进思路 两种Logistic和Tent混沌映射和采用DIH策略 采用基于DIH维度学习的狩猎搜索策略为每只狼构建邻域 增强局部和全局搜索能力 收敛速度比GWO更快 适用于pape
  • 工控安全PLC固件逆向三

    之前我们详细分析了bootram和Vxworks的基本启动流程 这篇文章中我们把视线转到plc的网络部分 同时来复现我们第一个 第二个工控安全漏洞 一 VxWorks的网络设备驱动 一般我们说有三种设备 块设备 字符设备 网络设备 但是考虑
  • 【封装】实体类(entity)

    实体类entity 一 ORM 1 1 ORM 实体类 entity 零散数据的载体 1 1 1 ORM应用 一 ORM ORM Object Relational Mapping 从数据库查询到的结果集 ResultSet 在进行遍历时
  • Error while parsing UI hierarchy XML file: Invalid ui automator hierarchy file. Error while parsing

    官方的工具就这吊样各种报错 不如使用二次开发的工具 使用 https github com alibaba web editor 替代
  • el-select实现懒加载

    先看一个线上的演示示例 https code juejin cn pen 7273352811440504889 背景 我们在实际开发中经常遇到这样的需求 el select实现懒加载 用通俗的话说 为了增加响应速度 就是初始下拉只展示50
  • 网络流量在线分析系统的设计与实现

    编译环境 visual studio2019 安装并配置winpcap和pthreads库函数 1 配置环境 1 1 安装vscode 参考微信公众号 软件安装管家 1 2 安装MinGW w64 下载地址 添加链接描述 安装参考博客 Mi
  • 实验二 程序流程控制

    1 编写程序计算 1 3 5 7 99 之和 summ 0 for i in range 1 100 summ summ i print 和为 summ 2 编写程序 计算 2 4 6 8 100 之和 summ 0 for i in ra
  • 计算机网络试题

    一 选择题 1 OSI模型与TCP IP模型都具有的层次是 A 会话层 网络层和物理层 B 表示层 会话层和数据链路层 C 网络层 传输层和应用层 D 表示层 数据链路层和物理层 2 对于计算机网络体系结构 下列关于第N层和第N 1层的关系
  • 蓝桥杯:字符串

    题目链接 include
  • notepad++字符串替换

    删除空白行 在编辑选项里面包括很多功能 编辑 gt 行操作 gt 移除空行 包括空白字符 行首添加字符串 按CTRL F 选择替换页签 选择正则表达式 查找目标 设置为 替换为 设置自己想要替换的字符串 特殊字符需要添加 进行转义 行尾添加
  • 【MySQL】34道SQL综合练习详解(员工表、部门表、工资等级表)

    文章目录 一 34道SQL综合练习 二 测试使用的数据表 三 创建测试表的SQL语句 一 34道SQL综合练习 1 查询取得每个部门最高工资的人员信息 select e ename t from emp e join select dept
  • 如何使用PCL将XYZRGB点云转换为彩色mesh模型

    如何使用PCL将XYZRGB点云转换为彩色mesh模型 最近完成了一个使用RGBD传感器 构建物体模型的小demo 其中有点难的最后一步是如何将获得的物体点云变成彩色mesh模型 效果图如下 从点云变成彩色mesh 其实整体的步骤可以总结如
  • M1 macbook上安装docker 编译内核 并使用qemu启动内核。

    一 编译内核并通过qemu启动内核 1 在M1上安装docker这个就不用提供步骤了 网上自行搜索 2 在M1上pull一个ubuntu的容器 docker pull ubuntu 18 04 docker images REPOSITOR
  • 卡尔曼滤波及其MATLAB程序

    今天写了个卡尔曼滤波的小程序 希望对有需要的同学有点帮助 卡尔曼滤波是一个很常用的滤波算法 与维纳滤波相比有很多长处 这里我们把Kalman Filter简称为KF KF的基本思想是 采用信号 噪声 状态空间模型 利用前一时刻的状态最优估计
  • 学习python笔记01

    一 python是什么 人生苦短 我用python python是一门解释型语言 边解释边运行 与编译型语言的区别是 编译型语言是先编译后运行 python语言的特点 1 优雅 2 明确 3 简单 python是一个完全面向对象语言 具有强
  • 纯java实现相片转素描

    1 实例演示图片转素描效果 首先我们来看一下具体的效果 在项目中添加依赖
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi