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 实用代码 小工具 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

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

    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 屏幕截图 全屏截图方法 全屏截图方法 带委托事件 自定义截图方法 自定义截图方法 带委托 延迟工具 携程延迟方法 携程延迟带委托方法 场景加载 场景加载 方法 场景加载方法 带委托 异步场景加载 方