unity 提供的一些底层的方法总结

先于start之前执行

现有的系统函数

void awake(){}只执行一次

void start ()只执行一次

{}

void Update () 循环执行

{}

void OnCollisionEnter2D (Collision2D other){};检测碰撞

void OnEnable ()可以循环执行

{}

void OnMouseDown ()点击实体物体触发。物体有碰撞盒

{}

void OnMouseEnter ()

{}//进入物体的范围,触发,这个方式

void OnMouseOver ()进入物体的范围一直执行

 

生命周期的

Awake 唤醒

CancelInvoke 取消调用

FixedUpdate 固定更新

InvokeRepeating 重复调用

Invoke 调用

IsInvoking 是否调用

LateUpdate 晚于更新

OnApplicationFocus当程序焦点

OnApplicationPause当程序暂停

OnApplicationQuit 当程序退出

OnBecameInvisible 当不可见

OnBecameVisible 当可见

OnCollisionEnter 当进入碰撞

OnCollisionExit 当退出碰撞

OnCollisionStay 当逗留碰撞

OnConnectedToServer当连接到服务器

OnControllerColliderHit当控制碰撞器碰撞

OnDestroy 当销毁

OnDisable 当不可用

OnDisconnectedFromServer当从服务器断开连接

OnDrawGizmosSelected当选择时绘制Gizmos

OnDrawGizmos 当绘制Gizmos

OnEnable 当可用

OnFailedToConnectToMasterServer当连接到主服务器失败

OnFailedToConnect 当连接失败

OnGUI 当界面

OnJointBreak 当关节断开

OnLevelWasLoadedOnLevelWasLoaded

OnMasterServerEvent当主服务器事件

OnMouseDown 当鼠标按下

OnMouseDrag 当鼠标拖动

OnMouseEnter 当鼠标进入

OnMouseExit 当鼠标退出

OnMouseOver 当鼠标经过

OnMouseUpAsButton 当鼠标作为按钮弹起时

OnMouseUp 当鼠标弹起 

今天处理一个问题,突然想起以前收集的一些方法可以使用,翻找半天找到这个文档,分享下希望对其他人有用

<think>我们正在讨论Unity中C#的底层原理。根据提供的引用,我们可以总结出几个关键点:1.Unity中的C#代码被编译成中间语言(IL),然后由Mono虚拟机执行(引用[^1])。2.Unity支持跨平台,这得益于Mono项目(引用[^1])。3.在底层,一些集合类型(如Stack、Queue)使用数组作为底层存储(引用[^3])。4.Dictionary的底层实现是数组,使用哈希函数和拉链法处理冲突(引用[^4])。5.可以通过反射在运行时动态加载和使用程序集(引用[^2])。用户的问题是想了解UnityC#底层实现原理。我们可以从编译过程、执行环境、数据结构实现等方面进行说明。###回答结构:1.**编译过程**:解释C#代码如何被编译成IL,然后由Mono虚拟机执行。2.**跨平台支持**:介绍Mono的作用。3.**底层数据结构**:简要说明常见集合类型(如List、Dictionary)的底层实现。4.**反射机制**:提及反射在Unity中的应用(如动态加载dll)。下面开始组织回答。</think>### Unity中C#的底层实现原理 #### 1. **编译与执行流程** - **C#代码编译**:Unity中的C#脚本通过Mono编译器(或Roslyn编译器)编译成**中间语言(IL)**,符合CLI(Common Language Infrastructure)规范[^1]。 - **IL执行**:IL代码由**Mono虚拟机(Mono Runtime)** 解释执行。虚拟机通过即时编译(JIT)或预先编译(AOT)将IL转换为目标平台的原生机器码[^1]。 - **跨平台支持**:Mono项目实现了.NET的跨平台能力,使IL可在Windows、Linux、macOS甚至游戏主机(如PS3/Wii)运行[^1]。 #### 2. **关键组件:Mono虚拟机** - **内存管理**:采用**分代垃圾回收(GC)机制**,自动管理内存(分Young/Old代),减少内存泄漏风险。 - **即时编译(JIT)**:运行时将IL动态编译为机器码,优化执行效率(但首次调用有开销)。 - **预先编译(AOT)**:针对iOS等限制JIT的平台,提前编译IL为原生代码(牺牲灵活性换取安全性)[^1]。 #### 3. **数据结构的底层实现** - **集合类型**(如`List<T>`、`Stack`): - 底层基于**动态数组**(`T[]`),初始容量为0或指定值。 - 扩容规则:当元素超出容量时,按**2倍大小**创建新数组并拷贝数据(类似`ArrayList`)[^3]。 - 存储方式:**连续内存地址**,访问高效但插入/删除需移动元素。 - **Dictionary**: - **哈希表+拉链法**:通过哈希函数(如取余)将Key映射到数组索引: $$ \text{index} = \text{Key} \% \text{数组长度} $$ - **冲突解决**:相同索引的Key以链表形式存储(拉链法)[^4]。 - **扩容机制**:容量从质数序列(3,7,11,17,...)中选取大于当前容量2倍的最小质数[^4]。 - **内存特点**:删除元素不缩减内存,非线程安全需手动加锁[^4]。 #### 4. **反射与动态加载** - **程序集加载**:通过`Assembly.LoadFrom`动态加载外部DLL,获取其中的类/方法信息[^2]。 - **反射操作**: ```csharp // 示例:动态调用类方法 Type type = assembly.GetType("MyNamespace.MyClass"); object instance = Activator.CreateInstance(type); MethodInfo method = type.GetMethod("MyMethod"); method.Invoke(instance, new object[]{"参数"}); ``` 反射灵活但性能较低,常用于插件系统或编辑器扩展[^2]。 #### 5. **性能优化点** - **避免频繁GC**:减少临时对象分配(如循环内避免`new`)。 - **预分配集合容量**:初始化`List`或`Dictionary`时指定预估大小,避免扩容开销。 - **慎用反射**:运行时反射消耗大,可改用委托或预编译方案。 --- ### 核心总结 Unity C#的底层依赖于**Mono虚拟机执行IL**,关键数据结构(如`Dictionary`)采用**哈希表+动态数组**实现,通过**Mono的跨平台能力**适配多设备。开发时需关注内存管理、集合扩容机制及反射性能影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值