System.ValueType
,引用类型继承自System.Object
。参考:https://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
引用类型的基类是System.Object
。
值类型的基类是System.ValueType
。同时,值类型也隐式继承自System.Object
ArrayList
存在不安全类型(ArrayList
会把所有插入其中的数据都当做Object
来处理),装箱拆箱的操作(费时)。
List
是接口,ArrayList
是一个实现了该接口的类,可以被实例化。
GC回收堆上的内存。
避免:
String
换为StringBuilder
抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公公只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。
参考:http://www.cnblogs.com/seapub/archive/2012/08/08/2628433.html
类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
public
:对任何类和成员都公开,无限制访问private
:仅对该类公开protected
:对该类和其派生类公开internal
:只能在包含该类的程序集中访问该类;protected internal
:protected
+ internal
审查元数据并收集关于它的类型信息的能力。
参考:http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射个人认为,就是得到程序集中的属性和方法。
实现步骤:
using System.Reflection;
Assembly.Load
(“程序集”)加载程序集,返回类型是一个Assembly
foreach (Type type in assembly.GetTypes()){ string t = type.Name; }
得到程序集中所有类的名称。Type type = assembly.GetType("程序集.类名");
获取当前类的类型。Activator.CreateInstance(type);
创建此类型实例。MethodInfo mInfo = type.GetMethod("方法名");
获取当前方法。mInfo.Invoke(null,方法参数);
。Mono官网主页:
Mono is a software platform designed to allow developers to easily create
cross platform applications. Sponsored by Xamarin, Mono is an open source
implementation of Microsoft’s .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
mono是.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,
可以运行于linux,Unix,Mac OS等。
Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
仅能从主线程中访问Unity3D的组件。
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread
,否则使用coroutine
。
注意:C#中有lock
这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象。
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine
(协同程序)和LoadLevelAsync
(异步加载关卡)后台加载场景的方法。 StartCoroutine
为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine
的函数体里处理一段代码时,利用yield
语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync
则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading
条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜。
参考:http://blog.csdn.net/kongbu0622/article/details/8775037
Transform
父类是Component
。
四元数用于表示旋转。
相对欧拉角的优点:
用于表示线性变换:旋转、缩放、投影、平移、仿射。
注意矩阵的蠕变:误差的积累。
不美观,OnGUI很耗费时间,使用不方便 ,DrawCall。
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。参考:http://blog.csdn.net/mfc11/article/details/17681429。
当前UGUI也已经更新的非常完善。
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
A renderer is what makes an object appear on the screen。
Mesh
就是指模型的网格(同名组件是用于调整网格属性的),MeshFilter
一般是用于获得模型网格的组件,而MeshRender
是用于把网格渲染出来的组件,
参考:http://blog.csdn.net/n5/article/details/3105872
游戏界面可以看到很多摄像机的混合。
Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。
参考:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html
Destory
。
组件上绑定的对象被删除了。
Meshcollider再快也是基于V3顶点~~ 建议还是用boxcollider,boxcollider本身是基于算法,没有面的概念。
会发生穿透(碰撞检测失败)。
解决方法:
Awake -》OnEnable-》Start
OnEnable
在同一周期中可以反复地发生。
参考:http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html。
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
Resource.Load()
:通过Resources模块,调用它的load函数:可以直接load
并返回某个类型的Object
,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。get
下来,然后从这个bundle中load
某个object
。AssetDatabase.loadasset
:这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的修改sharedMaterial
将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。
不推荐修改由sharedMaterial
返回的材质。如果你想修改渲染器的材质,使用material
替代。
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。
单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)
实际显示颜色 = 前景颜色Alpha/255 + 背景颜色(255-Alpha)/255。
LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型。
缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。
阴影由两部分组成:本影与半影。
求阴影区域的方法:做两次消隐过程。
阴影分为两种:自身阴影和投射阴影
在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MIP map或者mipmap。
isTrigger = false
,可以调用OnCollisionEnter/Stay/Exit函数。isTrigger = true
,可以调用OnTriggerEnter/Stay/Exit函数。物体A必须带有(collider
+rigidb
ody)或者CharacterController
,另一个物体也必须至少带有collider
Rigidbody
具有完全真实物理的特性,而CharacterController
可以说是受限的Rigidbody
,具有一定的物理效果但不是完全真实的。
三个阶段,OnCollisionEnter/Stay/Exit函数
rigidbody.AddForce
/AddForceAtPosition
,都是rigidbody
的成员函数
Hinge Joint ,他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。(简单说就是弹簧)
transform.Rotate
。
transform.RotateAround
。
PlayerPrefs.SetInt
与PlayerPrefs.GetInt
。
Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy
FixedUpdate
每固定帧绘制时执行一次,和Update
不同的是FixedUpdate
是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate
调用次数就会跟着下降。FixedUpdate
比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update
就比较适合做控制。
LateUpdate
,是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
做一个pool,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回。
实际看到的画面由多个camera的画面组成,由depth
、Clear Flag
、Culling Mask
都会影响最终合成效果。
在游戏运行时实例化,prefab相当于一个模版,对你已有的素材、脚本、参数做一个默认配置,以便于以后修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
Destroy
。
一般是组件上绑定的物体对象被删除了。
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。
有很多种方式,例如
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3. 释放AssetBundle占用的资源;
4. 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5. 使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
GetComponent
。AddComponent
。Destroy
。答案:©
A.动画放大 B.动画转换 C.动画的淡入为其他动画
答案:(A)
A.加载关卡 B.异步加载关卡 C.加载动作
Debug.Log();
。
工程目录下的Assets/Editor文件夹下。
GUI.DragWindow();
。
localPosition
:自身位置,相对于父级的变换的位置。 Position
:在世界坐标transform的位置
Mathf.Round
:四舍五入。Mathf.Clamp
:限制。Mathf.Lerp
:插值。Math.Ceiling
:只要有小数都加1Math.Floor
:总是舍去小数GameObject.GetComponent<>();
。
构造函数格式为public
+类名如果加上static
会报错(静态构造函数不能有访问修饰符).
原因:静态构造函数不允许访问修饰符,也不接受任何参数;
无论创建多少类型的对象,静态构造函数只执行一次;
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;
静态构造函数执行先于任何实例级别的构造函数;
显然也就无法使用this
和base
来调用构造函数。
如果是处理字符串的话,用string
中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder
是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder
这样比较节约内存。但是string
类的方法和功能仍然还是比stringBuilder
类要强。
string
类由于具有不可变性(即对一个string
对象进行任何更改时,其实都是创建另外一个string
类的对象),所以当需要频繁的对一个string
类对象进行更改的时候,建议使用StringBuilder
类,StringBuilder
类的原理是首先在内存中开辟一定大小的内存空间,当对此StringBuilder
类对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来存储和操作字符串的,唯一的区别就在于性能上。
String
主要用于公共API,通用性好、用途广泛、读取性能高、占用内存小。
StringBuilder
主要用于拼接String
,修改性能好。
不过现在的编译器已经把String
的+
操作优化成StringBuilder
了,所以一般用String
就可以了。
String
是不可变的,所以天然线程同步。
StringBuilder
可变,非线程同步。
参考:https://zhidao.baidu.com/question/240364840.html
参考:https://msdn.microsoft.com/zh-cn/library/bb397687.aspx
collider的性能和效率大概的顺序是:Sphere Collider > Capsule Collider> Box Collider > Mesh Collider。
transform.translate()
向某方向移动物体多少距离【默认local坐标系】transform.Position()
在世界空间坐标transform的位置。RigidBody.Velocity
刚体的速度向量。RigidBody.AddForce
添加一个力到刚体。作为结果刚体将开始移动。RigidBody.MovePosition
移动刚体到position
。SetDestination
函数,设置自动Path目标点。Move
函数,每次都绝对运动。Vector3.MoveToward
当前的地点移向目标。SetInt();
保存整型数据;GetInt();
读取整形数据;SetFloat();
保存浮点型数据;GetFlost();
读取浮点型数据;SetString();
保存字符串型数据;GetString();
读取字符串型数据;选择框架和使用框架是控制框架的基础。
我们了解到深度优先是一种类似递归的搜索算法(就是一条路走到底,还找不到就返回走第二条路)。
广度优先刚好相反,是只要有岔路都走个遍,走到下一个拐点要是还有岔路也都先探一探酱紫。
代码是通过GameObject.Find()
的方法,找到名为GameObject
的物体,然后隐藏其子物体。如果是广度优先的话,那么该被隐藏应该是和A平级的节点GameObjec
的自物体,但执行下来,隐藏的确是D下面的GameObject的子物体,可见==GameObject.Find()
应该是深度优先==,
网上的这篇文章还是蛮不错的,讲到了GameObject.Find
早就不推荐使用啦,分享给大家:csdn 博客《Unity3D 游戏开发GameObject.Find()Transform.Findc 查找隐藏对象》
https://blog.csdn.net/wjlsxl_whb/article/details/53187577