Unity和C#相关知识

Unity基础

1.Unity3D中的协程(coroutine),C#线程和进程之间的区别是什么?

进程progress:进程是一个具有独立功能的程序,它可以申请和拥有系统资源,是线程的容器。
线程thread: 线程是操作系统能够进行运算调度的最小单位,同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理,并发并行。
协程:协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码,同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理,这期间不影响主程序的继续执行,可以协同工作。

2.Unity中碰撞器(Collider)和触发器(Trigger)的区别?

碰撞器(Collider)有碰撞效果,触发器(Trigger)没有碰撞效果

3.碰撞条件和触发条件

在这里插入图片描述
在这里插入图片描述

4.触发相关函数和碰撞相关函数

在这里插入图片描述
在这里插入图片描述

5.Unity中常用的周期函数

Awake >OnEnable >Start > FixedUpdate > Update>Yield >LateUpdate >OnGui>OnDisable>OnDistroy

6.物理更新一般在哪个系统函数里?为什么?

FixedUpdate函数,因为该函数是渲染帧执行,所以比较适用于物理引擎的计算。

7.用代码实现第三人称角色控制器?第一人称角色控制器

待完成

8.Gameobje的销毁

Destroy销毁消息对象,内存中还是存在,只有内存不够才被清除释放内存
DestroyImmediate立即销毁对象,并释放内存

9.UnityAction和UnityFunc的区别

1.两者本质上都是委托
2.Action只用于没有返回值的方法,Func只用于有返回值的方法

10.unity常用资源路径有哪些

在这里插入图片描述
在这里插入图片描述

11.向量的点乘、叉乘以及归一化的意义?

**点乘:反映了两个向量在方向上的相似度,结果越大越相似。基于结果可以判断这两个向量是否是同一方向,是否正交垂直
叉乘:运算结果是一个向量,并且与这两个向量都垂直,是这两个向量所在平面的法线向量。使用右手定则确定其方向
normalized:用在只关系方向,不关心大小的情况下

Unity性能优化

1.当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存。

使用对象池技术,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回

2.请简述一下对象池原理,什么情况下使用?

将对象存储在一块预先划出的内存区域,需要时取出使用。从而减少GC,提高了游戏性能。当游戏中需要频繁的创建某个物体对象时可以使用对象池。

3.lod 是什么,优缺点是什么?

LOD 技术即 Levels of Detail 的简称,意为多细节层次。 LOD 技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型
缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。

4.MipMap是什么?作用?

在三维计算机图形的贴图渲染中有一个常用的技术被称为 Mipmapping 。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件 , 这样的贴图被称为 MIP map 或者 mipmap 。

5.、MeshCollider 和其他 Collider 的一个主要不同点?

MeshCollider是基于顶点数据,片面组成,消耗性能
BoxCollider是基于算法的,性能好

C#

1.什么是面向对象编程

面向对象编程是一种计算机编程架构。面向对象程序设计以对象为核心,通过建立模型把客观世界中的实体抽象为问题域中的对象。优点:重用性、灵活性和扩展性。

2.面向对象和面向过程有什么区别

面向过程是具体化的,流程化的,面向过程是面向对象的基础。面向对象可以说是面向过程的抽象,

3.面向对象的三大特性

面向对象的三大特性
封装指将一个计算机系统中的数据以及与这个数据相关的一切操作封装在一个模块中,从而实现高内聚、低耦合的状态,对于用户来说不需要了解底层原理只需要通过封装外的通道对计算机进行相关方面的操作即可
继承主要指的是两种或者两种以上的类之间的联系与区别,子类通过继承父类的功能并在其上扩展,减少了代码的重复,提高了代码的清晰度
多态多态性是指在面向对象技术中,当不同的多个对象同时接收到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态;

4.重写和重载的区别

重写:运行时发生,在子类中重写定义父类中的方法,子类中的方法和父类中的方法是一样的。即方法名、参数的个数、次序、类型和返回值都相同
重载:编译时发生,在同一作用域下,方法名相同,参数个数、次序、类型不同。

5.值类型和引用类型

常见的值类型:基础内置类型:int double floatd等,结构体,枚举
常见的引用类型:类,接口,委托,数组

内存区域上的区别:C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。

拷贝策略:值类型是拷贝数据,引用类型是拷贝引用地址

C#中引用类型和值类型都继承自System.Object类

6.public、private、protected、internal、sealed的区别

public任何外部类都可以不受限制的存取类数据
private限定此类内部使用
protected除了类本身可以用外,任何继承此类的类都可以使用
internalinternal表示在同一个应用程序(Application)或类库(Library)中都可以使用
sealed声明类就不能继承,声明方法就是不能被重写

7.装箱和拆箱的区别

装箱:值类型转换成引用类型的过程,生成新的引用
拆箱;引用类型转换成值类型的过程
装箱操作:托管堆分配内存,值类型拷贝数据,object地址指向托管堆对象
拆箱操作:根据object引用地址找到托管堆上的数据,栈上数据拷贝

8.什么是接口,接口的定义代码实现

接口是引用类型,不能定义字段,不能实例化,可以定义【非静态的】属性、索引器、事件、方法,不能写任何访问修饰符默认public。接口要小而精,定义一组方法,继承接口的派生类要实现接口的所有方法。

public delegate void DelegateTest();
    public interface ITest //只能包含非静态成员函数,隐式public,但不允许访问修饰符
    {
        void Method(string a); //方法
        string Property //属性
        {
            get; set;
        }
        event DelegateTest EventTest; //事件,需要先定义一个委托
        int this[int index] //索引器
        {
            get; set;
        }
    }

9.接口类和抽象类之间的不同

相同点:
1、都可以被继承
2、都不能被实例化
3、都可以包含方法声明
4、派生类必须实现未实现的方

不同点
1、抽象基类可以定义字段,接口类不可以定义字段
2、抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。
3、接口可以被多重实现,抽象类只能被单一继承
4、抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性

10.C#中有哪些常用的容器类,各有什么特点,性能区别?

容器特点
Stack-参考地址先进后出,入栈和出栈,底层泛型数组实现,入栈动态扩容2倍
Queue-参考地址先进先出,入队和出队,底层泛型数组实现
ArrayList-参考地址动态增加数组,适合插入删除少,查找多的情况
List-参考地址底层实现是泛型数组,适合插入删除多,查找少的情况
HashTableHashTable-参考地址是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构,查找时间O(1)
Dictionary-参考地址通过Key/Value(键值对的形式来存放数据;该类最大的优点就是它查找元素的时间复杂度接近O(1),实际项目中常被用来做一些数据的本地缓存,提升整体效率。

11.什么是泛型

泛型是C#语言和公共语言运行库中的一个新功能,它将类型参数的概念引入,大大简化类型之间的强制转换或装箱操作的过程,从而实现代码的灵活复用。

12.结构体和类有什么区别

1.类型不同:结构体是值类型,类是引用类型
2.存储不同:结构使用栈存储,而类使用堆存储
3.作用不同:类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性。
4.初始化不同:类可以在声明的时候初始化,结构不能在申明的时候初始化

13.C#引用和C++指针的区别

C#不支持指针,但可以使用,指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
不同点:指针是个实体,引用是个别名。

14.c#中Using的作用

1、 引用命名空间
2、 为命名空间或类型创建别名
3、using语句允许程序员指定使用资源的对象应当何时释放资源.using语句中使用的对象必须实现IDisposable接口

15.字典Dictionary的内部实现原理

1.哈希算法
2.Hash桶算法
3.解决碰撞冲突算法(拉链法)

设计模式

1.常用的设计模式

观察者模式

单例模式

状态模式

工厂方法模式

策略模式

2.设计模式原则

0、单一职责原则
一个类实现一个功能
1、开闭原则OCP(Open Close Principle)
对扩展开放,对修改关闭。
2、里氏代换原则LSP(Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现,即子类一定可以替换其基类。
3、依赖倒转原则DIP(Dependence Inversion Principle)
针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则ISP(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好。
它还有另外一个意思是:降低类之间的耦合度。
5、迪米特法则,又称最少知道原则DP(Demeter Principle)
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则CRP(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值