委托是什么? event 关键字有什么用?
委托:
委托是一种特殊类型的对象,它包含了对一个方法的引用。简单来说,委托就像是一个安全的函数指针。它允许我们创建可在运行时动态更改其引用方法的变量,并且可以指向类中定义的任何具有相同签名(即参数类型和返回类型)的方法。
Event :
"Event"关键字在C#或其他面向对象编程语言中常被使用, 它主要用于发布/订阅模式(也称为观察者模式)。当某个重要事件(比如点击按钮、文件下载完成等)发生时,程序需要通知其他部分进行相应处理。这时候就会使用到"Event"关键字来声明事件,并通过调用这个事件来通知所有订阅了该事件(即注册了该事件处理器)的代码块。
Unity协程是如何实现的
Unity中的协程是一种特殊类型的函数,可以在给定的时间段内多次返回。它们在某些情况下非常有用,比如当你需要对一个操作进行计时或者延迟执行。
以下是Unity协程实现的基本步骤:
创建协程函数:首先,你需要创建一个返回IEnumerator接口类型的函数。这个接口允许你控制代码何时暂停和恢复。
IEnumerator MyCoroutine()
{
// 这里写入你想要执行的代码
yield return null; // 暂停并在下一帧继续
}
启动协程:使用StartCoroutine()方法启动定义好的协程。
StartCoroutine(MyCoroutine());
控制流:通过yield关键字来控制代码执行流。例如:
- yield return null:暂停当前帧,并在下一帧恢复。
- yield return new WaitForSeconds(1):暂停1秒后恢复。
- yield return StartCoroutine(“AnotherCoroutine”):
开始另一个协程,并等待它完成后再继续。
以上就是Unity中实现和使用协程的基本方式。请注意,虽然看起来像多线程编程,但实际上所有Unity API调用都必须在主线程上完成,因此不会遇到常规多线程序可能遇到的并发问题。
摄像机有几种模式,成像原理分别是什么?
摄像机(Camera)有三种模式:正交投影模式(Orthographic)、透视投影模式(Perspective)和物理相机(Physical Camera)。
-
正交投影模式:
在这种模式下,摄像机将场景以平行线方式进行投影。这种方式没有透视效果,即远离或靠近摄像头的物体大小不会改变。这种模式通常用于2D游戏或者需要特殊视觉效果的3D游戏。 -
透视投影模式:
在此设置下,摄像机将场景以收敛线方式进行投影。也就是说,远离镜头的物体会显得更小。这就产生了一种深度感或者三维空间感觉,使得画面看起来更加真实立体。 -
物理相机:
从Unity 2018版本开始引入了"Physical Camera"属性, 可以让你设置镜头、传感器和其他一些参数, 更接近现实世界中相机的工作原理.
在Unity中,“成像原理”主要依赖于渲染管线(Render Pipeline)来完成。当你启动一个Scene时, Unity首先创建一个包含所有对象数据(位置、纹理、光照等)的渲染队列(Render Queue), 然后通过Shader程序对每个物体进行处理并生成图形数据, 最后由GPU根据这些数据生成最终图像并显示到屏幕上.
Canvas 有几种模式,如何配置?
Canvas是用于布局和渲染所有UI元素的组件。它有三种模式:
-
世界空间(World Space):在这种模式下,Canvas表现为任何常规的3D对象一样。你可以自由地移动、旋转、缩放它。这种模式通常用于3D游戏中的交互UI或者VR应用。
-
屏幕空间-覆盖(Screen Space - Overlay):这是默认的Canvas模式。在此模式下,Canvas将覆盖屏幕,并始终对准摄像机视野的前方,无论摄像机如何移动或旋转。当你需要全屏显示UI元素时,比如菜单、得分板等,这个选项非常实用。
-
屏幕空间-相机(Screen Space - Camera):此模式将Canvas渲染到特定摄像头的平面上,并随着摄像头移动而变化位置和大小。
UGUI如何打包图集
在Unity 2018及以后的版本中,Unity引入了新的系统"Sprite Atlas"来替代旧的"Sprite Packer"。以下是使用新版Sprite Atlas打包图集的步骤:
在Project窗口中右键点击 -> Create -> Sprite Atlas,创建一个新的Sprite Atlas对象。
将所有需要打包成图集的图片拖动到这个新建立的Sprite Atlas对象上,在Inspector窗口中可以看到Objects for Packing区域,里面列出了你添加进来的所有图片。
在Inspector窗口可以看到Pack Preview按钮, 点击它可以预览打包效果。如果满意,则可以保存并关闭预览。
在编写脚本或者配置UI元素时引用这些Sprite时, Unity会自动使用它们在图集中对应部分, 而不再是单独加载原始小图片。
如果你想要手动控制何时进行打包操作,也可以通过编程方式调用UnityEditor.U2D.SpriteAtlasUtility.PackAtlases()函数进行手动打包。注意这个函数只能在编辑器环境下使用,并且需要添加#if UNITY_EDITOR和#endif标记防止在构建游戏时产生错误。
UGUI 如何实现UI物体淡入淡出
在Unity的UGUI系统中,实现UI物体的淡入淡出效果可以通过调整Canvas Group组件或者Image和Text组件自身的Alpha值来达到。这里以Canvas Group为例,演示如何使用C#脚本实现:
首先,在你想要进行淡入淡出操作的UI物体上添加一个Canvas Group组件。
然后创建一个新的C#脚本,例如命名为FadeInOut,并把以下代码粘贴进去:
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class FadeInOut : MonoBehaviour
{
public float fadeSpeed = 0.5f; // 控制淡入淡出速度
private CanvasGroup canvasGroup;
void Start()
{
canvasGroup = GetComponent<CanvasGroup>();
StartCoroutine(FadeIn());
}
IEnumerator FadeIn()
{
while (canvasGroup.alpha < 1)
{
canvasGroup.alpha += Time.deltaTime * fadeSpeed;
yield return null;
}
yield return new WaitForSeconds(2); // 淡入完成后等待两秒开始执行淡出
StartCoroutine(FadeOut());
}
IEnumerator FadeOut()
{
while (canvasGroup.alpha > 0)
{
canvasGroup.alpha -= Time.deltaTime * fadeSpeed;
yield return null;
}
}
}
最后,将这个脚本附加到你刚才添加了Canvas Group组件的UI物体上,并设置好fadeSpeed参数即可。
运行游戏时,该UI物体就会以指定速度进行一次完整的从完全透明(alpha=0)到完全不透明(alpha=1)再回到完全透明(alpha=0)的过程。如果你需要在特定事件触发时进行此效果,则需要稍微修改以上代码结构来满足需求。
Hash表的原理是什么, 如何实现
哈希表(HashTable)也被称为散列表,是一种数据结构,它提供了快速插入、删除和查找操作的功能。哈希表通过使用哈希函数将键(Key)映射到存储位置,然后在这个位置存储值(Value)。
这是一个简单的示例来解释它是如何工作的:
假设我们有一个空的哈希表,并且我们想要在其中添加一个元素,例如(“name”, “John”)。
我们首先将键(“name”)输入到哈希函数中。这个函数会返回一个数字(假设返回3),我们把值(“John”)存储在数组索引为3的位置上。
当我们想要查找键为"name"对应的值时,我们再次使用同样的哈希函数处理键(“name”),得到相同的数字(3),然后直接访问数组索引为3处获取其对应值即可。
实现基本步骤如下:
-
初始化:
创建一个足够大容量(通常大于预期元素数量)且初始全部为空或特定标记值(例如null) 的数组用于存放数据。 -
插入:
当需要插入新元素时, 先通过hash 函数计算出该元素key 对应 hashcode, 然后根据 hashcode 找到在数组中对应下标位置并将value 存放进去. -
查找:
当需要查找某个key 对应value 时, 同样先计算出该key 对应hashcode, 再根据hashcode 找到对应下标并读取value. -
删除:
删除则与查找类似, 先定位到具体位置然后再进行删除操作.
不过需要注意,在实际情况中可能会发生所谓“碰撞”现象——即两个不同Key经过Hash Function计算得出相同HashCode导致他们试图占用同一块内存地址。
解决碰撞问题主要有两种方法:“开放寻址法”和“链地址法”。
- 开放寻址法就是如果发生碰撞,则向前或向后探测其他空位;
- 链地址法则是每个Hash槽里面维护了一个链表或者其他数据结构,在碰撞时就把Value添加进对应槽位里面去。
实际使用中还需要考虑扩容、缩容、哈希函数设计等问题。
链表如何实现
链表是一种动态数据结构,它使用节点(Node)来存储数据。每个节点包含两个部分:一个是数据域,用于保存数据;另一个是指针域,用于链接到下一个节点。这种结构使得在任何位置插入或删除元素都变得相对容易。
在C#中,链表的实现相对简单,因为它提供了内建的LinkedList类。但是如果你想自己实现一个链表,那么可以按照以下步骤操作:
定义节点(Node)类:
public class Node
{
public int Data {
get; set; }
public Node Next {
get; set; }
public Node(

本文围绕Unity开发展开,涵盖委托、协程、摄像机模式、Canvas配置、UGUI操作、数据结构实现等多方面内容。介绍了Unity中协程实现步骤、摄像机成像原理、UGUI打包图集和实现淡入淡出的方法,还讲解了哈希表、链表等数据结构原理及实现,以及Unity调用安卓和iOS API的步骤。
最低0.47元/天 解锁文章
12万+

被折叠的 条评论
为什么被折叠?



