“回嘉探宝”技术实现

①start界面加载进度条实现:

 首先在层级栏新建一个Image,在image下新建一个Text文本。

image作为进度条的样式,text为进度条上显示的文本。

 在camera组件下绑定脚本Load Scene,脚本选择的对象是之前新建的Image和Text,如下图

 脚本代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class LoadScene : MonoBehaviour
{
    public TextMeshProUGUI loadingText;
    public Image progressBar;
    private int curProgressValue = 0;

    void FixedUpdate()
    {
        int progressValue = 100;

        if (curProgressValue < progressValue)
        {
            curProgressValue++;
        }

        loadingText.text = $"游戏加载中...{curProgressValue}%";//实时更新进度百分比的文本显示  

        progressBar.fillAmount = curProgressValue / 100f;//实时更新滑动进度图片的fillAmount值  

        if (curProgressValue == 100)
        {
            loadingText.text = "OK";//文本显示完成OK
            SceneManager.LoadScene("Menu");
        }
    }
}

 

 

②UI的优化

 考虑到unity自带UI过于简陋,所以选择更换UI的贴图,操作如下

首先选中需要更换贴图的button

 接下来点击Image的源图像,在你的资源中选择你需要更换的贴图,完成你的UI优化。

 

 

③按钮实现界面跳转

首先新建一个脚本ChangeScene,代码如下

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

public class ChangeScene : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
    public void Jump()
    {
        SceneManager.LoadScene("introduction");
    }
}

在层级界面新建一个空物体(GameObject)

 将新建的脚本绑定到空对象上

 之后选中开始游戏按钮,在检查器界面为它新加一个鼠标点击事件,将空对象拖入,并选择ChangeScene.Jump函数

 还要注意跳转的页面所在场景是否在生成设置中Build中的场景内,如果没有,需要先将需要跳转的场景拖入进去,效果如下

 最终保存,可以成功运行

 

④退出游戏的功能实现

首先新建一个button按钮,然后新建一个c#脚本,命名为QuitButton

脚本代码:

 

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

public class QuitButton : MonoBehaviour
{
    /// <summary>
    /// 退出游戏
    /// </summary>
    public void Close()
    {
        Application.Quit();//退出应用
    }
}

 

和实现页面跳转功能一样,先新建一个空对象,将脚本挂载到空对象上,在退出按钮的检查器界面新添加一个鼠标点击事件

 

⑤打字机效果实现

 

需要挂载脚本如下:

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

public class 打字机脚本 : MonoBehaviour
{
    public float 打字机间隔时间 = 0.1f;
    float 计时器时间;
    public Text 文字组件;
    string 文字内容 = "需要实现打字机效果的文本";
    int 文字内容的数量;  
    bool 是否开始打字 = true;

    // Start is called before the first frame update
    void Start()
    {
        文字组件.fontSize = 100;
    }

    // Update is called once per frame
    void Update()
    {
        开始打字功能();
    }

    public void 开始打字功能()
    {
        if(是否开始打字 == true)
        {
            计时器时间 += Time.deltaTime;
            if(计时器时间>=打字机间隔时间)
            {
                计时器时间 = 0;
                文字内容的数量++;
                文字组件.text = 文字内容.Substring(0, 文字内容的数量);
                if(文字内容的数量>=文字内容.Length)
                {
                    是否开始打字 = false;
                }
            }
        }
    }
}

 

⑥安卓截屏(保存到相册)

将脚本挂载到需要有截屏功能的场景摄像头下:

 

 
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System;
using System.IO;
using System.Security.AccessControl;
using System.Collections.Generic;
using UnityEngine.Android;

public static class AndroidPermissionMgr
{
    /// <summary>
    /// 外部访问方法
    /// </summary>
    /// <param name="type">权限名</param>
    /// <param name="time">如拒绝延迟多久再次申请</param>
    public static void Get(string type, float time)
    {
        if (!Permission.HasUserAuthorizedPermission(type))
        {
            Permission.RequestUserPermission(type);

        }
    }

    //延时调用
    static IEnumerator Check(string type, float time)
    {
        yield return new WaitForSeconds(time);
        Get(type, time);
    }
}


/// <summary>
/// 截图保存安卓手机相册
/// </summary>
public class CaptureScreenshotMgr : MonoBehaviour
{
    private string path;
    /// <summary>
    /// 保存按钮点击事件
    /// </summary>
    public void OnScreenShootClick()
    {
        StartCoroutine(ScreenShoot());
    }
    //获取图片的保存路径
    public string ScreenshotPath()
    {
        string filePath = "";
        if (Application.platform == RuntimePlatform.Android)
        {
            filePath = "/storage/emulated/0/Pictures/pictest/";
        }
        if (!Directory.Exists(filePath))
        {
            try
            {
                Directory.CreateDirectory(filePath);
            }
            catch (PathTooLongException)
            {
                Debug.Log("路径或者文件名超过系统定义的最大长度。");
                //txt.text += "路径或者文件名超过系统定义的最大长度。";
            }
            catch (DirectoryNotFoundException)
            {
                //txt.text += "保存目录没有找到。";
                Debug.Log("保存目录没有找到。");
            }
            catch (UnauthorizedAccessException)
            {
                //txt.text += "创建目录失败,因为没有足够的权限。";
                Debug.Log("创建目录失败,因为没有足够的权限。");
            }

        }
        return filePath;
    }
    //截图保存之后刷新相册
    IEnumerator ScreenShoot()
    {
        //保存照片前隐藏保存按钮和返回按钮


        //图片大小  
        Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, true);
        yield return new WaitForEndOfFrame();
        tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, true);
        tex.Apply();
        yield return tex;
        byte[] byt = tex.EncodeToPNG();

        //显示返回按钮




        //图片名称,一般以日期命名
        DateTime currentTime = DateTime.Now;
        string fileName = "Custom" + currentTime.Year + currentTime.Month + currentTime.Day + "_" + currentTime.Hour + currentTime.Minute + currentTime.Second + ".png";
        path = ScreenshotPath() + fileName;
        File.WriteAllBytes(path, byt);
        string[] paths = { path };
        //安卓平台才调用安卓的活动刷新相册
        if (Application.platform == RuntimePlatform.Android)
        {
            ScanFile(paths);
        }
    }

    //刷新图片,显示到相册中
    void ScanFile(string[] path)
    {
        using (AndroidJavaClass PlayerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            AndroidJavaObject playerActivity = PlayerActivity.GetStatic<AndroidJavaObject>("currentActivity");
            using (AndroidJavaObject Conn = new AndroidJavaObject("android.media.MediaScannerConnection", playerActivity, null))
            {
                Conn.CallStatic("scanFile", playerActivity, path, null, null);
            }
        }
    }
}

 

 

⑦数字谜题

 脚本实现(挂载到画布下):

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


public class codebox : MonoBehaviour
{

    public Button[] btn;
    private string  _password;
    public TextMeshProUGUI _Text;
    public TMP_InputField m_InputField;

    private void Start()
    {
        btn[0].onClick.AddListener(btn_00);
        btn[1].onClick.AddListener(btn_01);
        btn[2].onClick.AddListener(btn_02);
        btn[3].onClick.AddListener(btn_03);
        btn[4].onClick.AddListener(btn_04);
        btn[5].onClick.AddListener(btn_05);
        btn[6].onClick.AddListener(btn_06);
        btn[7].onClick.AddListener(btn_07);
        btn[8].onClick.AddListener(btn_08);
        btn[9].onClick.AddListener(btn_09);
        btn[10].onClick.AddListener(btn_clear);
        btn[11].onClick.AddListener(btn_login);
    }

    private void Update()
    {
        m_InputField.text = _password;
    }

    private void btn_00()
    {
        _password += "0";
    }
    private void btn_01()
    {
        _password += "1";
    }
    private void btn_02()
    {
        _password += "2";
    }
    private void btn_03()
    {
        _password += "3";
    }
    private void btn_04()
    {
        _password += "4";
    }
    private void btn_05()
    {
        _password += "5";
    }
    private void btn_06()
    {
        _password += "6";
    }
    private void btn_07()
    {
        _password += "7";
    }
    private void btn_08()
    {
        _password += "8";
    }
    private void btn_09()
    {
        _password += "9";
    }
    private void btn_clear()
    {
        _password = "";
    }
    private void btn_login()
    {
        if (_password == "36110")
        {
            _Text.text = "密码正确";
            SceneManager.LoadScene("获得宝箱");
        }
        else
        {
            _Text.text = "密码错误";
            _password = "";

        }
    }

}

 

 

 

 

 

⑧制作道具栏

新建场景,新建面板,作为侧边栏(可任意命名)
侧边栏里再新建一个面板,明明为道具栏背景,搜索添加mask组件,(添加遮罩层用的)
添加完Mask组件后可以调整道具栏背景面板的大小,并拖动调整位置
在道具栏背景往下添加新面板,是道具格栏,搜索并添加Grid Layout Group组件,这个组件是道具栏的核心,作用是让下一级的UI部件自动按照顺序排序
继续往下添加UI面板,作为单体道具格的父对象和背景
设置道具格(预制体)背景图片,需要网络上找图,这里选取黄色图
道具格父对象里添加按钮(新旧版都可以,这里用旧版的)
如果没有预制体还需要的部件,这里就可以进行复制粘贴,完成道具栏样式
复制所需要的份数,效果如下
 
posted @ 2023-04-23 14:45  不用去猜mk  阅读(62)  评论(0编辑  收藏  举报