面试经验帖

##Unity面试经验(1)

项目中用到的技术要说清楚

对于上家公司的离职原因,参考如下:

我在上家公司负责过一些大型项目,也做出了一些成绩。在哪里工作的两年时间,也与那里的同事有良好的职场关系,我一直希望在新的岗位上追求更大的挑战和发展机会,能够更好地实现自己的职业生涯,我发现在上一家公司的发展空间有限,所以寻求一个有更多发展机会的公司。

unity中实时光照如何制作?

在Unity中,您可以通过使用点光源聚光灯或方向光等实时光源来模拟真实世界中的光照效果。通过调整光源的强度、颜色和其他属性,您可以为场景中的对象提供合适的光照。
在Unity中,您可以启用阴影投射来模拟物体对光源的遮挡效果。通过在场景中的物体上添加适当的阴影组件,并将光源的属性设置为可投射阴影,您可以实现物体之间的阴影效果。
在编辑器中,在Inspector面板中找,在Inspector面板中找到"Mesh Renderer"组件的"Receive Shadows"选项,将其设置为"True"。这样该模型就能够接收阴影。
在Unity中,您还可以通过点击顶部菜单中的"Edit",然后选择"Project Settings",进入"Quality"选项卡来调整全局阴影设置。您可以调整阴影的分辨率、距离和细节等参数。
使用全局光照:Unity中的全局光照技术,如环境光遮蔽(Ambient Occlusion)和反射探针(Reflection Probe),可以帮助您在场景中模拟间接光照和反射效果。您可以通过调整这些全局光照技术的参数来实现更加真实的光照效果。
请注意,在实时光照的实现中,您还可以考虑光源的数量、光照贴图、间接光照和实时阴影等因素,以获得更加真实和逼真的光照效果。通过合理地调整这些参数,结合场景和材质的设置,可以创建出令人满意的实时光照效果。

unity中静态光照如何制作?

在Unity中,静态光照是一种预计算的光照方法,用于在场景构建时计算和存储光照信息,并在游戏运行时使用这些信息进行渲染。使用静态光照可以提高渲染性能并获得更逼真的光照效果。以下是使用Unity的静态光照的一些关键步骤和注意事项:

  1. 光照模式:将场景的光照模式设置为"Realtime",这将使Unity使用静态光照进行渲染。

  2. 光照贴图:使用光照贴图来计算和存储静态光照信息。在Unity中,可以通过使用烘焙光照功能来生成光照贴图。烘焙光照会根据场景中的光源和物体属性,在场景构建时计算光照并将结果存储在光照贴图中。

  3. 光照贴图设置:在烘焙光照过程中,可以调整一些光照贴图的设置来控制光照的精度和效果。例如,可以调整光照贴图的分辨率、采样率和间接光照的强度等参数。

  4. 光照贴图应用:将烘焙好的光照贴图应用到场景中的物体上。在Unity中,可以通过使用Lightmap或Light Probes来将光照贴图应用到物体上。Lightmap会应用静态光照以获得准确的阴影和反射效果,而Light Probes可以在动态物体上模拟间接光照。

  5. 预计算时间:烘焙光照是一个计算密集的过程,可能需要较长的时间来完成。根据场景的复杂性和计算机性能的不同,预计算时间可能会有所不同。建议在空闲时间进行烘焙光照,以免影响开发工作流程。

  6. 场景改变和重新计算:如果场景发生了改变(如添加、删除或移动物体),可能需要重新计算光照贴图。在Unity中,可以选择只重新计算受影响的区域,以减少计算时间和资源消耗。

安卓打包注意事项

1.sdk,ndk在unity的版本兼容
2.在playerSetting中为安卓应用设置所需要的权限,在Unity的Player Settings中配置正确的构建设置。包括指定应用程序的包名、版本号、应用程序图标等。
3.考虑到不同的安卓设备和屏幕分辨率,确保应用程序能够在各种屏幕上呈现适配的布局和界面。可以使用Unity提供的屏幕适配功能,如使用Canvas Scaler组件进行UI的缩放。
4.为了减小应用程序的大小和提高性能,可以进行资源优化和压缩。可以使用Unity提供的压缩工具以及安卓专用的压缩方案,如修改纹理压缩格式、压缩音频和视频等。
5.安卓签名和密钥:在进行发布和发布之前,您需要为您的应用程序生成一个安卓签名密钥。确保在构建设置中设置正确的签名文件和密码,以及导出为发布所需的签名APK。
6.在构建发布之前,务必进行充分的测试和调试,确保应用程序在安卓设备上的正常运行和功能。可以使用SRDebugger来调试和测试应用程序。

网络

socket:Socket通常被称为套接字,它是用于实现服务器和客户端之间的物理连接,并进行数据传输的一种网络通信机制。在Unity中,Socket主要用于实现网络通信,通过使用UDP或TCP协议来进行数据传输。通过Socket,可以在Unity中创建网络连接、发送和接收数据等操作。
tcp:使用TCP协议进行客户端和服务器之间的通信。在Unity中,客户端和服务器的通讯协议是可以自定义的,并且可以根据自己的需求定义命令格式。在网络传输方面,通常使用Protobuf或Json格式进行数据的传输。
TCP协议在Unity中提供了可靠性的面向连接的字节流服务。使用TCP协议进行通信时,需要先建立一个TCP连接,类似于打电话前先拨号振铃,等待对方接听的过程。在TCP连接中,只有两个应用程序(通常是一个客户端和一个服务器)进行通信,而广播和多播不能用于TCP。TCP协议还使用重传策略来保证数据的可靠性,即通过设立重发定时器来判断是否需要重传数据段。同时,TCP连接的建立和断开也有特定的机制,TCP连接使用三次握手,而断开连接则使用四次挥手。
udp:无连接的传输协议,它主要用于在网络上进行简单的通信。与TCP协议不同,UDP协议不提供可靠性和连接状态的保证,但它的速度更快。Unity中也可以使用UDP协议进行客户端与服务端的通信。
UDP,TCP区别
(1)基于连接(TCP)与无连接(UDP);
(2)对系统资源的要求(TCP较多,UDP少);
(3)UDP程序结构较简单;
(4)流模式与数据报模式 ;
(5)TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

热更新

lua语言 C#区别
Lua语言和C#语言是两种完全不同的编程语言,并且在许多方面有着明显的区别。以下是一些主要的区别:

  1. 语言类型:Lua是一种动态类型的脚本语言,而C#是一种静态类型的编译语言。这意味着在Lua中,变量的类型在运行时可以改变,而在C#中,变量的类型在编译时就需明确定义并且不能改变。

  2. 语法和结构:Lua采用简洁、灵活的语法,具有较为简单的基本语法结构,适合快速开发和脚本编写。C#采用类似于C++和Java的面向对象语法,并有较为复杂的语法结构,适合大型项目和复杂的应用程序开发。

  3. 应用领域:Lua通常用于游戏开发领域,作为游戏脚本语言使用,用于编写游戏逻辑、游戏AI等方面。C#则广泛应用于.NET平台开发,包括Windows应用程序、Web应用程序、移动应用程序和企业级应用程序等。

  4. 程序性能:由于C#是一种编译语言,运行效率通常比Lua高。C#通过JIT(即时编译)或AOT(提前编译)技术进行高效的代码执行,而Lua是一种解释性语言,需要虚拟机解释执行,效率相对较低。

  5. 生态系统和库支持:C#拥有庞大的生态系统和丰富的类库,包括.NET Framework和各种第三方库,可以方便地进行开发和扩展。Lua的类库相对较少,但在游戏开发领域有一些适用的库可供使用。

总的来说,Lua适合快速开发和脚本编写,特别适用于游戏开发。C#适合大型项目和复杂应用程序开发,具有强大的生态系统和库支持。选择使用哪种语言取决于具体的应用场景和开发需求。

光照贴图注意事项

在使用光照贴图时,以下是一些需要注意的事项:

  1. 纹理质量:确保光照贴图的质量足够高,以获得更好的光照效果。选择合适的纹理分辨率和纹理格式,并确保纹理不失真或模糊。

  2. UV映射:正确地进行UV映射是生成有效光照贴图的关键。确保正确地映射光照信息到纹理坐标上,以获取准确和一致的光照效果。

  3. 光照贴图的细节:光照贴图应该捕捉到场景中的细节和纹理,以便准确地模拟光照效果。在捕捉过程中,考虑光照来源的方向、强度和颜色等因素。

  4. 光照贴图的渲染和应用:在渲染过程中,将光照贴图与材质和着色器结合使用,以模拟光照效果。确保正确地应用光照贴图,并将其与其他光照技术(如实时光照)结合使用,以获得更逼真的渲染效果。

  5. 光照贴图的调试和优化:在应用光照贴图后,观察场景的光照效果,并进行必要的调试和优化。根据实际效果,调整光照贴图的参数,并寻找优化光照贴图渲染性能的方法。

  6. 光照贴图的存储和加载:选择合适的光照贴图存储格式和加载方式,以满足你的应用程序需求。可以使用压缩技术来优化贴图的存储空间,并使用异步加载来提升加载性能。

  7. 光照贴图的更新和再计算:在场景发生改变时,可能需要更新或重新计算光照贴图。确保在场景改变后,正确地更新光照贴图,并避免过度计算以提高性能。

unity优化

  1. 使用合适的资源:使用合适的模型、纹理和音频资源可以减小游戏的文件大小并提高加载和渲染效率。选择合适的分辨率、压缩格式和采样率等可以在保持良好视觉质量的同时减少资源占用。
  2. 控制多边形数量:减少场景中复杂模型的多边形数量可以提高渲染性能。使用级别细节(LOD)和遮挡剔除(occlusion culling)等技术来优化可视化和渲染。
  3. 合并和批处理:合并静态物体和批处理动态物体可以减少渲染调用次数和渲染开销。使用Unity提供的静态合并工具和批处理接口来优化场景中的物体渲染效果。
  4. 内存管理:合理管理和优化内存使用可以减少运行时的内存占用和GC(垃圾回收)次数。避免频繁的内存分配和释放,重复利用对象池等技术可以有效减少内存压力。
  5. 脚本和代码优化:优化游戏代码可以提高游戏逻辑的运行效率。使用适当的数据结构、避免无用的循环和条件判断、并尽量减少不必要的函数调用等都是代码优化的重要方面。
  6. 减少过度绘制:在渲染过程中,过度绘制是指绘制了不可见或不必要的像素,从而浪费了渲染资源。通过使用剔除技术、调整渲染顺序和启用后期处理等手段可以减少过度绘制。
  7. 利用批处理和GPU功能:合理使用GPU功能,如着色器编程、纹理压缩、渲染纹理和GPU粒子系统等,可以在硬件加速下提高渲染性能。
  8. 测试和调试:在进行优化之前,进行充分的测试和性能调试是必不可少的。通过使用Unity的性能分析工具(如Profiler和Frame Debugger)来识别性能瓶颈并优化。

For循环与Foreach循环

  • 避免在foreach循环中修改集合中的元素。
  • 避免在foreach循环中删除或新增集合中的元素。
  • 在多线程环境中,确保对集合的并发访问得到适当的同步。
  • 确保遍历的对象类型支持foreach循环。
  • 在遇到较为复杂的集合操作时,可以考虑使用for循环或其他适合的遍历方式。
  • 性能问题:如果嵌套的foreach循环遍历的集合非常大,那么可能会导致性能问题。每个嵌套的循环都需要迭代整个集合,可能会导致不必要的开销。在这种情况下,考虑其他更高效的遍历方式可能更合适。

类的封装、继承和多态是面向对象编程中的基本概念。

封装(Encapsulation):封装是指将数据和对数据的操作封装在一个类中,通过访问修饰符(public、private、protected)来控制不同成员的访问权限,从而实现了数据的封装性和安全性。封装能够隐藏内部的实现细节,只暴露给外部必要的接口来进行操作。

继承(Inheritance):继承是指一个类可以继承另一个类的属性和方法。通过继承,子类可以重用父类的代码,并可以在此基础上进行扩展或修改。继承可以建立类之间的继承关系,提高代码的重用性和可维护性。

多态(Polymorphism):多态是指同一种类型的对象,对于不同的消息可以有不同的响应方式。例如,一个父类类型的引用变量可以指向其子类对象,通过此引用变量调用方法时,实际上会根据具体的对象类型执行相应的方法,实现不同对象的多种行为。

综上所述,封装提供了类的内部实现的隔离和保护,继承实现了类之间的代码复用和扩展,多态则实现了代码的灵活和扩展性,三者相互配合使用可以有效地提高代码的可维护性和可扩展性。

在Unity中,可以使用多种方式来加载资源,具体取决于资源的类型和加载的需求。以下是Unity中常用的资源加载方式:

  1. Resources.Load:使用Resources文件夹来加载资源。将资源放置在项目的Resources文件夹中,然后使用Resources.Load函数来加载资源。该方法适用于较小的资源和在运行时动态加载的资源。
GameObject myPrefab = Resources.Load<GameObject>("Prefab/MyPrefab");
  1. AssetBundle.LoadFromFile:使用AssetBundle加载资源。AssetBundle是一种可独立打包和加载的资源包,可以包含各种类型的资源(如模型、材质、纹理等)。首先需要创建和打包AssetBundle,然后使用LoadFromFile函数加载。
AssetBundle myAssetBundle = AssetBundle.LoadFromFile("Assets/AssetBundles/myAssetBundle");
GameObject myPrefab = myAssetBundle.LoadAsset<GameObject>("MyPrefab");
  1. AssetDatabase.LoadAssetAtPath:在编辑器中加载资源。该方法适用于仅在编辑器环境中使用的资源,可以直接指定资源的路径来加载。
GameObject myPrefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/MyPrefabs/MyPrefab.prefab");
  1. Addressable Assets System:Unity 2019.1及以上版本引入的一种高级资源管理系统。它提供了更灵活和高效的资源加载和管理方式,并支持动态加载和卸载资源。
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>("Assets/AddressableAssets/MyPrefab.prefab");

以上是Unity中常用的几种资源加载方式,根据实际需求选择合适的方法来加载资源。

StreamingAssets

要说到StreamingAssets,其实和Resources还是蛮像的。同样作为一个只读的Unity3D的保留文件夹出现。不过两者也有很大的区别,那就是Resources文件夹中的内容在打包时会被压缩和加密。而StreamingAsset文件夹中的内容则会原封不动的打入包中,因此StreamingAssets主要用来存放一些二进制文件。下面也同样做一个简单的总结:

只读不可写。
主要用来存放二进制文件。
Android平台下一般是通过过WWW类来读取。
下边的例子是把unity里StreamingAssets下的一个文件复制到手机上
可以打包成APK在手机上测试 把unity里streamingAssetsPath目录下选定的文件拷贝到手机的目标位置。

StreamingAssets与Resources文件夹区别

Unity的StreamingAssets文件夹和Resources文件夹都是用于存放在游戏运行过程中需要动态加载的资源的特殊文件夹,但它们有一些区别:

  1. 存放位置:StreamingAssets文件夹位于构建后的目标平台根目录下,而Resources文件夹位于项目的Assets文件夹下。

  2. 访问方式:StreamingAssets文件夹中的资源可以通过文件操作的方式直接访问和加载,而Resources文件夹中的资源需要使用Unity提供的Resources.Load函数来加载。

  3. 资源管理:在使用StreamingAssets文件夹中的资源时,需要手动管理资源的加载和释放。而Resources文件夹中的资源可以通过Unity的资源管理系统自动进行管理和卸载。

  4. 构建时处理:在构建游戏时,Unity会将StreamingAssets文件夹中的内容原封不动地复制到构建后的目标平台的特定位置,而Resources文件夹中的资源会被打包到游戏的二进制文件中。

根据具体的需求和使用场景,选择合适的文件夹来存放和加载资源。如果需要较大的资源或者动态加载的资源,可以选择使用StreamingAssets文件夹;如果需要在运行时动态加载的较小资源,并且希望通过Unity的资源管理系统来进行管理,可以选择使用Resources文件夹。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值