赞
踩
答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。
答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
Is Trigger=false
时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter
/Stay
/Exit
函数;Is Trigger=true
时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter
/Stay
/Exit
函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器。
答:两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。
ArrayList
和List
的主要区别答:
ArrayList
存在不安全类型ArrayList
会把所有插入其中的数据都当做Object来处理,而List
使用泛型,能够确保类型安全。ArrayList
的性能相对较低,因为需要进行装箱拆箱的操作,而List
由于使用泛型,避免了装箱拆箱的开销。ArrayList
是一个实现了该接口的类,可以被实例化。答:GC回收堆上的内存。
避免:
答:审查元数据并收集关于它的类型信息的能力。
实现步骤:
导入using System.Reflection
;
Assembly.Load("程序集")
; //加载程序集,返回类型是一个Assembly
得到程序集中所有类的名称
luaCopy codeforeach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
获取当前类的类型
graphqlCopy code
Type type = assembly.GetType("程序集.类名");
创建此类型实例
bashCopy code
Activator.CreateInstance(type);
获取当前方法
goCopy code
MethodInfo mInfo = type.GetMethod("方法名");
调用方法
csharpCopy code
mInfo.Invoke(null, 方法参数);
答:四元数用于表示旋转。
相对欧拉角的优点:
答:
答:Awake–>OnEnable–>Start
OnEnable在同一周期中可以反复地发生!
答:
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。
不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
(已回答在问题四的答案中)
答:(内容较长,请在Markdown编辑器中查看)
答:四种。
答:对象池就存放需要被反复调用资源的一个空间,比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。
在FPS游戏中,适合使用对象池的东西包括:
答:CharacterController具有较为简单的碰撞检测,主要用于控制角色在场景中的移动。不受物理引擎影响,适合处理角色的第一人称或第三人称控制。
Rigidbody具有完全真实物理的特性,会受到物理引擎的影响。适合处理更真实的角色物理行为,如跳跃、受力等。
答:移动相机通常在LateUpdate函数中进行,因为LateUpdate是在所有的Update结束后才调用,这样可以确保相机在其他物体移动后再进行自己的移动,避免相机跟随目标物体的抖动。
答:Prefab是Unity中用于预制对象的概念。它允许你创建一个模板对象并在场景中多次复用,可以大大简化场景的创建和管理。Prefab可以包含游戏对象的组件和属性,可以在编辑器中进行设置,然后在场景中实例化多个相同或相似的对象,方便团队的协作和修改。
答:在类声明时,sealed关键字用于防止其他类继承此类,即被标记为sealed的类不能被其他类所继承。
在函数声明时,sealed关键字用于防止派生类重写此方法,即被标记为sealed的方法不能在派生类中进行重写。
答:
简而言之,GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序)
GPU的工作流水线是高度并行化的,能够在短时间内完成大量图形计算任务。
答:渲染管道是指在显示器上为了显示出图像而经过的一系列必要操作。渲染管道中的许多步骤都要将几何物体从一个坐标系中变换到另一个坐标系中,最终输出像素点。
渲染管道的主要步骤包括顶点处理、光栅化计算、纹理帖图、像素处理和最终输出。
答:有很多种方式,例如:
这部分回答不够具体,无法提供准确的回答。
答:使用Unity3D实现2D游戏可以有以下几种方式:
答:物体发生碰撞的整个过程中,有三个阶段:
OnCollisionEnter
:在物体发生碰撞并初次接触时调用的函数。OnCollisionStay
:在物体持续接触(碰撞)时调用的函数。OnCollisionExit
:在物体离开碰撞状态时调用的函数。答:Unity3D的物理引擎中有两种常见的施加力的方式:
rigidbody.AddForce
:在刚体上施加一个持续的力。rigidbody.AddForceAtPosition
:在刚体上的指定位置施加一个持续的力。这些方法可以用于模拟物体的运动和受力效果。
答:链条关节(Hinge Joint)是Unity中的一种物理关节,它模拟了两个物体之间用链条连接在一起的情况。链条关节可以保持两个物体在一个固定距离内相互移动而不产生作用力,但在达到固定距离后就会产生拉力,从而模拟类似铰链的效果。
答:物体自身旋转使用Transform类的Rotate方法。例如:transform.Rotate(Vector3.up, angle);
答:
PlayerPrefs.SetInt(key, value)
;PlayerPrefs.GetInt(key)
;答:Unity3D脚本从唤醒到销毁的生命周期方法包括:
Awake
:在脚本对象被创建时调用,用于初始化一些数据和组件。Start
:在脚本对象被启用时调用,用于开始一些初始化操作。Update
:在每一帧更新时调用,用于处理逻辑和更新游戏状态。FixedUpdate
:在固定时间间隔更新时调用,用于处理物理相关的计算。LateUpdate
:在所有Update方法执行完后调用,用于处理相机跟随和其他延迟逻辑。OnGUI
:在渲染GUI时调用,用于绘制GUI元素。OnDisable
:在脚本对象被禁用时调用,用于做一些清理工作。OnDestroy
:在脚本对象被销毁时调用,用于释放资源和做一些善后工作。答:物理更新一般放在FixedUpdate
函数里。FixedUpdate
在固定的时间间隔内执行物理更新,与帧率无关,适合用于处理刚体物体的物理运算。在FixedUpdate
中进行物理更新可以确保物体在不同帧率下表现一致。
答:在场景中放置多个Camera并同时处于活动状态,会产生多个相机的混合效果。每个相机都会根据其设置的视野范围和位置来渲染场景,最终的显示效果是多个相机的图像叠加在一起,可能会产生复杂的效果。
答:可以使用Unity提供的Destroy
方法来销毁一个UnityEngine.Object
及其子类。例如:Destroy(gameObject)
。
答:游戏动画有三种常见的类型:
答:常用的Unity3D优化技巧包括:
答:常用的Unity事件函数有:
Awake
:在对象被创建时调用。Start
:在对象第一次更新前调用。Update
:在每一帧更新时调用。FixedUpdate
:在固定时间间隔更新时调用。LateUpdate
:在所有Update方法执行完后调用。OnEnable
:在对象被启用时调用。OnDisable
:在对象被禁用时调用。OnDestroy
:在对象被销毁时调用。OnTriggerEnter
:在对象进入触发器时调用。OnTriggerExit
:在对象离开触发器时调用。OnCollisionEnter
:在对象发生碰撞并初次接触时调用。OnCollisionExit
:在对象离开碰撞状态时调用。答:在使用Unity开发安卓游戏时,常见的性能优化包括:
答:LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
本影和半影:
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
答:顶点着色器是一段执行在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几个过程。
答:MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
答:抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公共只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。
csharpCopy codestring a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
答:其实在C#中第一行是会出错的(Java中倒是可行)。应该这样初始化:string b = new string(new char[]{'a','b','c'});
csharpCopy codeList ls = new List(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。
答:Mono是.NET的一个开源跨平台工具,类似于Java虚拟机,可以让.NET程序在跨平台上运行。.NET主要运行在Windows平台上,而Mono可以运行在Linux、Unix、Mac OS等平台。
答:Unity的脚本语言基于Mono的.NET平台上运行,可以使用.NET库,支持以下语言:
答:Unity3D并不直接支持多线程编程。除主线程之外的线程无法访问Unity3D的对象、组件和方法。如果需要进行多线程编程,可以使用C#中的Thread类等相关API,但需要注意以下几点:
答:协程(Coroutine)和C#线程有以下区别:
答:节点空间几何信息的组件名称是Transform,其父类名称是Component。
答:
答:矩阵相乘用于表示线性变换,如旋转、缩放、投影、平移、仿射等操作。
注意点:
答:U3D原生GUI在移动设备上存在一些问题,包括不美观、OnGUI的性能开销较大以及使用不方便等。为了提升用户体验和性能,很多开发者寻求使用其他替代方案,如:
答:保持UI在不同分辨率下的一致性需要考虑以下几点:
答:在Unicode环境下,使用dynamic font相对于static font的优势在于:
答:当一个细小的高速物体撞向另一个较大的物体时,可能会出现穿透(collision penetration)的情况,即细小的物体会穿过较大的物体并继续运动,而不是正确地停止在撞击的表面。
为了避免穿透问题,可以采取以下措施:
OnBecameVisible
及OnBecameInvisible
的发生时机,以及这一对回调函数的意义?答:OnBecameVisible
和OnBecameInvisible
是MonoBehaviour
类中的回调函数,在Unity中用于处理物体的可见性变化。
OnBecameVisible
:当物体的渲染器进入摄像机的可见范围时,该函数被调用。它通常用于处理物体进入视野时需要执行的操作,比如开始播放动画或加载一些资源。OnBecameInvisible
:当物体的渲染器从摄像机的可见范围中消失时,该函数被调用。它通常用于处理物体离开视野时需要执行的操作,比如停止播放动画或释放一些资源。这对回调函数的意义在于,它们提供了一种在物体可见性发生变化时执行相应操作的机制,帮助开发者优化游戏性能和资源管理。例如,当一个物体不可见时,可以停止其不必要的渲染和计算,从而提高游戏的性能。
答:
String
是字符串常量。StringBuilder
是字符串变量,线程安全。String
是字符串变量,线程不安全。String
类型是不可变的对象,每次对String
进行改变时都需要生成一个新的String
对象,指针指向新对象,这可能导致效率较低。而StringBuilder
对象在做字符串连接操作时是在原字符串上进行修改,改善了性能,特别在连接操作频繁的情况下,建议使用StringBuilder
对象。
LightMap
是指在三维软件中实现预先设置好光照,并将场景中各表面的光照输出到贴图上,然后通过引擎贴到场景上,使物体具有逼真的光照效果。答: Unity3D中的Shader主要分为以下几种:
区别:
原型:
cCopy code
char * strcpy(char * strDest, const char * strSrc);
实现:
cCopy codechar * strcpy(char * strDest, const char * strSrc)
{
if ((strDest == NULL) || (strSrc == NULL)) // 检查指针的有效性
throw "Invalid argument(s)"; // 抛出异常
char * strDestCopy = strDest; // 保存strDest的原始值
while ((*strDest++ = *strSrc++) != '\0'); // 复制字符串,直到遇到'\0'
return strDestCopy; // 返回strDest的原始值
}
说明:
new
创建字符串而忽略了内存管理等问题。const
限定输入参数、抛出异常而不是返回错误类型、保存strDest
的原始值以支持链式表达式,并在循环结束时为strDest
添加终止符\0
。在C#中,有四种访问修饰符:
public
: 存取不受限制,可以在任何位置访问。private
: 只有包含该成员的类可以访问,对外部不可见。internal
: 只有当前命名空间可以访问。protected
: 只有包含该成员的类以及派生类可以访问,对外部不可见。访问修饰符的区别在于它们控制了成员的访问范围。public
允许在任何位置访问,而private
和protected
限制了访问范围,只有包含该成员的类及其派生类才能访问。internal
允许在当前命名空间内访问,对其他命名空间是不可见的。
new
关键字来分配。Stack用于存储方法调用时的局部变量和方法返回地址,由于栈空间有限,所以大小有限制。而Heap用于存储动态分配的内存,大小较大,需要手动管理内存的申请和释放。
六十八:值类型和引用类型有何区别?
答:
六十九:结构体和类有何区别?
答:结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。结构体适用于较小的数据结构,而类适用于复杂的对象和行为。结构体在栈上分配内存,而类在堆上分配内存。结构体是通过复制进行传递,类是通过引用进行传递。
七十:请写出求斐波那契数列任意一位的值得算法
csharpCopy codestatic int Fn(int n)
{
if (n <= 0)
{
throw new ArgumentOutOfRangeException();
}
if (n == 1 || n == 2)
{
return 1;
}
return checked(Fn(n - 1) + Fn(n - 2)); // when n>46 memory will overflow
}
七十一:ref参数和out参数是什么?有什么区别?
答:ref参数和out参数都用于方法的参数传递,允许将参数按引用传递而不是按值传递。区别在于:
七十二:C#的委托是什么?有何用处?
答:委托是一种类型安全的函数指针,允许将方法作为参数传递、存储和调用。它允许将方法的引用封装在委托对象内,然后可以在运行时动态地调用这些方法,而不需要在编译时确定要调用的具体方法。委托用于实现事件、回调函数、多播委托等,提供了更加灵活和松耦合的编程方式。
七十三:协同程序的执行代码是什么?有何用处,有何缺点?
答:
csharpCopy codefunction Start() {
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0));
print("Before WaitAndPrint Finishes " + Time.time);
}
function WaitAndPrint(waitTime : float) {
yield WaitForSeconds (waitTime);
print ("WaitAndPrint "+ Time.time );
}
协同程序用于异步执行代码,可以在任意位置使用yield语句暂停协程的执行,并在一定条件下恢复协程向下执行。它适用于需要延迟执行或需要分阶段执行的操作。然而,协程并非真正的线程,可能会在执行过程中发生堵塞。同时,如果协程嵌套过多,可读性和维护性可能会受影响。
七十四:什么是里氏代换原则?
答:里氏代换原则(Liskov Substitution Principle,LSP)是面向对象设计的基本原则之一。它指出,任何基类可以出现的地方,子类一定可以出现,即子类应该能够替换其基类而不影响程序的正确性。这样的设计使得代码更加灵活、可扩展,增强了代码的可维护性。
七十五:Mock和Stub有何区别?
答:Mock和Stub都是测试中常用的测试辅助工具。
七十六:概述序列化:
答:序列化是将对象转换为可存储或传输的格式的过程,使得对象可以在不同的平台或程序之间进行数据交换。在C#中,可以使用.NET框架提供的序列化机制,如BinaryFormatter
、XMLSerializer
、JSONSerializer
等,来实现对象的序列化和反序列化操作。
七十七:堆和栈的区别?
答:栈和堆都是用来存储数据的内存区域,它们在内存分配和管理上有一些不同:
七十八:概述c#中代理和事件?
答:代理(Delegate)是一种类型安全的函数指针,可以将方法引用封装在委托对象内,并在运行时动态地调用这些方法。代理常用于实现回调机制、事件处理等。
事件(Event)是委托的特殊用法,用于实现发布-订阅模式。事件允许对象发布某个特定动作或状态的更改,并允许其他对象订阅并对其做出响应,实现了松耦合的事件驱动编程。
七十九:C#中的排序方式有哪些?
答:C#中常用的排序方式有:
八十:射线检测碰撞物的原理是?
答:射线检测是一种在3D世界中用于检测碰撞的方法。它通过从一个点向一个方向发射一条无限长的线(射线),并检查这条射线是否与其他物体发生碰撞。当射线与物体相交时,可以获取碰撞点的信息,从而实现碰撞检测和响应。
八十一:客户端与服务器交互方式有几种?
答:客户端与服务器交互方式主要有两种:
八十二:Unity和Android与iOS如何交互?
Unity与Android和iOS的交互主要通过使用Native插件(Native Plugin)来实现。Unity中可以编写C#代码调用Native插件中的原生方法,从而实现Unity与Android/iOS的交互。同时,Android和iOS平台上的原生代码也可以调用Unity中的C#方法。
八十三:Unity中,照相机的Clipping Planes的作用是什么?调整Near、Far两个值时,应该注意什么?
答:照相机的Clipping Planes用于指定相机视锥体的远近裁剪平面。Near表示近裁剪平面,Far表示远裁剪平面。只有在这个视锥体内的物体才会被渲染。
调整Near和Far两个值时应该注意:
八十四:如何在Unity3D中查看场景的面数、顶点数和Draw Call数?如何降低Draw Call数?
答:在Unity中查看场景的面数、顶点数和Draw Call数,可以在Game视图右上角点击Stats来查看性能统计信息。
降低Draw Call数的技术是Draw Call Batching,具体方法包括:
八十五:请问alpha test在何时使用?能达到什么效果?
答:alpha test通常用于对透明度(alpha值)进行测试,根据测试结果决定是否丢弃像素。当alpha test的测试条件满足时,保留像素;否则丢弃像素。alpha test能够实现一些特殊效果,如裁剪或形状的特定区域,创建透明贴图的透明效果等。使用alpha test可以减少透明物体的绘制开销,提高渲染性能。
答:
答:四元数用于对旋转角度进行计算。
答:ClearFlags选项选成Depth only表示只清除深度缓冲区,不清除颜色缓冲区。这在对象不被裁剪且只需要绘制深度信息时使用。
答:在GameObject的脚本中使用Awake()函数,并添加以下代码:
csharpCopy codevoid Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
答:将GameObject设置为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时。因此,在你的场景中所有不会动的物体都应该标记为Static。
答:将A组物体的渲染队列设置大于B组物体的渲染队列。
答:Texture用于模型贴图使用,Sprite用作UI精灵使用。
答:渲染速度没有区别,因为不管贴图数量多少,Terrain只进行一次渲染。
答:在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。Draw Call越高对显卡的消耗就越大。
降低DrawCall的方法:
答:实时点光源可以有cookies(带有alpha通道的立方图Cubemap纹理),但是是最耗费资源的光源。
答:这是Alpha混合的设置。公式为:最终颜色 = 源颜色 * 源透明值 + 目标颜色 * (1 - 源透明值)。
答:水面倒影通过对水面的贴图纹理进行扰动产生波光玲珑的效果。使用Shader可以在像素级别上对水面进行扰动,效果细腻,需要的顶点少,速度快。
答:Grid和Table都用于对子物体进行排序和定位,但是有些不同。Grid会自动将子物体按照指定的规则排列,而Table则可以在两个方向上进行自由排列。
答:
能用 foreach
遍历访问的对象需要实现 IEnumerable
接口或声明 GetEnumerator
方法的类型。
答案: IEnumerable
;GetEnumerator
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。