unity网络实战开发(丛林战争)-正式开发阶段(015-游戏场景及开始界面UI搭建)

2023-10-29

使用工具:VS2017,unity3d

使用语言:c#

作者:Gemini_xujian

参考:siki老师-《丛林战争》视频教程

上一篇文章中,我已经完成了游戏客户端与服务器端的初步连接,接下来将开始进行游戏场景与开始界面UI的搭建。

01-控制场景的视野漫游动画作为菜单界面背景

首先,需要将资源包中的一个scene场景作为游戏的主场景,这里,提供一下资源的下载地址(https://download.csdn.net/download/gemini_xujian/10465872),如果有需要的同学可以下载一下去使用。

接下来开始制作漫游动画。选中主摄像机,点击Windows菜单下面的animation选项,点击中间的create按钮,将animation文件保存在新建的animations目录下,命名为CameraWander,如图所示:


然后在animation编辑器中添加需要变化的属性,这里我们只需要修改position和rotation即可,如图:


添加完成之后是这样子的:


然后按照自己的想法修改位置和旋转,我在这里让摄像机围绕场景旋转一周回到起点,并调节帧率为4。如图:


这样就实现了开场动画的制作,附画面截图:


02-开发登录按钮

首先在Hierarchy视图下右键UI->Image与Text,修改image名字为startpanel并将锚点设置为全屏四角,再创建好text,将text做为startpanel的子物体,调整字体大小以及位置,并将字体选择为自己喜欢的一种字体,这里我是用资源提供的方正胖娃字体,调整好后,为字体添加shadow组件,使字体看起来更有立体感,然后为字体添加一个button组件,并将组件下的Transition选择为Animation,点击下面的Auto Generate Animation按钮,会弹出animation文件保存位置,我放在了animations文件夹下,并改名为button,然后打开animation编辑器,添加变化属性rect transform里面的scale,在中间位置将scale的x和y改为1.2,保存并查看效果,这样就完成了登录按钮的制作。如图:



03-设计登录面板UI

右键canvas,选择UI->image,作为登录面板的背景,然后将输入框以及按钮等组件做为其子物体,完成效果如图所示:


目前的UI层级为:


04-开发注册面板及提示信息面板

直接复制loginpanel修改成registerpanel,然后再搭建一个提示面板,效果如图:


UI面板层级结构如图:


05-创建面板脚本

将我们之前搭建好的UI框架中的base文件夹拖拽到scripts目录下,改名为uipanel,然后我们给每一个面板都创建一个脚本,命名方式与每个面板名称相同,创建好后,将这些脚本都继承自basepanel这个类,实现效果如图:


每个脚本继承自basepanel(以startpanel为例):


06-创建面板的prefab并修改json和paneltype

将所有的UI面板做成prefab并放入resources目录的uipanel文件夹下,在UIFramework/UIPanel文件夹下找到UIPanelType,然后删除原来的枚举值,添加上我们刚才创建的几个面板的枚举值,分别是Start,Message,Login,Register,然后修改json文件,json文件位于UIFramework/Resources目录下,按照原来的命名方式进行修改,修改后的代码如下:

UIPanelType.json:

{
"infoList":
[
{"panelTypeString":"Message",
"path":"UIPanel/MessagePanel"},

{"panelTypeString":"Start",
"path":"UIPanel/StartPanel"},

{"panelTypeString":"Login",
"path":"UIPanel/LoginPanel"},

{"panelTypeString":"Register",
"path":"UIPanel/RegisterPanel"}

]
}

UIPanelType.cs:

using UnityEngine;
using System.Collections;
using System;


public enum UIPanelType  {
   Message,
   Start,
   Login,
   Register,
}

07-开发提示信息模块

先上代码:

MessagePanel.cs:

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

public class MessagePanel : BasePanel
{
    private Text text;
    private float showTime=1f;
    public override void OnEnter()
    {
        base.OnEnter();
        text = GetComponent<Text>();
        text.enabled = false;
        uiMng.InjectMsgPanel(this);
    }

    public override void OnExit()
    {
        base.OnExit();
    }

    public override void OnPause()
    {
        base.OnPause();
    }

    public override void OnResume()
    {
        base.OnResume();
    }

    public void ShowMessage(string msg)
    {
        text.CrossFadeAlpha(1,0.2f,true);
        text.text = msg;
        text.enabled = true;
        Invoke("Hide", showTime);
    }
    private void Hide()
    {
        text.CrossFadeAlpha(0, showTime, true);
    }
}

UIManager.cs:

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

public class UIManager:BaseManager {

    /// 
    /// 单例模式的核心
    /// 1,定义一个静态的对象 在外界访问 在内部构造
    /// 2,构造方法私有化

    //private static UIManager _instance;

    //public static UIManager Instance
    //{
    //    get
    //    {
    //        if (_instance == null)
    //        {
    //            _instance = new UIManager();
    //        }
    //        return _instance;
    //    }
    //}

    private Transform canvasTransform;
    private Transform CanvasTransform
    {
        get
        {
            if (canvasTransform == null)
            {
                canvasTransform = GameObject.Find("Canvas").transform;
            }
            return canvasTransform;
        }
    }
    private Dictionary<UIPanelType, string> panelPathDict;//存储所有面板Prefab的路径
    private Dictionary<UIPanelType, BasePanel> panelDict;//保存所有实例化面板的游戏物体身上的BasePanel组件
    private Stack<BasePanel> panelStack;
    private MessagePanel msgPanel;
    

    public UIManager(GameFacade facade) : base(facade)
    {
        ParseUIPanelTypeJson();
    }

    /// <summary>
    /// 把某个页面入栈,  把某个页面显示在界面上
    /// </summary>
    public void PushPanel(UIPanelType panelType)
    {
        if (panelStack == null)
            panelStack = new Stack<BasePanel>();

        //判断一下栈里面是否有页面
        if (panelStack.Count > 0)
        {
            BasePanel topPanel = panelStack.Peek();
            topPanel.OnPause();
        }

        BasePanel panel = GetPanel(panelType);
        panel.OnEnter();
        panelStack.Push(panel);
    }
    /// <summary>
    /// 出栈 ,把页面从界面上移除
    /// </summary>
    public void PopPanel()
    {
        if (panelStack == null)
            panelStack = new Stack<BasePanel>();

        if (panelStack.Count <= 0) return;

        //关闭栈顶页面的显示
        BasePanel topPanel = panelStack.Pop();
        topPanel.OnExit();

        if (panelStack.Count <= 0) return;
        BasePanel topPanel2 = panelStack.Peek();
        topPanel2.OnResume();

    }

    /// <summary>
    /// 根据面板类型 得到实例化的面板
    /// </summary>
    /// <returns></returns>
    private BasePanel GetPanel(UIPanelType panelType)
    {
        if (panelDict == null)
        {
            panelDict = new Dictionary<UIPanelType, BasePanel>();
        }

        //BasePanel panel;
        //panelDict.TryGetValue(panelType, out panel);//TODO

        BasePanel panel = panelDict.TryGet(panelType);

        if (panel == null)
        {
            //如果找不到,那么就找这个面板的prefab的路径,然后去根据prefab去实例化面板
            //string path;
            //panelPathDict.TryGetValue(panelType, out path);
            string path = panelPathDict.TryGet(panelType);
            GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
            instPanel.transform.SetParent(CanvasTransform,false);
            instPanel.GetComponent<BasePanel>().UIMng = this;
            panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
            return instPanel.GetComponent<BasePanel>();
        }
        else
        {
            return panel;
        }

    }

    [Serializable]
    class UIPanelTypeJson
    {
        public List<UIPanelInfo> infoList;
    }
    private void ParseUIPanelTypeJson()
    {
        panelPathDict = new Dictionary<UIPanelType, string>();

        TextAsset ta = Resources.Load<TextAsset>("UIPanelType");

        UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);

        foreach (UIPanelInfo info in jsonObject.infoList) 
        {
            //Debug.Log(info.panelType);
            panelPathDict.Add(info.panelType, info.path);
        }
    }
    public void InjectMsgPanel(MessagePanel msgPanel)
    {
        this.msgPanel = msgPanel;
    }


    public void ShowMessage(string msg)
    {
        if (msg == null)
        {
            Debug.Log("无法显示提示信息,msgpanel为空");
            return;
        }
        msgPanel.ShowMessage(msg);
    }
    /// <summary>
    /// just for test
    /// </summary>
    //public void Test()
    //{
    //    string path ;
    //    panelPathDict.TryGetValue(UIPanelType.Knapsack,out path);
    //    Debug.Log(path);
    //}
}

BasePanel.cs:

using UnityEngine;
using System.Collections;

public class BasePanel : MonoBehaviour {
    protected UIManager uiMng;
    public UIManager UIMng
    {
        set
        {
            uiMng = value;
        }
    }
    /// <summary>
    /// 界面被显示出来
    /// </summary>
    public virtual void OnEnter()
    {

    }

    /// <summary>
    /// 界面暂停
    /// </summary>
    public virtual void OnPause()
    {

    }

    /// <summary>
    /// 界面继续
    /// </summary>
    public virtual void OnResume()
    {

    }

    /// <summary>
    /// 界面不显示,退出这个界面,界面被关系
    /// </summary>
    public virtual void OnExit()
    {

    }
}

GameFacade.cs:

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

public class GameFacade : MonoBehaviour {

    private static GameFacade _instance;
    public static GameFacade Instance
    {
        get
        {
            return _instance;
        }
    }

    private UIManager uiMng;
    private AudioManager audioMng;
    private PlayerManager playerMng;
    private RequestManager requestMng;
    private CameraManager cameraMng;
    private ClientManager clientMng;

    private void Awake()
    {
        if (_instance != null)
        {
            Destroy(this.gameObject);
            return;
        }
        _instance = this;
    }
    // Use this for initialization
    void Start() {
        InitManager();
    }

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

    }

    private void InitManager()
    {
        uiMng = new UIManager(this);
        audioMng = new AudioManager(this);
        playerMng = new PlayerManager(this);
        requestMng = new RequestManager(this);
        cameraMng = new CameraManager(this);
        clientMng = new ClientManager(this);

        uiMng.OnInit();
        audioMng.OnInit();
        playerMng.OnInit();
        requestMng.OnInit();
        cameraMng.OnInit();
        clientMng.OnInit();
    }
    private void DestroyManager()
    {
        uiMng.OnDestory();
        audioMng.OnDestory();
        playerMng.OnDestory();
        requestMng.OnDestory();
        cameraMng.OnDestory();
        clientMng.OnDestory();

    }
    private void OnDestroy()
    {
        DestroyManager();
    }

    public void AddRequest(ActionCode actionCode, BaseRequest request)
    {
        requestMng.AddRequest(actionCode, request);
    }
    public void RemoveRequest(ActionCode actionCode)
    {
        requestMng.RemoveRequest(actionCode);
    }
    public void HandleResponse(ActionCode actionCode, string data)
    {
        requestMng.HandleResponse(actionCode, data);
    }
    public void ShowMessage(string msg)
    {
        uiMng.ShowMessage(msg);
    }
}

说明:首先,我们对messagepanel进行实现,通过showmessage方法来显示提示信息,在showmessage中调用invoke方法,来调用hide方法,invoke方法的两个参数分别表示将要调用的方法名以及多长时间后调用,crossfadealpha的三个参数分别表示目标的透明度值,过渡完成的时间长短以及是否忽略时间的大小快慢。之后,我们想要让其他面板可以调用showmsaage方法,那么,我们可以在basepanel中得到uimanager,通过uimanager这个类来调度所有的UI面板对外的方法,我们在uimanager调用messagepanel中的方法之前,需要先得到messagepanel的实例,这里通过messagepanel面板调用显示信息方法时将自身传递给uimanager,这样我们就可以方便的得到messagepanel实例并使用他的方法,除了在UI面板中调用外,我们还想要在其他的模块中也可以调用显示提示信息的方法,那么,我们就可以将gamefacade类作为中介,用它来完成对messagepanel中showmessage方法的调用。

08-开发开始界面和面板进入的动画

在使用dotween动画之前,需要先进行初始化,初始化的方法可以通过使用dotween提供的可视化界面进行初始化,在工具栏有会有一个tools菜单栏选项,这个选项是在导入dotween后出现的,我们点击Tools->demigiant->dotween utility panel选项,会弹出来一个面板,点击面板中的setup dotween按钮。这样就完成了dotween插件初始化工作。

先上修改的代码:

StartPanel.cs:

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

public class StartPanel : BasePanel {
    private Button loginbtn;
    private Animator btnAnimator;

    private void Start()
    {
        loginbtn = transform.Find("loginbtn").GetComponent<Button>();
        loginbtn.onClick.AddListener(OnLoginClick);
        btnAnimator = transform.Find("loginbtn").GetComponent<Animator>();
    }
    public override void OnEnter()
    {
        base.OnEnter();
        if (loginbtn == null)
        {
            loginbtn = transform.Find("loginbtn").GetComponent<Button>();
            loginbtn.onClick.AddListener(OnLoginClick);
        }
        if(btnAnimator==null)
        btnAnimator = transform.Find("loginbtn").GetComponent<Animator>();
    }

    public override void OnExit()
    {
        base.OnExit();
    }

    public override void OnPause()
    {
        base.OnPause();
        btnAnimator.enabled = false;
        loginbtn.transform.DOScale(0, 0.4f).OnComplete(() => loginbtn.gameObject.SetActive(false));
    }

    public override void OnResume()
    {
        base.OnResume();
        loginbtn.gameObject.SetActive(true);
        loginbtn.transform.DOScale(1, 0.4f).OnComplete(()=> btnAnimator.enabled = true);
    }
    public void OnLoginClick()
    {
        uiMng.PushPanel(UIPanelType.Login);
    }
}

LoginPanel.cs:

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

public class LoginPanel : BasePanel
{
    private Button closebtn;
    private void Start()
    {
        closebtn = transform.Find("closebtn").GetComponent<Button>();
        closebtn.onClick.AddListener(OnCloseClick);
    }
    public override void OnEnter()
    {
        base.OnEnter();
        gameObject.SetActive(true);
        if (closebtn == null)
        {
            closebtn = transform.Find("closebtn").GetComponent<Button>();
            closebtn.onClick.AddListener(OnCloseClick);
        }
        transform.localScale = Vector3.zero;
        transform.localPosition = new Vector3(800,0,0);
        transform.DOScale(1, 0.4f);
        transform.DOLocalMove(Vector3.zero, 0.4f);
    }

    public override void OnExit()
    {
        base.OnExit();
        gameObject.SetActive(false);
    }

    public override void OnPause()
    {
        base.OnPause();
    }

    public override void OnResume()
    {
        base.OnResume();
    }
    public void OnCloseClick()
    {
        transform.DOScale(0, 0.4f);
        transform.DOLocalMove(new Vector3(800,0,0), 0.4f).OnComplete(()=> { uiMng.PopPanel(); });
    }
}
说明:当我们点击开始面板的登录按钮的时候,需要显示出来下一个面板并将当前的面板隐藏,因为我们继承了basepanel,所以我们可以通过定义的四种面板状态进行一些动画的接入,动画效果的实现是由dotween实现的,我们在得到一些物体或者组件时,需要同时在start方法以及enter方法中得到,要注意的是,在enter中得到物体或者组件时需要判断是否已经得到了,尤其是对UI组件(例如按钮)注册事件时为了防止重复,防止重复的原因是多次重复可能会导致事件执行多次,例如点击按钮时重复注册事件会导致事件中的方法多次执行,可能会发生不可预料的错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity网络实战开发(丛林战争)-正式开发阶段(015-游戏场景及开始界面UI搭建) 的相关文章

  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • visual studio:是否统一换行符 提示弹窗是否显示

    工具 选项 环境 文档 加载时检查一致的行尾
  • unity制作一个可以自由滑动收缩的历史记录功能。

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

  • [3dsMax]2018版下拉菜单项的子菜单无法选中

    软件自身问题 安装更新补丁即可解决 不想更新补丁也可以使用键盘的方向键进行选中 补丁百度云链接 https pan baidu com s 1LDxRFwQnR0GSONuz7wcEfA 提取码 6gpk
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • unity的LOD组件

    本文转载自http blog csdn net huutu article details 52106468 LOD是Level Of Detais 的简称 多细节层次 在游戏场景中 根据摄像机与模型的距离 来决定显示哪一个模型 一般距离近
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity3D的四种坐标系

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

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

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • Nacivat导入Access数据库时cannot initialize database问题解决

    问题 想使用Nacivat将Access数据库导入到pgsql 在选择Access数据库的mdb文件时提示 cannot initialize database 解决方案 需要安装AccessDatabaseEngine X64 下载地址
  • 如何限制请求的并发数量

    如何限制请求的并发数量 设计思路 代码实现 需求 当前端同时发出多个api请求 在前端对请求的并发数量进行限制 做到同时只能处理有限个请求任务 设计思路 设计 Scheduler 类 对需要发送的请求进行统一管理 类中配置最大并发数 max
  • python spyder环境配置

    首先安装python 配置环境变量等等 其次 pip install spyder 安装 spyder 最后启动 spyder cmd下 执行 spyder 就打开了 调试下面的代码看看是否是系统的python import sys pri
  • Mysql数据库学习笔记[完结]

    一 数据库 1 概述 数据库 database 简称db 就是用来存储数据和管理数据的仓库 分类 关系型数据库 指存放的数据之间是有紧密关系的 常见的有 Oracle MySQL SQLServer Access 非关系型数据库 指存放的数
  • element table复选框回显报错

    toggleRowSelection总报错 Cannot read properties of undefined reading toggleRowSelection 因为toggleRowSelection要在dom选然后才可以调用 解
  • python中父类和子类的属性,方法互相调用

    1 子类调用父类 class A object def init self self name leel def test self print A test class B A def init self super B self ini
  • FreeRTOS移植报错。Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o)

    STM32H743移植FreeRTOS 本人使用的是正点原子的板子 由于官方资料找不到 H743的FreeRTOSConfig h此文件 本文此文件使用的CubeMX生成的 报错前如图 修改后 修改FreeRTOSConfig h文件里的宏
  • Intel(中国)云基础设施软件研发总监王庆:Intel在云原生里的技术发展和展望

    整理 小雨青年 在过去10多年里 云计算技术从虚拟化和容器技术衍生出来之后 得到了迅猛的发展 期间 涌现了众多的应用场景和应用需求 由此也产生了许多开源技术和项目 2022年7月21日 由中国开源软件推进联盟主办 赛迪传媒 软件和集成电路
  • 启动报错:org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource

    启动报错 org springframework data repository config AnnotationRepositoryConfigurationSource Lorg springframework core type A
  • JavaEE学习记录day08集合02 Set

    JavaEE学习记录day08集合02 Set 1 Set集合 1 1Set集合概述和特点 应用 不可以存储重复元素 没有索引 不能使用普通for循环遍历 1 2Set集合的使用 应用 存储字符串并遍历 public class MySet
  • U盘重装系统Win10详细步骤和方法

    当前超多的用户都在使用Win10系统 有些用户想使用U盘来重装一下Win10系统 但不知道具体怎么操作 其实操作起来难度不会很大 可以按照以下小编给大家分享的U盘重装系统Win10详细步骤和方法 就能轻松顺利完成U盘重装系统Win10的操作
  • git 提交代码到github上

    1 通过git clone xxx git 将代码down到本地 2 当你修改或者添加文件的时候 3 首先使用git status 查看文件状态 4 然后使用git add 将文件add到本地缓冲区 5 再提交到本地仓库 git commi
  • el-input验证规则

    rules people 在未输入任何内容情况下触发 required true message 请输入你的内容 trigger blur 在输入非数字或不是1 100之间的整数时触发 pattern 0 1 9 0 9 100 0 9 0
  • 剑指 Offer 56 - I. 数组中数字出现的次数(java+python)

    一个整型数组 nums 里除两个数字之外 其他数字都出现了两次 请写程序找出这两个只出现一次的数字 要求时间复杂度是O n 空间复杂度是O 1 示例 1 输入 nums 4 1 4 6 输出 1 6 或 6 1 示例 2 输入 nums 1
  • java中代码块的执行顺序

    执行顺序 父类静态代码块 gt 子类静态代码块 gt 父类构造块 gt 父类构造方法 gt 子类构造块 gt 子类构造方法 注意 静态代码块只执行一次 并且是在main之前执行 构造块就是非静态代码块 执行顺序 父类静态代码块 只执行一次
  • scrapy爬虫框架简绍与安装使用

    Scrapy Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 其可以应用在数据挖掘 信息处理或存储历史数据等一系列的程序中 其最初是为了页面抓取 更确切来说 网络抓取 所设计的 也可以应用在获取API所返回的数据 例如
  • 简单说一说手机中常用的芯片-OVP芯片

    什么是OVP OVP Over Voltage Protection 即过压保护 电压值超过一定值后 对后级电路起到了保护作用 避免因输入电压过大 导致后级电路损坏 过压保护的方式有很多种 然而运用在手机端的 往往是采用OVP芯片 价格实惠
  • mysql 索引 长文本 失败_MySQL: 长文本字段上建索引的有关问题与解决方案_mysql

    mysql 长文本字段上建索引的问题与解决方案 文本字段越长 在这个字段上建索引的代价就越高 为了解决这个问题 可以为这个字段配一个hash字段 然后在这个hash字段上建索引 如 select from log where url has
  • 微信小程序开发【前端+后端(java)】

    前言 现在微信小程序越来越火了 相信不少人都通过各种途径学习过微信小程序或者尝试开发 作者就是曾经由于兴趣了解开发过微信小程序 最终自己的毕业设计也是开发一个微信小程序 所以现在用这篇博客记录我之前开发的一些经验和一些心得吧 主要内容 sp
  • unity网络实战开发(丛林战争)-正式开发阶段(015-游戏场景及开始界面UI搭建)

    使用工具 VS2017 unity3d 使用语言 c 作者 Gemini xujian 参考 siki老师 丛林战争 视频教程 上一篇文章中 我已经完成了游戏客户端与服务器端的初步连接 接下来将开始进行游戏场景与开始界面UI的搭建 01 控