当前位置: 首页 > news >正文

C# Unity 唐老狮 No.1 模拟面试题

         本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要:

Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho

 C#

1.其他类型转object类型(值类型转引用类型) 称为装箱

int x = 10;
object obj = x; // 装箱

反之(引用转值)称为拆箱

int y = (int)obj; // 拆箱

补充:虽然和装拆箱没有关系 但是可以用as(类型转换) is(检查类型) 配合使用

2.值类型指向栈内存,赋值修改自己栈上的内容

int a = 10;
int b = a; // b 是 a 的副本
b = 20;    // a 仍然是 10

引用类型指向堆内存,赋值修改指向栈的内存,新变量和原变量指向同一对象

int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1; // arr2 和 arr1 指向同一对象
arr2[0] = 10;      // arr1[0] 也变为 10

3.委托可以赋值、调用,支持多播(组合多个方法)

public delegate void MyDelegate(string message);
MyDelegate del = Console.WriteLine;
del("Hello");

事件是更加安全的委托,只能用在类之中使用,也只能在定义它的类中触发(Invoke),外部只能订阅(+=)和取消订阅(-=

public event EventHandler MyEvent;
MyEvent += (sender, args) => Console.WriteLine("Event triggered");
MyEvent?.Invoke(this, EventArgs.Empty);

4.显示声明接口

知识加油站:

C# & Unity 面向对象补全计划 之 接口_unity c# 接口-CSDN博客

interface IA { void Test(); }
interface IB { void Test(); }

class MyClass : IA, IB
{
    void IA.Test() => Console.WriteLine("IA.Test");
    void IB.Test() => Console.WriteLine("IB.Test");
}

// 使用
MyClass obj = new MyClass();
((IA)obj).Test(); // 调用 IA.Test
((IB)obj).Test(); // 调用 IB.Test

5. 在扩容函数之中,以一个标志位进行双倍扩容 eg: 4 8 16 32......

private void EnsureCapacity(int min)
{
    if (_items.Length < min)
    {
        int newCapacity = _items.Length == 0 ? 4 : _items.Length * 2;
        if (newCapacity < min) newCapacity = min;
        Array.Resize(ref _items, newCapacity);
    }
}

Unity 

1.向量点乘 为数 可以根据其夹角判断两向量的方向关系

        只是加油站:unity中的数学 之 向量篇_unity 向量-CSDN博客

  • 结果为标量,计算公式:a·b = |a||b|cosθ
  • 作用
    • 判断两个向量的方向关系:
      • 结果 > 0:夹角 < 90°(同方向)
      • 结果 = 0:夹角 = 90°(垂直)
      • 结果 < 0:夹角 > 90°(反方向)
    • 计算投影长度(如角色面朝方向的速度)

向量叉乘 为新向量 可以判断两个向量的顺序(相对方向) 可以用新向量做原平面的法线向量

  • 结果为垂直于原两向量的新向量(右手法则),计算公式:|a×b| = |a||b|sinθ
  • 作用
    • 判断相对方向(顺时针/逆时针)。
    • 计算平面法向量(如计算地形坡度)。
    • 用于旋转轴计算(如绕某个轴旋转)。

2.CD, Unity 的 API 绝大多数只能在主线程调用

c:在宏观位置以及逻辑上不能同时修改位置

d:你也不能重复销毁同一个对象(因其内存不存在)

3.对比表

特性StreamingAssetsPathPersistentDataPath
读写权限只读(移动端)可读写
打包包含打包时原样保留不包含,首次运行时创建
平台路径示例Android: jar:file:// 包内路径Android: /storage/emulated/0/Android/data/...
典型用途存放初始资源(配置表、预制体)存放动态生成的文件(存档、截图)
访问方式需用 UnityWebRequest 或 System.IO(PC)直接使用 System.IO 读写

4.在同一个线程之中,执行协程

        知识加油站:unity保姆级教程之协同程序_unity协同-CSDN博客

        "协程在遇到 yield return 时会暂停自身,控制权返回给Unity的主线程工作流(处理渲染、输入等),当预设条件满足(例如:指定时间结束/资源加载完成)后,Unity主线程会在正确时机继续执行协程剩余代码 

        这里我举一个经典的等待时间的例子:

        

IEnumerator Example2()
{
    Debug.Log("实时时间:" + Time.time);
    yield return new WaitForSeconds(2f);
    Debug.Log("2秒后:" + Time.time); 
}

        执行顺序为:开始协程 ----> 打印实时时间 ------>等待两秒(这期间会执行其他本线程的逻辑)------->打印2秒后的时间

        这里我要说一个暴论,在<<游戏编程模式>>一书之中,使用了while去模拟游戏的循环,添加了各种各样的打断条件,其实协程的底层也可以这么看,如果我说的有误,请以你的理解为准

  • 协程本质
    • 基于 C# 的迭代器(IEnumerator)+ 协程调度器
    • 协程不是多线程,所有代码仍在主线程执行

相关文章:

  • 在Linux环境下利用MTCNN进行人脸检测(基于ncnn架构)
  • ARM Coretex-M核心单片机(STM32)分析hardfault的原因
  • Spring如何解决循环依赖?
  • CCF-CSP历年真题大全附题解python
  • 矩阵的奇异值(SVD)分解和线性变换
  • DeepSeek推出DeepEP:首个开源EP通信库,让MoE模型训练与推理起飞!
  • FastJSON 默认行为:JSON.toJSONString 忽略 null 字段
  • python 使用 venv 创建虚拟环境 (VSCode)
  • 关于命令行下的 git( git add、git commit、git push)
  • 字符串_替换数字
  • 蓝桥每日打卡
  • HBase与MapReduce结合(一)——HBase表中插入数据
  • Ubuntu 下 nginx-1.24.0 源码分析 - pool->cleanup
  • 半导体制造工艺(二)光刻工艺—掩模版
  • SpringAI从人工智障到人工智能的实战改造
  • 人工智能时代:Python学习的全面攻略路线图
  • 二分法 ──── 算法3
  • JAVA实战开源项目:靓车汽车销售网站(Vue+SpringBoot) 附源码
  • 安装floodlight
  • unity学习54:图片+精灵+遮罩mask,旧版文本 text 和新的TMP文本
  • 人社部:一季度全国城镇新增就业308万人,同比增加5万人
  • 李在明涉嫌违反《公职选举法》案将于5月1日宣判
  • 绿地控股:今年一季度营业收入356亿元,中高层管理人员带头降薪
  • 一周人物|卡鲁等入围英国特纳奖,李学明新展中国美术馆
  • 光明网评论员:手机“二次放号”,需要重新确认“你是你”
  • 央行副行长:研究建立民营中小企业增信制度,破解民营中小企业信用不足等融资制约