Unity 实用代码 小工具

2023-11-08

代码很简单没有难度,都有注解,随便 康一康 就会了。

Unity 屏幕截图

全屏截图方法

优点:响应速度快,几乎不用考虑优化问题。
缺点:只能截全屏。
/// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 截图保存名字="_ImageName"></param>
    /// <returns></returns>
    IEnumerator Screenshot(string _ImageName)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        //Environment.CurrentDirectory 相对路径:在项目文件夹
        //如果这个文件夹不存在就创建一个
        if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false)
        {
            Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");

            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }
        else
        {
            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }


        yield break;
    }

全屏截图方法 带委托事件

给两个参考文档:
Texture2D.ReadPixels 参考文档

Rect类 参考文档

额。。。就是带了一个委托
/// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 委托事件="_Action"></param>
    /// <param 截图名称="_ImageName"></param>
    /// <returns></returns>
    IEnumerator Screenshot(Action _Action, string _ImageName)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        //Environment.CurrentDirectory 相对路径:在项目文件夹
        //如果这个文件夹不存在就创建一个
        if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false)
        {
            Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");

            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }
        else
        {
            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }

        _Action.Invoke();

        yield break;
    }

自定义截图方法

可自定义保存路径,截图名称,截图大小,就很银杏化
/// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 保存路径="_FilePath"></param>
    /// <param 截图名称="_ImageName"></param>
    /// <param 截图长度="_ImageWidth"></param>
    /// <param 截图高度="_ImageHeight"></param>
    /// <returns></returns>
    IEnumerator Screenshot(string _FilePath, string _ImageName,int _ImageWidth,int _ImageHeight)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        Texture2D _DestinationTexture;

        // 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  
        _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);

        if (_ImageWidth == 0)
        {
            _ImageWidth = Screen.width;
        }
        if (_ImageHeight == 0)
        {
            _ImageHeight = Screen.height;
        }

        // 定义ReadPixels操作的参数  
        Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);
        int xPosToWriteTo = 0;
        int yPosToWriteTo = 0;



        // 从相机的渲染目标复制像素到纹理  
        _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);

        // 将纹理数据上传到GPU,由GPU渲染更新后的纹理  
        // 注意:这个方法代价很高,应该只在需要时调用它  
        // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  
        //destinationTexture.Apply();

        //截图数据存储
        byte[] _BytesImage = _DestinationTexture.EncodeToPNG();
        File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);

        yield break;
    }

自定义截图方法 带委托

没错  又是多了一个委托事件
 /// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 委托事件响应="_Action"></param>
    /// <param 保存路径="_FilePath"></param>
    /// <param 截图名称="_ImageName"></param>
    /// <param 截图长度="_ImageWidth"></param>
    /// <param 截图高度="_ImageHeight"></param>
    /// <returns></returns>
    IEnumerator Screenshot(Action _Action, string _FilePath, string _ImageName, int _ImageWidth, int _ImageHeight)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        Texture2D _DestinationTexture;

        // 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  
        _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);

        if (_ImageWidth == 0)
        {
            _ImageWidth = Screen.width;
        }
        if (_ImageHeight == 0)
        {
            _ImageHeight = Screen.height;
        }

        // 定义ReadPixels操作的参数  
        Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);
        int xPosToWriteTo = 0;
        int yPosToWriteTo = 0;



        // 从相机的渲染目标复制像素到纹理  
        _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);

        // 将纹理数据上传到GPU,由GPU渲染更新后的纹理  
        // 注意:这个方法代价很高,应该只在需要时调用它  
        // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  
        //destinationTexture.Apply();

        //截图数据存储
        byte[] _BytesImage = _DestinationTexture.EncodeToPNG();
        File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);

        //委托事件响应
        _Action.Invoke();
        yield break;
    }
// An highlighted block
var foo = 'bar';

延迟工具

携程延迟方法

使用 协程特性实现程序等待
    /// <summary>
    /// 延迟工具
    /// </summary>
    /// <param 延迟时间="_Time"></param>
    /// <returns></returns>
    public IEnumerator DelayedTime(float _Time)
    {
        yield return new WaitForSeconds(_Time);
        Debug.Log($"延迟{_Time}秒");
    }

携程延迟带委托方法

和上面那个相似 不过加了个 委托事件
    /// <summary>
    /// 延迟工具
    /// </summary>
    /// <param 委托响事件="_Action"></param>
    /// <param 延迟时间="_Time"></param>
    /// <returns></returns>
    public IEnumerator DelayedTime(Action _Action, float _Time)
    {
        yield return new WaitForSeconds(_Time);
        //延迟 _Time 秒 再响应委托方法
        _Action.Invoke();

        Debug.Log($"延迟{_Time}秒");
    }

场景加载

场景加载 方法

是的  是场景加载
   /// <summary>
    /// 场景加载
    /// </summary>
    /// <param 加载场景名称="_StrMap"></param>
    /// <returns></returns>
    IEnumerator LoadSceneMap(string _StrMap)
    {
        SceneManager.LoadScene(_StrMap);
        yield return null;
    }

场景加载方法 带委托

没看错 就是简单的场景加载
  /// <summary>
    /// 场景加载
    /// </summary>
    /// <param 可使用委托事件调用="_ActionMaop"></param>
    /// <param 加载场景名称="_StrMap"></param>
    /// <returns></returns>
    IEnumerator LoadSceneMap(Action _ActionMaop,string _StrMap)
    {
        SceneManager.LoadScene(_StrMap);
        yield return null;
    }

异步场景加载 方法

异步场景加载 连委托都没有了
    /// <summary>
    /// 异步场景加载
    /// </summary>
    /// <param 想要加载的场景名称="_StrMap"></param>
    /// <param 加载滑动条="_SliderLoad"></param>
    /// <param 加载百分比="_TextLoad"></param>
    /// <returns></returns>
    IEnumerator LoadSceneMap(string _StrMap, Slider _SliderLoad, Text _TextLoad)
    {
        //想要加载的场景
        AsyncOperation _Operation = SceneManager.LoadSceneAsync(_StrMap);
        //允许场景被激活  为True 时跳转
        _Operation.allowSceneActivation = false;

        //当场景没有加载完毕
        while (!_Operation.isDone)
        {
            //场景加载程度
            Debug.Log(_Operation.progress);
            //转换成百分比
            Debug.Log((_Operation.progress * 100).ToString() + "%");



            //滑动条 赋值
            _SliderLoad.value = Mathf.Lerp(_SliderLoad.value, _Operation.progress, Time.deltaTime * 1);
            //加载进度文字显示
            _TextLoad.text = (_Operation.progress * 100).ToString() + "%";


            //场景加载大于 0.9f 证明基本加载完毕
            if (_Operation.progress >= 0.9f)
            {
                Debug.Log("100%");
                //允许场景被激活  为True 时跳转
                _Operation.allowSceneActivation = true;
            }
            yield return null;
        }
    }

计时器方法

倒数计时器 附带委托 可自由变形
/// <summary>
    /// 计时器
    /// </summary>
    /// <param 委托事件调用="_ActionTimer"></param>
    /// <param 定时 时间="_RefreshTime"></param>
    /// <returns></returns>
    public IEnumerator TimerController(Action _ActionTimer, float _RefreshTime)
    {

        while (true)
        {
            //时间衰减
            _RefreshTime -= Time.deltaTime;

            Debug.Log($"时间流逝{_RefreshTime}秒");

            //衰减小于 0 时 执行方法
            if (_RefreshTime <= 0)
            {
                //计时结束
                _ActionTimer.Invoke();
                yield break;
            }
            yield return null;
        }
    }

鼠标双击方法

算是对计时器的一个变种吧
 /// <summary>
    /// 鼠标双击事件
    /// </summary>
    /// <param 委托事件响应="_ActionTimer"></param>
    /// <param 状态布尔="_BoolState"></param>
    /// <returns></returns>
    public IEnumerator MouseClickDown(Action _ActionTimer, bool _BoolState)
    {
        float _StarTime = 0.0f;
        float _EndTime = 0.0f;
        int _Number = 0;
        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                _Number++;

                if (_Number == 1)
                {
                    //游戏开始后以秒为单位的实时时间(只读)。
                    _StarTime = Time.realtimeSinceStartup;
                }
                else if (_Number >= 2)
                {
                    //游戏开始后以秒为单位的实时时间(只读)。
                    _EndTime = Time.realtimeSinceStartup;

                    //鼠标双击 满足条件 执行委托
                    if (_EndTime - _StarTime <= 0.23f)
                    {
                        _ActionTimer.Invoke();

                        //状态布尔 如果为True 就只执行一次  如果为 False 会重复执行
                        if (!_BoolState)
                        {
                            yield break;
                        }
                    }
                    _Number = 0;
                }

            }
            yield return null;
        }
    }

最大最小值限定方法

是的呢  就是你看到的意思 啧... 真简单
 /// <summary>
    /// 最大最小值限定
    /// </summary>
    /// <param 返回值="_Value"></param>
    /// <param 最小值="_Min"></param>
    /// <param 最大值="_Max"></param>
    /// <returns></returns>
    public float Clam(float _Value, float _Min, float _Max)
    {
        //如果传递值 _Value 小于最小值 就返回最小值
        if (_Value < _Min)
        {
            return _Min;
        }
        //如果传递值 _Value 大于最大值 就返回最大值
        if (_Value > _Max)
        {
            return _Max;
        }
        //否则就返回当前值
        return _Value;
    }

完整代码

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

/// <summary>
/// 实用工具集合
/// </summary>
public class CodeTools_ZH:MonoBehaviour 
{
    //单例
    public static CodeTools_ZH _Instance;


    private void Awake()
    {
        _Instance = this;
    }

    void Start()
    {
        StartCoroutine(DelayedTime(3.0f));

        StartCoroutine(DelayedTime(() => { Debug.Log("方法延迟"); }, 4.0f));

        StartCoroutine(TimerController(() => { Debug.Log("计时结束后的方法调用"); }, 4.0f));

        StartCoroutine(MouseClickDown(() => { Debug.Log("鼠标双击事件"); }, false));

        StartCoroutine(Screenshot( "全屏截图"));

        StartCoroutine(Screenshot("F:\\桌面\\11","自定义截图",100,100));

        StartCoroutine(Screenshot(()=> { Debug.Log("带委托的截图方法"); },"F:\\桌面\\11", "自定义截图", 100, 100));

        Clam(12, 0, 50);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
          
        }
    }



    #region 延迟响应

    /// <summary>
    /// 延迟工具
    /// </summary>
    /// <param 延迟时间="_Time"></param>
    /// <returns></returns>
    public IEnumerator DelayedTime(float _Time)
    {
        yield return new WaitForSeconds(_Time);
        Debug.Log($"延迟{_Time}秒");
    }

    /// <summary>
    /// 延迟工具
    /// </summary>
    /// <param 委托响事件="_Action"></param>
    /// <param 延迟时间="_Time"></param>
    /// <returns></returns>
    public IEnumerator DelayedTime(Action _Action, float _Time)
    {
        yield return new WaitForSeconds(_Time);
        //延迟 _Time 秒 再响应委托方法
        _Action.Invoke();

        Debug.Log($"延迟{_Time}秒");
    }

    #endregion


    #region 屏幕截图

    /// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 截图保存名字="_ImageName"></param>
    /// <returns></returns>
    IEnumerator Screenshot(string _ImageName)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        //Environment.CurrentDirectory 相对路径:在项目文件夹
        //如果这个文件夹不存在就创建一个
        if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false)
        {
            Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");

            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }
        else
        {
            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }


        yield break;
    }

    /// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 委托事件="_Action"></param>
    /// <param 截图名称="_ImageName"></param>
    /// <returns></returns>
    IEnumerator Screenshot(Action _Action, string _ImageName)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        //Environment.CurrentDirectory 相对路径:在项目文件夹
        //如果这个文件夹不存在就创建一个
        if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false)
        {
            Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");

            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }
        else
        {
            ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");
        }

        _Action.Invoke();

        yield break;
    }

    /// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 保存路径="_FilePath"></param>
    /// <param 截图名称="_ImageName"></param>
    /// <param 截图长度="_ImageWidth"></param>
    /// <param 截图高度="_ImageHeight"></param>
    /// <returns></returns>
    IEnumerator Screenshot(string _FilePath, string _ImageName,int _ImageWidth,int _ImageHeight)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        Texture2D _DestinationTexture;

        // 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  
        _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);

        if (_ImageWidth == 0)
        {
            _ImageWidth = Screen.width;
        }
        if (_ImageHeight == 0)
        {
            _ImageHeight = Screen.height;
        }

        // 定义ReadPixels操作的参数  
        Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);
        int xPosToWriteTo = 0;
        int yPosToWriteTo = 0;



        // 从相机的渲染目标复制像素到纹理  
        _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);

        // 将纹理数据上传到GPU,由GPU渲染更新后的纹理  
        // 注意:这个方法代价很高,应该只在需要时调用它  
        // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  
        //destinationTexture.Apply();

        //截图数据存储
        byte[] _BytesImage = _DestinationTexture.EncodeToPNG();
        File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);

        yield break;
    }

    /// <summary>
    /// 屏幕截图
    /// </summary>
    /// <param 委托事件响应="_Action"></param>
    /// <param 保存路径="_FilePath"></param>
    /// <param 截图名称="_ImageName"></param>
    /// <param 截图长度="_ImageWidth"></param>
    /// <param 截图高度="_ImageHeight"></param>
    /// <returns></returns>
    IEnumerator Screenshot(Action _Action, string _FilePath, string _ImageName, int _ImageWidth, int _ImageHeight)
    {
        //等待当前帧结束
        yield return new WaitForEndOfFrame();

        Texture2D _DestinationTexture;

        // 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  
        _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);

        if (_ImageWidth == 0)
        {
            _ImageWidth = Screen.width;
        }
        if (_ImageHeight == 0)
        {
            _ImageHeight = Screen.height;
        }

        // 定义ReadPixels操作的参数  
        Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);
        int xPosToWriteTo = 0;
        int yPosToWriteTo = 0;



        // 从相机的渲染目标复制像素到纹理  
        _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);

        // 将纹理数据上传到GPU,由GPU渲染更新后的纹理  
        // 注意:这个方法代价很高,应该只在需要时调用它  
        // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  
        //destinationTexture.Apply();

        //截图数据存储
        byte[] _BytesImage = _DestinationTexture.EncodeToPNG();
        File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);

        //委托事件响应
        _Action.Invoke();
        yield break;
    }

    #endregion



    #region 场景加载

    /// <summary>
    /// 异步场景加载
    /// </summary>
    /// <param 想要加载的场景名称="_StrMap"></param>
    /// <param 加载滑动条="_SliderLoad"></param>
    /// <param 加载百分比="_TextLoad"></param>
    /// <returns></returns>
    IEnumerator LoadSceneMap(string _StrMap, Slider _SliderLoad, Text _TextLoad)
    {
        //想要加载的场景
        AsyncOperation _Operation = SceneManager.LoadSceneAsync(_StrMap);
        //允许场景被激活  为True 时跳转
        _Operation.allowSceneActivation = false;

        //当场景没有加载完毕
        while (!_Operation.isDone)
        {
            //场景加载程度
            Debug.Log(_Operation.progress);
            //转换成百分比
            Debug.Log((_Operation.progress * 100).ToString() + "%");



            //滑动条 赋值
            _SliderLoad.value = Mathf.Lerp(_SliderLoad.value, _Operation.progress, Time.deltaTime * 1);
            //加载进度文字显示
            _TextLoad.text = (_Operation.progress * 100).ToString() + "%";


            //场景加载大于 0.9f 证明基本加载完毕
            if (_Operation.progress >= 0.9f)
            {
                Debug.Log("100%");
                //允许场景被激活  为True 时跳转
                _Operation.allowSceneActivation = true;
            }
            yield return null;
        }
    }

    /// <summary>
    /// 场景加载
    /// </summary>
    /// <param 可使用委托事件调用="_ActionMaop"></param>
    /// <param 加载场景名称="_StrMap"></param>
    /// <returns></returns>
    IEnumerator LoadSceneMap(Action _ActionMaop,string _StrMap)
    {
        SceneManager.LoadScene(_StrMap);
        yield return null;
    }

    /// <summary>
    /// 场景加载
    /// </summary>
    /// <param 加载场景名称="_StrMap"></param>
    /// <returns></returns>
    IEnumerator LoadSceneMap(string _StrMap)
    {
        SceneManager.LoadScene(_StrMap);
        yield return null;
    }

    #endregion




    /// <summary>
    /// 计时器
    /// </summary>
    /// <param 委托事件调用="_ActionTimer"></param>
    /// <param 定时 时间="_RefreshTime"></param>
    /// <returns></returns>
    public IEnumerator TimerController(Action _ActionTimer, float _RefreshTime)
    {

        while (true)
        {
            //时间衰减
            _RefreshTime -= Time.deltaTime;

            Debug.Log($"时间流逝{_RefreshTime}秒");

            //衰减小于 0 时 执行方法
            if (_RefreshTime <= 0)
            {
                //计时结束
                _ActionTimer.Invoke();
                yield break;
            }
            yield return null;
        }
    }

    /// <summary>
    /// 鼠标双击事件
    /// </summary>
    /// <param 委托事件响应="_ActionTimer"></param>
    /// <param 状态布尔="_BoolState"></param>
    /// <returns></returns>
    public IEnumerator MouseClickDown(Action _ActionTimer, bool _BoolState)
    {
        float _StarTime = 0.0f;
        float _EndTime = 0.0f;
        int _Number = 0;
        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                _Number++;

                if (_Number == 1)
                {
                    //游戏开始后以秒为单位的实时时间(只读)。
                    _StarTime = Time.realtimeSinceStartup;
                }
                else if (_Number >= 2)
                {
                    //游戏开始后以秒为单位的实时时间(只读)。
                    _EndTime = Time.realtimeSinceStartup;

                    //鼠标双击 满足条件 执行委托
                    if (_EndTime - _StarTime <= 0.23f)
                    {
                        _ActionTimer.Invoke();

                        //状态布尔 如果为True 就只执行一次  如果为 False 会重复执行
                        if (!_BoolState)
                        {
                            yield break;
                        }
                    }
                    _Number = 0;
                }

            }
            yield return null;
        }
    }




    /// <summary>
    /// 最大最小值限定
    /// </summary>
    /// <param 返回值="_Value"></param>
    /// <param 最小值="_Min"></param>
    /// <param 最大值="_Max"></param>
    /// <returns></returns>
    public float Clam(float _Value, float _Min, float _Max)
    {
        //如果传递值 _Value 小于最小值 就返回最小值
        if (_Value < _Min)
        {
            return _Min;
        }
        //如果传递值 _Value 大于最大值 就返回最大值
        if (_Value > _Max)
        {
            return _Max;
        }
        //否则就返回当前值
        return _Value;
    }


}

暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。

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

Unity 实用代码 小工具 的相关文章

  • 打击垃圾邮件机器人

    我的网站中有 C 表单 希望防止垃圾邮件机器人填写它 诀窍是 我想避免 CAPTHA 或任何其他用户输入 以避免丢失单个注册 以下是我心中的一些技巧 隐藏输入栏 问题 这还有效吗 跟踪时间 从第一个用户输入 关注名字 到发布表单 人类需要
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 如何在线程创建和退出时调用函数?

    include
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 有没有办法将 boost::json::serializer 切换为美化输出?

    Using boost json serializer如中的示例所示文档 快速查看 http vinniefalco github io doc json json usage quick look html以紧凑格式保存 json tre
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

  • 获取随机位数阿拉伯数字

    int Math random 9 1 1000 这里是随机4位数 需要几位数 就乘以几个零 int Math random 9 1 100 随机3位数 int Math random 9 1 10 随机2位数 来个方法吧 获取随机位数的阿
  • IPSec 基础介绍

    IPSec是IETF Internet Engineering Task Force 制定的一组开放的网络安全协议 它并不是一个单独的协议 而是一系列为IP网络提供安全性的协议和服务的集合 包括认证头AH Authentication He
  • python TimedRotatingFileHandler 配置参数 (转)

    TimedRotatingFileHandler这个模块是满足文件名按时间自动更换的需求 这样就可以保证日志单个文件不会太大 用法很简单 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 impo
  • python学习之【模块】

    前言 上一篇文章 python学习之 深拷贝 中学习了python中的深浅拷贝学习内容 这篇文章接着学习python中的模块 什么是模块 在python中 一个文件 以 py 为后缀名的文件 就叫做一个模块 每一个模块在python里都被看
  • 群晖做网页服务器_群晖NAS软件DS get介绍及使用方法教程

    我的NAS介绍第二篇 群晖NAS软件介绍与应用之DS get篇前言 1 为什么选择NAS之所以我现在建议大家选择NAS 不仅仅因为网盘的不稳定性和不安全性 遇到和谐大神不说 网盘也经历了各种风风雨雨 从和谐到倒闭不过一步之遥 大家都懂的 还
  • Mysql-连接https域名的Mysql数据源踩的坑

    背景介绍 大家在实际项目中 大部分都会用到关系数据库mysql 通常数据库服务器提供的都是ip的方式 所以不会出现本文涉及到的https域名的问题 本文介绍的是基于数据库服务器是分配了指定域名且有ssl证书的https 连接数据源 遇到的问
  • java面向对象基础练习--实现简单的图书管理系统

    这个系统使用的是java的基础语法 没有使用数据库 实现图书管理系统基础的查询 增加 删除 借阅 归还 打印 退出功能 这个小项目作为我java基础语法的综合运用 主要是为了建立面向对象编程的思想 培养编程习惯 如果有错误或者更好的实现方法
  • 深入详解ThreadLocal

    本文已收录至GitHub 推荐阅读 Java随想录 微信公众号 Java随想录 原创不易 注重版权 转载请注明原作者和原文链接 文章目录 什么是ThreadLocal ThreadLocal 原理 set方法 get方法 remove方法
  • 又回来了

    又回来了 一年多没有来了 再次回来还是感觉那么熟悉 那么亲切 怀念以前在学校的日子 怀念苦苦思索技术的日子 除了学习没有繁杂的社会关系要处理 单纯快乐着 为了一个小小的技术难题 愿意不吃不喝去摸索 去测试 在成功的那一刻忘记了一切疲倦和劳累
  • c++ 实现数据库连接池

    c 实现数据库连接池 自己尝试用c 新标准实现了数据库连接池 代码简化了很多 思路 将数据库的连接当作一个对象添加进list队列中 在连接池创建的时候就建立好队列 并添加自定义大小的连接对象 连接对象用智能指针来管理 现代c 中不应该出现d
  • Api接口版本管理实现

    Api接口版本管理实现 引言 实现 RequestCondition 实现代码 ApiVersion注解 ApiVersionRequestCondition 版本匹配 ApiVersionHandlerMapping 将condition
  • fastjson对泛型的反序列化

    文章目录 具体告警分析 告警影响 fastjson未指定泛型具体类型 fastjson TypeReference指定泛型具体类型 可以看到fastjson反序列化时IDEA提示告警 Unchecked assignment 怎么解决这个告
  • ubuntu+vscode构建c++开发调试环境

    1 vscode下载与安装 下载 Visual Studio Code Mac Linux Windows下载deb文件 运行指令安装vscode sudo dpkg i xxx deb 如果报 dpkg 错误 另外一个进程已经为 dpkg
  • python 3.7版本 打不开 python 3.8 保存的pickle文件

    1 问题描述 最近有一个pickle文件 当我使用python3 7 读取的时候报错 ValueError unsupported pickle protocol 5 查找原因发现是原始文件是用高版本的python解释器 比如3 8 保存的
  • 数据结构实验--表达式的后缀表示

    一 问题描述 表达式中包含运算对象 运算符和圆括号等 习惯上使用中缀表示 指运算符夹在两运算符对象中间 形式 计算表达式的值 涉及到运算符的优先级别 如先乘除后加减 括在一对圆括号中的子表达式必须先计算 因此 圆括号可视为特殊的运算符 具有
  • Linux--遇见的一些小错误

    一 问题 linux下运行出现 sh 1 pause not found 原因 在windows系统下 使用此语句 但linux不认识 system pause 解决方法 删去system pause 二 问题 编程时出现 Warning
  • Unity3D——AR小游戏

    文章目录 有趣的AR小游戏制作 环境准备 具体实现 替换Camera 上传识别卡 下载识别卡模型 编辑游戏对象 实验环境是否配置成功 导入Lean Touch脚本 制作成Android应用 游戏制作 实验结果 有趣的AR小游戏制作 环境准备
  • MySQL 5.1中文参考手册 - 学习笔记

    MySQL 5 1中文参考手册地址 http dev mysql com doc refman 5 1 zh index html 学习笔记及重要点 由于最近使用MySQL数据库的机会越来越多 所以看来这次要认真的学习一下了 以往只懂得皮毛
  • 线程-Linux下的轻量级进程

    首先我们知道 每个进程都是在各自独立的地址空间上运行 如果要同时完成好几个任务 比如你一边在下载软件 另一边在进行着其他的操作 那么试想一下 可不可以在一个进程里面把这几个事件同时进行呢 这里就要提到线程的概念了 但其实Linux中 并没有
  • Unity 实用代码 小工具

    Unity 实用代码 小工具 Unity 屏幕截图 全屏截图方法 全屏截图方法 带委托事件 自定义截图方法 自定义截图方法 带委托 延迟工具 携程延迟方法 携程延迟带委托方法 场景加载 场景加载 方法 场景加载方法 带委托 异步场景加载 方