网页浏览总次数

星期三, 二月 28, 2024

Unity常用操作技巧

 日常工作学习遇到的知识点总结,持续更新。


选择物体 按住v 鼠标在模型上移动 切换中心点


*物体变换

*移动缩放旋转操作时  按住Ctrl 每次改变固定值(Edit->Snap Setting设置)


*编辑器扩展

[Header"解释"]  //编辑器中public的变量上面增加文本解释

public int name;

[Range(0,100)]  //编辑器中public的变量的值只可以设置0-100

public int age;

[Space(10)]     //增加编辑器中public变量的上下间距

public int sex;


*快捷键

*shift+alt+a  切换物体的setactive状态

*ctrl+shift+f  先选择摄像机 使镜头对齐


编辑器的任何面板下 ctrl+f 鼠标光标定位到搜索栏

Hierarchy(层级面板)中搜索组件可以筛选带这个组件的GameObject


*选择物体  f2  改名


切换层级排序按照 字母顺序 还是 Transform 排序

edit->preferences->general 中enable alpha···勾选 后 层级面板中增加的新图标可以切换


*双击物体 或者 按键f 切换Scene视角到物体

*按两下f 第二下按住  视角以物体为中心 切换物体或者松开f后失效


edit->preferences->color->playmode 颜色 设置 编辑器运行状态的颜色


*运行保存组件信息

运行时候 复制组件信息  结束后黏贴组件信息

如果修改多个组件信息  可以在运行时候 设置物体为prefab  结束后 更换


*先暂停再运行 开始的时候就是update第一帧结束的状态


*资源可以改图标  物体也可以增加图标显示在scene中


*不同面板右键 可以关闭 或者增加 新的面板 比如多个scene多视角编辑


*关闭父物体的层级结构时候 按住alt  那么所有的子物体都展开或者收起


*按住右键 wsad移动视口


unity hub  管理 unity


*inspector面板的参数输入框 支持 + -数值简单运算


*输入框可以左右移动鼠标改变数值  按住alt数值增幅变小  按住 shift增幅变大


project面板搜索资源也会返回资源商店的结果


*unity 崩溃之后找到temp文件夹下的临时场景文件夹拿到最近的文件改后缀为.unity 

打开未保存的场景 拖拽文件进project面板 双击得到崩溃未保存的场景


*工程预制

layout设置保存常用的编辑器布局

颜色相关的面板也可以 保存预设 方便使用之前的颜色

曲线可以保存预设

*不同电脑copy预设

可以打开预设所在库的位置 拿到预设文件 放到别的电脑对应位置 即可在不同面板使用设置好的颜色/曲线等预制体


*场景摆放

*按照地面坡度摆放(地面需要有碰撞器)

运行后加刚体 之后掉落到地面 然后 复制transform组件后粘贴 得到完美的物理效果摆放


*脚本报错处理

*导入别人插件或者工程 报错也想运行

新建文件夹WebplayerTemplates 把脚本放这里 不会报错


*文件夹可以增加后缀~ 隐藏文件夹 找到目录删除后缀 可以再次显示


*Inspector面板可以锁定 

增加一个新的I面板可以对照属性


*2d游戏技巧

*layer锁定 无法选择 避免误选精灵

更改成debug模式 后 layer会多出一组 可以locked


星期二, 二月 27, 2024

UE4材质学习笔记

 注释:

节点名[关键字]  输入关键字查询对应节点

没有关键字 则说明节点名就是关键字

 

1. Append[AppendVector]增加通道 通道只有r(red)g(green)b(blue)a(alpha)四个

2. DebugScalarValues 可以debug float参数 DebugFloat2Values可以debug V2参数

3. SwitchParam[StaticSwitchParameter] true时使用上面的一套材质节点生成HLSL代码, false 时为下面的节点生成HLSL代码 创建材质实例 切换 不同HLSL代码中的参数

4. TexCoord[0][TextureCoordinate] UV节点 告诉编译器如何采样 只有 R G两个通道有效   R是从左到右0-1 G是从上到下0-1

5. Sine 正弦函数sin周期是0-1 不是0-2π


 






6. Dot 点乘 A=(x1,y1,z1) B=(x2,y2,z2) Dot(A,B)=x1*x2+y1*y2+z1*z2   结果是一个数

7. Cross 叉乘 A=(x1,y1,z1) B=(x2,y2,z2) Cross(A,B)=(y1*z2-y2*z1,z1*x2-z2*x1,x1*y2-x2*y1) 结果是 V3

8. Distance 求距离 A=(x1,y1) B=(x2,y2) Distance(A,B)=Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

9. Normalize 归一化 A=(x,y,z) B=Sqrt(x*x+y*y+z*z) Normalize(A)=(x/B,y/B,z/B)

10. Saturate 饱和 0-1值不变 小于0的负数升为0 大于1的正数降为1

11. 直角坐标系(笛卡尔坐标系) 转 极坐标系


笛卡尔坐标系
 




极坐标系

 

坐标转换公式:

x=ρcosθ

y=ρsinθ

极角:

θ=arctan(y/x)(x≠0)

极径:

ρ=sqrt(x*x+y*y)

12. 材质函数调用[MaterialFunctionCall] Input的参数类型需要对应

13. Input节点在材质函数中才可以调用


V2
的输入参数


float
的输入参数

 

14. Arctangent 反正切arctan的取值范围是 -π ~ π

15. Ceil 向上取整

16. Floor 向下取整

17. Frac 取小数部分 1.4取0.4 -1.4取0.6 负数抹掉整数取绝对值 再用1减去它就是输出值1-(0.4)=0.6

18. Truncate 取整数部分 不分正负

19. Absolute World Position[WorldPosition]赋予了材质的物体每一个像素的绝对世界位置 RGB对应XYZ 坐标

20. Panner 平移 移动UV坐标


 




21. PBR光学反射概念


 




22. 










bool判断和参数选择

23. L+鼠标右键 材质界面 打灯

24. 








A UV B中心点 Radius半径 Hardness 从内到外虚化


星期一, 二月 26, 2024

C#学习笔记——字符串处理

C#字符串特点及其常用方法 

//字符串特点

            //引用类型 数据储存在堆空间 在栈空间中存储了该数据的引用地址

            //值不可变  字符串重新赋值 旧值不销毁 而是开辟新空间

            //字符串可以看成只读的char[]

//字符串常用方法

            string s = "Far";

            Console.WriteLine(s.ToUpper());//字符全大写

            Console.WriteLine(s.ToLower());//字符全小写

            string s2 = "zgy";

            Console.WriteLine(s2.Equals(s));//比较是否相同 

            string s3 = "F a r";

            foreach(string str in s3.Split(' '))//使用字符分割 

            {

                Console.WriteLine(str);

            }

            Console.WriteLine(s.Substring(1));//从角标1开始截取到最后

            Console.WriteLine(s.Substring(0,1));//从角标0开始截取1个字符

            Console.WriteLine(s.IndexOf("F"));//查找子字符串在字符串中第一次出现的角标 从前向后查找

            Console.WriteLine(s.LastIndexOf("Fa"));//查找子字符串在字符串中第一次出现的角标 从后向前查找 

            Console.WriteLine(s.StartsWith("F"));//判断以什么字符串开头

            Console.WriteLine(s.EndsWith("ar"));//判断以什么字符串结尾

            Console.WriteLine(s2.Replace("zgy", "Far"));//替换字符串

            Console.WriteLine(s.Contains("ar"));//判断一个字符串中是否包含子串 

            string s4 = "    F  a r  ";

            Console.WriteLine("o" + s4.Trim() + "o");//去掉字符串开始前和结束后的所有空格 

            Console.WriteLine("o" + s4.TrimStart());//去掉字符串开始前的所有空格

            Console.WriteLine(s4.TrimEnd() + "o");//去掉字符串结束后的所有空格

            Console.WriteLine(string.IsNullOrEmpty(s));//判断字符串是否为null或者""


//字符串缺点

            //当需要对一个字符串重复赋值时,内存中会产生大量垃圾数据信息

            //当重复赋值频率很高时,执行效率就会降低 

            //StringBuilder 是一个类 引用类型 字符串的值可以改变 依赖using System.Text;

            StringBuilder sb = new StringBuilder();//创建一个对象

            sb.Append("Far");//追加数据 重载方法很多

            sb.Append(0528);

            sb.Append(true);

            Console.WriteLine(sb.ToString());//转换成string

            sb.Clear();//清空

            Console.WriteLine(sb);

            //效率测试

            //Stopwatch 秒表计时器 依赖using System.Diagnostics;

            Stopwatch sw = new Stopwatch();

            sw.Start();//计时器开启

            sw.Stop();//计时器结束

            Console.WriteLine(sw.Elapsed);//计时器开启到结束的时长

            //使用for循环测试 string 和StringBuilder的效率

            sw.Start();

            string stringTest = "";

            for(int i = 0; i < 100000; i++)

            {

                stringTest += i;

            }

            sw.Stop();

            Console.WriteLine(sw.Elapsed);//string时长

            sw.Start();

            StringBuilder sbTest = new StringBuilder();

            for (int i = 0; i < 100000; i++)

            {

                sb.Append(i);

            }

            sw.Stop();

            Console.WriteLine(sw.Elapsed);//sb时长


星期日, 二月 25, 2024

记录一下自己配置第一台台式机

记录自己装机中的硬件学习,主要是台式机八大件,和最终配置应该还算合理,吧~


中央处理器(CPU)   预算约等于二分之一显卡预算

酷睿(intel CORE) 面向个人电脑

命名规则

I3-13 100F

I5- 9 600K

I7-13 700KF

I9-13 900KS

I9- 9 900XE

I3 I5 I7 I9代表CPU级别

13或9 代表CPU代数,越大发布时间越近性能越强

100 600 700 900代表性能水平,代数一致数字越大性能越强

F 没有核显,K 可以超频,X/E 当代最强旗舰(12代前),S 当代最强旗舰(12代后)


显卡(GPU) 最好京东或天猫买新显卡

NVIDIA 办公 游戏 AI都好

命名规则

RTX 3080TI   RTX级别 30代数 80性能水平 TI后缀


主板

H系列 如H610 低端

B系列 如B760 中端

Z系列 如Z790 高端


内存(暂时存放CPU中的运算数据,和CPU要适配好,避免不够或浪费)

推荐 官方天猫 或 京东自营店购买

命名规则

级别 频率(一般越高越好)

DDR3 1600   

DDR4 3200

DDR5 6000

看清楚主板是否支持DDR5


硬盘(外存,分为固态和机械,固态机械都要有,固态装系统和游戏和各种办公软件,机械保存

数据)

推荐 官方天猫 或 京东自营店购买

固态硬盘(SSD)接口 M.2(新) 和 SATA(老)

M.2(性能强,老电脑没这个接口) 分为Pcie3.0 Pcie4.0

Pcie4.0读写速度是Pcie3.0的2倍

机械硬盘 垂直式(速度快寿命长,个人首选) 叠瓦式


散热器

淘宝,搜索 CPU型号+散热器 关键字即可


电源 750W+的

天猫品牌店

80PLUS认证 金银铜牌 表示能量转换效率,越高越省电


机箱

淘宝即可

注意主板尺寸,要注意显卡长度短于机箱长度


主板和内存 插口 注意

DDR5 DDR4 要对应好


最终配置 花费7200元(基本都是天猫官方店铺,排名靠前的,虽然贵一点点但是应该靠谱

不要买主板CPU的套装,自己分开买的)

主板:CVN B760M FROZEN WIFI D5战列舰

固态硬盘:致钛 Ti600 1TB 

显卡:iGame RTX3060 Ultra W OC 12G LHR 

CPU:i5-13600KF【14核20线程】

电源:X6 650W/金牌全模组/5年质保

散热器:PA 120 SE 

机械硬盘:【p300 3t 7200垂直】sata线+螺丝+螺丝刀+电源线+分区

内存条:【时序C36】黑刃 6000 16G*2 内存频率:6000MHz


MySQL数据库基础

DDL 数据定义语言 用来定义数据库对象 库 表 列等

DML 数据操作语言 用来操作数据库表中的记录(数据)

DQL 数据查询语言 用来查询记录

DCL 数据控制语言 用来定义访问权限和安全级别


DDL

#注释

/*多行注释*/

-- 创建数据库 create


-- SQL 不区分大小写

-- 创建一次 再次执行代码 需要注释 此行 否则 报错 或者单独选中 需要执行的 语句


-- create database mydb2;


-- create database mydb3 character set utf8;


-- show databases; -- 查询

-- 

alter database mydb3 character set gbk; -- 修改

-- 

drop database mydb2; -- 删除

 -- 

use mydb1; -- 选择数据库


-- select database(); -- 查看当前选择的是哪个数据库


-- 创建表

/*

use mydb1;

create table mytable2

(

id int,

gender varchar(10)

);

*/


/*

常用数据类型:

int 整数

double 浮点型 double(5,2) 表示最多5位 其中必须有2位

char 固定长度字符串类型 char(5)

varchar 可变长度字符串类型

text 字符串类型

blob 字节类型

date 日期类型 格式 yyyy-MM-dd

time 时间类型 格式为 hh:mm:ss

timestamp 时间戳类型 yyyy-MM-dd hh:mm:ss 自动赋值

datetime 日期时间类型 yyyy-MM-dd hh:mm:ss 


*/


-- show tables; -- 查看所有表


-- desc mytable1; -- 查看表中字段


-- alter table mytable2 add image blob; -- 表中添加字段


-- alter table mytable2 modify gender varchar(15); -- 修改表中字段


-- alter table mytable2 drop image; -- 删除表中字段


-- rename table mytable2 to mytable22; -- 修改表名


-- show create table mytable22; -- 查看表的创建细节 


-- alter table mytable22 character set gbk;-- 修改表的字符集为gbk


-- alter table mytable22 change gender ggeennddeerr varchar(10); -- 修改表中字段名


DML


select* from mytable1; -- 查询表中数据


/*insert into mytable1(id,name) 

values(2,'16'); */ -- 插入数据


-- insert into mytable1 values(2,'16');         -- 插入数据 简写   values(2,'')占内存  values(2)不占内存 null


/* update mytable1 set name ='16' 

where id = 2; */ -- 修改数据 where name = 'xx'也可以


-- delete  from mytable1 where id = 2; -- 删除表中数据 结构还在 可以找回


DQL


create database DB1;


use DB1;


create table STU(

sid char(6),

sname varchar(50),

age int,

gender varchar(50)

);


-- drop table STU;


insert into STU values('01','reimu',1,'female');


insert into STU values('02','marisa',2,'male');


#查询


-- 基础查询 所有列


select*from STU; 


-- 指定列查询


select sid,sname from STU; 


-- 条件查询

/*


*

> < >= <= = !=  

<>不等于


not 不是 or 或 and 与 is 是  is not 不是 is null 是空 is not null 不是空


between a and b  ab之间


*/


select *from STU

where gender = 'male' and age = 2;


-- 满足 数据集里的内容任意都可以查询到 相当于 or


select *from STU

where sid in('01','02');


-- 模糊查询 like


/*

通配符

_任意一个字符  %n 任意0-n个字符

*/


-- 确定个数

select *from STU

where sname like '_____';


-- 不确定个数

select *from STU

where sname like 'r%';


-- 固定特殊位置但是总个数不定

select *from STU

where sname like '_a%';


-- 不固定特定位置但是包含

select *from STU

where sname like '%m%'; 


-- 字段控制查询


-- 去除重复记录 distinct


select distinct gender from STU;


-- 求和 任何值和null计算都是null


-- select x,y x+y from table;


-- 函数 ifnull(age,1) 如果age是null那么age=1


-- x as 'name' x起别名


-- 升序排序


select *from stu

order by sid asc;


-- 降序排序


select *from stu

order by sid desc;


-- 按照x升序排序 如果相同再按照y升序排序


select *from stu

order by sid asc,age asc;


-- 聚合函数


-- count()  统计指定列不为null的记录行数


select count(*) as 记录数 from stu;


-- sum() 指定列的和


select sum(age) as 年龄和 from stu;


-- avg() 指定列平均数


select avg(age) as 年龄平均数 from stu;


-- max() min() 指定列最大 最小值


select max(age) as 年龄最大 from stu;


select min(age) as 年龄最小 from stu;



-- 分组查询


select gender,count(*) as 男或者女个数 from stu group by gender;


-- where 对分组前的数据进行操作且不可以接 聚合函数


select gender,sum(age) as 年龄和 from stu where age<10 group by gender;


-- having 对分组后的数据进行操作可以接 聚合函数 后面可以接多个条件


select gender,sum(age) as 年龄和 from stu where age<10 group by gender having sum(age)>1;



-- limit 分页查询 所有数据分页 一页显示几个 


select *from stu limit 0,2; 


-- 从第0行开始 查询1条


select *from stu limit 0,3; 

-- 0 当前页 3显示几条数据


-- 数据的完整性 创建表的时候添加约束保证不能随便添加数据


-- 实体 表中的一行


-- 实体完整性 标识每一行数据不同


-- 主键约束 pk 要求 数据唯一 不能为null 比如id


-- 方法一


create table table1(

tid int primary key, -- 设置主键约束

tname varchar(5)

);


-- 方法二


create table table2

(

tid int,

tname varchar(5),

primary key(tid,tname) -- 联合主键 两个都一样才触发


);


-- 方法三


create table table3

(

tid int

);

-- 添加约束语句

alter table table3 add constraint pk_table3_id primary key(tid);


-- 唯一键 可以为null


create table table4

(

tid int primary key,

tname varchar(5) unique -- 设置唯一键

);


-- 自动增长列 只能是整数类型 一般配合主键一起用


create table table5

(

tid int primary key auto_increment

);


-- 域完整性 单个格子检测数据是否正确


-- 非空约束


create table table6

(

tid int not null 

);


-- 默认值约束


create table table7

(

tname varchar(50) not null default'far'

);


insert into table7(tname) values(default);


select *from table7;


-- 引用完整性


-- 外键约束 外检列的数据类型一定和主键的类型一致


create table table8

(

tid int,

constraint fk_table8_tid foreign key(tid) references table3(tid)

);


星期六, 二月 24, 2024

Unity常用API

上学时期学习总结 。


1、Event Function:事件函数

 

Reset() :被附加脚本时、在游戏物体的组件上按Reset时会触发该事件函数

Start() :在游戏初始化时会执行一次

Update() :每一帧都会运行这个方法

FixedUpdate(): 会在指定帧调用该方法多少次

LateUpdate(): 晚于Update的运行顺序,但是FPS和Update是一样的

Awake() Start() : 都是在游戏物体初始化运行一次,但是Awake的运行顺序高于Start的,并且只要脚本中存在Awake方法,则无论是否挂载了该脚本都会执行该方法

OnEnable(): 当将物体的SetActive设置为true时就会自动调用调用该方法

OnDestory(): 当关闭游戏则会调用该方法

 

2、Time时间类函数:

 

Time.time 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。

Time.timeSinceLevelLoad 表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。

Time.deltaTime 表示从上一帧到当前帧时间,以秒为单位。【一般用来控制角色、动画的运动】

Time.fixedTime 表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。

Time.fixedDeltaTime 表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。

Time.SmoothDeltaTime 表示一个平稳的deltaTime,根据前 N帧的时间加权平均的值。

Time.timeScale 时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,回放等、非常有用。如果游戏中控制运动的都是使用了Time.deltatime的话,则可以通过设置Time.timeScale=0来暂停其运动等。

Time.frameCount 总帧数

Time.realtimeSinceStartup 表示自游戏开始后的总时间,即使暂停也会不断的增加。【一般用作性能测试】

Time.captureFramerate 表示设置每秒的帧率,然后不考虑真实时间。

Time.unscaledDeltaTime 以秒计算,完成最后一帧的时间 不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。

Time.unscaledTime 从游戏开始到现在所用的时间 不考虑timescale时候与time相同,若timescale被设置,则无效。

 

3、GameObject类:

 

【1】、创建游戏物体的三种方法:

 

通过其构造器来创建 GameObject go=new GameObejct("游戏物体名"); //一般是用来创建空的游戏来存放其他东西的。

Instantiate GameObject.Instantiate(prefab) //根据Prefab或者是另外一个游戏物体来创建(克隆Colon),可以实例粒子、等其他的游戏物体,很是常用的

CreattePrimitive GameObject.CreatePrimitive(PrimitiveType.**) //创建原始的游戏物体,基本的几何体

 

【2】、 为游戏物体添加组件, 其中组件可以是我们自己自定义的脚本GameObject.AddComponent<组件名>

 

【3】、属性、变量:

 

GameObject.activeInHierarchy 游戏物体是否处于激活状态,与父类有关,父类被取消激活,则子类也是取消激活的

GameObject.activeSelf 自身的激活状态,与父类无关,只与自身有关。【控制组件的激活与取消激活则使用.enable=false/true】

GameObject.tag 游戏物体的tag标签,具体的由程序员自定义设置

GameObject.SetActive(false/true) 通过参数的控制来设置其游戏物体的激活状态,true为激活状态,反之为取消激活状态。

 

【4】、UnityEngine.Object中的共有方法与变量

name: 名字,调用该变量,则无论是通过GameObject还是Component都是返回游戏物体的名字

Destroy() :删除游戏物体,但是不会立马在unity中删除,而是会先进行回收,等确定没对象使用的时候,在进行删除

DontDestroyOnLoad() : 当加载新的场景的时候,不删除这个场景中的某个游戏物体

FindObjectType<>

FindObjectsType<> : t通过类型来进行查找,是进行全局的查找,则就是在整个场景中进行查找

FindGameObjectWithTag :如果查到的是多个,则只返回查找到的第一个

FindGameObejctsWithTag 返回查找到的游戏物体集合

 

【5】、消息的发送

BroadcastMessage() 广播发送消息,则该物体上对应的方法会被调用,同时这个游戏物体上的子物体上对应的方法也会被调用的

SendMessage() 发送消息,只会对这个游戏物体中脚本上的方法发送消息

SendMessageUpwards() 广播发送消息,但是和BroadcastMessage()是相反的,在调用自身的方法时也会向上传递,调用其父类的方法

 

【6】、游戏组件的查找

 

Cube cube = target.GetComponent<Cube>(); 返回一个对应的组件,如果有多个,则只返回第一个

Cube[]cc= target.GetComponents<Cube>(); 返回该游戏物体上所有符合条件的组件,返回一个组件数组

Cube[] xx = target.GetComponentsInChildren<Cube>(); 返回该游戏物体上的对应组件,同时返回该游戏物体的子类上对应的组件

Cube[] yy = target.GetComponentsInParent<Cube>(); 返回该游戏物体上的对应组件,同时返回该游戏物体的父类上对应的组件

 

4、MonoBehaviours的类:

 

【1】、继承的变量成员

 

enabled: 返回该组件是否被激活或者是被禁用,可以通过该变量来进行设置

isActiveAndEnabled: 只能返回该组件是否激活的标志位,不能设置该变量,为只读的

tag :该组件所对应的游戏物体的标签

name :该组件所对应的游戏物体的名字

【2】、Invoke等方法、变量:将添加要调用的方法添加到等待队列中,然后等待用户设定的时间后,进行队列中的方法调用。

 

Invoke("方法1",float time): 在等待time的时间后调用方法1

bool i= IsInvoking("方法1") 返回bool值,如果方法被添加到队列中,但没有被运行则返回true,如果经过一段时间后该方法被调用了则会返回false;

InvokeRepeating("方法1",time,number): 等待time时间后,会重复开始运行方法1,每秒钟运行number次。

CancelInvoke() 会暂停通过Involve/InvokeRepeating的运行,但是一般来说CancelInvoke会和InvokeRepeating组合调用。参数由自己设定

 

 

扩充: 在脚本的类前添加[ExecuteInEditMode]:则该脚本不用按游戏运行按钮就会开始编译,只限在编辑模式里面

在脚本的共有变量前添加[HideInInspector]:则该共有变量不会在Inspector面板进行显示

 

5、Coroutines:协程:

 

1、定义协程:IEnumerator 方法名()

{

yield return 0/null ;

yield return new WaitForSeconds(1.0f); //等待一定时间在运行下面的代码

}

2、开启协程:StartCoroutines(方法名());

说明:协程开启会继续执行下面代码,不会等协程方法运行完再执行接下来的方法

 

3、开启与关闭协程时,StartCoriutine(参数)、StopCoroutine(参数) 其中的参数要互相对应,如果传递的是方法名,则两个方法中的参数就要是方法名,如果是IEnumerator的返回值,则其中两个方法发的参数就要是IEnumerator的返回值

1、 private IEnumerator coroutine;

coroutine = WaitAndPrint();

StartCoroutine(coroutine);

StopCoroutine(coroutine);

 

2、StartCoroutine("WaitAndPrint");

StopCoroutine("WaitAndPrint");

4、StopAllCoroutines() 停止所有的协程,不管你是怎么调用的

 

6、OnMousexx鼠标触发事件: 如果是通过Collider进行触发检测的话,则要在设置中打开允许进行射线检测。

 

OnMouseDown(): 当鼠标按下的时候触发,按一次触发一次

OnMouseDrag(): 当鼠标按住不放的时候一直触发,是每一帧进行触发

OnMouseUp(): 当鼠标抬起的时候触发,只执行一次

OnMouseEnter(): 当鼠标进入的时候触发,进入一次触发一次

OnMousetOver(): 当鼠标在触发物体的上面时,则一直触发

OnMouseExit(): 当鼠标移出的时候触发

OnMouseUpAsButton() 相当于是按钮的功能,当鼠标在同一个游戏物体上按下抬起的时候才会触发,按下与抬起不在同一个游戏上的话则不会进行触发。

 

7、Mathf类:所有的成员均为静态的

Mathf.Abs() 返回绝对值的

Mathf.Ceil() 向上取整的,10.1--->11

Mathf.Clamp(value,min,max) 如果value的值在min--max之间的话就返回value,但是如果value的值小于min,则返回min,如果value的值大于max,则返回max,一般是用在控制角色血量,当玩家的血量减少的时候,不会出现出现低于0和大于100的情况 hp= Mathf.Clamp(hp,0,100);

Mathf.ClosePowerOfTwo(value): 取得离value的2次方最近的值

Mathg.DeltaAngke: 取得两个角度之间的最小夹角

Mathf.Floor 向下取整

Mathf.Pow(i,j) 取得i的j次方

Mathf.MoveToWards() 一般用来做移动控制,是匀速的运动,加速度固定的

Mathf.Lerp() 差值运算,一般是用来控制动画、运动,越往后运行的越慢的。

Mathf.PingPong(t,maxValue) 类似乒乓球的来回运动,起始 值是0,通过t变量来控制值由0向maxValue移动,当t大于maxValue的时候又向0进行移动,然后就这样的来回往复运动,一般t变量用时间Time.deltatime来进行控制的。


8、Input输入类:

GetKey() 按键一直按着时触发

GetKeyDown 按键被按下那一刻进行触发

GetKeyUp 按键被按下后抬起时触发

 

GetMouseButton(0/1/2) 1:左键 2:右键 3:中键 鼠标一直按着时触发

GetMouseButtonDown() 鼠标按下那一刻触发、

GetMouseButtonUp() 鼠标抬起的那一刻时触发

 

GetButtonDown()

GetButton()

GetButtonUp() 这三个的参数是用户自定义的虚拟按键进行触发,其他的和上面的一样

 

GetAxis("虚拟轴名") 通过按下的虚拟轴来返回-1~1之间的值,开始值是0,然后向-1/1进行渐渐的变化,有一定的加速度。一般用来控制运动的,比如是赛车的加速运动等

GetAxisRaw() 其他的和GetAxis差不多,就是少了渐变效果,返回值只有 0 1 -1三个

 

anyKeyDown 当任何按键被按下(包括鼠标按键)时返回true

anyKey 当任何按键被按着(包括鼠标)时返回true

mousePosition 返回鼠标在屏幕上的像素坐标,【屏幕坐标】z轴衡为0的


9、Vector2;二维向量

 

magnitude: 返回向量的长度

normalized; 返回这个向量长度为1的矢量,不管这个向量多长,也是返回1的矢量,只是返回值,不对原向量的值产生影响

Normalize() 无参数的,也是向量化,但是调用该方法会改变原向量值,使其的值被向量化 了

ClampMagnitude() ;将一个向量限制在参数中指定的长度之间

MoveToWards() 用来做匀速的运动,由一个位置向另一个位置进行移动

sqrMagnitude 对求向量的的长度时不进行开平方根运算了,减少性能的损耗,一般是用来比较两个向量的长度大小的。

其他的参考API文档即可,较为简单。

扩充:向量是结构体,为值类型,修改其中的变量的时候要整体进行修改,不能单独的进行单个变量的赋值修改

 

10、Vector3:三维变量

Cross() 插乘运算【左手法则】,通过两个向量来获得另一个向量的方向,然后进行相关的判断

 

Project() 投影运算

 

Reflect() 反射运算

Slerp() 按照角度进行插值,与lerp的按照位置信息进行插值的,一般用在炮台的旋转,使旋转的更加平滑

 

11、Random随机数类:

 

InitState(): 通过参数指定的种子,然后再调用Range()产生随机数的时候会依据种子来进行生成,则每一次运行所生成的随机数都是一样的,是伪随机数。一般要生成的随机数不同,可以设置参数为System.DataTime.Now.Ticks:通过时间戳来完成

 

insideUnitFCircle :在单位为1的园内随机生成一个位置信息,如果要在更大的圆中生成,则可以在后面*圆的半径信息。一般用来控制随机生成敌人的位置信息

insideUnitSphere: 在单位为1的球内随机生成一个位置信息,如果要在更大的球中生成,则可以在后面*圆的半径信息。


12、四元数 Quaternion:

 

欧拉角【eulerAngles】与面板中的值对应和四元数【rotation】之间是可以进行转换的,一般欧拉角是用来让用户可以直观的看到的,而四元数是用来控制内部的运算 的。

 

.eulerAngles 将四元数转变为欧拉角

Euler() 将欧拉角转变为四元数

 

.LookRotation() 让玩家通过设置四元数来进行望向敌人的旋转,将向量方向转变为四元数

 

Vector3 temp = enemy.position - player.position; //获得两个位置信息之间的变量,是主角望向敌人,所以要设置向量的方向是指向敌人的

enemp.y = 0; //如果不想主角在望向他的时候出现低头的情况,也就是y轴的值出现了变化了。

player.rotation= Quaternion.LookRotation(temp);

slerp() 在做朝向的旋转的时候,不建议使用lerp,而是建议使用slerp,使其的旋转朝向更为平滑,更加的自然

Quaternion target= Quaternion.LookRotation(temp);

player.rotation = Quaternion.Slerp(player.rotation, target, Time.deltaTime); //插值的缓慢旋转

 

 

13、Rigidbody:刚体组件,控制角色的移动

.position: 可以通过刚体来控制运动,在控制运动方面,使用rigibody.positon比transform.porition计算要快的多,相关的物理计算也是在刚体中计算好了,但是不建议使用这个方法来持续的控制物体的运动,不平滑,控制一两次的时候还可以使用

MovePosition() 对position的优化,其中利用了插值运算,一般持续运动的则使用这个方法,不出现卡顿的现象

,rotation:

MoveRotation 用来控制刚体的旋转的,一般不建议使用rotation,比较耗性能,建议使用MoveRotation(),然后配合Quaternion,slerp()进行使用,使其更加的平滑

AddForce() 为刚体添加力,一般可以用在赛车游戏中,当进行短时的加速则可以给以限定时间的AddForce方法


14、Camera;相机组件:

当相机的标签是main camera时,可以通过Camera.main来进行主相机camera组件的查找射线,用来检测鼠标在屏幕上的位置信息,以及触碰到什么

Ray ray = cameraMain.ScreenPointToRay(Input.mousePosition); //获得相机到鼠标之间的射线

RaycastHit hit; //用来存放射线检测到的游戏物体的信息的

bool temp = Physics.Raycast(ray, out hit); //进行射线检测


15、Application

SreeamingAcsets: 该文件下的资源不会被压缩,导入是什么类型还是什么类型,【主要是音频、视频资源】

 

dataPath: 工程文件路径

streamingAssetsPath: 可以通过文件流来进行读取的文件路径

persistenDataPath :可以实例的文件路径

tempporaryCachePath :临时的文件路径

 

Application.OpenURL("") 打开指定的网址

Application.Quit() 退出游戏的运行

.CapturScreenshot("游戏截图") 用来截图的,字符串为截图fileName

 

 

Application.identifier 标识名

.companyName 公司名

productName 产品名

instalMode 安装包名

isEditor 是否在编辑器模式

isFocused 是否在焦点

isMoliePlatform 是否是移动平台

isPlaying

isWebPlayer

platform 编辑器的平台

unityVersion unity版本号

version 项目文件版本号

runInBackground 是否可以在后台运行

 

UnityEditor.EditorApplication.isPlaying=false; //在编辑器模式下推出编辑状态


16、SceneManager场景类

 

SceneManager.LoadScene() 加载下一个场景,一般是用在另一个场景不是太大的情况下

SceneManager.LoadSceneAsync() 异步加载下一个场景,返回AsyncOperation类型,里面包含了加载的信息,加载的进度条等等。可以让用户缓解等待加载场景的时间

sceneCount 获得当前加载的场景个数

sceneCountInBuildSettings 在Build面板中加载的场景个数

GetActiveScene() 获取已经加载的当前场景的信息

GetSceneAt(index) 加载index索引的场景

 

当加载新的场景的时候会触发下面的事件:

activeSceneChanged 当有新场景被加载的时候就会调用这个事件

sceneLoaded 当有新场景加载完成的时候就会触发这个事件

 

 

扩充:事件的注册时通过加方法来进行注册的:

SceneManger.activeSceneChanged+=OnAcitiveScenenChanged;

 

17、射线检测:一般射线检测要在射线检测的范围内,并且被检测物体要有Collider

 

Ray ray=new Ray(起点,方向);

PaycastHit hit; //hit中存放的是射线检测的碰撞信息

bool temp=Physics.Raycast(ray,out hit); //具体的重载方法边用边查

 

Ray ray = new Ray(this.transform.position + transform.forward, transform.forward); //创建射线

RaycastHit hit; //存储射线检测到的游戏物体信息

if(Physics.Raycast(ray,out hit)) //通过返回值来判断射线是否检测到相关的物体了

{

Debug.Log(hit.collider.gameObject.name);

}

扩充:

Raycast;检测的是射线碰撞到的第一个物体,不具有穿透性

RaycastAll:返回的是RaycastHit数组,具有穿透性,可以返回检测到的多个游戏物体


18、代码监听触发事件:

 

<Button>().onClick.AddListener(方法名); //当触发button组件,则会触发指定的方法名的方法

 

通过实现接口来注册监听事件: using UnityEgine.EventSystems; 导入命名空间

 

 

IPointerDownHandler 鼠标按下的事件,具体的接口参考手册

Raycast Target: 如果取消勾选则不做事件监听了,则无法实现检测了

 

19、www类,下载 是用来在网络中下载资源的,

 

public string url = "http://img.taopic.com/uploads/allimg/120727/201995-120HG1030762.jpg";

IEnumerator Start()

{

WWW www = new WWW(url);

yield return www;

Renderer renderer = this.GetComponent<Renderer>();

renderer.material.mainTexture = www.texture;

}

 

 

20、Touches触摸事件:

 

Input.touches: 返回放在屏幕上的手指信息,返回数组

Touch touch1=Input.touches[0];

touch1.position;

TouchPhase pahse=touch1.phase phase 是用来返回手指的状态的

 

21、Debug.DrawRay(ray.oridin,ray.direction) 绘制射线,第一个参数是原点,第二个是方向

 

22、CharacterController角色控制器

 

.SimpleMove(【vector3】) 简单移动

.isGrounded 判断是否到地面上,bool值

.Move() 与simpleMove的区别是要*Time.deltatime、而且simpleMove会使用自带的重力

OnCOntrollerColliderHit(ControllerCollidrHit hit) 当有碰撞到其他的碰撞器的时候会触发这个事件函数【hit保存碰撞到的物体信息】

 

23、Mesh的设置:

 

material mesh指定人是什么样子的,material指定人的肤色是什么样子的

 

24、API变更:

 

弃用:Application.LoadLevel();

新的:SceneManager.LoadScene(); 加载新的场景

弃用

新的:Scene scene=SceneManager.GetActiveScene(); //获得当前活动场景的信息

SceneManger.LoadScene(scene.buildIndex) //重新加载当前场景

 

OnLevelWasLoaded() 当场景被加载的时候调用,被弃用了

改成事件了:sceenLoaded


星期五, 二月 23, 2024

C语言学习笔记

C语言语法基础


32个关键字

下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。

关键字 说明

auto 声明自动变量

break 跳出当前循环

case 开关语句分支

char 声明字符型变量或函数返回值类型

const 声明只读变量

continue 结束当前循环,开始下一轮循环

default 开关语句中的"其它"分支

do 循环语句的循环体

double 声明双精度浮点型变量或函数返回值类型

else 条件语句否定分支(与 if 连用)

enum 声明枚举类型

extern 声明变量或函数是在其它文件或本文件的其他位置定义

float 声明浮点型变量或函数返回值类型

for 一种循环语句

goto 无条件跳转语句

if 条件语句

int 声明整型变量或函数

long 声明长整型变量或函数返回值类型

register 声明寄存器变量

return 子程序返回语句(可以带参数,也可不带参数)

short 声明短整型变量或函数

signed 声明有符号类型变量或函数

sizeof 计算数据类型或变量长度(即所占字节数)

static 声明静态变量

struct 声明结构体类型

switch 用于开关语句

typedef 用以给数据类型取别名

unsigned 声明无符号类型变量或函数

union 声明共用体类型

void 声明函数无返回值或无参数,声明无类型指针

volatile 说明变量在程序执行中可被隐含地改变

while 循环语句的循环条件


数据类型

C 中的类型可分为以下几种:

序号 类型与描述

1 基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型。

2 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。

3 void 类型: 类型说明符 void 表明没有可用的值。

4 派生类型: 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。


整数类型

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型 存储大小 值范围

char 1 字节 -128 到 127 或 0 到 255

unsigned char 1 字节 0 到 255

signed char 1 字节 -128 到 127

int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647

unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295

short 2 字节 -32,768 到 32,767

unsigned short 2 字节 0 到 65,535

long 4 字节 -2,147,483,648 到 2,147,483,647

unsigned long 4 字节 0 到 4,294,967,295


您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。


浮点类型

下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:


类型            存储大小 值范围 精度

float         4 字节 1.2E-38 到 3.4E+38         6 位小数

double 8 字节 2.3E-308 到 1.7E+308 15 位小数

long double 16 字节 3.4E-4932 到 1.1E+4932 19 位小数



运算符

算术运算符

下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例

+ 把两个操作数相加 A + B 将得到 30

- 从第一个操作数中减去第二个操作数 A - B 将得到 -10

* 把两个操作数相乘 A * B 将得到 200

/ 分子除以分母 B / A 将得到 2

% 取模运算符,整除后的余数 B % A 将得到 0

++ 自增运算符,整数值增加 1 A++ 将得到 11

-- 自减运算符,整数值减少 1 A-- 将得到 9


关系运算符

下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例

== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 不为真

!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真

> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真

< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 ( A < B) 为真

>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真

<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真


逻辑运算符

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:


运算符 描述 实例

&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假

|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真

! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 (!A)    为假


位运算符

下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符 描述

& 按位与操作,按二进制位进行"与"运算。运算规则:0&0=0;    0&1=0;     1&0=0;      1&1=1;

| 按位或运算符,按二进制位进行"或"运算。运算规则:`0

^ 异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0;    0^1=1;    1^0=1;   1^1=0;

~ 取反运算符,按二进制位进行"取反"运算。运算规则:~1=0;    ~0=1;

<< 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

>> 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃


赋值运算符

下表列出了 C 语言支持的赋值运算符:


运算符 描述 实例

= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C

+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A

-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A

*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A

/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A

%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A

<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2

>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2

&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2

^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2

|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2


杂项运算符 ? sizeof & 三元

下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。


运算符 描述 实例

sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。

& 返回变量的地址。 &a; 将给出变量的实际地址。

* 指向一个变量。 *a; 将指向一个变量。

? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y


常量

整数常量

整数常量可以是十进制、八进制或十六进制的常量。

前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。

后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

下面列举几个整数常量的实例:

212         /* 合法的 */

215u        /* 合法的 */

0xFeeL      /* 合法的 */

078         /* 非法的:8 不是八进制的数字 */

032UU       /* 非法的:不能重复后缀 */

以下是各种类型的整数常量的实例:

85         /* 十进制 */

0213       /* 八进制 */

0x4b       /* 十六进制 */

30         /* 整数 */

30u        /* 无符号整数 */

30l        /* 长整数 */

30ul       /* 无符号长整数 */


浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。


当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。

下面列举几个浮点常量的实例:

3.14159       /* 合法的 */

314159E-5L    /* 合法的 */

510E          /* 非法的:不完整的指数 */

210f          /* 非法的:没有小数或指数 */

.e55          /* 非法的:缺少整数或分数 */


字符常量

字符常量是括在单引号中,例如,'x' 可以存储在 char 类型的简单变量中。

字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。

在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:


转义序列 含义

\ \ 字符

' ' 字符

" " 字符

? ? 字符

\a 警报铃声

\b 退格键

\f 换页符

\n 换行符

\r 回车

\t 水平制表符

\v 垂直制表符

\ooo 一到三位的八进制数

\xhh . . . 一个或多个数字的十六进制数

定义常量

在 C 中,有两种简单的定义常量的方式:

使用 #define 预处理器。

使用 const 关键字。

#define FAR 16

const int far = 16;


操作字符串的函数

序号 函数 & 目的

1 strcpy(s1, s2); 

复制字符串 s2 到字符串 s1。

2 strcat(s1, s2); 

连接字符串 s2 到字符串 s1 的末尾。

3 strlen(s1); 

返回字符串 s1 的长度。

4 strcmp(s1, s2); 

如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。

5 strchr(s1, ch); 

返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

6 strstr(s1, s2); 

返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。






星期四, 二月 22, 2024

web前端学习笔记——CSS

下面是学习用的html和css文件,创建对应文件复制代码到文本编辑器看,缩进更舒服。


 index.html文件


<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>CSS引用,选择器及其优先级</title>

<!-- 引入css 页面级css -->

<!-- <style type="text/css">

div{

width: 100px;

height: 100px;

background-color: green;

}

</style> -->

<!-- 外部css文件 -->

<link rel="stylesheet" type="text/css" href="style.css">     <!--异步加载-->

</head>

<body>

<!-- 引入css 行间样式-->

<!-- <div style="width: 100px;height: 100px;background-color: red"></div> -->

<!-- 选择器 -->

<!-- id -->

<div id="only"></div>

<!-- class -->

<div class="demo demo1">$100</div>

<!-- 标签选择器 -->

<div></div>

<!-- 通配符选择器 *-->

<!-- 属性选择器 [id]或者[id="demo"]-->

<!-- 选择器优先级 !important(权重 256进制 infinity)>行间样式(1000)>id(100)>class==属性选择器==伪类选择器(10)>标签选择器(1)>通配符(0) (同行权重相加 大的更优先) -->

<!-- 父子选择器 -->

<div>

<span></span>

<em>

<span>

</span>

</em>

</div> 

</body>

</html>


------------------------------------------------------------------------------

style.css文件


/*注释*/


*{

margin: 0px;    /*body天生带8px*/

padding: 0px;

}

div{

width: 100px;

height: 100px;

background-color: red;

}

#only{

width: 100px;

height: 100px;

background-color: green;

}

.demo{

width: 100px;

height: 100px;

background-color: yellow;

}

.demo1{

color: #f40;

}

[id]{

}

/*父子选择器 不限定为标签 孙子也可 便利顺序是从右向左*/

div span{

}

/*直接子元素选择器 父子关系*/

div span{

}

/*并列选择器*/

div.span{


}

/*分组选择器 */

div,strong,em,.demo,#only{

}

/*伪类选择器 鼠标挪入时触发*/

a:hover{

text-decoration: none;

}

---------------------------------------------------------

css基础属性


#only{

font-size: 100px;        /*字体大小 默认16px 设置的是字体的高*/

font-weight: bold;       /*字体加粗 可以设置100-900*/

font-style: italic;      /*字体倾斜*/

font-family: arial;      /*字体*/

color: #f40;          /*字体颜色 1.英文单词 2.颜色代码RGB(光学三原色)#00-ff 00-ff 00-ff 3.颜色函数rag(255,255,255)*/ 


border: 10px solid black;   /*边框(宽度 样式 颜色) border-width border-style border-color*/ 

border-width: 1px;              /*宽度*/

border-style: dashed;            /*样式*/

border-color: rgb(0,0,0);        /*颜色*/


/*画三角形*/

width: 0px;                     /*容器的宽度*/

height: 0px;                 /*容器的高度*/

border:100px solid black;

border-left-color: transparent;           /*左边框颜色 transparent透明色*/

border-top-color: transparent;

border-bottom-color: black;

border-right-color: black;


text-align: center;              /*文本对齐方式 居中显示*/

line-height: 16px;            /*行高设置*/

height:16px; /*单行文本垂直居中 height = line-height*/

text-indent: 2em;                   /*首行缩进2个字 1em = font-size*/

text-decoration: line-through;  /*line-through中划线 none没有线 underline 下划线 overline上划线*/

cursor: pointer;                     /*鼠标挪入鼠标变样式*/


/*1.行级元素(内联元素) inline 

feature : 内容决定元素所占位置

  不可以通过css改变宽高

  span strong em a del

2.块级元素 block

feature :独占一行

  可以通过css改变宽高

  div p ul li ol form address 

3.行级块元素 inline-block

feature : 内容决定大小

   可以改变宽高

   img(多张并列 代码中间不要有空格或者回车 防止图片中间有空隙)*/


display: block;                      /*设置 行级inline 块级block 行级块元素inline-block*/

/*凡是带有inline属性的元素 都有文字特性*/

/*自定义标签  初始化标签 设置标签的属性*/

/*通配符标签* 初始化所有标签*/


/*absolute 脱离原来位置进行定位 相对于最近的有定位的父级进行定位 如果没有相对于文档定位 需要定位的元素设置成这个*/

/*relative 保留原来位置进行定位 相对于自己原来的位置进行定位 用来做参照物*/

/*fixed 广告定位 在屏幕的一个位置不动*/


z-index: 1;              /*层 越大越上*/


/*相对于窗口居中*/

position: fixed;

left: 50%;

top: 50%;

margin-top: -50px;

margin-left: -50px;

}


*两栏布局*/

/*.right{

background-color: green;

width: 100px;

height: 100px;

position: absolute;

right: 0;

opacity: 0.5;

}

.left{

background-color: yellow;

height: 100px;

margin-right: 100px;

}*/


/*margin塌陷解决办法

触发一个盒子的bfc

position: absolute;

display: inline-block;

float: left/right;

overflow: hidden;*/

.wrapper{

/*margin-left: 100px;

margin-top: 100px;

width: 100px;

height: 100px;

background-color: black;*/


/*position: absolute;

display: inline-block;

float: left/right;

overflow: hidden;*/

}

.content{

/* margin-left: 50px;

margin-top: 50px;

width: 50px;

height: 50px;

background-color: green;*/

}


/*margin合并  不解决 使用数学方法调试*/


/*float*/


 /*伪元素清除浮动流*/

.float::after{

content: "";            

display: block;

clear: both;  /*清除周围的浮动流  需要是块级元素*/

}


/*父级包住浮动元素 可以在子元素下加一个 p标签 并给p标签清除浮动流*/



/*伪元素 天生是行级元素 想要修改css  需要 改 display 为inline-block*/

/*#weiyuansu::before{

content: "i am";

}

#weiyuansu::after{

content: "far";

}*/


#point{

width: 300px;

height: 20px;

line-height: 20px;

border:1px solid black;


/*单行文本溢出打点展示三件套*/

white-space: nowrap;

overflow: hidden;

text-overflow: ellipsis;

}