- 博客(68)
- 收藏
- 关注
原创 Unity:销毁(Destroy)
Destroy是Unity提供的一个方法,用于立即或延迟销毁游戏对象(GameObject)或其组件(Component)。它会从场景中移除对象,并释放相关资源(比如内存)。销毁后,对象从场景中移除,无法再通过代码访问它的属性或方法。如果尝试访问已销毁的对象,会抛出错误。
2025-04-05 20:15:22
36
原创 Unity:标签(tags)
在游戏开发中,游戏对象(GameObject)数量可能非常多,比如玩家、敌人、子弹、墙壁、道具等。比如,你可以检查碰撞的对象是否是“Enemy”,然后执行特定逻辑。Unity的Tags系统正是为了解决这个问题而设计的:它允许你给游戏对象贴上“标签”,然后通过这些标签在代码中查找或操作对象。你也可以创建自定义Tags,比如“Enemy”、“Bullet”、“PowerUp”等。条件判断:根据对象的类型(比如“敌人”或“玩家”)执行特定代码。批量设置:可以同时选中多个对象,给它们设置相同的Tag。
2025-04-05 19:58:19
96
原创 Unity:Simple Follow Camera(简单相机跟随)
在Unity中,GameObject是场景中的任何对象(如角色、墙壁、球等),它有自己的Transform组件,用于存储位置、旋转和缩放信息。这里偏移量是(0, 0, -10),意思是相机在目标的Z轴方向上向后移动10个单位(X和Y保持不变)。很多游戏(尤其是3D或2D平台游戏)需要相机自动跟随玩家角色,让玩家始终可以看到角色及其周围的环境,而不需要手动调整相机位置。(在所有Update方法之后)。因为相机通常需要等到所有其他对象(尤其是目标)的位置更新完成后,再调整自己的位置,这样可以避免同步问题。
2025-04-05 19:40:18
151
原创 Unity:平滑输入(Input.GetAxis)
比如,玩家按住A键,角色不会瞬间跳到最大速度,而是逐渐加速(如果设置了Sensitivity和Gravity)。比如,当你按下A键时,值不会瞬间跳到-1,而是可能逐渐接近-1(取决于设置的“Sensitivity”和“Gravity”参数)。敏感度低,值变化较慢。提供平滑的输入:让玩家的操作更自然,比如按下A键时角色慢慢加速到最大速度,而不是瞬间跳到最大速度。支持模拟输入:不仅适用于键盘,还适用于游戏手柄的摇杆,这些设备通常返回一个连续的值(-1到1)。比如,松开A键后,值会慢慢回到0,而不是瞬间跳回。
2025-04-04 20:05:37
512
原创 Unity:序列化(SerializeField)
/ 玩家的血量// 玩家的名字这些字段默认是私有的(private),意思是其他代码不能直接访问它们。这种设计是为了保护数据安全。但在某些场景下,比如Unity游戏开发,你希望这些字段可以在Unity编辑器中调整,或者保存到场景文件中,这样游戏运行时就能加载这些值。问题来了:私有的字段默认是不会被Unity或C#的序列化系统看到的,因为它们是“隐藏”的。那么怎么办?这就是[SerializeField]出场的地方。
2025-04-04 16:53:53
875
原创 C#:is关键字
定义:is 关键字是 C# 提供的一种运算符,用于检查一个对象是否与某个类型兼容。如果兼容,返回 true;否则返回 false。它不会改变对象本身,也不会抛出异常,是一种安全的方式来检查类型。为什么要用 is 而不是直接转换?从第一性原理看:假设你有一个神秘的盒子(对象),你不确定里面是苹果还是橘子。如果你直接试着把它当作苹果(强制转换),但里面是橘子,可能会出错(抛出异常)。is 就像先用 X 光检查一下,确认里面“是不是”苹果,再决定下一步。
2025-04-04 09:57:04
312
原创 C#:接口(interface)
定义:接口是 C# 中的一种引用类型,用于声明一组方法、属性、事件或索引器的签名,但不包含具体实现。接口本身不能被实例化,只能被类或结构体实现。为什么要用接口而不是直接用类?从第一性原理看:如果你想让多个类有相同的行为(比如都能“飞行”或“计算”),但它们的实现细节不同(比如鸟和飞机飞的方式不同),直接用类继承会有局限,因为一个类只能继承一个基类(单继承)。接口解决了这个问题:它允许一个类实现多个接口,从而支持多重继承的“行为”。
2025-04-03 20:01:49
865
原创 C#:枚举(enum)
定义:枚举类型(enum)是 C# 提供的一种特殊数据类型,它允许你定义一组有名字的常量,这些常量通常代表一组相关的值。比如,交通灯的状态可以是“红”、“黄”、“绿”,而不是用 0、1、2。为什么要用枚举而不是整数或字符串?从第一性原理看:人类的大脑更擅长处理有意义的名称,而不是抽象的数字或字符串。如果用整数(比如 0、1、2)表示交通灯状态,程序员和维护者需要记住每个数字代表什么意思,很容易出错(比如 0 是红灯还是绿灯?
2025-04-03 09:19:31
561
原创 C#:重构(refactoring)
重构(Refactoring)是指对现有代码进行结构调整和优化的过程,其目标是:提高代码质量:让代码更干净、更简洁、更易于理解。减少技术债务:避免代码随着时间推移变得越来越难以维护。便于未来扩展:让代码更容易添加新功能或修改现有功能。
2025-04-03 08:32:16
937
原创 C#:DispatcherTimer计时器
从最基本的角度看,DispatcherTimer 是一种计时器,它可以按照指定的时间间隔(比如每秒一次)触发事件,并确保这些事件在应用程序的 UI 线程中执行。这非常重要,因为在 GUI 应用中,所有与界面相关的操作(如更新按钮文本、改变窗口内容)都必须在 UI 线程中进行,否则可能会导致界面卡死或崩溃。
2025-04-02 19:47:30
846
原创 C#:base 关键字
用通俗的话说,base 就像是子类给父类打的一个“求助电话”或“快捷方式”。它让子类能够:调用父类的构造函数(base()),确保父类的初始化逻辑被执行。调用被覆盖的父类方法(base.MethodName()),复用父类的功能。访问父类的成员(base.MemberName),避免命名冲突。base 的存在体现了面向对象编程的“继承”原则:子类可以站在父类的肩膀上,扩展功能,而不需要从头开始。
2025-04-02 17:10:01
901
原创 C#:封装(encapsulated)
从最基础的角度看,封装其实是人类生活中一种很常见的想法——把相关的东西放在一起,保护它们不受外界干扰,同时只暴露我们希望别人知道或使用的部分。想象你有一个抽屉,里面放着你的私人物品。你不会让每个人都能随便打开抽屉乱翻,而是只在需要的时候自己拿东西,或者告诉别人“这个抽屉里有什么,你可以问我,但我不会让你直接动它”。封装在编程里也是类似的道理。在C#(或者其他面向对象编程语言)中,封装是一种设计思想和实践,它的核心目标是:隐藏细节:把代码的内部实现细节隐藏起来,只对外暴露必要的接口或方法。
2025-04-02 16:23:36
945
原创 C#:常见 Console 类输入输出方法
难点通俗解释:想象你是一个门卫,ReadLine 像是在等一封完整的信(整行文字)才开门,而 ReadKey 像是在等有人敲门(按一个键)就立刻开门,告诉你是谁敲的门(哪个键)。难点通俗解释:想象你在画画,ForegroundColor 像是你选择的笔的颜色(文字颜色),BackgroundColor 像是画布的底色。难点通俗解释:想象你的屏幕是一个窗户,缓冲区是窗户后面的滚动纸。原理:这些是 Console 的属性,你可以设置它们的值(如 ConsoleColor.Red),影响后续输出的颜色。
2025-03-31 21:24:43
663
原创 C#:字符串插值(String Interpolation)
用较为专业的但易懂的语言,字符串插值是一种在 C# 中创建字符串的简洁方法,它允许你直接在字符串中嵌入表达式(变量、计算等),使用 $ 符号和花括号 {} 来实现。插值后的字符串会自动替换这些表达式为实际值。核心功能:通过 $ 标记字符串为插值字符串,然后用 {表达式} 在字符串中嵌入动态内容。难点通俗解释:想象你有一个模板信件,里面有些空白处(如“亲爱的 {名字}”),你想把变量(如 name = "Alice")填进去。字符串插值就像一个智能填空工具,直接把变量值塞进模板,不需要手动拼接或格式化。
2025-03-31 20:01:12
572
原创 C#:尝试解析方法TryParse
Try 表示“尝试”:它不会强制转换,如果失败也不会报错,只是告诉你“不行”。Parse 表示“解析”:把一种格式(比如字符串)解析成另一种格式(比如数字)。用较为专业的但易懂的语言,TryParse 是一个方法,用于尝试将字符串解析(转换)成其他数据类型(如 int、double 等),并返回一个布尔值(true 或 false)表示是否成功。如果成功,还会把结果存入一个输出参数。核心功能:它“试着”转换,如果能转换就返回 true 并给出结果;如果不能,就返回 false,不会抛出异常。
2025-03-31 18:06:02
929
原创 C#: 输入(Console.ReadLine())和输出(Console.WriteLine())
目录起点:编程的基本需求推导:C# 如何处理输入输出?什么是 C# 中的输入输出?输出:Console.WriteLine() 和 Console.Write()输入:Console.ReadLine()为什么 C# 这样设计?对比类比补充:输入输出的局限与扩展程序需要与外部交互:任何程序都不是孤立运行的,它必须接收外部数据(输入)并产生结果或反馈(输出)。输入的本质:输入是从用户或设备(如键盘)获取信息的过程,程序需要一种机制将这些信息捕获并处理。输出的本质:输出是将程序处理后的结果或消息传递给用户或设备
2025-03-31 17:46:34
953
原创 c++ 函数指针
用通俗的话说,函数指针就是“函数的地址标签”。它让你可以:把一个函数的“位置”(内存地址)存进一个变量。之后通过这个变量去“找到”并“调用”那个函数。就像:你有一个电话本,里面存了朋友的电话号码。函数指针就是电话号码,你可以通过它“拨打”某个函数,让它“接听”(执行)。在 C++ 中,函数指针的写法看起来复杂,但本质很简单。// ptr 是一个函数指针,指向 printHelloptr();// 通过指针调用函数,效果等同于 printHello()return 0;
2025-03-31 11:31:34
722
原创 Unity:Time.deltaTime
在回答这个问题之前,我想先解释一下帧和帧率的概念。帧(frame)可以简单理解为动画或视频中的一幅静态画面,就像电影胶片上的单张照片。游戏也是类似的:游戏画面并不是连续流动的,而是一张张静态图片快速切换,让人看起来像是动的。类比:想象你在翻看一本动画书(那种每一页都画了稍微不同的图,你快速翻动时看起来像在动)。每翻动一页,你看到的就是一“帧”。游戏中的每一帧也是一样,只不过这些“页”是由电脑实时生成的。
2025-03-30 10:35:09
759
原创 C#:第一性原理理解日志(log)
日志级别就像程序的“情绪表达”:Debug是细碎的嘀咕,Info是日常报告,Warning是小心提醒,Error是问题警告,Critical是生死攸关的大事。开发者通过设置级别,可以让日志更高效地服务于他们的需求。
2025-03-30 10:14:53
646
原创 C#:第一性原理拆解字段(fields)
/ 存储名字的字段// 存储年龄的字段string name:分配一块内存,命名为“name”,类型是字符串,用来存名字。int age:分配另一块内存,命名为“age”,类型是整数,用来存年龄。public:表示这块内存可以被外部访问(暂时不考虑封装)。使用时:// 写入内存// 写入内存// 读取内存,输出 "Alice"// 读取内存,输出 25从第一性原理看,字段就是类中用于存储数据的内存块,带有名字和类型,直接绑定到对象的实例上。
2025-03-29 20:09:04
941
原创 C#:第一性原理拆解属性(property)
从最基本的需求出发,C# 的属性是为了解决以下问题:数据封装:通过私有字段隐藏实现细节。访问控制:通过 getter 和 setter 提供逻辑。语法简洁:让开发者用类似字段的方式操作对象。属性不是凭空发明的,而是基于“数据 + 行为”的基本编程需求,结合“简洁性 + 灵活性”的设计目标演化而来。它是字段和方法的“中间态”,既不是单纯的存储,也不是完全的方法,而是一种更高层次的抽象。
2025-03-29 20:01:38
812
原创 C#:foreach循环语句
foreach 的本质就是个“自动发牌机”,帮你从一堆东西里挨个儿拿出来用。它简单、省事,但你得接受它只让你看,不能随便改牌堆。想干更复杂的活儿,就得换别的工具(比如 for)。从最基本的需求出发,它就是为了解决“挨个儿看东西”这件事儿设计的。
2025-03-27 09:50:42
527
原创 c++ 命名空间 namespace
推导过程需求:需要一种方法,让相同的名字在不同“区域”中互不干扰。类比现实:生活中,“上海的南京路”和“南京的南京路”通过城市名区分;编程中,logger::print 和 printer::print 通过“组名”区分。定义:命名空间是一个逻辑上的“命名容器”,它为名称加上一个前缀或标签(如 std::),限定其作用范围。本质:它是名称的“地址系统”,类似邮编或电话区号,确保每个名字在全局中有唯一身份。结果命名空间是 C++ 中用来分组和隔离名称的工具。
2025-03-23 22:29:41
739
原创 Windows控制台函数:调整控制台窗口大小函数SetConsoleWindowInfo()
SetConsoleWindowInfo 是一个 Windows API 函数,用来设置控制台的窗口区域(visible window area),也就是你在屏幕上实际看到的显示区域的大小和位置。它不改变缓冲区的大小,只控制“窗口”部分。画布和窗口比喻:缓冲区是整个画布(由 SetConsoleScreenBufferSize 设置)。窗口是画布上你能看到的那块“框”,可以用 SetConsoleWindowInfo 调整框的大小和位置。
2025-03-14 13:05:52
878
原创 Windows控制台函数:设置控制台屏幕缓冲区大小函数SetConsoleScreenBufferSize()
SetConsoleScreenBufferSize 是一个 Windows API 函数,用来设置控制台的屏幕缓冲区大小。屏幕缓冲区就像控制台的“画布”,决定了它能保存多少行和列的内容。画布比喻:想象控制台是一个画板,缓冲区是画板的大小(宽度和高度,单位是字符数)。你可以用 FillConsoleOutputAttribute 在画板上画东西,但画的范围不能超过画板的大小。作用:调整缓冲区的大小,控制能显示或滚动的字符区域。
2025-03-14 11:27:21
625
原创 Windows控制台函数:控制台的单位问题
在 Windows控制台函数 中涉及的“数字单位”主要是参数中的数值,如 DWORD cells 和 COORD,它们代表的是一种逻辑单位,即“字符单元格”,而不是物理尺寸。
2025-03-12 20:31:41
303
原创 Windows控制台函数:设置区域属性函数FillConsoleOutputAttribute()
目录什么是 FillConsoleOutputAttribute?函数签名参数详解用法跟 SetConsoleTextAttribute 的区别有趣的例子注意事项FillConsoleOutputAttribute 是一个 Windows API 函数,用来给控制台的一个区域设置属性(主要是文字颜色和背景色)。它不像 SetConsoleTextAttribute 只影响后续输出,而是可以一次性填充一大片区域的属性,不管有没有文字。
2025-03-12 13:07:11
638
原创 Windows控制台函数:计时器函数GetTickCount()
GetTickCount 是一个 Windows API 函数,用来告诉你“从电脑开机到现在过去了多少毫秒”。它就像一个计时器,记录系统运行的时间,单位是毫秒(1 秒 = 1000 毫秒)。想象你在玩游戏,想知道从游戏开始到现在过了多久,GetTickCount 就能帮你算这个时间。不过它是从系统启动开始计时的,不是从你程序开始。
2025-03-10 15:50:35
838
原创 Windows控制台函数:设置文字颜色样式函数SetConsoleTextAttribute()
SetConsoleTextAttribute 是一个 Windows API 函数,用来设置控制台文字的颜色和样式。它就像一个“调色盘”,可以改变你输出到屏幕上的文字颜色(比如红色、蓝色)或者背景颜色。想象你在黑板上写字,默认是白色粉笔,但用这个函数,你可以换成彩色粉笔,还能给文字加个彩色背景。
2025-03-10 11:38:25
679
原创 Windows控制台函数:控制台输出函数WriteConsoleA()
WriteConsoleA 是一个 Windows API 函数,用来把文字写到控制台屏幕上。就像你在 C++ 用 std::cout 输出东西,但它是直接跟 Windows 的控制台打交道。把它想象成一个“送信员”:你给它一堆信(文字)和一个地址(屏幕的钥匙),它就帮你把信送到屏幕上。它是 ReadConsoleA 的反向操作:ReadConsoleA 是收信,WriteConsoleA 是送信。
2025-03-09 20:37:52
1141
原创 Windows控制台函数:控制台窗口设置函数system(“mode con ...“)
system("mode con ...") 是通过 system 函数调用 Windows 命令行中的 mode 命令,用来改变控制台窗口的属性。mode 是一个多功能命令,而 mode con 专门用来设置控制台(con 是“console”的缩写)的样子,比如窗口大小、行数、列数等。简单来说,它就像一个“控制台装修工”,可以调整窗口的宽度、高度,甚至其他设置。
2025-03-09 20:17:52
699
原创 控制台清屏函数system(“cls“)
system("cls") 是一个 C/C++ 函数调用,用来清空控制台屏幕。简单来说,它就像一个“擦黑板”的命令,把控制台上的所有文字都抹掉,光标也回到左上角。system 是 C 标准库里的函数,定义在 <stdlib.h>(C++ 是 <cstdlib>)中。"cls" 是传给 system 的一个字符串,它其实是 Windows 命令行里的“清屏”指令。运行 system("cls") 后,屏幕会变干净,就像刚打开控制台一样。
2025-03-09 12:35:23
926
原创 Windows控制台函数:移动光标位置函数SetConsoleCursorPosition()
SetConsoleCursorPosition 是一个 Windows API 函数,用来移动控制台的光标位置。你可以把它想成一个遥控器,告诉屏幕上的那个闪烁小光标(就是输入文字时跳动的那个小线):“嘿,去这个位置等着!在控制台程序里,默认情况下,光标会随着你输入或输出的文字自动移动。但如果你想自己控制它,比如让文字出现在屏幕的特定位置(像画图或做游戏那样),就需要用这个函数。SHORT X;// 横坐标(列号,从 0 开始)SHORT Y;// 纵坐标(行号,从 0 开始)} COORD;
2025-03-09 12:14:28
868
原创 Windows控制台函数:控制台读取输入函数ReadConsoleA()
ReadConsoleA 是一个 Windows API 函数,用来从控制台读取用户输入。想象一下,你用 GetStdHandle(STD_INPUT_HANDLE) 拿到了键盘的“钥匙”,现在你需要一个工具来“打开键盘的门”,读取用户敲进去的文字——这个工具就是 ReadConsoleA。它有点像 C++ 的 std::cin,但更底层,直接跟 Windows 系统打交道。
2025-03-09 12:05:10
785
原创 Windows控制台函数:标准输入输出流交互函数GetStdHandle()
想象你在用 C++ 写程序时,经常用 std::cout 来输出文字到屏幕上,对吧?return 0;这里 std::cout 是一个“工具”,它负责把文字送到屏幕上。但在 Windows 系统中,如果你不用 C++ 的标准库,而是直接跟操作系统“对话”,就需要用到 Windows 提供的一些函数,其中 GetStdHandle 就是帮你拿到类似 std::cout 这样的“工具”的。
2025-03-09 11:59:08
931
原创 非阻塞输入函数_kbhit()和_getch()
目录1. _kbhit()2. _getch()_kbhit() 和 _getch() 的配合使用注意事项在 C++ 中,_kbhit() 和 _getch() 是两个常用于处理键盘输入的函数,尤其在 Windows 环境下。它们通常包含在 <conio.h> 头文件中,主要用于控制台程序的输入操作。需要注意的是,这两个函数并非标准 C++ 的一部分,而是特定于某些编译器(如 MSVC 或 Borland C++)的扩展,因此它们在非 Windows 平台(如 Linux)上通常不可用。下面我详细讲解一下这
2025-03-09 10:29:14
829
原创 c++ auto关键字
auto 是一个关键字,最初在 C++ 中用于声明自动存储期的变量(与 static 相对),但在 C++11 中被重新定义为类型推导工具。它允许编译器根据变量的初始化表达式自动推导出变量的类型,而无需程序员显式指定。
2025-03-08 11:29:01
274
原创 C++ 中的静态数组 std::array
std::array 是一个模板类,定义在 <array> 头文件中。它是一个固定大小的数组,封装了 C 风格数组(例如 int arr[5]),但提供了更多的功能和安全性。它的主要特点是:大小在编译时确定:不像 std::vector,std::array 的大小是固定的,无法在运行时动态改变。与 STL 兼容:它支持标准模板库(STL)的接口,例如迭代器、算法等。没有额外的内存开销:它的实现与普通数组一样高效,存储在栈上(而不是堆上)。
2025-03-08 11:14:53
1099
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人