Unity基础实践小项目
项目流程:
需求分析
开始界面
选择角色面板
排行榜面板
设置面板
游戏面板
确定退出面板
死亡面板
UML类图
准备工作
1.导入资源
2.创建需要的文件夹
3.创建好面板基类
开始场景
开始界面
1.拼面板
2.写脚本
注意事项:注意先设置NGUI的分辨率大小,注意控件的分辨率自适应,注意 Draw Calls!
设置界面 —— 拼面板和基础逻辑
1.拼面板
2.逻辑
BegingPael 里打开设置面板
设置界面——音效数据
1.创建音效数据类
2.创建游戏数据管理类
3.SettingPanel 关联逻辑
实现了音效数据的在设置面板中的获取和修改
设置界面——背景音乐对象
1.创建音乐对象和音乐控制脚本
音乐对象
音乐控制脚本
2.设置面板 调用
排行榜界面——排行榜数据
1.排行榜数据类
2.GameDataMgr 中调用
排行榜界面——拼面板
排行榜界面——逻辑处理
1.单个排行榜控件类——RankItem
2.创建排行榜面板类
选择角色界面 —— 拼面板
选择角色界面——数据准备
1.创建数据集合
2.创建Xml配置文件
3.GameDataMgr 中调用初始化
选择角色界面——逻辑处理
1.创建 ChoosePanel 类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class ChoosePanel : BasePanel<ChoosePanel>
{//各按钮public UIButton btnClose;public UIButton btnLeft;public UIButton btnRight;public UIButton btnStart;//模型父对象public Transform heroPos;//下方属性相关对象public List<GameObject> hpObjs;public List<GameObject> speedObjs;public List<GameObject> volumeObjs;//当前显示的飞机模型对象private GameObject airPlaneObj;public override void Init(){//选择角色后 点击开始 切换场景btnStart.onClick.Add(new EventDelegate(() =>{SceneManager.LoadScene("GameScene");}));btnLeft.onClick.Add(new EventDelegate(() =>{//左按钮 减我们设定的索引--GameDataMgr.Instance.nowSelHeroIndex;//如果 小于最小的索引 直接让其等于 最后一个索引if (GameDataMgr.Instance.nowSelHeroIndex < 0)GameDataMgr.Instance.nowSelHeroIndex = GameDataMgr.Instance.roleData.roleList.Count - 1;ChangeNowHero();}));btnRight.onClick.Add(new EventDelegate(() =>{//右按钮 加我们设定的索引++GameDataMgr.Instance.nowSelHeroIndex;//如果大于了最大索引 就置0if (GameDataMgr.Instance.nowSelHeroIndex > GameDataMgr.Instance.roleData.roleList.Count - 1)GameDataMgr.Instance.nowSelHeroIndex = 0;ChangeNowHero();}));btnClose.onClick.Add(new EventDelegate(() =>{//关闭自己HideMe();//显示开始面板BeginPanel.Instance.ShowMe();}));HideMe();}public override void ShowMe(){base.ShowMe();//每次显示的时候都从第一个开始GameDataMgr.Instance.nowSelHeroIndex = 0;ChangeNowHero();}public override void HideMe(){base.HideMe();//删除当前模型DestroyObj();}//切换当前的选择private void ChangeNowHero(){//得到当前选择的 玩家游戏数据RoleInfo info = GameDataMgr.Instance.GetNowSelHeroInfo();//更新模型//先删除上一次的飞机模型DestroyObj();//再创建当前的飞机模型airPlaneObj = Instantiate(Resources.Load<GameObject>(info.resName));//设置父对象airPlaneObj.transform.SetParent(heroPos);//设置角度和位置 缩放airPlaneObj.transform.localPosition = Vector3.zero;airPlaneObj.transform.localRotation = Quaternion.identity;airPlaneObj.transform.localScale = Vector3.one * info.scale;//修改层级airPlaneObj.layer = LayerMask.NameToLayer("UI");//更新属性for (int i = 0; i < 10; i++){hpObjs[i].SetActive(i < info.hp);speedObjs[i].SetActive(i < info.speed);volumeObjs[i].SetActive(i < info.volume);}}/// <summary>/// 用于删除上一次显示的模型对象/// </summary>private void DestroyObj(){if(airPlaneObj != null){//移除场景的模型Destroy(airPlaneObj);//置空airPlaneObj = null;}}private float time;//是否鼠标选中 模型private bool isSel;// Update is called once per framevoid Update(){//让飞机 上下浮动time += Time.deltaTime;heroPos.Translate(Vector3.up * Mathf.Sin(time) * 0.0001f, Space.World);//射线检测 让飞机 可以左右转动if (Input.GetMouseButtonDown(0)){//如果点击了 UI层碰撞器 认为需要开始 拖动 飞机了if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),1000,1 << LayerMask.NameToLayer("UI"))){isSel = true;}}//抬起 取消选中if (Input.GetMouseButtonUp(0))isSel = false;//旋转对象if (Input.GetMouseButton(0) && isSel){heroPos.rotation *= Quaternion.AngleAxis(Input.GetAxis("Mouse X") * 20, Vector3.up);}}
}
2.GameDataMgr 中逻辑关联
3.BeginPanel 中显隐设置
注意:模型旋转时,发射射线检测的摄像机要是主摄像机,或者就自己指定摄像机发射。
游戏场景
游戏界面
1.拼面板
2.逻辑面板
确定退出界面
1.拼面板
2.写逻辑
3.调用
GamePanel 中调用
结束界面
1.拼面板
2.写逻辑
游戏主逻辑——主玩家相关
1.加一个相加来渲染
一个专门渲染特效
一个专门渲染UI
一个专门渲染其他
2.玩家逻辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerObject : MonoBehaviour
{//血量public int nowHp;public int maxHp;//速度public int speed;//旋转速度public int roundSpeed;//目标四元数角度private Quaternion targetQ;//是否死亡public bool isDead;//当前世界坐标系转屏幕上的点private Vector3 nowPos;//上一次玩家的位置 就是在位移前 玩家的位置private Vector3 frontPos;public void Dead(){isDead = true;//显示游戏结束面板GameOverPanel.Instance.ShowMe();}public void Wound(){if (isDead)return;//减血this.nowHp -= 1;//更新游戏面板上的血量显示GamePanel.Instance.ChangeHp(this.nowHp);//是否死亡了if (this.nowHp <= 0)this.Dead();}private float hValue;private float vValue;// Update is called once per framevoid Update(){//如果死亡了 就没有必要移动了if (isDead)return;//移动 旋转逻辑//旋转hValue = Input.GetAxisRaw("Horizontal");vValue = Input.GetAxisRaw("Vertical");//如果没有按我们的AD键 那么目标角度 就是(0,0,0)度if (hValue == 0)targetQ = Quaternion.identity;//如果按AD键 就是(0,0,20)或者 (0,0,-20) 根据按的左右决定elsetargetQ = hValue < 0 ? Quaternion.AngleAxis(20, Vector3.forward) : Quaternion.AngleAxis(-20, Vector3.forward);//让飞机朝着 这个目标四元数 去旋转this.transform.rotation = Quaternion.Slerp(this.transform.rotation, targetQ, roundSpeed * Time.deltaTime);//在位移之前 记录 之前的位置frontPos = this.transform.position;//移动this.transform.Translate(Vector3.forward * vValue * speed * Time.deltaTime);this.transform.Translate(Vector3.right * hValue * speed * Time.deltaTime, Space.World);//进行极限判断nowPos = Camera.main.WorldToScreenPoint(this.transform.position);//左右 溢出判断if(nowPos.x < 0 || nowPos.x >= Screen.width){this.transform.position = new Vector3(frontPos.x, this.transform.position.y, this.transform.position.z);}//上下 溢出判断if(nowPos.y < 0 || nowPos.y >= Screen.height){this.transform.position = new Vector3(this.transform.position.x, this.transform.position.y, frontPos.z);}}
}
游戏主逻辑——子弹相关
数据准备
1.制作子弹 和 子弹爆炸特效
2.子弹数据类
3.Xml文件配置
4. GameDataMgr 管理初始化
写逻辑
1.创建 BullteObject 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BulletObject : MonoBehaviour
{//子弹使用的数据private BulletInfo info;//用于曲线移动的 计时变量private float time;//初始化子弹数据的方法public void InitInfo(BulletInfo info){this.info = info;//根据生命周期函数 决定自己什么时候 延迟移除//Destroy(this.gameObject, info.lifeTime);//两种方式来移除 Destroy和延迟函数 看看哪种方法更合适Invoke("DealyDestroy", info.lifeTime);}private void DealyDestroy(){Destroy(this.gameObject);}//销毁场景上的子弹public void Dead(){//创建死亡特效GameObject eff = Instantiate(Resources.Load<GameObject>(this.info.deadEffRes));//设置特效的位置 创建在当前子弹的位置eff.transform.position = this.transform.position;//1秒后延迟移除特效Destroy(eff, 1f);//销毁子弹对象Destroy(this.gameObject);}//和对象碰撞时 (触发)private void OnTriggerEnter(Collider other){if (other.gameObject.CompareTag("Player")){//得到玩家脚本PlayerObject obj = other.GetComponent<PlayerObject>();//玩家受伤减血obj.Wound();//销毁自己 就是直接调用 Dead方法Dead();}}// Update is called once per framevoid Update(){//所有移动的共同特点 都是朝自己的面朝向动this.transform.Translate(Vector3.forward * info.forwardSpeed * Time.deltaTime);//接着再来处理 其他的移动逻辑//1 代表 只朝自己面朝向移动 直线移动//2 代表 曲线运动//3 代表 右抛物线//4 代表 左抛物线//5 代表 跟踪移动switch (info.type){case 2:time += Time.deltaTime;//sin里面值变化的快慢 决定了 左右变化的频率//乘以的速度 变化的大小 决定了 左右位移的多少this.transform.Translate(Vector3.right * info.rightSpeed * Time.deltaTime * Mathf.Sin(time * info.roundSpeed));break;case 3://右抛物线 无非 就是 去改变 旋转角度this.transform.rotation *= Quaternion.AngleAxis(info.roundSpeed * Time.deltaTime, Vector3.up);break;case 4://左抛物线 无非 就是 去改变 旋转角度this.transform.rotation *= Quaternion.AngleAxis(-info.roundSpeed * Time.deltaTime, Vector3.up);break;case 5://跟踪移动 不停的计算 玩家和我之间的方向向量 得到四元数 然后自己的角度 不停的 变化为这个目标四元数this.transform.rotation = Quaternion.Slerp(this.transform.rotation,Quaternion.LookRotation(PlayerObject.Instance.transform.position - this.transform.position), info.roundSpeed * Time.deltaTime);break;}}
}
2.测试
游戏主逻辑——开火点相关
数据准备
1.创建开火点数据 —— FireData
2.配置Xml文件
3. GameDataMgr 中初始化
逻辑处理一
主要实现了绘制开火点位置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 表示 开火点位置的 类型
/// </summary>
public enum E_Pos_Type
{TopLeft,Top,TopRight,Left,Right,BottonLeft,Botton,BottonRight,
}public class FireObject : MonoBehaviour
{public E_Pos_Type type;//表示屏幕上的点private Vector3 screenPos;//初始发射子弹的方向 主要用于作为散弹的初始方向 用于计算private Vector3 initDir;// Update is called once per framevoid Update(){//用于测试玩家转屏幕坐标后 横截面的 z轴值//print(Camera.main.WorldToScreenPoint(PlayerObject.Instance.transform.position));//更新 开火点位置 达到分辨率自适应UpdatePos();}//根据点的类型 来更新它的位置private void UpdatePos(){//这里设置z轴 是为了和主玩家位置转屏幕坐标后的 z位置一样 目的是 让点和玩家 所在的 横截面是一致的screenPos.z = 150.6f;switch (type){case E_Pos_Type.TopLeft:screenPos.x = 0;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.Top:screenPos.x = Screen.width / 2;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.TopRight:screenPos.x = Screen.width;screenPos.y = Screen.height;initDir = Vector3.left;break;case E_Pos_Type.Left:screenPos.x = 0;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.Right:screenPos.x = Screen.width;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.BottonLeft:screenPos.x = 0;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.Botton:screenPos.x = Screen.width / 2;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.BottonRight:screenPos.x = Screen.width;screenPos.y = 0;initDir = Vector3.left;break;}//再把屏幕点 转换为 世界坐标点 那得到的 就是我们想要的坐标点this.transform.position = Camera.main.ScreenToWorldPoint(screenPos);}
}
逻辑处理二
1.实现了重置开火点数据 和 检测开火逻辑 (代码量较多 要好好了解)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 表示 开火点位置的 类型
/// </summary>
public enum E_Pos_Type
{TopLeft,Top,TopRight,Left,Right,BottonLeft,Botton,BottonRight,
}public class FireObject : MonoBehaviour
{public E_Pos_Type type;//表示屏幕上的点private Vector3 screenPos;//初始发射子弹的方向 主要用于作为散弹的初始方向 用于计算private Vector3 initDir;//当前开火点的数据信息private FireInfo fireInfo;private int nowNum;private float nowCD;private float nowDelay;//当前组开火点 使用的子弹信息private BulletInfo nowBulletInfo;//散弹时 每颗子弹的间隔角度private float changeAngle;//用于发射散弹时 记录上一次的方向private Vector3 nowDir;// Update is called once per framevoid Update(){//用于测试玩家转屏幕坐标后 横截面的 z轴值//print(Camera.main.WorldToScreenPoint(PlayerObject.Instance.transform.position));//更新 开火点位置 达到分辨率自适应UpdatePos();//每次 都检测 是否需要 重置 开火点数据ResetFireInfo();//发射子弹UpdateFire();}//根据点的类型 来更新它的位置private void UpdatePos(){//这里设置z轴 是为了和主玩家位置转屏幕坐标后的 z位置一样 目的是 让点和玩家 所在的 横截面是一致的screenPos.z = 150.6f;switch (type){case E_Pos_Type.TopLeft:screenPos.x = 0;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.Top:screenPos.x = Screen.width / 2;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.TopRight:screenPos.x = Screen.width;screenPos.y = Screen.height;initDir = Vector3.left;break;case E_Pos_Type.Left:screenPos.x = 0;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.Right:screenPos.x = Screen.width;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.BottonLeft:screenPos.x = 0;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.Botton:screenPos.x = Screen.width / 2;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.BottonRight:screenPos.x = Screen.width;screenPos.y = 0;initDir = Vector3.left;break;}//再把屏幕点 转换为 世界坐标点 那得到的 就是我们想要的坐标点this.transform.position = Camera.main.ScreenToWorldPoint(screenPos);}//重置当前要发射的炮台数据private void ResetFireInfo(){//自己定一个规则 只有当cd和数量都为0时 才认为需要重新获取 发射点数据if (nowCD != 0 && nowNum != 0)return;//组间休息时间判断if (fireInfo != null){nowDelay -= Time.deltaTime;//还在组间休息if (nowDelay > 0)return;}//从数据中随机取出一条 来按照规则 发射子弹List<FireInfo> list = GameDataMgr.Instance.fireData.fireInfoList;fireInfo = list[Random.Range(0, list.Count)];//我们不能直接改变数据当中的内容 我们应该拿变量 临时存储下来 这样就不会影响我们数据本身nowNum = fireInfo.num;nowCD = fireInfo.cd;nowDelay = fireInfo.delay;//通过 开火点数据 取出 当前要使用的子弹数据信息//得到开始id 和 结束id 用于随机取子弹信息string[] strs = fireInfo.ids.Split(',');int beginID = int.Parse(strs[0]);int endID = int.Parse(strs[1]);int randomBulletID = Random.Range(beginID, endID + 1);nowBulletInfo = GameDataMgr.Instance.bulletData.bulletInfoList[randomBulletID - 1];//如果是散弹 就需要计算 间隔角度if (fireInfo.type == 2){switch (type){case E_Pos_Type.TopLeft:case E_Pos_Type.TopRight:case E_Pos_Type.BottonLeft:case E_Pos_Type.BottonRight:changeAngle = 90f / (nowNum + 1);break;case E_Pos_Type.Top:case E_Pos_Type.Left:case E_Pos_Type.Right:case E_Pos_Type.Botton:changeAngle = 180f / (nowNum + 1);break;}}}//检测开火private void UpdateFire(){//当前状态 是不需要发射子弹的if (nowCD == 0 && nowNum == 0)return;//cd更新nowCD -= Time.deltaTime;if (nowCD > 0)return;GameObject bullet;BulletObject bulletObj;switch (fireInfo.type){//一颗一颗的发射子弹 朝向玩家case 1://动态创建 子弹对象bullet = Instantiate(Resources.Load<GameObject>(nowBulletInfo.resName));//动态添加 子弹脚本bulletObj = bullet.AddComponent<BulletObject>();//把当前的子弹数据传入子弹脚本 进行初始化bulletObj.InitInfo(nowBulletInfo);//设置子弹的位置 和朝向bullet.transform.position = this.transform.position;bullet.transform.rotation = Quaternion.LookRotation(PlayerObject.Instance.transform.position - bullet.transform.position);//表示已经发射一颗子弹--nowNum;//重置cdnowCD = nowNum == 0 ? 0 : fireInfo.cd;break;//发射散弹case 2://无CD 一瞬间 发射所有的散弹if(nowCD == 0){for (int i = 0; i < nowNum; i++){//动态创建 子弹对象bullet = Instantiate(Resources.Load<GameObject>(nowBulletInfo.resName));//动态添加 子弹脚本bulletObj = bullet.AddComponent<BulletObject>();//把当前的子弹数据传入子弹脚本 进行初始化bulletObj.InitInfo(nowBulletInfo);//设置子弹的位置 和朝向bullet.transform.position = this.transform.position;//每次都会旋转一个角度 得到一个新的方向nowDir = Quaternion.AngleAxis(changeAngle * i, Vector3.up) * initDir;bullet.transform.rotation = Quaternion.LookRotation(nowDir);}//因为是瞬间创建完所有子弹 所以 重置数据nowCD = nowNum = 0;}else{//动态创建 子弹对象bullet = Instantiate(Resources.Load<GameObject>(nowBulletInfo.resName));//动态添加 子弹脚本bulletObj = bullet.AddComponent<BulletObject>();//把当前的子弹数据传入子弹脚本 进行初始化bulletObj.InitInfo(nowBulletInfo);//设置子弹的位置 和朝向bullet.transform.position = this.transform.position;//每次都会旋转一个角度 得到一个新的方向nowDir = Quaternion.AngleAxis(changeAngle * (fireInfo.num - nowNum), Vector3.up) * initDir;bullet.transform.rotation = Quaternion.LookRotation(nowDir);//表示已经发射一颗子弹--nowNum;//重置cdnowCD = nowNum == 0 ? 0 : fireInfo.cd;}break;}}}
2.串联 开始面板和游戏面板
创建 Main 类 用于创建玩家飞机
逻辑功能完善
1.子弹自动销毁
2.不隐藏光标
3.射线检测销毁子弹
游戏展示:
暂时无法上传!
总结
相关文章:
Unity基础实践小项目
项目流程: 需求分析 开始界面 选择角色面板 排行榜面板 设置面板 游戏面板 确定退出面板 死亡面板 UML类图 准备工作 1.导入资源 2.创建需要的文件夹 3.创建好面板基类 开始场景 开始界面 1.拼面板 2.写脚本 注意事项:注意先设置NGUI的分辨率大小&…...
Set up a WordPress blog with Nginx
CentOS7 配置Nginx域名HTTPS Here is the revised guideline for setting up a WordPress blog with Nginx: Step 1: Install Nginx, MySQL, and PHP (LEMP Stack) Install Nginx: sudo yum install nginx sudo systemctl start nginx sudo systemctl enable nginxInstall MyS…...
Facebook开户|Facebook广告设计与测试优化
早上好家人们~今天Zoey给大家伙带来的是Facebook广告设计与测试优化,需要的家人们看过来啦! 一、避免复杂用图和过多的文字 根据Facebook的数据显示,用户平均浏览一个贴文的时间在手机上仅花1.7秒、在电脑上则为2.5秒。因此,广告…...
vite获取所有环境变量(env)
0.环境变量文件 API_URL8888888 VITE_API_URL99999991.定义环境变量 默认情况下,vite只获取以VITE_为前缀的环境变量。 为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码 但如果你觉得你是进击的巨人…...
【算法】常用排序算法(插入排序、希尔排序、堆排序、选择排序、冒泡排序、快速排序、归并排序、计数排序)超详细
排序算法是数据结构相关知识中非常重要的一节,相信很多小伙伴对这部分知识一知半解。那么接下来,小编就要带领大家一起来进行对排序算法的深入剖析学习,希望本篇文章能够使你有所收获! 一.常见的排序算法 排序算法有很多种&#…...
力扣 240.搜素矩阵II
题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9…...
ASUS华硕ROG幻14Air笔记本GA403UI(UI UV UU UJ)工厂模式原厂Windows11系统安装包,带MyASUS in WinRE重置还原
适用型号:GA403UI、GA403UV、GA403UU、GA403UJ 链接:https://pan.baidu.com/s/1tz8PZbYKakfvUoXafQPLIg?pwd1mtc 提取码:1mtc 华硕原装WIN11系统工厂包带有ASUS RECOVERY恢复功能、自带面部识别,声卡,显卡,网卡,蓝牙等所有驱动、出厂主题…...
Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流
😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...
硬件工程师的蜗牛成长路
一名合格的硬件工程师,需要掌握的知识有很多,知识点积累不是一蹴而就,而是细水长流,螺旋提升,不急,慢慢来,想掌握的都能掌握,就让时间来见证个人的成长路径。 ---大青山 2024/6/10 …...
简单记录玩4399游戏flash插件问题
一、因谷歌浏览器默认禁止flash插件自动运行,所以玩家在使用谷歌浏览器,访问www.4399.com平台页面或者4399小游戏(flash资源)时,可能会出现加载异常的情况。今天教大家如何开启flash插件 二、下载falsh官方插件 地址:Flash Player官方下载中心-Flash中国官网 三、如果您…...
GNU/Linux - 使用字符设备来操作GPIO
从 4.8 版开始,Linux 内核引入了基于字符设备的新用户空间 API,用于管理和控制 GPIO(通用输入/输出)。这篇文章介绍了新接口的基本原理,并通过一个简单的教程/示例演示了如何使用新 API 控制 GPIO。 教程中使用的硬件是…...
Android13 Settings 左上角箭头图标点击无效
最近在修改A311D2方案固件,系统Settings发现很多bug 最明显的是左上角有个箭头样子的图标,通常认为是返回键,点击之后没有任何效果,目测这个是ActionBar的按键。 SettingsBaseActivity里面有一段这样的代码: // Th…...
WinForms 应用(.NET 8.0)使用ReportViewerCore.WinForms显示打印RDLC报表
在要WinForms 应用(.NET 8.0)中,显示RDLC报表,就要使用ReportViewerCore.WinForms。原来的ReportViewer只能在.NET Framework框架下运行。 1.ReportViewerCore.WinForms 程序包说明 SQL Server Reporting Services ReportViewer…...
【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习
文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…...
【CentOS】手动编译安装make、cmake、gcc、git
摘要 Centos7升级make和gcc版本到最新——CSDN make make 各个版本下载地址 http://ftp.gnu.org/pub/gnu/make 以4.4为例安装: # 下载 wget https://ftp.gnu.org/pub/gnu/make/make-4.4.tar.gz # 解压配置 tar zxf make-4.4.tar.gz cd make-4.4 ./configure --p…...
45.django - 开始建立第一个项目
1.django是什么? Django是一个高级的、免费的、开源的Web应用框架,它由Python编程语言编写而成。Django遵循模型-视图-控制器(MVC)的设计模式,但通常将其称为模型-视图-模板(MVT)架构。它的主要…...
# 梯影传媒T6投影仪刷机方法及一些刷机工具链接
梯影传媒T6投影仪刷机方法及一些刷机工具链接 文章目录 梯影传媒T6投影仪刷机方法及一些刷机工具链接1、安装驱动程序2、备份设备rom【boot、system】3、还原我要刷进设备的rom【system】4、打开开发者模式以便于安装apk5、root设备6、更多好链接: 梯影传媒T6使用的…...
【代码随想录算法训练营第37期 第三十二天 | LeetCode122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II】
代码随想录算法训练营第37期 第三十二天 | LeetCode122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II 一、122.买卖股票的最佳时机II 解题代码C: class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for(int i 1; i &…...
DP:回文串模型
一、回文子串 . - 力扣(LeetCode) 该题有3种解法 (1)中心扩展算法(在字符串章节有介绍)时间复杂度O(N^2),空间复杂度O(1) (2)马丁车…...
STM32CubeMX软件的安装以及配置
STM32CubeMX软件的配置过程可以详细分为以下几个步骤,以确保您能够顺利地使用该软件进行STM32微控制器的配置和代码生成: 1. 安装前准备 安装JAVA环境:由于STM32CubeMX软件是基于JAVA环境运行的,所以需要先安装Java Runtime Env…...
【适配鸿蒙next】Flutter 新一代混合栈管理框架
前言 据最新消息显示,华为今年下半年将全面转向其自主平台HarmonyOS,放弃Android系统。 报道中提到,下一版HarmonyOS预计将随华为即将推出的Mate 70旗舰系列一起发布。 据悉,HarmonyOS Next 已经扩展到4000个应用程序,…...
车载电子电气架构 --- 车载信息安全
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
【数据结构(邓俊辉)学习笔记】图04——双连通域分解
文章目录 0. 概述1 关节点与双连通域2 蛮力算法3 可行算法4 实现5 示例6 复杂度 0. 概述 学习下双连通域分解,这里略微有一点点难,这个算是DFS算法的非常非常经典的应用,解决的问题也非常非常有用。 1 关节点与双连通域 连通性很好理解&am…...
UI学习(二)
UI学习(二) 文章目录 UI学习(二)布局子视图手动布局自动布局 导航控制器导航控制器基础导航控制器的切换导航栏工具栏 分栏控制器分栏控制器协议部分的内容UITableView基础部分相关的协议函数高级协议与单元格 多界面传值 布局子视…...
【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?
问题: 波特率9600,发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间,如何计算? 在计算发送数据的时间时,首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式(1个起始位&…...
jmeter -n -t 使用非GUI模式运行脚本说明
命令模式下执行jmx文件 jmeter -n -t fatie.jmx -l results\t4.jtl -e -o results\h1 表示以命令行模式运行当前目录下的脚本fatie.jmx,将结果存入当前目录下的results\t1.jtl,并且生成html格式的报告,写入文件夹results\h1。 说明:生成结果的文件夹r…...
网络流媒体协议——HLS协议
HTTP 实时流媒体(HTTP Live Streaming,HLS)协议是苹果公司提出的主要用于直播的流媒体协议。一个完整的基于HLS协议的流媒体直播系统由四部分组成,即音视频采集器、媒体服务器、媒体分发器和播放客户端。 媒体服务器 媒体服务器的…...
Linux服务器扩容及磁盘分区(LVM和非LVM)
Linux扩容及磁盘分区(LVM和非LVM) 本文主要介绍了阿里云服务器centos的扩容方法:非LVM分区扩容方法(系统盘),以及磁盘改LVM并分区(数据盘)。主要是ext4文件系统及xfs磁盘scsi MBR分…...
支持向量机
支持向量机(SVM) 支持向量机(Support Vector Machine, SVM)是一种用于分类和回归任务的监督学习算法。SVM 的核心思想是找到一个最优的决策边界(或称为超平面),以最大化不同类别之间的间隔。以…...
Kafka 架构
1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务,用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈,…...
顺德营销型网站一站式服务哪家好/长沙市网站制作
Windows创建本地Git代码管理 在window是环境下快速本地Git代码管理; 包括下载软件、创建版本库基本命令; 下载Git Git官方网站下载地址 尝试了两次,速度只有几十kBps,而且下载到差不多80%时显示下载失败,不推荐。这里…...
p2p网站制作郑州/百度推广没有一点效果
我在绘制简单的折线图时遇到了问题,在y轴上有数值,其中轴上的日期是:我的python代码如下:i 0 #iterator for weather dataxAxis []yAxis []for trainingDate in observations[:,0]: #getting values in x and y axis for the d…...
网站新闻打不开/全网seo是什么意思
昨天用Extjs2.x建了弹窗里面有一个gridA,然后我希望点击gridA内的行实现弹窗,窗体内也放了一个gridB,但是当我点击gridA的行的时候弹窗是弹出来了不过在gridA的窗体后面,后来我在gridB的弹窗的时候加了一句Ext.getBody()的渲染效果暂时解决了…...
wordpress h5模板/百度代做seo排名
题库来源:安全生产模拟考试一点通公众号小程序 2022年安全员-C证试题是安全员-C证练习题高频考题覆盖!2022安全员-C证考试题模拟考试题库及在线模拟考试依据安全员-C证考试教材。安全员-C证复审模拟考试通过安全生产模拟考试一点通上提前熟悉考试环境。…...
wordpress点击后出现浮窗/百度app打开
文章目录一、基本概念:①字母表:②字母表上的运算:③符号串:④符号串上的运算:二、文法的定义:①文法的形式化定义:②产生式的简写:③符号约定:三、语言的定义࿱…...
湛江网站建设公司/seo推广策划
在某些小型组织中,可能有必要在集线器传输服务器上运行 Microsoft Exchange Server 2010 反垃圾邮件功能。例如,某些组织可能没有相当数量的电子邮件,因此没有必要投入成本安装和维护完备的外围网络以及边缘传输服务器。可以在集线器传输服务…...