1.Transform
位置:世界坐标,当地坐标,通过属性和方法操作;使用属性的时候默认是世界坐标
调整位置:
通过属性position调整:
[if !supportLists](1)[endif]transform.position+=transform.方向名;
transform.forward前,transform.right右,transform.up上等等
[if !supportLists](2)[endif]transform.position+=new
Vector3(x,y,z);
通过方法Translate方法调整:
transform.Translate(transform.方向名,Space.World或Space.Self);
transform.Translate(Vector3.方向名,Space.World或Space.Self);
每个游戏对象都有Transform组件,所以不用再在前面写GameObject.了
通过方法
角度:轴心(旋转的轴心)和中心(重心),通过属性和方法操作
调整角度:
通过属性eulerAngles(欧拉角)调整:
transform.eulerAngles+=new Vector3(x,y,z);
通过方法Rotate调整:
transform.Rotate(new Vector3(x,y,z));
缩放:游戏对象的大小
父子关系:Parent和Root
转换父类与子类,操作完成后无法在层界面拖动更改。
使用属性操作
TrGreen.parent = TrRed;
使用方法操作
TrGreen.SetParent(TrRed);
第二个值若为true,则TrGreen会以TrRed为中心。
TrGreen.SetParent(TrRed,true);
用来显示子类的个数
print(TrGreen.childCount);
用来显示索引的子类的名字,作用:对查找的子进行操作。
print(TrGreen.GetChild(0).gameObject.name);
GameObject.Find("");//比Transform.Find慢,Transform.Find是通过节点找的,
而GameObject.Find要通过层级关系对物体对象遍历查找。
//查找一个物体对象
Transform tr=TrGreen.Find("GameObject (1)");
print(tr.gameObject.name);
LookAt()方法:
TrGreen.LookAt(TrRed);
2.矫正坐标系
[if !supportLists](1)[endif]把游戏对象的正方向跟世界坐标轴的z轴正方向平行
[if !supportLists](2)[endif]建立一个空游戏对象
[if !supportLists](3)[endif]把空游戏对象的中心放在要矫正坐标的游戏对象的中心上
[if !supportLists](4)[endif]把要矫正的游戏对象作为空游戏对象的子物体(拖进空游戏对象里)
[if !supportLists](5)[endif]此时,这个空的游戏对象就是原来的游戏对象,对它进行操作即可。
3.input
[if !supportLists](1)[endif]通过键盘按键输入
[if !supportLists](2)[endif]通过鼠标按键输入
[if !supportLists](3)[endif]通过18个轴的值输入,用Input.GetAxis(轴名称);
[if !supportLists](4)[endif]太阳地球月亮模拟RotateAround公转方法、Rotate自转方法,用input实现坦克移动旋转放大视野
4.time
时间缩放Time.timeScale:影响的是所有跟时间有关的,跟帧有关的不会受到影响
每帧的时间:Time.deltaTime:计时器用变量名+=Time.deltaTime实现
从游戏开始到现在的时间:Time.time:每帧是0.1秒
固定时间更新的FixedUpdate方法:发生在Update之前,默认每0.02s执行一次
5.GameObject
如果不加this.gameObject那么默认就是使用这个脚本组件的游戏对象
开启、禁止组件:GetComponent<组件名>().enabled=true或false;
通过名字找游戏对象:游戏对象名.Find(”名字”);
调用其他脚本文件的方法:游戏对象名.GetComponent<脚本文件名>().方法名();
新建游戏对象:new GameObject(“新建游戏对象名”);
在代码里临时创建游戏对象:游戏对象名.CreatePrimitive(PrimitiveType.枚举成员);
添加部件:游戏对象名.AddComponent<部件名称>();
返回游戏对象自己:游戏对象名.activeSelf
设定游戏对象是否活动(显示或隐藏):游戏对象名.SetActive(true或false);
标签:作用:归类,具有相同标签的游戏对象可以看作一类食物
根据类型查找:FindObjectOfType<部件>();//根据类型查找最后使用泛型,因为不需要类型转换,如果不是用泛型去查找,那么找到的返回值都是Object类型的,西药进行类型转换,期间有风险
所有的组件都能.出gameObject
查找子节点:Transform.Find();//查找的比较快的
克隆方法:Instantiate(克隆对象,克隆的位置,克隆的旋转);
销毁方法:Destroy(销毁对象,销毁倒计时);//可以不写第二个参数
打印的方法:
(1)Debug是一个专门用来打印各种消息的类(建议使用,没有约束条件)
(2)print(”打印的消息”);//是MonoBehaviour类中封装的打印方法
类,当继承MonoBehaviour的时候类名必须要跟脚本名字一致。因为只有继承了MonoBehaviour,游戏对象才能挂载这个脚本
Start和Update是系统的回调方法,所以这两个方法名字写法是固定的
gameObject必须要继承MonoBehaviour类才能使用
6.刚体和碰撞盒
碰撞器(盒)类型:
[if !supportLists](1)[endif]静态碰撞器(Static Collider):没有附加刚体而附加了碰撞器的游戏对象(常应用场景:环境模型)
[if !supportLists](2)[endif]刚体碰撞器(Rigidbody Collider):同时附加了刚体和碰撞器的游戏对象,通过脚本代码添加的力和碰撞完全受物理引擎的影响
[if !supportLists](3)[endif]运动学刚体碰撞器(Kinematic Rigidbody Collider):同时包含碰撞器和刚体,并且激活IsKinematiic的游戏对象,不受物理引擎影响;只能通过transform组件移动;可以和其他的非运动学刚体以及角色控制器互相作用
[if !supportLists](4)[endif]角色控制器(Character Controllers):
应用场景:多用于制作一个类似人的角色;
第三人称平台游戏:
第一人称射击游戏的主要角色或任何敌对角色。
不遵循物理规则,不具有物理特性,如果要应用真正的物理作用到你的角色,必须用刚体;
永远沿Y轴对齐(如果你的角色需要在空间中改变方向,也必须要用到刚体,但要注意调整刚体在角色上表现自然是很难的—困难一:游戏对象自身的非物理特性总想表现出来;困难二:刚体不能像角色控制器一样可以从特定高度的台阶上平滑的滑下)
受碰撞检测;
不会对加在它身上的力做出反应(如果你想让你的游戏角色别物理效果影响,最好使用刚体);也不会自动推开其他刚体,但它额可以通过脚本施加力(通过添加OnControllerHit()函数)影响其他对象
不受力影响(但重力效果还是有的,也可以被代码施加的力推动);
两个物体发生碰撞的必要条件:
[if !supportLists](1)[endif]都有碰撞盒(角色控制器)
[if !supportLists](2)[endif]其中一个有刚体
[if !supportLists](3)[endif]带有刚体的物体要处于运动状态(刚体不运动的话会进入刚体休眠)
刚体休眠:
只要刚体的速度低于sleepAngulareVelocity和sleepVeclocity,该刚体就会开始休眠。其空闲一些帧后就会被设置为休眠状态。
处于休眠状态中的物体,不会再对其进行检测和模拟。
好处:节约大量CPU开销;
唤醒休眠的刚体的方法:
[if !supportLists](1)[endif]使用代码施加外力;
[if !supportLists](2)[endif]刚体的属性发生了变化;
[if !supportLists](3)[endif]和它通过关节连接的刚体发生了移动,因为连带关系,所以它也被唤醒了;
[if !supportLists](4)[endif]被其他刚体碰撞器碰撞(只有处于运动状态中的刚体或运动学刚体才可以唤醒它)
[if !supportLists](5)[endif]注意:静态碰撞器无法唤醒休眠刚体的
7.碰撞检测
三个方法:OnCollisionEnter(Collision被碰撞的碰撞器形式名字)进入、OnCollisionStay(Collision被碰撞的碰撞器形式名字)逗留、OnCollisionExit(Collision被碰撞的碰撞器形式名字)退出
只有刚体碰撞器碰其他碰撞器都可以产生碰撞检测
把碰到的游戏对象改变颜色:被碰到的碰撞器形参.gameObject.GetComponent().material.color=new
Color(r,g,b);//Color.blue//Color类中的rgb是[0,1];
大小(缩放)(组件改为Transform,点出Scale属性),分享材质(相同材质的游戏对象分享材质变色,分享后材质的颜色不再改变)(把material改为sharedMaterial)
8.触发检测
三个方法:OnTriggerEnter()进入、OnTriggerStay()逗留、OnTriggerExit()退出
除了静态触发碰撞器和静态触发碰撞器、静态碰撞器碰撞没有触发信息,其他触发器都能触发信息
9.鼠标和碰撞盒检测
这个脚本要挂在到有碰撞盒的游戏对象身上才起作用
七个方法:OnMouseEnter()进入、OnMouseOver()覆盖、OnMouseExit()退出、OnMouseDown()按下、OnMouseUp()抬起、OnMouseUpAsButton()一个回程、OnMouseDrag()拖动
将屏幕坐标转换成世界坐标:
transform.position=Camera.main.ScreenToWorldPoint(new
Vector3(x,y,z));
将屏幕坐标转换成射线(通过鼠标点击地面,移动坦克位置):
Ray ray=Camera.main.ScreenToRay(new Vector3(x,y));
10.射线检测
射线投射信息(RaycastHit类):里面存储了一些有关于检测到的游戏对象的信息(collider、transform)
两个Debug类的方法DrawRay画射线、DrawLine画直线(只是起到辅助作用,方便观察,不是实际存在的线,打包之后不会存在)
物理类中方法Raycast(用来检测射线第一个射到的游戏对象)和RaycastAll(用来检测射线射到的所有游戏对象):
Physics.Raycast(检测的射线,射线映射信息,检测范围,检测的层,QueryTriggerInteraction.枚举成员);
射线映射信息是一个输出参数(out修饰),可以用它.出被检测到的游戏对象的属性;这个参数的类型是RaycastHit类型的,可以.出point(射线检测到的点的位置)
检测的层表示:~(1<<10)表示从第一层(0开始索引,2的0次方开始,每上升一层就乘一次2)开始,升到第11层,~表示取反,也就是除了第11层的游戏对象,其他层的游戏对象都能被检测。
如果不取反,那么其中层的参数写2的层数索引次方
一个枚举:QueryTriggerInteraction中的三个枚举值,0.都有影响1.忽略2.世界
RaycastAll()需要foreach来遍历数组中的每一个检测到的游戏对象,并得到组件进行操作
插值(数学方法,为了让物体更平滑的移动):
(1)Vector3.Lerp(移动方向,目标位置-,所需时间);
(2)Vector3.MoveTowards(起始位置,目标位置,所需时间);
11.刚体
给碰撞器一个能触发的圆形范围:碰撞器名字=Physics.OverlapSphere(触发范围的中心点,触发碰撞器的圆形范围的半径);
添加爆炸力:刚体名.AddExplosionForce(爆炸威力,爆炸中心,爆炸范围);
添加力:刚体名.AddForce(向量值);//向量值:有方向有大小的值
速度:刚体名.velocity属性;
角速度:刚体名.angularVelocity;
注意:这里的速度跟时间有关,如果Time.timeScale=0,则速度也会变为0
12.物理材质:
参数:
动态摩擦力、静态摩擦力、弹力、摩擦力组合模式(平均值、最小值、相乘值、最大值)、弹力组合模式(平均值、最小值、相乘值、最大值)
13.角色控制器:
这里主要对比了一下:分别通过Transform、Rigidbody、CharacterController实现移动
Transform通过Translate方法实现移动,Rotate方法实现转动;
Rigidbody通过velocity实现移动,angularVelocity实现转动;
CharacterController通过SimpleMove()或者Move()实现移动,通过transform的转动方法转动;
注意这里:SimpleMove()和Move()的区别:
SimpleMove只能实现x-z轴的移动,y轴方向不能控制移动,但它可以实现重力效果;而Move能实现x-y-z轴的移动,但是没有重力效果,如果需要重力,则需要自己手动写要给重力值,让自己的速度减等于这个重力值(如:v-=G)
把世界位置换成自身位置:一个储存轴增量的变量=Transform.TransformDirection(一个储存轴增量的变量);
//这句话必须在已经是世界坐标之后再使用,如果在没生成世界坐标之前使用等于没有用,这里牵扯到语句的执行顺序
角色控制器的检测方法:OnControllerCollierHit(ControllerCollierHit
hit);
一般如果想给一个游戏对象添加力,必须先判断它是否有刚体且保证它不是运动学刚体,否则给它一个力是没有物理效果的,就失去了意义
标准化力量,使向量模为1:向量名.normalized
判断是否在地面:角色控制器名.IsGrounded(bool类型,用来判断是否在地面)
14.物理关节:
铰链关节:把两个物体用铰链关节连接,都安上碰撞器、刚体,其中一个勾上运动学刚体,没有勾上运动学刚体的会以他们之间的一个可见的箭头方向为旋转轴旋转(例:门和门柱,门会以门柱为轴打开关闭);
固定关节:把两个物体通过固定关节连接,都安上碰撞器、刚体,其中一个勾上运动学刚体,通过这种方式把没有勾上运动学刚体的游戏对象固定在运动学刚体上;
弹簧关节:把两个物体通过固定关节连接,都安上碰撞器、刚体,其中一个勾上运动学刚体,在没有勾上运动学刚体的游戏对象和运动学刚体之间有一根隐形的弹簧存在;
角色关节:用来固定角色的每个组成,让它实现类似人的结构。。有点不太清楚吧。。。
Unity中可以通过JavaScript和C#(C Script)两种编程语言编辑脚本程序,JavaScript的文本后缀是.js,而C#则是.cs文本格式