Unity学习周报(一)

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文本格式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容