目录
5.JS自带的JsonUtilty能否识别字典?第三方插件为啥能识别字典,其底层逻辑?
6.屏幕坐标、视口坐标、世界坐标?视口的大小(0,1)&屏幕大小(600,800)转换?×
9. TCP/UDP的区别?及其应用场景?面试官:说说UDP和TCP的区别及应用场景 - 知乎 (zhihu.com)
2023.4.6 【lb科技自己给自己挖坑,填的项目坑】
1.讲述一下你在实习期间或在校中的项目?觉得比较难的地方
2.collide和trigger区别
3.怪物如何达到一个点
4.layer 和 tag区别?layer所占内存的性能?
"Layer" 和 "tag" 是两个不同的概念,它们在不同的上下文中使用,并且与内存性能有关的具体细节取决于使用它们的方式和具体情况。
-
Layer(层):
-
在计算机编程和软件开发中,"layer" 通常指的是图形界面或用户界面设计中的一层。这种分层结构用于组织和管理用户界面的不同元素,例如窗口、按钮、文本框等。每一层可能包含不同的用户界面元素,并且可以以不同的方式进行渲染和处理。
-
Layer的内存占用和性能取决于具体的图形处理引擎和硬件。一般来说,较复杂的图形界面可能需要更多的内存和计算资源来渲染和处理。
-
-
Tag(标签):
-
"Tag" 通常用于标识或分类数据元素,对象或内容。在编程和数据管理中,标签可以用于标记数据,以便更容易地检索、组织或处理它们。例如,文件系统中的文件可以使用标签进行分类,网页上的内容可以使用标签进行结构化,以便搜索引擎更好地理解它们。
-
标签本身通常不占用大量内存。它们是用来提高数据管理和检索效率的工具。
-
关于内存性能,性能和内存占用取决于具体的应用程序、上下文和使用情况。无法简单地说"layer"或"tag"的性能是多少,因为它们通常用于不同的目的和情境。要考虑内存性能,需要根据具体情况进行优化,并考虑整个应用程序的结构和需求,以减少内存占用并提高性能。这可能包括使用更有效的数据结构、释放不再需要的内存、避免内存泄漏等。
总之,"layer"和"tag"是两个不同的概念,它们在不同的上下文中使用,性能和内存占用问题取决于具体情况和如何使用它们。
5.JS自带的JsonUtilty能否识别字典?第三方插件为啥能识别字典,其底层逻辑?
在 Unity 中,JavaScript(通常称为UnityScript)不再被官方支持,而官方推荐使用C#进行游戏开发。因此,我将解释C#中的JSON序列化和字典处理。
-
C#中的JSON序列化和字典:
Unity内置的
JsonUtility
类主要用于将C#对象序列化为JSON格式的字符串以及将JSON字符串反序列化为C#对象。但是,它对于C#中的字典(Dictionary
)来说并不是直接支持的。JsonUtility
主要支持的是简单的POCO(Plain Old C# Objects)类型,它们是基本的数据结构。如果你要将字典序列化为JSON字符串,或者从JSON字符串反序列化为字典,通常需要使用第三方JSON库,如Json.NET(也称为Newtonsoft.Json)。
-
第三方插件如Json.NET的底层逻辑:
第三方JSON库如Json.NET非常强大,它之所以能够处理复杂的数据结构,包括字典,是因为它的底层实现具有高度的灵活性和可配置性。以下是Json.NET的一些核心特点和底层逻辑:
-
反射:Json.NET使用反射来检查C#对象的属性和字段,以便将其序列化为JSON或从JSON反序列化为C#对象。这使得它可以动态地处理各种对象类型,包括字典。
-
自定义序列化:Json.NET允许你为特定类型的对象创建自定义的序列化和反序列化逻辑。这意味着你可以为字典类型定义特定的序列化规则,以满足你的需求。
-
可扩展性:Json.NET允许你扩展其功能,以支持特定的数据结构或处理方式。这意味着你可以编写自定义的转换器来处理字典或其他复杂的对象。
因此,Json.NET之所以能够处理字典以及其他复杂的数据结构,是因为它具有高度可配置的底层逻辑和对反射的灵活使用,使得它能够动态地解析和序列化各种类型的数据。
-
总之,Unity的JsonUtility
主要用于简单的对象序列化,而第三方JSON库如Json.NET之所以能够处理字典等复杂数据结构,是因为它们具有更强大和灵活的底层逻辑和功能。这些库允许你自定义序列化和反序列化规则,以适应不同的数据结构和需求。
/*-----------------------------------------------------补充-----------------------------------------------------------------*/
Json.NET自定义序列化【Newtonsoft.Json】:
可以通过创建自定义转换器(Custom Converters)来实现这一点。以下是如何自定义序列化和反序列化的一般步骤
1.创建自定义转换器类:
创建一个继承自JsonConverter
类的自定义转换器类。
using Newtonsoft.Json;
public class MyCustomConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// 实现自定义的序列化逻辑
// 在writer中写入JSON表示
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// 实现自定义的反序列化逻辑
// 从reader中读取JSON并转换为对象
return null;
}
public override bool CanConvert(Type objectType)
{
// 返回true或false以指示该转换器是否能够处理特定类型的对象
return objectType == typeof(MyCustomType);
}
}
2.注册自定义转换器:
在使用Json.NET进行序列化和反序列化之前,你需要将自定义转换器注册到Json.NET的JsonSerializerSettings
中。例如:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new MyCustomConverter());
// 然后在序列化和反序列化时使用这些设置
string json = JsonConvert.SerializeObject(myObject, settings);
MyCustomType deserializedObject = JsonConvert.DeserializeObject<MyCustomType>(json, settings);
3.实现自定义逻辑:
在自定义转换器的WriteJson
方法中,你可以编写将对象转换为JSON表示的逻辑。在ReadJson
方法中,你可以编写将JSON表示转换为对象的逻辑。通过这种方式,你可以完全控制对象的序列化和反序列化过程,以满足特定的需求,包括处理自定义数据结构、特殊字段映射等。
/*----------------------------------------------------------------------------------------------------------------------------*/
6.屏幕坐标、视口坐标、世界坐标?视口的大小(0,1)&屏幕大小(600,800)转换?×
(24条消息) Unity中屏幕坐标、视口坐标和世界坐标、局部坐标与其之间的相互转换_unity2d物体的局部坐标轴_To-String的博客-CSDN博客
7.UGUI为啥需要canvas?×
一句话概括Canvas就是渲染 UI 的组件,UGUI是Unity新支持的2D界面控件,所有的UI控件都需要在包含Canvas组件的物体下边充当子物体,我们可以在GameObject->UI下创建物体时,会自动生成Canvas以及与其对应的EventSystem控件。
UGUI Canvas(画布)详解 - 知乎 (zhihu.com)Unity3D的UGUI——Canvas之美_51CTO博客_unity3d canvas
/*-----------------------------------------------------补充-----------------------------------------------------------------*/
UGUI(Unity GUI)需要 Canvas 的主要原因是为了提供一种灵活的方式来渲染UI元素,并确保UI元素在3D场景中的正确呈现。以下是 Canvas 在 UGUI 中的作用和原因:
-
UI层级管理:
Canvas 允许你创建多个不同层级的UI,以便管理和控制UI元素的显示顺序。每个 Canvas 可以有自己的渲染顺序,这意味着你可以将UI元素分为多个层级,如底层UI、中间UI、顶层UI等。这有助于确保UI元素按照你的预期顺序进行渲染,以避免重叠或遮挡问题。
-
分辨率独立性:
Canvas 具有分辨率独立性,可以在不同分辨率和屏幕尺寸上自动缩放和调整UI元素的位置和大小。这使得你的UI可以在各种设备上保持一致的外观,而不需要手动调整每个元素的位置和大小。
-
深度测试:
Canvas 支持深度测试,确保UI元素按照正确的顺序进行渲染,而不会出现不正确的遮挡效果。这对于创建复杂的UI布局非常重要,因为它确保了正确的渲染顺序。
-
相机独立性:
Canvas 允许你将不同的 Canvas 关联到不同的摄像机,从而在多个摄像机视图中显示不同的UI元素。这在需要多个相机视图的场景中非常有用,例如分屏游戏、AR/VR应用等。
-
性能优化:
Unity的 Canvas 使用了一些性能优化技巧,例如批处理(batching),以减少渲染调用的数量,提高UI渲染的效率。
总的来说,Canvas是UGUI的核心组件,它提供了管理UI元素的强大工具,使得UI的创建和管理更加灵活和方便,同时确保UI在不同场景和设备上的正确渲染。因此,Canvas在UGUI中是一个非常重要的概念
/*----------------------------------------------------------------------------------------------------------------------------*/
8.image和texture渲染先后顺序??×
在Unity中,Image和Texture的渲染顺序可以简单地理解为:
-
Image的渲染顺序:
Image通常用于UI元素,它们在Canvas上的渲染顺序受Canvas的Sorting Order和Sibling Index的影响。Canvas的Sorting Order决定了UI元素的渲染顺序,而同一Canvas内的Sibling Index则用于确定在相同Sorting Order下的渲染顺序。较高Sorting Order和较高Sibling Index的Image会在较低的Image之上渲染。
-
Texture的渲染顺序:
Texture通常用于3D对象的材质,它们的渲染顺序受到材质的Queue属性和渲染模式的影响。Queue属性决定了材质的渲染队列,较低Queue值的材质会首先渲染,而较高Queue值的材质会在其上层渲染。此外,使用透明渲染模式的Texture会在不透明渲染模式的Texture之后渲染,因为透明渲染模式允许透明度。
简而言之,Image用于UI元素的渲染顺序与Canvas的属性和Sibling Index有关,而Texture用于3D对象的渲染顺序与材质的Queue属性和渲染模式有关。这些因素决定了它们在屏幕上的呈现顺序。
9. TCP/UDP的区别?及其应用场景?面试官:说说UDP和TCP的区别及应用场景 - 知乎 (zhihu.com)
TCP 是面向连接的、可靠的流协议。UDP 是面向报文的,UDP 是不具有可靠性的数据报协议。
10.HTTP状态码404,400?×
404、500、502等HTTP状态码介绍 - Nuke'Blog - 博客园 (cnblogs.com)
出现网页错误时, 404、502这些数字代表啥 - 知乎 (zhihu.com)
11.补充
2023.4.8【CT笔】
1.Unity自带的回调函数中,OnEnable,Awake,Start 哪个可能在通一个对象周期中反复发生 ?OnEnable
2.Unity2D平台开发,碰撞方法是?void OnCollisionEnter2D(collision collision);×
3.Light组件中,哪个属性可以实现图像投影Cookie,Flare,ShadowType,color?Cookie
4.Unity3D提供了用于保存和读取数据的类型PlayerPrefs,Resource,DataSave,Player?PlayerPrefs
5.角色控制器自动使用重力的方法是SimpleMove,Move?SimpleMove
6.物理更新一般放在哪个函数里OnEnable,Awake,Start,FixedUpdate?FixedUpdate
7.屏幕坐标系?屏幕坐标系是建立在屏幕上的二维坐标系;是以像素为单位,屏幕的左下角为(0, 0),右上角为 (Screen.width, Screen.height);×××视口坐标系是与屏幕坐标系息息相关的,它是将 Game视图的屏幕坐标系单位化,即左下角为(0, 0),右上角为(1, 1),z轴坐标是相机的世界坐标中z轴坐标的负值