欢迎

How more than you show,speak less than you know.

Unity API讲解课程 笔记

API文档

1.在Help栏可以看本地版的Manual和Scripting API文档(没有就去官方下载对应版本的Unity补充安装)

2.About Unity可以看版本,xx.f代表最新,可能需要打补丁(补丁P结尾)


事件函数

手册位置:Manual-Scripting-ScriptingOverview-Execution Order of Event Functions

《Unity API讲解课程 笔记》

事件方法的解释:

1.Awake:物体初始化或者场景刚运行时执行。

2.OnEnable:物体可用(场景运行时会执行)或设置true,false会执行。

3.Reset:编辑器模式下执行,设置物体恢复默认设置(齿轮-reset)执行。

4.start:游戏开始时执行

5.FixedUpdate:每秒运行x次,和帧数不挂钩。一般放物理内容。

6.Update:根据实际帧数每帧执行。

7.LateUpdate:在Update后执行,和Update执行次数相同。

8.OnTrigger:事件触发

9.Oncollison:碰撞触发

10.yield…:在FixedUpdate中调用

11.Onmouse:鼠标事件

12.Scene rendering:场景渲染相关

13.Gizmo rendering:窗口辅助线设置

14.onApplicationPause:编辑器暂停时执行。

注:课程中游戏运行时onApplicationPause也执行了,不知道原因。


Time类中静态变量介绍

1.??Time.captureFramerate 设置帧速率。

2.??Time.deltaTime 当前帧所占用的时间 上下波动(delta的结果会和timeScale相乘,所以可以利用这个特点实现暂停)

3.Time.fixeddeltaTime 当前帧所占用时间 固定值

4.fixedTime  从游戏开始到现在的时间 还有几个有类似功能(time,。。。)以游戏为参考计时,切换场景不会清零

unscaledtime不受时间比例的影响,realtime since startup暂停和后台都会计算时间。

5.frameCount 游戏开始到现在运行了多少帧

6.timeScale  时间比例 游戏暂停 加速播放

7.即使仅用了脚本 awake和 onapplication ondestory还是会执行

8.timeSinceLevelLoad当前场景加载完成后所运行的时间

9.如何看游戏帧数:edit-project setting-time

10. smoothdeltatime 平滑的运动时间

11.realtime since startup可以用来测试性能(如测试某方法)


创建游戏物体的三种方法

1.Gameobject go =new Gameobject(“cube”)(参数可以不指定);

或直接new Gameobject(“cube”),这样就是没引用。

2.Instantiate(可以认为是clone)

根据prefab初始化:

Gameobject.Instantiate(prefab)(Instantiate是object的方法)

(根据prefab实例化,在面板上会提示clone??clone名字可以修改?)

根据另外一个物体:

Gameobject.Instantiate(一个物体)(也是clone)

3.CreatePrimitive(创建原始形状)

Gameobject.CreatePrimitive(PrimitiveType.cube)

默认位置0,0,0


游戏物体通过代码添加组件

1.go.AddComponent<Rigidbody>();

2.go.AddComponent<脚本名>()


禁用和启用一个游戏物体

1.transform必须任何物体都要有且只有一个且不能移除

2.tag用来区分物体

3.activeHierarchy判断物体是否处于激活状态 和父物体挂钩

4.activeself和父物体无关,即使父物体被禁用,也会显示ture。

5..SetActive可以设置activeHierarchy

6.即使物体处于未激活,属性还是存在只是不显示了。物体还在内存中只是不耗费性能。


GameObject、Component和Object

《Unity API讲解课程 笔记》《Unity API讲解课程 笔记》

 

1.立即销毁和destroy一样,但是destroy会等到没有引用以后再销毁。

2.destroy既可以销毁物体,也可以销毁组件

3.destroy可以指定等待时间

4.DontDestroyOnload可以在切换游戏场景时不销毁指定内容。始终在各个场景中存在。

5.FindObjectOfType根据组件类型全局(整个场景)查找组件。返回值是Object,找到第一个符合类型的就返回。

6.FindObjectsOfType可以查找多个符合类型的组件。数组。不查找未启用的物体。

7.静态方法需要直接调用,或者Gameobject.

8.【否决的】代表方法已废弃。

9.debug.log(物体名)可以输出物体名和类型

10.Instantiate有多个重载方法。

GameObject

1.find根据名字进行查找,耗费性能

2.广播和发送就是调用某方法

3.Broadcast Message向自身以及子物体上的所有组件来广播调用方法。

4.Broadcast Message可以选择不一定有接收者:

5.未激活状态无法接受消息

6.sendMessage会发送给物体上的所有组件,不会发送给子物体。

7.Broadcast Message是当前物体及其所有子物体。sendMessageupwards是当前物体及父物体包括父物体的父物体,一个像上一个向下。

8.父亲只能有一个

得到组件的各种方法函数

注;component和GameObject有一些共同方法,但是对于component来说,这些方法是在对Game Object进行操作。


MonoBehaviour

1.MonoBehaviour-Behaviour-component-object

2.MonoBehaviour中有很多消息

3.【ExecuteInEditMode】特性加到某类上,编辑模式就也可以运行。

4.cancelinvoke会取消当前脚本所有invoke调用的方法,指定参数可以停止指定的invoke。

5.invokerepeating重复调用某方法

6.invoke可以定时执行某方法。

7.print是MonoBehaviour里的

8.isActiveAndEnabled 判断组件是否启用

9.有enable属性

10.MonoBehaviour也是组件

11.物体身上的组件名就是类名

12.insoector面板可以锁定,还可以添加多个

13.禁用组件就是禁用update方法,如果组件没有updte方法,就不会再面板上显示禁用选项

14.IsInvoking判断是否正在被invoke


UGUI

1.button在面板可以指定触发方法

2.通过脚本注册方法:

3.supported events可以查看可实现的接口,通过让物体继承接口,可以监听一些普通的物体。脚本放在哪,就只能监听哪

具体接口看手册。

4.实现接口后,unity是怎么将实现的方法绑定在事件上的

5.实现拖拽接口后可以实现拖拽

6.


事件Mousexx

按下和抬起不是一个事件

1.监听Mousexx事件必须有collider,如果collider是trigger就要保证edit-project settings-physicals下的queries hit trigger勾选

2.over每帧执行

3.碰撞器和触发器不一样碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性

4.UpAsButton 点击方法,点击a在b抬起就不会触发。

5.


触摸事件

1.多点触控

2.鼠标无法检测到

3.触摸后会获得一个touch对象数组 input.touchs

4.easytouch插件


协程

1.协程方法可以暂停。

2.协程方法规则:返回值是IEnumerator,返回是 yield return,调用方法StartCoroutine。

3.协程谁先进行是不确定的

4.协程暂停:yield return new WaitForSecond();

5.差值 颜色

6.开启关闭两种方式

7.stopallcoroutines停止所有协程


Mathf

1.全都是静态的

2.clamp方法

3.ceil和floor

4.lerp插值,比例大于1取最大值。比例小于0取最小值 先快后慢

5.max min可以放入多个值

6.closestpoweroftwo取得离 2 4 8 16偶数数列最近的值

7.MoveTowards 可以匀速运动

8.PingPong 来回运动的值


Input类

1.edit-projectsettings-input

2.GetKeyDown只在按下那一帧是true。

3.GetKeyDown可以传字符串

4.虚拟按键:

5.GetAxis(轴名字),积极键返回正值,消极键返回负值

6.GetAxis可以模拟加速运动,有渐变

7.GetAxisRaw无渐变马上返回1,-1,0

8.轴分水平和垂直

9.EasyTouch插件可以检测两点触摸等操作

10.对于不需要传递参数的方法一般会定义成变量

11.anykeydonw鼠标按键也会触发

12.mouseposition获取以屏幕左下角为原点,以像素为单位的坐标。

13.Camera.main.ScenePointtoRay传入坐标做射线检测


Vector2

1.magnitude取得向量长度

2.normalized 单位化向量(方向不变,长度变)

3.sqrmagnitude 没开方的长度(两个向量比较,不开方也能比且不耗费性能)

4.Vector2 3 都是结构体

5.Transform内部这个transform.position.x是c#中的结构体当作返回值的问题,结构体是值类型,而值传递是复制传递,所以返回的值不是原来的值了,对此返回值的修改是无效的,所以编译器就从源头上禁止了这样的操作。

transform.position = Vector3.zero; 是可以的

https://www.jianshu.com/p/dddceca086f8

1,Transform中的position是属性(property)(换成方法也一样,因为属性的实现本质上还是方法)而不是公有字段(fiel)

2,position的类型是Vector3的,而Vector3是Struct类型

3,Struct之间的赋值是拷贝而不是引用

6.结构体为什么这么操作??

7.值类型 可以直接==比较

8.Normail方法是单位化自身

9.Clamp Magnitude限定向量在一个值

10.LerpUnclamped a,b中间值×比例

11.lerp 可以做先快后慢的运动

12.movetowards  做匀速运动

13.z轴是前后

14.Project 投影

15.Slerp ab之间夹角进行插值


Random

1.生成的整数不包含最大值

2. seed一样每次随机数都一样

3.System.DataTIme.now.ticks是此时日期(前时间-时间戳),并随着时间增长一直增长,作为seed很合适

4.时间戳?

5.相反为了保证随机数在不同设备一样,可以使用相同的seed

6.ColorHSV 生成颜色

7.value是个小于1的随机小数

8.insidUnitCircle随机在单位圆中生成位置


Quaternion

1.主要是旋转

2.表示游戏物体旋转:欧拉角,四元数。四元数更方便计算,欧拉角方便观察。

3.xx.rotation返回的是四元数

4.euler 欧拉角变四元数

5.LookRotation把主角的方面望向敌人

6.position.y设置为0 代表忽略高度差

7.平滑望向敌人:


Rigidbody

1.Rigidbody继承competent

2.Rigidbody使用position比使用transform更改位置性能更好

如果使用transform。position会使自身collider重新计算。

(GetComponent<Rigidbody>.position = xxx)

3.属性面板的刚体中的Constraints可以冻结某一轴

4.如果持续的移动刚体,推荐使用MovePosition移动。会使用插值方式使运动更平滑。

5.通过刚体可以修改旋转,和rotation的性能比较,和position同理。

6.addforce 施加力,有一个加速的过程,由慢变快并一直加速度。 力太小是运动不起来的。


Camera

1.可以添加多个相机

2.如果不想使用onmousedown这种方法,可以使用射线检测

3.Camera可以将鼠标点转换为射线,

4.Camera.mian 可以获取main camera标签的camera,如果经常访问maincamera最好设置一个变量作为引用,节省性能

5.cameraname.ScreenPointToRay(input.mouserPosition);将鼠标位置转换射线

6.raycasthit存储的是碰到的物体

7.射线的起点是在摄像机对着的屏幕上,而且射线是发散的。

8.面板上的near和far可以调节可视距离,fieldofview可以调节广角

9.摄像机可以改为正交的

10.摄像机的背景可以改变

11.clearflags关闭图像就会有重影

12.depth控制多个相机的渲染顺序

13.debug.drawray()绘制射线


Physics

射线检测:

1.3d和2d都可以检测

2.射线长度可以规定

3.raycast可以指定射线长度

4.射线检测的条件是物体必须有碰撞器

5.先创建一个射线ray,再通过Phtsics.Raycast(ray)来判断是否碰撞

6.通过Phtsics.Raycast的重载方法可以获取的碰撞的物体名

7.raycasthit 保存碰撞的物体,hit.保存了碰撞物体的信息

8.Raycast指定碰撞图层就必须要指定射线长度,可以设置为无限大

9.2d检测要确定是否添加了2d碰撞器

10.Raycastall可以穿透所有物体

11.


Application

1.SteamingAssets(自己新建文件夹)是不会被编译压缩的

2.Application.datapath+”/SteamingAssets”可以读取到SteamingAssets,不同平台有不同的写法

3.BuildSettings中的Playersetting可以设置公司名,productname是软件名,Playersetting可以设置很多游戏的信息

4.isFocused 判断是否为焦点

5.退出游戏 Quit,(曾经)编辑器模式下退出游戏:isPlaying = false

现在:UnityEditor.EditorApplication.isPlaying = false

6.CaptureScreenshot 截图

7.


场景(SceneManager)

1.以前的加载方式是:Application.LoadLevel(1)

2.需要引用命名空间

3.SceneManager.loadScene()。参数中有一个模式,有两种模式,一是销毁当前场景加载新的,另一种是附加

4.加载的慢可以异步加载显示进度条

5.setactivescene也可以切换场景

6.unload卸载场景

7.有一些事键可以注册

8.已激活的场景和加载场景的模式都可以得到

9.没有加载的场景,通过index,名获取不到。反过来也不行

10.


WWW

1.ftp仅限于匿名下载

2.只支持四种协议

3.


CharacterController

1.物体上添加CharacterController组件

2.通过传递轴控制人物移动

3.Move方法会按向量参数移动,但simplemove会有重力的影响

4.有一些方法可以实现

5.


Mesh

1.mesh指定了一个人是什么样的,meterial指定了皮肤

2.mesh filter控制网格,mesh renderer控制材质

3.材质丢失会显示紫色

4.mesh可以通过代码更改,mesh会重新复制一份赋值的mesh,sharemesh不复制

5.


Material

1.color

2.获取物体的material组件:Getcomponent<MeshRenderer>().material


Animator

1.speed调节状态机速度

2.


Unity API方法变更

1.粒子系统有更改

2.场景加载 application.loadlevel被弃用,场景加载不属于应用级别,使用scenemanager来管理场景

3.OnLecelWasLoaded被弃用,使用sceneloaded事件代替

4.声音中spatial blend来更改3d 2d声音


transform

deltatime和移动的关系

getcomponent小号性能

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注