4、Unity【基础】画线功能Linerenderer、物理系统Physics

在这里插入图片描述

文章目录

  • 画线功能Linerenderer
    • 1、LineRenderer是什么
    • 2、LineRender参数相关
    • 3、LineRender代码相关
      • 思考1 请写一个方法,传入一个中心点,传入一个半径,用LineRender画个圆出来
      • 思考2 在Game窗口长按鼠标用LineRender画出鼠标移动的轨迹
  • 核心系统
    • 1、物理系统之范围检测
      • 回顾:物理系统之碰撞检测
      • 什么是范围检测
      • 如何进行范围检测
        • 必备条件
        • 范围检测API
          • 1.盒状范围检测
          • 2.球形范围检测
          • 3.胶囊范围检测
        • 总结
        • 思考 范围检测
    • 2、物理系统之射线检测
      • 1、什么是射线检测
      • 2、射线对象
      • 3、碰撞检测函数
      • 4、使用时注意的问题
      • 思考1 子弹射击到物体效果
      • 思考2 控制场景物体

画线功能Linerenderer

1、LineRenderer是什么

LineRenderer是Unity提供的一个用于画线的组件
使用它我们可以在场景中绘制线段
一般可以用于
1、绘制攻击范围 2、武器红外线 3、辅助功能 4、其它画线功能

2、LineRender参数相关

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、LineRender代码相关

private Material m;
void Start()
{//动态添加一个线段GameObject line = new GameObject();line.name = "line";LineRenderer lineRenderer = line.AddComponent<LineRenderer>();//首尾相连lineRenderer.loop = true;//开始结束宽lineRenderer.startWidth = 0.02f;lineRenderer.endWidth = 0.02f;//开始结束颜色lineRenderer.startColor = Color.white;lineRenderer.endColor = Color.red;//设置材质m = Resources.Load<Material>("M");lineRenderer.material = m;//设置点的数量lineRenderer.positionCount = 4;lineRenderer.SetPositions(new Vector3[] { new Vector3(0, 0, 0),new Vector3(0, 0, 5),new Vector3(5, 0, 5)}); //批量设置lineRenderer.SetPosition(3, new Vector3(5, 0, 0)); //索引设置//是否使用世界坐标系//决定了是否随对象移动而移动lineRenderer.useWorldSpace = true;//让线段受光影响会接受光数据进行着色器计算lineRenderer.generateLightingData = true;
}

思考1 请写一个方法,传入一个中心点,传入一个半径,用LineRender画个圆出来

using UnityEngine;public class CicleLine : MonoBehaviour
{void Start(){DrawCicleLine(Vector3.zero, 5, 360);}public void DrawCicleLine(Vector3 centerPos, float r, int pointNum){//画线对象GameObject obj = new GameObject();obj.name = "R";LineRenderer cicleLine = obj.AddComponent<LineRenderer>();cicleLine.loop = true;//设置点cicleLine.positionCount = pointNum;//圆的单位弧度float angle = 360f / pointNum;//画圆for (int i = 0; i < pointNum; i++){cicleLine.SetPosition(i, centerPos + Quaternion.AngleAxis(angle * i, Vector3.up) * Vector3.forward * r);}}
}

思考2 在Game窗口长按鼠标用LineRender画出鼠标移动的轨迹

using UnityEngine;public class MouseLine : MonoBehaviour
{private LineRenderer DrawLine;//为了设置画线位置的横截面(距离)private Vector3 nowMousePos;void Update(){if(Input.GetMouseButtonDown(0)){GameObject obj = new GameObject();DrawLine = obj.AddComponent<LineRenderer>();DrawLine.loop = false;DrawLine.startWidth = 0.5f;DrawLine.endWidth = 0.5f;DrawLine.positionCount = 0;}if (Input.GetMouseButton(0)){DrawLine.positionCount += 1;//得到鼠标的屏幕坐标转世界坐标的点位置//新加点为最后一个点//1、得到鼠标位置//Input.mousePosition//2、鼠标屏幕坐标转世界坐标//Camera.main.ScreenToWorldPoint(Input.mousePosition);nowMousePos = Input.mousePosition;nowMousePos.z = 10;DrawLine.SetPosition(DrawLine.positionCount-1, Camera.main.ScreenToWorldPoint(nowMousePos));}}
}

核心系统

在这里插入图片描述

1、物理系统之范围检测

回顾:物理系统之碰撞检测

碰撞产生的必要条件
1.至少一个物体有刚体
2.两个物体都必须有碰撞器碰撞和触发
碰撞会产生实际的物理效果
触发看起来不会产生碰撞但是可以通过函数监听触发
碰撞检测主要用于实体物体之间产生物理效果时使用

什么是范围检测

游戏中瞬时的攻击范围判断一般会使用范围检测
没有实体物体只想要检测在指定某一范围是否让敌方受到伤害时便可以使用范围判断
在指定位置进行范围判断,我们可以得到处于指定范围内的对象
目的是对对象进行处理,比如受伤减血等

如何进行范围检测

必备条件
必备条件:想要被范围检测到的对象必须【具备碰撞器】
注意点:
1.范围检测相关API:只有当执行该代码时,进行一次范围检测,它是瞬时的
2.范围检测相关API:并不会真正产生一个碰撞器,只是碰撞判断计算而已
范围检测API
1.盒状范围检测
范围检测API
1.盒状范围检测
参数一:立方体中心点
参数二:立方体三边大小
参数三:立方体角度
参数四:检测指定层级(不填检测所有层)
参数五:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)重要知识点:关于层级
通过名字得到层级编号LayerMask.NameToLayer 我们需要通过编号左移构建二进制数
这样每一个编号的层级都是对应位为12进制数
我们通过位运算可以选择想要检测层级
好处一个int就可以表示所有想要检测的层级信息Collider[] colliders = Physics.OverlapBox(Vector3.zero, Vector3.one,Quaternion.AngleAxis(45, Vector3.up),1 << LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal);for (int i = 0; i < colliders.Length; i++){print(colliders[i].gameObject.name);}参数四的层级编号是0~31刚好32位是一个int数
每一个编号代表的都是二进制的一位
例如:0000 0001 左移5: 1 << 50010 0000另一个API
可以判断有无触发碰撞器
返回值:碰撞到的碰撞器数量
参数:传入一个数组进行存储if (Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders) != 0){}
2.球形范围检测
2.球形范围检测
参数一:中心点
参数二:球半径
参数三:检测指定层级(不填检测所有层)
参数四:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)Physics.OverlapSphere(Vector3.zero,3,1<<LayerMask.NameToLayer("UI"));另一个API
可以判断有无触发碰撞器
返回值:碰撞到的碰撞器数量
参数:传入一个数组进行存储if (Physics.OverlapSphereNonAlloc(Vector3.zero, 3, colliders) != 0){}
3.胶囊范围检测
3.胶囊范围检测
参数一:半圆中心点
参数二:半圆二中心点
参数三:半圆半径
参数四:检测指定层级(不填检测所有层)
参数五:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal);另一个API
可以判断有无触发碰撞器
返回值:碰撞到的碰撞器数量
参数:传入一个数组进行存储if (Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders) != 0){}
总结
范围检测主要用于瞬时的碰撞范围检测
主要掌握
Physics类中的静态方法
球形、盒装、胶囊三种API的使用即可
思考 范围检测
世界坐标原点有一个立方体,键盘WASD键可以控制其前后移动和旋转
请结合所学知识实现
1.按J键在立方体面朝向前方1米处进行立方体范围检测
2.按K键在立方体前面5米范围内进行胶囊范围检测
3.按L键以立方体脚下为原点,半径10米内进行球形范围检测using UnityEngine;public class RangeSensing : MonoBehaviour
{public float moveSpeed = 8;public float rotateSpeed = 30;void Update(){transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed * Input.GetAxis("Vertical"));transform.Rotate(Vector3.up, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime);if (Input.GetKeyDown(KeyCode.J)){Collider[] colliders = Physics.OverlapBox(transform.position + transform.forward,Vector3.one * 0.5f, //此处为边长的一半transform.rotation, //面朝向角度1 << LayerMask.NameToLayer("Monster"));for (int i = 0; i < colliders.Length; i++){print(colliders[i].gameObject.name + "受到伤害");}}if (Input.GetKeyDown(KeyCode.K)){Collider[] colliders = Physics.OverlapCapsule(transform.position,transform.position + transform.forward * 5,0.5f,1<<LayerMask.NameToLayer("Monster"));for (int i = 0; i < colliders.Length; i++){print(colliders[i].gameObject.name + "受到伤害");}}if (Input.GetKeyDown(KeyCode.L)){Collider[] colliders = Physics.OverlapSphere(transform.position, 10, 1 << LayerMask.NameToLayer("Monster"));for (int i = 0; i < colliders.Length; i++){print(colliders[i].gameObject.name + "受到伤害");}}}
}

2、物理系统之射线检测

在这里插入图片描述

在这里插入图片描述

1、什么是射线检测

物理系统中
目前我们学习的物体相交判断
1.碰撞检测的必备条件 1刚体 2碰撞器
2.范围检测的必备条件碰撞器如果想要做这样的撞检测呢
1.鼠标选择场景上一物体
2.FPS射击游戏(无弹道-不产生实际的子弹对象进行移动)
等等需要判断一条线和物体的碰撞情况
射线检测就是来解决这些问题的
它可以在指定点发射一个指定方向的射线
判断该射线与哪些碰撞器相交,得到对应对象

2、射线对象

13D世界中的射线假设有一条
起点为坐标(1,0,0)
方向为世界坐标Z轴正方向的射线
注意:
理解参数含义
参数一:起点
参数二:方向向量(一定记住不是两点决定射线方向,第二个参数直接就代表方向向量)Ray ray = new Ray(Vector3.right,Vector3.forward);
Ray中的参数ray.origin; //起点ray.direction; //方向2,摄像象机发射出的射线
得到一条从屏幕位置作为起点
摄像机视口方向为方向的射线Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePosition);注意
单独的射线对于我们来说没有实际的意义
我们需要用它结合物理系统进行射线碰撞判断

3、碰撞检测函数

Physics类中提供了很多进行射线检测的静态函数
它们有很多种重载类型,我们只需要掌握核心的几个函数
注意
射线检测也是瞬时的
执行代码时进行一次射线检测1.最原始的射线检测(只会判断是否碰撞)
准备一条射线Ray ray = new Ray(Vector3.zero,Vector3.forward);
进行射线检测,如果碰撞到对象,则返回true
参数一:射线
参数二:检测的最大距离超出这个距离不检测
参数三:检测指定层级(不填检测所有层)
参数四:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:bool 当碰撞到对象时 返回true,没有返回falseif (Physics.Raycast(ray, 1000, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal)){print("碰撞到了对象");}还有一种重载不用传入射线直接传入起点和方向也可以用于判断
就是把第一个参数,变成了射线的两个点(一个起点,一个方向)if (Physics.Raycast(Vector3.zero,Vector3.forward, 1000, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal)){print("碰撞到了对象");}
2.获取相交的【单个物体信息】
物体信息类RaycastHitRaycastHit hitInfo;
参数一:射线
参数二:RaycastHit是结构体,是值类型Unity会通过out关键在在函数内部处理后,得到碰撞数据后返回到该参数中
参数三:检测距离
参数四:检测指定层级(不填检测所有层)
参数五:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)if(Physics.Raycast(ray,out hitInfo,1000,1<<LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal)){print("得到了碰撞到物体的信息");//碰撞器信息print("碰撞到物体的名字" + hitInfo.collider.name);print("碰撞到物体的名字" + hitInfo.collider.gameObject.name);//碰撞到的点(相交位置)print("相交位置" + hitInfo.point);//平面的法线信息print("法线" + hitInfo.normal);//碰撞到对象的位置print("对象的位置" + hitInfo.transform.position);//碰撞到对象离自己的距离print("距离" + hitInfo.distance);}另一种重载,不用传入射线(直接传入起点和方向也可以用于判断)if (Physics.Raycast(Vector3.zero, Vector3.forward, out hitInfo, 1000, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal)){ }
3.获取相交的【多个物体信息】
可以得到碰撞到的多个对象
如果没有就是容量为0的数组
参数一:射线
参数二:检测距离
参数三:检测指定层级(不填检测所有层)
参数四:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)RaycastHit[] hits = Physics.RaycastAll(ray,1000,1<<LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal);for (int i = 0; i < hits.Length; i++){print(hits[i].collider.name);}
另一种重载,不用传入射线(直接传入起点和方向也可以用于判断)RaycastHit[] hits = Physics.RaycastAll(Vector3.zero, Vector3.forward, 1000,1<<LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal);还有一种函数返回的碰撞的数量,通过out得到数据if(Physics.RaycastNonAlloc(ray, hits, 100, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal) > 0){//遍历hits}

4、使用时注意的问题

注意(使用参数)
距离、层级两个参数都是int类型
当我们传入参数时一定要明确传入的参数代表的是距离还是层级
举例if(Physics.Raycast(ray,1<<LayerMask.NameToLayer("UI")){}
这样写是错误的,第二个参数虽然是float但编辑器不会提示错误,因为第二个参数代表的是距离,不是层级

思考1 子弹射击到物体效果

1.请用资料区给的资源,实现鼠标点击场景上一面墙,在点击的位置创建子弹特效和弹孔
using UnityEngine;public class ShootBullet : MonoBehaviour
{RaycastHit info;void Update(){//从屏幕发射一条射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);Debug.DrawRay(ray.origin, ray.direction);if (Input.GetMouseButtonDown(0)){//按下鼠标进行射线检测,从屏幕发射一条射线if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out info, 100, 1 << LayerMask.NameToLayer("Wall"))){//碰撞到的点和法向量//创建打击特效GameObject hitObj = Instantiate(Resources.Load<GameObject>("Effect/BoomEff"));//设置点位置hitObj.transform.position = info.point + info.normal * 0.1f;//设置角度,特效面向我们hitObj.transform.rotation = Quaternion.LookRotation(info.normal);//销毁特效Destroy(hitObj, 0.8f);hitObj = Instantiate(Resources.Load<GameObject>("Effect/BulletHole"));hitObj.transform.position = info.point + info.normal * 0.1f;hitObj.transform.rotation = Quaternion.LookRotation(info.normal);}}}
}

思考2 控制场景物体

2.场景上有一个平面,有一个立方体,当鼠标点击选中立方体时,
长按鼠标左键可以拖动立方体在平面上移动,松开鼠标左键取消选中
using UnityEngine;public class SceneObject : MonoBehaviour
{private Transform nowSelObj;RaycastHit info;void Update(){//选中,鼠标左键按下选中if (Input.GetMouseButtonDown(0)){if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out info, 1000, 1 << LayerMask.NameToLayer("Monster"))){//记录选中的对象位置信息nowSelObj = info.transform;}}//长按拖动if (Input.GetMouseButton(0) && nowSelObj != null){if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out info, 1000, 1 << LayerMask.NameToLayer("Wall"))){nowSelObj.position = info.point + Vector3.up * nowSelObj.transform.position.y;}}//取消选中,鼠标左键抬起取消选中if (Input.GetMouseButtonUp(0)){nowSelObj = null;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409812.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure设计之单选框教程(中继器)

在Axure RP中&#xff0c;通过结合中继器的强大功能&#xff0c;我们可以轻松实现动态加载的单选框列表&#xff0c;不仅可以根据数据自动调整选项宽度&#xff0c;还能实时更新选中状态。本教程将引导你完成一个使用中继器制作动态单选框列表的项目&#xff0c;包括案例分析、…

Linux文件IO缓存

一、缓冲区大小对 I/O 系统调用性能的影响 总之&#xff0c;如果与文件发生大量的数据传输&#xff0c;通过采用大块空间缓冲数据&#xff0c;以及执行更少的 系统调用&#xff0c;可以极大地提高 I / O 性能 二、stdio 库的缓冲 当操作磁盘文件时&#xff0c;缓冲大块数据以…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构&#xff08;Tree Data Structures&#xff09;的全面指南&#xff1a;深度解析、算法实战与应用案例 引言 树数据结构&#xff08;Tree Data Structures&#xff09;作为计算机科学中的基石之一&#xff0c;以其独特的层次结构和分支特性&#xff0c;在众多领域发…

IIS中检测不到AspNetCoreModuleV2模块

安装了.net 2.2 的runtime&#xff08;运行时&#xff09;&#xff0c;但是在IIS中还是没有检测出来AspNetCoreModuleV2模块 解决方案&#xff1a; 其实问题点主要是选错了包&#xff0c;选成了x64&#xff0c;应该选择Hosting Bundle&#xff0c;这个是与IIS有关的。 之后下…

HW数通IA笔记2-网络参考模型

目录 零、本章主要内容 一、应用和数据 二、网络参考模型与标准协议 2.2 TCP/IP参考模型 2.3 TCP/IP常见协议 2.3.1 应用层 2.3.2 传输层 2.3.3 网络层 2.3.4 数据链路层 2.3.5 物理层 2.4 常见的协议标准化组织 三、数据的通信过程 零、本章主要内容 1、理解数据的…

SpringBoot集成kafka-生产者发送消息

springboot集成kafka发送消息 1、kafkaTemplate.send()方法1.1、springboot集成kafka发送消息Message对象消息1.2、springboot集成kafka发送ProducerRecord对象消息1.3、springboot集成kafka发送指定分区消息 2、kafkaTemplate.sendDefault()方法3、kafkaTemplate.send(...)和k…

关于elementui table组件 —— 竖向表格

前端模拟数据方式&#xff1a; html代码&#x1f447;&#xff1a; <template><el-table :data"tableData" style"width: 60%;margin-top:20px" stripe :show-header"false" border :row-style"rowStyle"><el-table…

MyBatis如何自定义项目中SQL日志

说明&#xff1a;用过MyBatis框架的同学们都知道&#xff0c;打印SQL日志&#xff0c;可以通过在application.yml配置文件中加入下面配置来设置&#xff1a; mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl但打印出来的SQL如下&#xff0c;丑陋…

机器学习/数据分析--通俗语言带你入门决策树(结合分类和回归案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…

NVIDIA将在Hot Chips 2024会议上展示Blackwell服务器装置

NVIDIA 将在 Hot Chips 2024 上展示其 Blackwell 技术堆栈&#xff0c;并在本周末和下周的主要活动中进行会前演示。对于 NVIDIA 发烧友来说&#xff0c;这是一个激动人心的时刻&#xff0c;他们将深入了解NVIDIA的一些最新技术。然而&#xff0c;Blackwell GPU 的潜在延迟可能…

企事业单位数据资料防外泄如何实现?这5个小技巧等你来掌握!

企事业单位的数据资料防外泄是一项重要的任务&#xff0c;它关乎企业的核心竞争力和信息安全。 以下是五个实用的小技巧&#xff0c;可以帮助企事业单位有效地防止数据外泄&#xff1a; 1. 数据加密 技巧说明&#xff1a;通过对敏感数据进行加密处理&#xff0c;即使数据被非…

外贸管理软件一般都有哪些功能

外贸管理软件通常被设计来帮助国际贸易企业高效管理其业务流程。这类软件的功能多样&#xff0c;这里以神卓外贸管理软件为例&#xff0c; 以下是一些常见的核心功能模块&#xff1a; 客户关系管理 (CRM) 客户信息管理询盘与报价管理销售机会跟踪 订单管理 订单生成与处理发货…

Sparse Kernel Canonical Correlation Analysis

论文链接&#xff1a;https://arxiv.org/pdf/1701.04207 看这篇论文终于看懂核函数了。。谢谢作者

Azure OpenAI citations with message correlation

题意&#xff1a;“Azure OpenAI 引用与消息关联” 问题背景&#xff1a; I am trying out Azure OpenAI with my own data. The data is uploaded to Azure Blob Storage and indexed for use with Azure AI search “我正在尝试使用自己的数据进行 Azure OpenAI。数据已上传…

中介者模式详解

中介者模式 简介通过引入一个中介者对象来封装和协调多个对象之间的交互&#xff0c;从而降低对象间的耦合度。 人话:就是两个类或者系统之间, 不要直接互相调用, 而是要中间的类来专门进行交互。 举个例子 比如两个国家之间(关系差, 没有大使馆), 需要联合国作为中介进行对话…

公园的客流统计意义何在,有哪些积极作用

随着城市化进程的加快&#xff0c;人们越来越重视休闲娱乐和亲近自然的机会。公园作为市民休闲放松的重要场所&#xff0c;其管理和维护的质量直接影响着市民的生活质量和城市的形象。客流统计在公园管理中扮演着重要角色&#xff0c;不仅可以帮助公园管理者更好地理解游客的行…

大模型网络安全能力和风险评估框架Cybench

大模型网络安全能力和风险评估框架Cybench 前言 语言模型在网络安全领域的双重应用&#xff0c;既可以用于攻击&#xff08;如识别并利用代码漏洞&#xff09;&#xff0c;也可以用于防御&#xff08;如渗透测试和漏洞检测&#xff09;。当前的研究包括对CTF挑战、代码片段中的…

LLM 培训

步骤 1 # 预训练 步骤 1 # 预训练 在预训练阶段,该模型被训练为互联网规模数据上的下一个单词预测器。 在预训练阶段 从互联网上收集大量多样化的数据集。此数据集包含来自各种来源的文本,以确保模型能够学习广泛的语言模式。清理和预处理数据以消除噪音、格式问题和不相关的…

CSS文本样式(一)

一、font-family 1、font-family属性 font-family​ &#xff1a;属性指定元素的​字体​&#xff0c;语法格式如下&#xff1a; ​font-family​: 字体1,字体2,...; 有两种字体系列名称&#xff1a; ​字体系列​&#xff1a;特定的字体系列&#xff08;如Times New Rom…

大型公司网络系统集成方案

一、前言 1.1.公司综合信息系统建设目标 -----------------------------------------------------3 1.2. 用户具体需求----------------------------------------------------------------------------4 1.3.公司综合信息系统建设原则 -------------------------------…