本博客在Edward-Phoenix博客下改编,对部分答案进行详细说明,本人纯属为了加深印象自己敲了一遍。在此感谢前辈的整理。原博客地址:
https://blog.csdn.net/qq_25601345/article/details/77102775
本人正处于求职准备阶段,如有兴趣可以加入QQqun:713591618。此群支持学习讨论,更有大厂内推。再次恭候各路英雄好汉的加入。期待与你共同进步。
-----2020.3.13
文章目录
-
- C# StringBuilder类型比string类型的优势是什么?
- C# 函数Func(string a, string b)用Lambda表达式怎么写?
- 数列1,1,2,3,5,8,13...第n位数是多少?用C#递归算法实现
- 请简述值类型与引用类型的区别
- 请简述ArrayList和List<>的主要区别
- 请简述GC(垃圾回收)产生的原因,并描述如何避免?
- 请描述Interface与抽象类之间的不同
- 下列代码在运行中会产生几个临时对象?
- 下列代码在运行中会发生什么问题?如何避免?
- 请简述关键字Sealed用在类声明和函数声明时的作用
- 请简述private,public,protected,internal的区别
- 反射的实现原理?
- .Net与Mono的关系?
- 请说出4种面向对象的设计原则,并分别简述它们的含义。
- Hashtable是无序的吗?
- *unity问题*
-
- NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么?
- 请简述NGUI中Panel和Anchor的作用
- 为何大家都在移动设备上寻求U3D原生GUI的替代方案
- 使用Unity3d实现2d游戏,有几种方式?
- 怎么判断两个平面是否相交?不能用碰撞体,说出计算方法
- MeshCollider和其他Collider的一个主要不同点?
- Unity3d中的碰撞器和触发器的区别?
- 物体发生碰撞的必要条件
- CharacterController和Rigidbody的区别?
- 当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
- 在unity3d中物体发生碰撞的整个过程中,有几个阶段,分别列出对应的阶段函数
- 请描述游戏动画有哪几种,以及其原理?
- 写出Animation的五个方法
- 动画层(AnimationState Layers)的作用是什么?
- Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?
- 法线贴图 、CG动画 ?
- Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
- Unity3D的协程和C#线程之间的区别是什么?
- 什么是协同程序?
- 四元数是什么?主要作用什么?对欧拉角的优点是什么?
- 在场景中放置多个Camera并同时处于活动状态会发生什么?
- Unity摄像机有几种工作方式,分别是什么?
- Prefab的作用?如何在移动环境的设备下恰当地使用它?
- unity 当需要频繁创建一个物体对象时,怎样减少内存
- 光照计算中的diffuse的计算公式
- MeshRender中material和shader的区别?
- 光照贴图 的优势是什么?
- Vertex Shader是什么,怎么计算?
- .unity3d提供了几种光源,分别是什么
- 物理更新一般在哪个系统函数里?
- OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
- Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
- 物理更新一般放在哪个系统函数里?
- 移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?
- 请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
- 动态加载资源的方式?区别是什么?
- 以下哪个函数在游戏进入新场景后会被马上调用?
- 如何销毁一个UnityEngine.Object及其子类对象
- 获取、增加、删除组件的命令分别是什么?
- Application.loadLevel命令是什么?
- 调试记录到控制台的命令是什么?
- LayerMask.NameToLayer()这个方法有什么作用?
- localPosition与Position的使用区别?
- 物体自身旋转使用的函数?
- 物体围绕某点旋转使用的函数?
- 6.U3D中用于记录节点空间几何信息的组件名称,及其父类名称
- 写一个计时器工具,从整点开始计时,格式为:00:00:00
- 实现吊机吊物体的功能
- Material和Physic Material区别?
- CharacterController和Rigidbody的区别?
- Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
- 什么叫做链条关节?
- 什么是导航网格( NavMesh)?
- 简述Unity3D支持的作为脚本的语言的名称
- 向量的点乘、叉乘以及归一化的意义?
- 矩阵相乘的意义及注意点?
- 为什么dynamic font在unicode环境下优于static font?
- Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同
- 简述SkinnedMesh的实现原理
- 为什么Unity3D中会发生在组件上出现数据丢失的情况?
- 如何安全的在不同工程间安全地迁移asset数据?三种方法
- Lod是什么,优缺点是什么?
- 两种阴影判断的方法、工作原理。
- 如何优化内存?
- 什么是渲染管道?
- 什么是矢量图 ?
- 什么是矩阵?矩阵运算?
- 角度和弧度的转换
- 矢量标量
C# StringBuilder类型比string类型的优势是什么?
答:string不可变,再进行赋值或者拼接时会新建一个对象,分配新的内存空间。而StringBuilder不会。
两者区别:
- 它是引用类型,在堆上分配内存
- 运算时会产生一个新的实例
- String 对象一旦生成不可改变(Immutable)
- 定义相等运算符(== 和 !=)是为了比较 String 对象的值(而不是引用)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25); //设置StringBuilder的最大容量
MyStringBuilder.Capacity = 25; //同上,Capacity可读可写
分别用String和StringBuilder拼接10000次进行时间即计时:差距还是挺大的。
stringBuilder的使用方法:
StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。
StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。
StringBuilder.Replace 替换指定索引处的指定字符。
出处:https://www.cnblogs.com/Tirisfal/p/4516818.html
C# 函数Func(string a, string b)用Lambda表达式怎么写?
(a,b)=>{}
数列1,1,2,3,5,8,13…第n位数是多少?用C#递归算法实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp9
{
class Program
{
static void Main(string[] args)
{
;
int n = int.Parse(Console.ReadLine());
Console.WriteLine(cp(n).ToString());
}
public static int cp(int n)
{
if (n <= 0)
{
return -1;
}
else if (n == 1 || n == 2)
{
return 1;
}
else
{
return cp(n - 1) + cp(n - 2);
}
}
}
}
请简述值类型与引用类型的区别
值类型:byte,short,int,long,float,double,decimal,char,bool
直接存储数据,不管有没有赋值直接为其分配内存。通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)
引用类型:string class
存储数据的引用,声名时在栈中创建该类型的地址引用空间并没有为其分配内存。在new后为其在数据堆上分配内存。
相同点:
- 引用类型和值类型中的struct都可以实现接口
- 都继承于System.Object
不同点
1)范围方面
- C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
- C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
2)内存分配方面
- 数组的元素不管是引用类型还是值类型,都存储在托管堆上。
- 引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实
例)存储;作为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)
3)适用场合
- 值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
- 引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;
- 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型,如 int? a = null; );
- 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
出处:https://www.cnblogs.com/d0975/p/10638037.html
请简述ArrayList和List<>的主要区别
ArrayList是非泛型列表,存储数据时把所有的数据都当成object类型存储,存在装箱问题,取出来使用的时候存在拆箱问题,装箱拆箱会使性能变差,而且存在数据安全问题,但是优点在于可以让值类型和引用类型互相转换。
List是泛型列表,在使用的时候才去定义数据类型,泛型避免了拆箱装箱的问题,存入读取速度较快,类型也更安全。
请简述GC(垃圾回收)产生的原因,并描述如何避免?
GC回收堆上的内存
避免:
- 减少new产生对象的次数
- 使用公用的对象(静态成员)
- 如果字符串拼接多的将String换为StringBuilder
请描述Interface与抽象类之间的不同
语法不同处:
- 1.抽象类中可以有字段,接口没有。
- 2.抽象类中可以有实现成员,接口只能包含抽象成员。
- 3.抽象类中所有成员修饰符都可以使用,接口中所有的成员都是对外的,所以不需要修饰符修饰。
用法不同处:
- 抽象类是概念的抽象,接口关注于行为。
- 抽象类的子类与父类的关系是泛化关系,耦合度较高,而实现类和接口之间是实现的关系,耦合度比泛化低。
- 一个类只能继承一个类,但是可以实现多个接口。
下列代码在运行中会产生几个临时对象?
string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
答:第一行是会出错的。应该这样初始化:
string b = new string(new char[]{‘a’,‘b’,‘c’});
3个临时对象
下列代码在运行中会发生什么问题?如何避免?
List ls = new List(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
运行时产生错误,在foreach中不能更改数据。可以用for代替
请简述关键字Sealed用在类声明和函数声明时的作用
Sealed修饰类后表明封闭,即不支持继承。在函数前加Sealed表明不能在子类中进行函数重载。
请简述private,public,protected,internal的区别
- public:对任何类和成员都公开,无限制访问
- private:仅对该类公开
- protected:对该类和其派生类公开
- internal:只能在包含该类的程序集中访问该类
反射的实现原理?
反射:通过动态获取程序集,并获取其中的类型元数据,然后访问该类型的过程。
反射的用途
- (1)使用Assembly定义和加载程序集,加载在程序集中的所有模块以及从此程序集中查找类型并创建该类型的实例。
- (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
- (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic
或private)和实现详细信息(如abstract或virtual)等。 - (4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic
或private)和实现详细信息(如abstract或virtual)等。 - (5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
- (6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
- (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
- (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
反射用到的主要类
System.Type 类--通过这个类可以访问任何给定数据类型的信息。
System.Reflection.Assembly 类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。
System.Type类用法
System.Type类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。获取给定类型的Type引用有3种常用方式:
- 1、使用 C# typeof 运算符
Type t = typeof(string);
- 2、 使用对象GetType()方法
string s = "grayworm";
Type t = s.GetType();
- 3、还可以调用Type类的静态方法GetType()
Type t = Type.GetType("System.String");
Type类的属性
- Name数据类型名
- FullName 数据类型的完全限定名(包括命名空间名)
- Namespace 定义数据类型的命名空间名
- IsAbstract 指示该类型是否是抽象类型
- IsArray 指示该类型是否是数组
- IsClass 指示该类型是否是类
- IsEnum 指示该类型是否是枚举
- IsInterface 指示该类型是否是接口
- IsPublic 指示该类型是否是公有的
- IsSealed 指示该类型是否是密封类
- IsValueType 指示该类型是否是值类型
Type类的方法
- GetConstructor(),GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息
- GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息
- GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
- GetInterface(), GetInterfaces():返回InterfaceInfo类型,用于取得该类实现的接口的信息
- GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息
- GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息
- GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息
System.Reflection.Assembly类的用法
Assembly类可以获得程序集的信息,也可以动态的加载程序集,以及在程序集中查找类型信息,并创建该类型的实例。使用Assembly类可以降低程序集之间的耦合性,有利于软件结构的合理化。
- 1、通过程序集名称返回Assembly对象
Assembly assembly = Assembly.Load("ReflectionDemo2");
- 2、通过DLL文件名称返回Assembly对象
Assembly assembly = Assembly.LoadFrom("ReflectionDemo2.dll");
- 3、通过Assembly获取程序集中类
Type t = assembly.GetType("ReflectionDemo2.ReflectionClass"); //参数必须是类的全名
- 4、通过Assembly获取程序集中所有的类
Type[] tArray = assembly.GetTypes();
- List item
- 5、通过程序集的名称反射
Assembly assembly = Assembly.Load("ReflectionDemo2");
Type t = assembly.GetType("ReflectionDemo2.ReflectionClass"); //参数必须是类的全名
object o = Activator.CreateInstance(t,"男");
MethodInfo mi = t.GetMethod("Show");
mi.Invoke(o,null);
出处:https://blog.csdn.net/Gnd15732625435/article/details/78587483?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
.Net与Mono的关系?
mono是.net的一个开源跨平台工具。.net只能在windows下运行,mono可以实现跨平台,可以运行于linux,Unix,Mac OS等。
请说出4种面向对象的设计原则,并分别简述它们的含义。
- 单一职责原则:一个类,最好只做一件事,只有一个引起它的变化.
- 开放-封闭原则:对于扩展是开放的,对于更改是封闭的
- 里氏替换原则:子类必须能够替换其基类
- 依赖倒置原则:依赖于抽象
- 接口隔离原则 :使用多个小的专门的接口,而不要使用一个大的总接口。
Hashtable是无序的吗?
答:电脑没有绝对的无序,hashtable是通过哈希码让开发者感觉无序。
unity问题
NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么?
1.直接监听事件:在按钮上绑定一个带有OnClick脚本,但这种方法不太好用,也不灵活。
2.ButtonScript:在按钮上添加BoxCollider,在添加ButtonScript脚本,把要调用的方法放到场景中一个物体上,一般放在摄像机上,因为摄像机一直存在,然后把这个方法添加到ButtonScript脚本里写好的委托里面,所以可以添加多个方法,一旦点击就触发事件。
请简述NGUI中Panel和Anchor的作用
Panel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。
Anchor是NGUI中屏幕分辨率的自适应性,来适应不同的分辨率的屏幕显示。
为何大家都在移动设备上寻求U3D原生GUI的替代方案
- 1.不美观
- 2.OnGUI很耗费时间
- 3.使用不方便
- drawcall很高
使用原生GUI创建一个可以拖动的窗口命令是什么?
答:GUI.DragWindow()
使用Unity3d实现2d游戏,有几种方式?
- 1.使用本身的GUI
- 2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴
- 3.使用2d插件,如:2DToolKit
怎么判断两个平面是否相交?不能用碰撞体,说出计算方法
答:在两个平面上分别取一个向量,然后看是否相交
MeshCollider和其他Collider的一个主要不同点?
答:MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。
Unity3d中的碰撞器和触发器的区别?
1.碰撞器物体不能互相进入到对方内部,触发器可以
2.触发器角色控制器可以使用,碰撞器中不能使用
3.触发器没有物理属性了,碰撞器可以有力存在
4.碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数
物体发生碰撞的必要条件
答:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
CharacterController和Rigidbody的区别?
CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
答:穿透(碰撞检测失败)
避免的方法:把刚体的实时碰撞检测打开Collision Detection修改为Continuous Dynamic
在unity3d中物体发生碰撞的整个过程中,有几个阶段,分别列出对应的阶段函数
主要是三个阶段:1.Collider.OnCollisionEnter 进入碰撞,
OnCollisionEnter is called when this collider/rigidbody has begun touching
another rigidbody/collider.
当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用。
2.Collider.OnCollisionStay 逗留碰撞,
OnCollisionStay is called once per frame for every collider/rigidbody that is
touching rigidbody/collider.
每个collider/rigidbody触动rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说,
一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。
3.Collider.OnCollisionExit 退出碰撞,
OnCollisionExit is called when this collider/rigidbody has stopped touching
another rigidbody/collider.
当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。
请描述游戏动画有哪几种,以及其原理?
答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
1.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画。
2.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。
写出Animation的五个方法
答:AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样 、CrossFade淡入淡出切换动画、IsPlaying是否正在播放某个动画
动画层(AnimationState Layers)的作用是什么?
答:动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画
Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?
答:ITween是补间动画的一个插件,主要作用就是给出开始、结束的值、时间,此插件实现各种动画,晃动,旋转,移动,褪色,上色,音量控制等等。
方法:1.MoveTo 物体移动
2.ColorTo:随着时间改变对象的颜色组
3.LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置
法线贴图 、CG动画 ?
答:法线贴图:是一种特殊的纹理,可以应用在3D表面,让低模呈现出更明显的凹凸效果。一般应用在CG动画、美术效果要求较高的单机游戏
CG动画:游戏中的CG动画其实是用3D模拟引擎制作的游戏短片,一般画面效果比较真实。
Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
答:Unity支持多线程,如果同时要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:1.虽然支持多线程,但是仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,所以如果使用的话需要把组件中的数值传到开启的新线程中。
2.C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
Unity3D的协程和C#线程之间的区别是什么?
答:多线程程序同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。
什么是协同程序?
答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
四元数是什么?主要作用什么?对欧拉角的优点是什么?
答:所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部
作用:四元数用于表示旋转
优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]
四元数由4个数组成,旋转矩阵需要9个数
两个四元数之间更容易插值
四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易
与旋转矩阵类似,两个四元组相乘可表示两次旋转
在场景中放置多个Camera并同时处于活动状态会发生什么?
答:游戏界面可以看到很多摄像机的混合
Unity摄像机有几种工作方式,分别是什么?
答:正交和透视
正交无法看到一个物体距离自己有多远,或者远近的变化,物体也不会随着距离而收缩,所以一般做2D游戏或者是UI时会使用正交摄像机。
透视一般看物体会随着距离有大小的变化,一般3D游戏里经常使用这种摄像机
Prefab的作用?如何在移动环境的设备下恰当地使用它?
Prefab是预制物,一般当游戏中需要频繁创建一个物体时,使用预制物可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。
unity 当需要频繁创建一个物体对象时,怎样减少内存
答:动态加载再实例化,如果自己不主动清理内存的话,再次加载不会增加内存的,会自动去取之前已经加载好的assets,如果这一个assets你都嫌多的话,那你只能减资源了,比如,模型面数,纹理尺寸等
光照计算中的diffuse的计算公式
- 实际光照强度l=环境光(lambient)+漫反射光(Idiffuse)+镜面高光(lspecular)
- 环境光:lambient=环境光强度(Aintensity)*环境光颜色(Acolor)
- 漫反射光:ldiffuse=镜面光照强度(Dintensity)镜面光颜色(Scolor)(光的反射向量(R).观察者向量(V))^镜面光指数(n)
MeshRender中material和shader的区别?
答:MeshRender是模型渲染的组件,有此组件物体才能显示出来
Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。
Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。
Shader大致分为:
1.表面着色器
2.顶点和片元着色器
3.固定功能着色器
alpha blend工作原理
答:Alpha Blend是 实现透明效果,Color = 原颜色alpha/255+目标色(255-alpha)/255
光照贴图 的优势是什么?
- 使用光照贴图比使用实时光源渲染要快
- 可以降低游戏内存消耗
- 多个物体可以使用同一张光照贴图
Vertex Shader是什么,怎么计算?
顶点着色器:顶点着色器是一段执行在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几个过程。
.unity3d提供了几种光源,分别是什么
4种,
Directionl light:方向光
Point Light:点光
Spot Light:聚光
Area Light:区域光,区域光在“实时光照”模式下是无效的,仅在“烘焙光照”模式下有用。
物理更新一般在哪个系统函数里?
FixedUpdate:每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
答:Awake –>OnEnable->Start
OnEnable在同一周期中可以反复地发生
Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
物理更新一般放在哪个系统函数里?
FixedUpdate因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新。
移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?
LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible 当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible
动态加载资源的方式?区别是什么?
1.Resources.Load();
2.AssetBundle
区别:
Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。
简单说,Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的,可用于热更新。
以下哪个函数在游戏进入新场景后会被马上调用?
MonoBehaviour.OnLevelWasLoaded
如何销毁一个UnityEngine.Object及其子类对象
Destory函数。
获取、增加、删除组件的命令分别是什么?
获取:GetComponent
增加:AddComponent
没有删除组件只有让组件不生效:enable
Application.loadLevel命令是什么?
切换场景
调试记录到控制台的命令是什么?
答: Debug.Log();
LayerMask.NameToLayer()这个方法有什么作用?
答:层索引
localPosition与Position的使用区别?
localPosition:自身位置,相对于父级的变换的位置,局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。
Position:在世界坐标transform的位置,世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。
物体自身旋转使用的函数?
Transform.Rotate()
物体围绕某点旋转使用的函数?
Transform.RotateAround()
6.U3D中用于记录节点空间几何信息的组件名称,及其父类名称
Transform 父类是 Component
写一个计时器工具,从整点开始计时,格式为:00:00:00
代码实现:
private float _time;
void Start()
{
_time = 0f;
}
// Update is called once per frame
void Update()
{
_time += Time.deltaTime;
Debug.Log(string.Format("{0:D2}:{1:D2}:{2:D2}", (int)(_time / 3600), (int)(_time / 60), (int)(_time % 60)));
}
实现吊机吊物体的功能
思路:
- 检测物体碰撞
- 将物体设为吊机的子物体
代码:此代码只实现物体跟随效果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class jishiqi : MonoBehaviour
{
GameObject diaoji;
GameObject cube;
void Start()
{
diaoji = GameObject.Find("Cube");
cube = GameObject.Find("Cube (1)");
}
// Update is called once per frame
void Update()
{
diaoji.transform.position += new Vector3(0, 0.1f, 0);
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log("发生碰撞");
if(collision.gameObject.name == "Cube (1)")
cube.transform.parent = diaoji.transform;//将其设置为吊机的子物体
}
}
效果图:
Material和Physic Material区别?
答:PhysicMaterial 物理材质:主要是控制物体的摩擦,弹力等物理属性。
Material材质:主要是控制一个物体的颜色,质感等显示。
CharacterController和Rigidbody的区别?
CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。
什么叫做链条关节?
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
什么是导航网格( NavMesh)?
Unity内一种用于实现自动寻路的网格
简述Unity3D支持的作为脚本的语言的名称
答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
JavaScript
C#
Boo
向量的点乘、叉乘以及归一化的意义?
1)点乘计算两个向量之间的夹角,还可表示某一方向的投影
2)叉乘得到的是法向量
3)标准化向量:用在只关系方向,不关心大小的时候
矩阵相乘的意义及注意点?
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意:矩阵的蠕变:误差的积累
为什么dynamic font在unicode环境下优于static font?
答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同
答:render是渲染器,渲染器可以使物体显示在屏幕上。
MeshRender是网格渲染,SkinnedMeshRender是蒙皮网格渲染器
简述SkinnedMesh的实现原理
答:骨骼蒙皮动画,模型本身是静态的,是因为通过蒙皮,使模型每个点都有Skin数据,Skin数据包括顶点受到哪些骨骼影响以及这些骨骼影响顶点的权重值,还有动画数据,有了Skin数据的模型就可以根据动画数据进行显示动画了。
为什么Unity3D中会发生在组件上出现数据丢失的情况?
组件上绑定的对象被删除了
如何安全的在不同工程间安全地迁移asset数据?三种方法
- 1)将Assets目录和Library目录一起迁移
- 2)导出包
- 3)用unity自带的assets Server功能
Lod是什么,优缺点是什么?
答:LOD是Level of detail简称,意为多层次细节,是最常用的游戏优化技术,LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态的选择渲染不同细节的模型
缺点:增加美工工作量,增大了游戏的容量。
两种阴影判断的方法、工作原理。
自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域收不到光照照射而形成的阴影。
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后在按视点位置对场景进行相应处理得到所要求的师徒(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。
MipMap是什么,作用?
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
如何优化内存?
1.压缩自带类库
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉
3.释放AssetBundle占用的资源
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
5.使用光照贴图
6.使用多层次细节(LOD)
7.使用着色器(Shader)
8.使用预设(Prefab)等
什么是渲染管道?
是指在显示器上为了显示出图像而经过的一系列必要操作。
渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要有三步:应用程序阶段,几何阶段 光栅阶段
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。
什么是矢量图 ?
计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
什么是矩阵?矩阵运算?
矩阵:横轴排列的二维数据表格
矩阵运算:
加减 限制条件:行和列必须相同,对应相加相减得到结果
乘法 限制条件:要求左矩阵的行和右矩阵的列必须同,行数和左矩阵相等,列数和右矩阵相等,结果的第i行第j列,是左矩阵的第i行和右矩阵的第j列逐个相乘并把结果相加,得到结果是结果 的 第i行第j列
角度和弧度的转换
角度和弧度
度和弧度之间的换算 1弧度 = 180度 /pi(约57.3)
1度=pi/180弧度(约0.017)
矢量标量
答:矢量有方向如力速度 标量只有大小没有方向如温度
矢量取模就是只要大小不要方向
^单位向量 有方向 大小为1的向量
矢量的加法:是矢量的几何和,服从平行四边形规则
矢量满足交换律,满足结合律
在直角坐标系中,矢量等于骑在坐标轴上投影的矢量之和(二维矢量可以看做三维矢量的特例也就是说 三维成立,二维也成立)
矢量减法:
大小相等 方向相反 称为逆矢量
任意多个矢量首尾相连接组成闭合多边形,其结果必为0
矢量的乘法:点积(内积、标量积)、叉积(外积)结果是矢量