RPG项目01_UI登录

首先创建一个项目

将资源包导进Resources文件夹

创建一个Scripts脚本文件夹

然后再对Scripts脚本文件夹分门别类

导入UI资源包

创建一个Image

按住Alt 选择右下角 image就会覆盖整个面板

修改image名字为BG

将image图片放置背景栏

再创建一个image

改名为MainMenu

修改MainMenu得长宽尺寸 320 500

image选取输入3_0

   

解释:

选择具体图片

点击以下Slice切片,即可在图片中选择区域分割

这样每一块都可以分割了

如果切割不明显,可以做见拉动自定义截取

仔细看图片外面有蓝色的线框,和四个绿色的点

调节四个点内缩

这样的设定是设计成无论是横向拉伸与纵向拉伸都不会被拉伸

这样设定是为了适配任何面板,点击Apply应用

替换掉图片对面板进行拖拽拉伸,其都不会改变最外四角边框

知识点讲解完成换成图片3_0 并调节位置与尺寸

调节字体大小

调节y轴位置

ctrl + d 复制出一份

改名为BtnLoad

修改第二个Btn得y轴坐标为10

修改字体内容

继续复制向下串90坐标

以此手法

在代码文件夹中新建文件夹Effect效果

文件夹下新建脚本UITween

将以下代码复制UITween

using System.Collections;
using UnityEngine;
public delegate void FunBack();
public class UITween : MonoBehaviour{
    Vector2 startPos;//开始坐标
    Vector2 targetPos;
    public Vector2 offsetPos;
    public event FunBack funback;
    public event FunBack funStart;
    RectTransform rect;//当前坐标
    void Awake(){
        startPos = transform.position;
        rect = GetComponent<RectTransform>();
    }
    public void UIStart(){
        targetPos = offsetPos + new Vector2(Screen.width / 2, Screen.height / 2);
        StartCoroutine(MoveTo());
        if (funStart != null){
            funStart();
        }
    }
    public IEnumerator MoveTo(){
        while (Mathf.Abs(rect.position.x - targetPos.x) > 5){
            rect.position = Vector2.Lerp(rect.position, targetPos, 0.01f);
            yield return new WaitForEndOfFrame();
        }
        if (funback != null){
            funback();
            funback = null;
        }
    }
    public void UIBack(){
        targetPos = startPos;
        StartCoroutine(MoveTo());
    }
    public void AddEventBackHandle(FunBack fun){
        funback += fun;
    }
    public void AddEventStartHandle(FunBack fun){
        funback += fun;
    }
    public void SetBtnHandle(params UITween[] uis){
        for (int i = 0; i < uis.Length; i++){
            AddEventBackHandle(uis[i].UIStart);
        }
    }
}
之后回到unity场景中将主UI面板拖拽至屏幕外侧

在Canvas下再创建一个image

修改名字QuitMenu

尺寸修改 600 * 300

图片使用4_1

接着复制一个按钮

粘粘作为子物体

修改位置

复制并修改名字为 BtnYes 和 BtnNo

将QuitMenu的x轴设为1000移出屏幕外

在脚本文件夹下的Manager文件夹下新建脚本MainMenu

将以下代码复制

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

public class MainMenu : MonoBehaviour
{
    UITween mainMenu;
    UITween quitMenu;
    void Start()
    {
        mainMenu = GetComponent<UITween>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
接下来再在Manager文件夹下创建脚本GameManager

将以下代码复制

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

public enum GameState { Play,Menu };
public class GameManager 
{
    //当只需要一个的时候使用静态类
    public static GameState gameState = GameState.Play;
    public static void Init() {
    
    }
    public static T FindType<T>(Transform t, string n) {
        return t.Find(n).GetComponent<T>();
    }
    public static T ParseEnum<T>(string value) {
        return (T)System.Enum.Parse(typeof(T), value, true);
    }
}
修改MainMenu脚本代码:

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

public class MainMenu : MonoBehaviour
{
    UITween mainMenu;
    UITween quitMenu;
    void Start()
    {
        mainMenu = GetComponent<UITween>();
        quitMenu = GameManager.FindType<UITween>(transform.parent, "QuitMenu");
        mainMenu.UIStart();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
接下来挂载代码

运行即实现主功能面板缓慢移至屏幕中心

如果觉得移速过慢可以调整UITween脚本中的移动速度

 

修改代码前,看一下unity场景中Canvas的Mainmenu下的四个按键

然后修改MainMenu代码

继续修改MainMenu代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainMenu : MonoBehaviour{
    UITween mainMenu;
    UITween quitMenu;
    Button btnStart;
    Button btnLoad;
    Button btnQuit;
    Button btnSet;
    void Start(){
        //gameObject.通常省略
        mainMenu = gameObject.GetComponent<UITween>();
        //查找子物体身上得组件 先返回父级再找QuitMenu
        quitMenu = GameManager.FindType<UITween>(transform.parent, "QuitMenu");

        btnStart = GameManager.FindType<Button>(transform, "BtnStart");
        btnLoad = GameManager.FindType<Button>(transform, "BtnLoad");
        btnQuit = GameManager.FindType<Button>(transform, "BtnQuit");
        btnSet = GameManager.FindType<Button>(transform, "BtnSet");
        //监听
        btnQuit.onClick.AddListener(delegate
        {
            mainMenu.SetBtnHandle(quitMenu);
            mainMenu.UIBack();
        });
        mainMenu.UIStart();
    }
    void Update()
    {
        
    }
}
回到unity中运行即可实现:

开始主页面移至屏幕中心

点击退出游戏按钮,主页面移出屏幕,提示是否信息页面进入屏幕中心

下面继续做提示是否退出游戏页面代码

修改MainMenu代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainMenu : MonoBehaviour{
    UITween mainMenu;
    UITween quitMenu;
    Button btnStart;
    Button btnLoad;
    Button btnQuit;
    Button btnSet;
    Button BtnYes;
    Button BtnNo;
    void Start(){
        //gameObject.通常省略
        mainMenu = gameObject.GetComponent<UITween>();
        //查找子物体身上得组件 先返回父级再找QuitMenu
        quitMenu = GameManager.FindType<UITween>(transform.parent, "QuitMenu");        btnStart = GameManager.FindType<Button>(transform, "BtnStart");
        btnLoad = GameManager.FindType<Button>(transform, "BtnLoad");
        btnQuit = GameManager.FindType<Button>(transform, "BtnQuit");
        btnSet = GameManager.FindType<Button>(transform, "BtnSet");
        BtnYes = GameManager.FindType<Button>(quitMenu.transform, "BtnYes");
        BtnNo = GameManager.FindType<Button>(quitMenu.transform, "BtnNo");
        //监听
        btnQuit.onClick.AddListener(delegate
        {
            mainMenu.SetBtnHandle(quitMenu);
            mainMenu.UIBack();
        });
        BtnYes.onClick.AddListener(Application.Quit);
        BtnNo.onClick.AddListener(delegate
        { 
            quitMenu.SetBtnHandle(mainMenu);
            quitMenu.UIBack();
        });
        mainMenu.UIStart();
    }
    void Update()
    {
        
    }
}

修改提示面板信息

回到unity场景中运行测试

主体思想就是在MainMenu等面板上挂载UITween移动代码只负责UI移动,后续用Manager管理开始点及目标点即可。

接下来做一个UI得片头动画:

首先在Canvas下添加一个 Raw Image

改Image名为Video

点击锚点alt + 右下角全屏

在Video下新增一个组件Video Player

在顶层文件夹下创建一个Video文件夹

拖动视频放入Video Player 的 Video Clip选框中

再右键Video文件夹下创建一个渲染纹理Render Texture

将渲染纹理分别放在Video的Raw Image下的Texture内框,及Video Player下的Target Texture内框中。

换成满屏

这样视频就导入了开场UI

拓展知识:

所有UI都有Raycast Target 射线检测目标 如果是勾选的

点击射线是能碰撞到这个UI的 如果取消 点击就会穿过它

最后代码:

using UnityEngine;
public enum GameState { Play,Menu };
public class GameManager {
    //当只需要一个的时候使用静态类
    public static GameState gameState = GameState.Play;
    public static void Init() {

    }
    public static T FindType<T>(Transform t, string n) {
        return t.Find(n).GetComponent<T>();
    }
    public static T ParseEnum<T>(string value) {
        return (T)System.Enum.Parse(typeof(T), value, true);
    }
}

using UnityEngine;
using UnityEngine.UI;
public class MainMenu : MonoBehaviour{
    UITween mainMenu;
    UITween quitMenu;
    Button btnStart;
    Button btnLoad;
    Button btnQuit;
    Button btnSet;
    Button BtnYes;
    Button BtnNo;
    void Start(){
        //gameObject.通常省略
        mainMenu = gameObject.GetComponent<UITween>();
        //查找子物体身上得组件 先返回父级再找QuitMenu
        quitMenu = GameManager.FindType<UITween>(transform.parent, "QuitMenu");

        btnStart = GameManager.FindType<Button>(transform, "BtnStart");
        btnLoad = GameManager.FindType<Button>(transform, "BtnLoad");
        btnQuit = GameManager.FindType<Button>(transform, "BtnQuit");
        btnSet = GameManager.FindType<Button>(transform, "BtnSet");
        BtnYes = GameManager.FindType<Button>(quitMenu.transform, "BtnYes");
        BtnNo = GameManager.FindType<Button>(quitMenu.transform, "BtnNo");
        //大多数需要动态UI时 需要使用监听
        //监听 实际可以看成是一种委托 在实现一种匿名函数
        btnQuit.onClick.AddListener(delegate
        {
            //设置后续动作
            mainMenu.SetBtnHandle(quitMenu);
            mainMenu.UIBack();
        });
        BtnYes.onClick.AddListener(Application.Quit);
        BtnNo.onClick.AddListener(delegate
        { 
            quitMenu.SetBtnHandle(mainMenu);
            quitMenu.UIBack();
        });
        mainMenu.UIStart();
    }
    void Update(){
        
    }
}

using System.Collections;
using UnityEngine;
public delegate void FunBack();
//通用工具类pow-有部分多余代码等待拓展
public class UITween : MonoBehaviour{
    Vector2 startPos;//开始坐标
    Vector2 targetPos;
    //偏移量本次不使用
    public Vector2 offsetPos;
    public event FunBack funback;
    public event FunBack funStart;
    RectTransform rect;//当前坐标
    void Awake(){
        startPos = transform.position;
        rect = GetComponent<RectTransform>();
    }
    //从屏幕外部进入屏幕的函数 UIStart()
    public void UIStart(){
        targetPos = offsetPos + new Vector2(Screen.width / 2, Screen.height / 2);
        StartCoroutine(MoveTo());
        if (funStart != null){
            funStart();
        }
    }
    //协程函数 模拟Update函数
    //携程具体作用:1.重复执行 2.延迟执行
    public IEnumerator MoveTo(){
        //按照绝对值根据距离是否大于五判断UI到没到目标点 
        while (Mathf.Abs(rect.position.x - targetPos.x) > 5){
            //Lerp比例插值越走越慢
            rect.position = Vector2.Lerp(rect.position, targetPos, 0.03f);
            //等待一帧时间
            yield return new WaitForEndOfFrame();
        }
        //回调
        if (funback != null){
            funback();
            //释放
            funback = null;
        }
    }
    public void UIBack(){
        targetPos = startPos;
        StartCoroutine(MoveTo());
    }
    //添加后续动作 后续动作是谁就写谁FunBack
    public void AddEventBackHandle(FunBack fun){
        funback += fun;
    }
    public void AddEventStartHandle(FunBack fun){
        funback += fun;
    }
    public void SetBtnHandle(params UITween[] uis){
        for (int i = 0; i < uis.Length; i++){
            AddEventBackHandle(uis[i].UIStart);
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂 | AI技术如何驱动企业供应链智能化,赋能企业降本增效?

近年以来&#xff0c;随着互联网技术的发展&#xff0c;AI的创新研究加速。随着大数据、云计算、物联网等信息技术的发展&#xff0c;以深度神经网络为代表的AI技术迅速发展&#xff0c;图像分类、语音识别、知识问答、无人驾驶等AI技术实现了从“不能用、不好用”到“可以用”…

HarmonyOS开发(七):构建丰富页面

1、组件状态管理 1.1、概述 在应用中&#xff0c;界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI&#xff0c;具有状态驱动UI更新的特点&#xff0c;当用户进行界面交互或有外部事件引起状态改变时&#xff0c;状态的变会会触发组件的自动…

2023.11.26 关于 Spring Boot 单元测试

目录 单元测试 优势 单元测试的使用 具体步骤 实现不污染数据库 阅读下面文章之前 建议点击下方链接了解 MyBatis 的创建与使用 MyBatis 的配置与使用 单元测试 单元测试 指对软件中的最小可测试单元进行检查和验证的过程单元测试 由开发人员在编码阶段完成&#xff0c;…

数据结构—树

文章目录 9.树(1).树的基本概念#1.基本定义#2.树的广义表表示法#3.基本术语 (2).树的存储结构#1.标准形式(常用)#2.逆存储形式#3.孩子兄弟存储法 (3).并查集#1.我们到底想解决什么问题#2.并查集结点#2.Find(查)#3.Union(并)#4.例子 (4).树的遍历#1.前序遍历#2.后序遍历#3.遍历的…

winform联合halcon读取图像出现问题

1.在Form1.cs和Form.Designer.cs中添加using HalconDotNet&#xff1b; 2. 3.添加Halcon导入.cs的程序 4.注释掉导出文件的主函数&#xff0c;不然会报错。 .

C#常见的设计模式-行为型模式

前言 行为型模式是面向对象设计中的一类设计模式&#xff0c;它关注对象之间的通信和相互作用&#xff0c;以实现特定的行为或功能。在C#中&#xff0c;有许多常见的行为型模式&#xff0c;下面将对其中10种行为型模式进行介绍&#xff0c;并给出相应的代码示例。 目录 前言1.…

ky10 server sp3 解决/boot/grub2/grub.cfg 找不到

现象 /boot/grub2 目录下不存在grub.cfg 配置文件 解决 执行下面脚本即可 yum install -y grub2 grub2-mkconfig -o /boot/grub2/grub.cfg 执行完成第一条命令 执行完成第二条命令 查看效果 已经生成这个文件了

Java抽象类和接口(2)

&#x1f435;本篇文章继续对接口相关知识进行讲解 一、排序 1.1 给一个对象数组排序&#xff1a; class Student {public String name;public int age;public Student(String name, int age) {this.name name;this.age age;}public String toString() {return "name:…

BetaFlight模块设计之三十七:SBUS

BetaFlight模块设计之三十七&#xff1a;SBUS 1. 源由2. sbus启动&动态任务3. 主要函数3.1 sbus初始化3.2 sbusFrameStatus更新3.3 rxFrameTimeUs3.4 sbusDataReceive接收数据 4. 辅助函数4.1 sbusChannelsDecode 5. 参考资料 1. 源由 接着BetaFlight模块设计之三十六&…

Leetcode—266.回文排列【简单】Plus

2023每日刷题&#xff08;四十&#xff09; Leetcode—266.回文排列 C语言实现代码 char chara[26] {0};int calculate(char *arr) {int nums 0;for(int i 0; i < 26; i) {nums arr[i];}return nums; }bool canPermutePalindrome(char* s) {int len strlen(s);for(in…

零基础在ubuntu上搭建rtmp服务器-srs

搭建服务器 搭建 SRS&#xff08;Simple-RTMP-Server&#xff09;服务器需要一些步骤&#xff0c;以下是一个简单的步骤指南。请注意&#xff0c;SRS 的配置可能会有所不同&#xff0c;具体取决于你的需求和环境。在开始之前&#xff0c;请确保你的 Ubuntu 系统已经连接到互联…

高效记账,轻松管理,批量记账与柱形图分析助你掌控收支明细

你是否曾经因为繁琐的记账过程而感到烦恼&#xff1f;是否曾经因为无法全面掌握个人或企业的收支情况而感到困惑&#xff1f;现在&#xff0c;我们为你带来了一种全新的高效记账方式&#xff0c;让你从此告别繁琐&#xff0c;轻松掌控收支明细。 首先第一步我们要打开晨曦记账…

商城免费搭建之java商城 鸿鹄云商 B2B2C产品概述

【B2B2C平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级B2B2C电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消费者出发&#xff0c;助…

pytest系列——pytest-xdist插件之多进程运行测试用例|| pytest-parallel插件之多线程运行测试用例

pytest之多进程运行测试用例(pytest-xdist) 前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两…

警惕!AI正在“吞食”你的数据

视觉中国供图 □ 科普时报记者 陈 杰 AI大模型的热度&#xff0c;已然开始从产业向日常生活渗透&#xff0c;并引起不小的舆论旋涡。近日&#xff0c;网友指出国内某智能办软件有拿用户数据“投喂”AI之嫌&#xff0c;引发口水的同时&#xff0c;再度把公众对AI的关注转移到数…

使用paddledetection的记录

首先在这里使用的是是paddle--detection2.7的版本。 成功进行训练 目录&#xff1a; 目录 数据集准备 配置文件的修改 使用的是BML的平台工具&#xff1a; !python -m pip install paddlepaddle-gpu2.5 -i https://mirror.baidu.com/pypi/simple --user %cd /home/aistudio…

Rust语言入门教程(七) - 所有权系统

所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源&#xff0c;也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统&#xff0c;才使得编译器能够提前暴露代码中的错误&#xff0c;并给出我们必要且精准的错误提示。 所有权系统的三个规则…

Anaconda安装教程(超详细版)

目录 一、Anaconda简介 二、运行环境 三、安装Anaconda 四、手动配置环境变量&#xff08;重点&#xff09; 五、测试Anaconda环境是否配置成功 一、Anaconda简介 Anaconda&#xff0c;一个开源的Python发行版本&#xff0c;可用于管理Python及其相关包&#xff0c;包含了…

慕尼黑电子展采访全程 | Samtec管理层对话电子发烧友:虎家卓越服务

【摘要/前言】 今年的慕尼黑上海电子展上&#xff0c;Samtec大放异彩&#xff0c;特装展台一亮相就获得了大家的广泛关注&#xff0c;展台观众络绎不绝。 作为深耕连接器行业数十年的知名厂商以及Electronica的常客&#xff0c;Samtec毫无疑问地获得了大量媒体朋友的关注和报…

【数据结构】二叉树之链式结构

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、前置说明二、二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历 三、…