首先制作所需要的UI界面:
在Hierarchy属性框内创建 3D Object 物体 并重命名为BackGround,调节位置使其充满摄像机的全部视角。
Project->Assets->右键单击选择Folder创建文件夹并重命名为Material用于储存材质,邮件单击生成的文件夹,选择Material创建材质,更改材质的颜色,并且重命名为BG标识它使BackGround的材质更改它的颜色,使其处于想要的颜色

将材质拖拽到BackGround中

绘制地面:
在Hierarchy属性栏中右键->3D Object->Cube 调节位置,并重命名为Floor当作游戏的地面,如果想要更改地面的颜色,与制作背景颜色的步骤一样

创建一个空物体:在Hierarchy属性框中右键->creat empty,然后创建三个Cube步骤如上,调节好位置

将空物体重命名为Wall,三个Cube分别重命名为Up,Right,Lift(右键单击Cube选择Rename重命名物体)

制作砖块:创建一个空物体并重命名为AllBrick在其中创建子物体Cube,调节位置如图

创建一个Cube与Sphere(在Hierarchy->3D Object->Sphere),将Cube重命名为CrushBrick将Sphere重命名为Ball,并调节到如图位置

制作相应物体的Material(材质),个人审美不好,请自行修改颜色

至此,打砖块的UI界面已经基本制作好。
开始添加脚本,通过脚本内的方法来控制小球,碰撞板等,使其能够完成我们想要的功能。
实现碰撞板移动的功能:
在Project属性框里右键点击Assets创建一个空文件夹命名为Scripts用来保存所有脚本资源,右键单击Scripts创建C#脚本,重命名为CrushBrick,如下

在脚本中编写碰撞板的功能代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CrushBrick : MonoBehaviour {public float speed;//定义碰撞板的速度public float xMin;//用于限制碰撞板延x轴的最小坐标public float xMax;//用于限制碰撞板延x轴的最大坐标public static Vector3 pos;//用于获取碰撞板的位置// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {float hor = Input.GetAxisRaw("Horizontal");if (hor != 0){pos = transform.position;//将脚本所挂物体的当前位置给变量pospos.x -= pos.x * speed * hor * Time.deltaTime;//定义碰撞板的移动速度pos.x = Mathf.Clamp(pos.x, xMin, xMax);//限制碰撞板延x轴的最大最小坐标transform.position = pos;//将修改后的碰撞板坐标功能等赋值给脚本所挂物体的坐标}}
}

这样就完成了对碰撞板左右移动的功能实现,接下来开始实现小球的功能,首先进行需求分析,我们需要小球所具有的功能如下:1.小球具有弹力的功能,即当小球触碰到墙壁,碰撞板,砖块等物体时会向某个方向反弹,当掉落到地面也就是Floor上时会死亡,也就是重新开始游戏,当游戏未开始之前,球与碰撞板是一起运动

实现弹力的过程:若想要小球具有弹力,则应该给它添加物理刚体(注:物体的弹力,静摩擦,动摩擦的设置在它所携带的刚体组件里面)具体设置如下:
在Material文件上右键选择 Creat->Physic Material,由于我们想要使弹力最大,但是不想要它有动摩擦力,或者静摩擦力所以要将动摩擦与静摩擦力设置为0,弹力设置成1(0为最小1为最大)如下

其中第一个选项为动摩擦力,第二个是静摩擦力,第三个是弹力
然后将这个物理组件挂到Ball上,如下

然后开始对球功能的实现
首先要知道,目前球只是有了弹力的这个物理属性,但是,如果不给它一个初速度,让它动起来,与其他物体发生碰撞,那么它也不是我们想要的结果,所以首先要给它一个初速度,而若想能给小球添加速度,小球则必须具有一个刚体组件,在Add Component里面输入Rigidbody添加刚体组件。
由于不想让小球的弹射速度发生变化,所以将他的质量(Mass)设为最小,阻力(Drag)设为0,Angular Drag设为0,并且把Use Gravity取消勾选

在Scripts文件中新建脚本命名为Ball
脚本内容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Ball : MonoBehaviour {public float speed;//定义球弹出的速度public Rigidbody ball;//由于球的速度函数在刚体的类里面,所以要获取到球的刚体// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (Input.GetKeyDown(KeyCode.Space))//判断,当用户摁下空格的时候执行下面的操作{Vector3 ba = new Vector3(1f, 1f, 0).normalized;//定义一个延着xoy平面的45度的方向向量并把这个方向向量单位化ball.velocity = ba * speed;//将速度与方向赋值给ball}}
}

别忘了给Ball添加刚体组件,步骤如上,然后将脚本挂在Ball上,将定义的变量赋上值

现在球实现了弹出的功能,接下来实现游戏未开始,小球跟随碰撞板一起运动的功能。
在Ball脚本中添加如下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Ball : MonoBehaviour {public float speed;//定义球弹出的速度public Rigidbody ball;//由于球的速度函数在刚体的类里面,所以要获取到球的刚体public CrushBrick CB;//定义一个CrushBrick类的对象,便于对其中布尔值进行判断public Transform ba;//获取到Ball的Transform组件,便于对其位置进行操作// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (CrushBrick.isplaying == false){Vector3 pos = new Vector3(0, 1, 0);ba.transform.position = CB.transform.position + pos;}if (Input.GetKeyDown(KeyCode.Space))//判断,当用户摁下空格的时候执行下面的操作{CrushBrick.isplaying = true;Vector3 ba = new Vector3(1f, 1f, 0).normalized;//定义一个延着xoy平面的45度的方向向量并把这个方向向量单位化ball.velocity = ba * speed;//将速度与方向赋值给ball}}
}

对CrushBrick脚本进行如下的代码添加

public static bool isplaying = false;//定义一个布尔类型的变量用于判断游戏是否已经开始

这样就完成了在游戏没开始之前小球跟随着碰撞板一起运动的功能,接下来实现小球碰到地面,游戏结束,并且让游戏直接重新开始的功能
新建脚本命名为Floor
脚本中的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class Floor : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){CrushBrick.isplaying = false;//将游戏判定为未开始SceneManager.LoadScene(0);//重新载入场景}
}

这样就实现了当小球落到地面上时,游戏结束,重新开始的功能
下面来实现,当小球碰撞到砖块时,砖块消除的功能
新建脚本,命名为AllBrick,代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AllBrick : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){Destroy(gameObject);}
}

然后将此脚本挂在所有砖块上,就实现了当小球触碰到砖块时砖块自我销毁的功能
接下来实现游戏生命显示的功能:
首先需要在unity中创建一个Text,系统会自动创建一个Canvas与EventSystem,这不用管,只需要知道unity中所有的UI元素都是以Canvas为父节点的,也就是说Canvas包含了所有的UI元素
如下:

将Text的毛点与界面的左定点对其,将Text文本框中的文字修改为Lift-Times:3,将下面字号的大小改成适当大小,显示方式改成跟随文字大小调节的模式也就是Overflow,防止字体太大不文本框中的大小装不下导致输入的字不显示。
下面进行一下需求分析,当小球掉落地面的时候,游戏的生命值应该减一,假设有增加生命的道具,游戏的生命值应该加一。
首先实现小球掉落地面游戏生命减一的功能需求,
在Floor脚本中添加的代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;public class Floor : MonoBehaviour {// Use this for initializationpublic Text LiftTimes;//获取到生命显示的那个组件public static int lift = 3;//定义生命数void Start () {}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){lift--;//如果与地面发生碰撞则生命减一LiftTimes.text = "lift-Times:" + lift;//将生命减一之后的生命数显示出来CrushBrick.isplaying = false;//将游戏判定为未开始SceneManager.LoadScene(0);//重新载入场景}
}

这样就完成了当小球落地之后生命数减一的功能需求,但是在现实中,当生命数为0时应该显示游戏结束,所以想要添加这样的功能需要做以下处理
在Canvas中添加Text并对其进行如下操作

由于游戏开始的时候,我们不想让其显示,所以取消勾选,让它处于不显示的状态。
在Floor脚本中添加如下代码:

 private void OnCollisionEnter(Collision collision){lift--;//如果与地面发生碰撞则生命减一LiftTimes.text = "lift-Times:" + lift;//将生命减一之后的生命数显示出来CrushBrick.isplaying = false;//判定此次游戏结束if (lift < 0)//当游戏的生命数小于零时{GameOver.SetActive(true);//显示游戏结束的那个见面lift = 0;//将显示的界面中游戏生命数设置为零LiftTimes.text = "lift-Times:" + lift;//将游戏的显示判定为设置的值Ball.judge = false;//判定条件设为否,用来使球不能再有速度}}

这样就实现了当生命值为零时显示游戏结束的提示画面。
并且在Ball中添加如下控制判断的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Ball : MonoBehaviour {public float speed;//定义球弹出的速度public Rigidbody ball;//由于球的速度函数在刚体的类里面,所以要获取到球的刚体public CrushBrick CB;//定义一个CrushBrick类的对象,便于对其中布尔值进行判断public static bool judge = true;//为了判断游戏结束不能再给速度的功能// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (CrushBrick.isplaying == false)//当游戏判定为未开始时{Vector3 a = new Vector3(0, 1, 0);//定义一个长度为了方便控制球的位置transform.position = CB.transform.position + a;//再游戏未开始之前将球的位置始终放在碰撞板的上方}if (Input.GetKeyDown(KeyCode.Space) && judge == true && CrushBrick.isplaying ==false)//判断,当用户摁下鼠标左键的并且游戏未开始时候执行下面的操作{CrushBrick.isplaying = true;//当判定条件都成立的时候,设置游戏为开始状态Vector3 ba = new Vector3(1f, 1f, 0).normalized;//定义一个延着xoy平面的45度的方向向量并把这个方向向量单位化ball.velocity = ba * speed;//将速度与方向赋值给ball Debug.Log(CrushBrick.isplaying + "Ball");}    }}

这样就完成了打砖块的基本功能。
接下来为游戏添加一点可玩性,在游戏开局时将可打破的砖块设置为随机颜色
在脚本CrushBrick中添加如下代码

void Start () {this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//获取到脚本所挂物体的MeshRenderer组件中material的color属性,并且给其赋予随机颜色的值}

这样就实现了脚本所挂物体的随机颜色,
下面添加增加游戏生命的办法,首先需要一张图片,这张图片可以是在网上下载的也可以从别处找的,图片上最好有心形,这里提供一张图片
新建一个Quad (右键->3DObject->Quad),命名为Heart,新建一个材质命名为Heart,,新建一个文件夹命名为Textures(存放资源)将照片拖入文件夹

将图片拖入材质球的Albedo中

将材质球拖到Heart中

由于材质球看着有点暗,将材质球的Shader选项选择成Unlit/Texture

然后将Heart制作成预制体,也就是拖入prefabs文件夹中

删除Heart,这样就完成了预制体的制作,然后在AllBrick脚本中添加如下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class AllBrick : MonoBehaviour {// Use this for initializationpublic  GameObject LiftTool_Prefab;//为了获取生命道具的预制体public Text Lifttime;public enum Brick_Type//定义枚举类型,用于制作生命道具的功能{Normal,//正常砖块lift_brick//有生命道具功能的砖块}public Brick_Type CurrType;void Start () {this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//给所挂物体随机赋予颜色}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时{    Floor.lift++;//生命值+1Lifttime.text = "lift-Times:" + Floor.lift;//将变化后的生命值显示出来Destroy(gameObject);//销毁脚本所挂的物体GameObject Lift = GameObject.Instantiate(LiftTool_Prefab);//实例化预制体Lift.transform.position = transform.position;//将预制体的位置放在销毁的砖块的位置}if(CurrType == Brick_Type.Normal)//如果枚举类型的元素为Normal时{Destroy(gameObject);//销毁脚本所挂的物体}}
}

将应该赋予的参数在unity外部中赋予,这样就完成了当小球碰撞到带有生命道具的砖块时,生命值加一的功能


然后开始实现,当所有的砖块都已经打完之后,提示游戏通关的功能,首先与游戏结束的界面一样,我们要创建一个Text,在其中的文字输出栏输入我们想要显示的信息,然后取消显示。

在AllBrick脚本中添加如下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class AllBrick : MonoBehaviour {// Use this for initializationpublic  GameObject LiftTool_Prefab;//为了获取生命道具的预制体public Text Lifttime;public static int Lifts = 0;//定义最初消除砖块的数量为0public GameObject pass;//用于获取游戏通关之后的界面public CrushBrick CB;//定义一个CrushBrick类的对象,用于获取碰撞板的位置public Ball Ba;//定义一个Ball类的对象,用于获取球的位置public enum Brick_Type//定义枚举类型,用于制作生命道具的功能{Normal,//正常砖块lift_brick//有生命道具功能的砖块}public Brick_Type CurrType;void Start () {this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//给所挂物体随机赋予颜色}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){Lifts++;if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时{    Floor.lift++;//生命值+1Lifttime.text = "lift-Times:" + Floor.lift;//将变化后的生命值显示出来Destroy(gameObject);//销毁脚本所挂的物体GameObject Lift = GameObject.Instantiate(LiftTool_Prefab);//实例化预制体Lift.transform.position = transform.position;//将预制体的位置放在销毁的砖块的位置}if(CurrType == Brick_Type.Normal)//如果枚举类型的元素为Normal时{Destroy(gameObject);//销毁脚本所挂的物体}if (Lifts == 12){pass.SetActive(true);//将通关的信息显示出来Vector3 b = new Vector3(0, 1, 0);Ba.transform.position = CB.transform.position + b;//重置球的位置Ball.judge = false;//将其判定为false}}
}

这样就完成了,当所有砖块都销毁之后,提示游戏通关界面的功能
接下来制作碰撞特效,碰撞声音,死亡声音的功能,首先要知道,碰撞特效是想用粒子系统来做,
首先创建一个粒子系统(右键->Effect->partical…)t调节属性如下

再创建一个材质球,挂到粒子系统上面,创建脚本,命名为ParticalDestory,用于控制粒子的销毁时间,其中的代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ParticleDestory : MonoBehaviour {public float destoryitem;// Use this for initializationvoid Start () {Destroy(gameObject, destoryitem);}// Update is called once per framevoid Update () {}
}

然后在Floor与AllBrick中添加代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class AllBrick : MonoBehaviour {// Use this for initializationpublic  GameObject LiftTool_Prefab;//为了获取生命道具的预制体public Text Lifttime;public static int Lifts = 0;//定义最初消除砖块的数量为0public GameObject pass;//用于获取游戏通关之后的界面public CrushBrick CB;//定义一个CrushBrick类的对象,用于获取碰撞板的位置public Ball Ba;//定义一个Ball类的对象,用于获取球的位置public GameObject Partical_prefabs;//获取特效的预制体public enum Brick_Type//定义枚举类型,用于制作生命道具的功能{Normal,//正常砖块lift_brick//有生命道具功能的砖块}public Brick_Type CurrType;void Start () {this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//给所挂物体随机赋予颜色}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){Lifts++;if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时{GameObject PF = GameObject.Instantiate(Partical_prefabs);//将特效的预制体实例化Floor.lift++;//生命值+1Lifttime.text = "lift-Times:" + Floor.lift;//将变化后的生命值显示出来Destroy(gameObject);//销毁脚本所挂的物体GameObject Lift = GameObject.Instantiate(LiftTool_Prefab);//实例化预制体Lift.transform.position = transform.position;//将预制体的位置放在销毁的砖块的位置}if(CurrType == Brick_Type.Normal)//如果枚举类型的元素为Normal时{GameObject PF = GameObject.Instantiate(Partical_prefabs);//将特效的预制体实例化PF.transform.position = transform.position;Destroy(gameObject);//销毁脚本所挂的物体}if (Lifts == 12){pass.SetActive(true);//将通关的信息显示出来Vector3 b = new Vector3(0, 1, 0);Ba.transform.position = CB.transform.position + b;//重置球的位置Ball.judge = false;//将其判定为false}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;public class Floor : MonoBehaviour {// Use this for initializationpublic  Text LiftTimes;//获取到生命显示的那个组件public static int lift = 3;//定义生命数public GameObject GameOver;//接受游戏显示的text界面public GameObject Partical_prefabs;//获取特效的预制体public Ball ba;//用于获取球的位置void Start () {}// Update is called once per framevoid Update () {}private void OnCollisionEnter(Collision collision){GameObject Pf = GameObject.Instantiate(Partical_prefabs);//实例化预制体Pf.transform.position = ba.transform.position;//将粒子系统的预制体的位置放在球所处的位置lift--;//如果与地面发生碰撞则生命减一LiftTimes.text = "lift-Times:" + lift;//将生命减一之后的生命数显示出来CrushBrick.isplaying = false;//判定此次游戏结束if (lift < 0)//当游戏的生命数小于零时{GameOver.SetActive(true);//显示游戏结束的那个见面lift = 0;//将显示的界面中游戏生命数设置为零LiftTimes.text = "lift-Times:" + lift;//将游戏的显示判定为设置的值Ball.judge = false;//判定条件设为否,用来使球不能再有速度}}
}

这样就完成了,当小球碰撞到地面与砖块的时候,播放粒子特效的功能
还有最后一个功能就是为游戏添加声音,我们在这里仅添加两种声音,一种时碰撞到球的声音,一种是死亡的声音,声音文件可以去网上下载,这里不予提供
将准备好的声音文件拖到Texture文件夹中
然后创建一个空物体(右键->empty object)重命名为song将两个声音文件拖拽进去,取消勾选Play On Awake(游戏开始就播放的功能),然后在AllBrick脚本与Floor脚本中填写如下代码

在Floor脚本中添加public AudioSource die;//用于获取死亡的声音。。。private void OnCollisionEnter(Collision collision){die.Play();GameObject Pf = GameObject.Instantiate(Partical_prefabs);//实例化预制体Pf.transform.position = ba.transform.position;//将粒子系统的预制体的位置放在球所处的位置lift--;//如果与地面发生碰撞则生命减一。。。。。
在AllBrick脚本里面添加public AudioSource Brick;//用于获取碰撞的声音。。。private void OnCollisionEnter(Collision collision){Brick.Play();Lifts++;if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时{GameObject PF = GameObject.Instantiate(Partical_prefabs);//将特效的预制体实例化
。。。

注意添加完,不要忘记把声音文件拖到对应的地方


好了打砖块的这个游戏基本功能都已经实现了,如果想要扩展功能的话也可以再加,博主刚学unity与C#不久,如果有错的地方请多多提醒了。

打砖块教学(初学:5)相关推荐

  1. FPGA开发工具套餐搭配推荐及软件链接(工程师们转起来)

    FPGA开发工具套餐搭配推荐及软件链接(工程师们转起来) FPGA之家 今天 以下文章来源于FPGA开源工作室 ,作者相量子 FPGA开源工作室 知识,创新,创艺,FPGA,matlab,opencv ...

  2. FPGA开发工具套餐搭配推荐及软件链接 (更新于2020.03.16)

    一.Xilinx(全球FPGA市场份额最大的公司,其发展动态往往也代表着整个FPGA行业的动态) (1) Xilinx官方软件下载地址链接: https://china.xilinx.com/supp ...

  3. B站百万播放量Java零基础教程视频(适合Java 0基础,Java初学入门),史上最细Java零基础教学视频

    是否还在为学习Java如何入门而烦恼? 是否还在为Java软件如何安装而烦恼? 是否还在找寻着适合零基础的Java视频教程? 动力节点教学总监老杜159集课堂实录Java零基础视频教程,从初学者角度出 ...

  4. python课堂教学_初中生初学python课堂教学感悟

    作者:实验初中 望玉红 21世纪以来,信息技术迅猛发展,深刻地改变着人们的学习.生产.生活和社会交往方式,人类社会已快速进入信息化社会.信息素养是当代社会公民所必备的基本素养,强化信息技术课程教育教学 ...

  5. 初学python心得1000字实训_数学教学1000字六年级心得大全

    数学是训练学生思维能力的一门主要基础学科.改革数学教学,其着眼点应该放在引导学生通过自己的思维活动掌握学习方法上.为发展学生的思维能力,培养学生和训练学生善于发现问题和解决问题的能力,要重视思维训练. ...

  6. 适合初学Altium Designer的教学视频

    以下推荐的我都亲自看过,个人感觉确实不错,可以有助于了解流程,以及一些设计规范 首先是凡亿的PCB教学,贵是贵了点,不过也有免费的,讲解的很详细,而且还有专门的群,610359270 http://w ...

  7. python初中教学_初中生初学python课堂教学感悟

    作者:实验初中 望玉红 21世纪以来,信息技术迅猛发展,深刻地改变着人们的学习.生产.生活和社会交往方式,人类社会已快速进入信息化社会.信息素养是当代社会公民所必备的基本素养,强化信息技术课程教育教学 ...

  8. 塔罗牌新手初学占卜资料视频教程教学

    现在我为你准备了一份塔罗学习资料包,现在找我索取即可.发送资料到xiaoxiaomo9#qq.com,#换成@即可,自动获取学习资料. 你有没有想过,有些人不需要花费大量的时间,就可以给别人看的八九不 ...

  9. C语言/C++初学 问题

    编程及C/C++初学者 FAQ  本文原为本人在论坛所发若干帖,意在集中解决新手学习C/C++语言时将遭遇到的各类问题,网友反馈情况良好,集合修订后作为个人作品贴于此处. 本贴主要分析概念原理和解决方 ...

最新文章

  1. ad16自动布线设置规则_PCB设计的十大误区——那些年,我们一起遵守的规则
  2. java字符串编程_java字符串抉择
  3. pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)
  4. 折线插值_使用地形转栅格插值工具创建水文高程表面
  5. hive查看数据库里库的信息_hive 查看当前数据库
  6. OSI七层网络模型与TCP/IP四层网络
  7. java中runnable_Java:在Runnable中处理RuntimeException
  8. 人工智障学习笔记——梯度下降(2)优化算法
  9. php5.2 json,php5.2 对json格式的支持
  10. 各版本的STP BPDU
  11. Perf -- Linux下的系统性能调优工具
  12. 微信开发者工具的使用
  13. win10计算机管理删除卷,win10系统删除卷或驱动器分区的方法
  14. java方法集:大写金额转换数字
  15. 工欲善其事,必先利其器-器
  16. linux之ls -l命令详解
  17. 转转后台 最新转转源码
  18. 《怪诞小镇》的怪诞之物
  19. nginx1.18.0 安装vts
  20. 犹如“笼中困兽”的中国半导体,正在冒着敌人的炮火“匍匐前进”

热门文章

  1. linux中文语音合成软件,中文TTS 的容易告终(基于linux)之 语音库的告终
  2. 数据结构和算法基本概念
  3. 数据库Table ‘数据库名.表名‘ doesn‘t exist
  4. jeecg屏蔽聊天窗口
  5. 2023年还能入行程序员吗?毕业3年以上的黑马老学员这么说!
  6. python每日新鲜壁纸
  7. 鲁大师2022半年报手机流畅榜:vivo X Note弯道超车斩获第一名!
  8. 《Linux命令行与shell脚本编程大全》第二十章 正则表达式
  9. linux负载的单位是,Linux系统负载
  10. GBase 8c V5 单机版安装示例