打砖块教学(初学:5)
首先制作所需要的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)相关推荐
- FPGA开发工具套餐搭配推荐及软件链接(工程师们转起来)
FPGA开发工具套餐搭配推荐及软件链接(工程师们转起来) FPGA之家 今天 以下文章来源于FPGA开源工作室 ,作者相量子 FPGA开源工作室 知识,创新,创艺,FPGA,matlab,opencv ...
- FPGA开发工具套餐搭配推荐及软件链接 (更新于2020.03.16)
一.Xilinx(全球FPGA市场份额最大的公司,其发展动态往往也代表着整个FPGA行业的动态) (1) Xilinx官方软件下载地址链接: https://china.xilinx.com/supp ...
- B站百万播放量Java零基础教程视频(适合Java 0基础,Java初学入门),史上最细Java零基础教学视频
是否还在为学习Java如何入门而烦恼? 是否还在为Java软件如何安装而烦恼? 是否还在找寻着适合零基础的Java视频教程? 动力节点教学总监老杜159集课堂实录Java零基础视频教程,从初学者角度出 ...
- python课堂教学_初中生初学python课堂教学感悟
作者:实验初中 望玉红 21世纪以来,信息技术迅猛发展,深刻地改变着人们的学习.生产.生活和社会交往方式,人类社会已快速进入信息化社会.信息素养是当代社会公民所必备的基本素养,强化信息技术课程教育教学 ...
- 初学python心得1000字实训_数学教学1000字六年级心得大全
数学是训练学生思维能力的一门主要基础学科.改革数学教学,其着眼点应该放在引导学生通过自己的思维活动掌握学习方法上.为发展学生的思维能力,培养学生和训练学生善于发现问题和解决问题的能力,要重视思维训练. ...
- 适合初学Altium Designer的教学视频
以下推荐的我都亲自看过,个人感觉确实不错,可以有助于了解流程,以及一些设计规范 首先是凡亿的PCB教学,贵是贵了点,不过也有免费的,讲解的很详细,而且还有专门的群,610359270 http://w ...
- python初中教学_初中生初学python课堂教学感悟
作者:实验初中 望玉红 21世纪以来,信息技术迅猛发展,深刻地改变着人们的学习.生产.生活和社会交往方式,人类社会已快速进入信息化社会.信息素养是当代社会公民所必备的基本素养,强化信息技术课程教育教学 ...
- 塔罗牌新手初学占卜资料视频教程教学
现在我为你准备了一份塔罗学习资料包,现在找我索取即可.发送资料到xiaoxiaomo9#qq.com,#换成@即可,自动获取学习资料. 你有没有想过,有些人不需要花费大量的时间,就可以给别人看的八九不 ...
- C语言/C++初学 问题
编程及C/C++初学者 FAQ 本文原为本人在论坛所发若干帖,意在集中解决新手学习C/C++语言时将遭遇到的各类问题,网友反馈情况良好,集合修订后作为个人作品贴于此处. 本贴主要分析概念原理和解决方 ...
最新文章
- ad16自动布线设置规则_PCB设计的十大误区——那些年,我们一起遵守的规则
- java字符串编程_java字符串抉择
- pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)
- 折线插值_使用地形转栅格插值工具创建水文高程表面
- hive查看数据库里库的信息_hive 查看当前数据库
- OSI七层网络模型与TCP/IP四层网络
- java中runnable_Java:在Runnable中处理RuntimeException
- 人工智障学习笔记——梯度下降(2)优化算法
- php5.2 json,php5.2 对json格式的支持
- 各版本的STP BPDU
- Perf -- Linux下的系统性能调优工具
- 微信开发者工具的使用
- win10计算机管理删除卷,win10系统删除卷或驱动器分区的方法
- java方法集:大写金额转换数字
- 工欲善其事,必先利其器-器
- linux之ls -l命令详解
- 转转后台 最新转转源码
- 《怪诞小镇》的怪诞之物
- nginx1.18.0 安装vts
- 犹如“笼中困兽”的中国半导体,正在冒着敌人的炮火“匍匐前进”
热门文章
- linux中文语音合成软件,中文TTS 的容易告终(基于linux)之 语音库的告终
- 数据结构和算法基本概念
- 数据库Table ‘数据库名.表名‘ doesn‘t exist
- jeecg屏蔽聊天窗口
- 2023年还能入行程序员吗?毕业3年以上的黑马老学员这么说!
- python每日新鲜壁纸
- 鲁大师2022半年报手机流畅榜:vivo X Note弯道超车斩获第一名!
- 《Linux命令行与shell脚本编程大全》第二十章 正则表达式
- linux负载的单位是,Linux系统负载
- GBase 8c V5 单机版安装示例