本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要:
Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho
目录
C#
1.其他类型转object类型(值类型转引用类型) 称为装箱
2.值类型指向栈内存,赋值修改自己栈上的内容
3.委托可以赋值、调用,支持多播(组合多个方法)
4.显示声明接口
5. 在扩容函数之中,以一个标志位进行双倍扩容 eg: 4 8 16 32......
Unity
1.向量点乘 为数 可以根据其夹角判断两向量的方向关系
2.CD, Unity 的 API 绝大多数只能在主线程调用
3.对比表
4.在同一个线程之中,执行协程
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.对比表
特性 StreamingAssetsPath PersistentDataPath 读写权限 只读(移动端) 可读写 打包包含 打包时原样保留 不包含,首次运行时创建 平台路径示例 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
)+ 协程调度器- 协程不是多线程,所有代码仍在主线程执行