自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 收藏
  • 关注

原创 Unity WebGL项目问题记录

内容打包:Addressable系统自动管理了所有复杂的依赖连接,所以即使资源移动了或是重新命名了,系统依然能够高效地找到准确的依赖进行打包。低使用门槛:使用Addressable在开发前期就进入快速开发的阶段,使用任何你喜欢的资源管理技术,你都能快速的切换来Addressable系统中,几乎不需要修改代码。WXAssetBundle可以减轻iOS的内存压力,对于使用Addressable的项目,需要替换Provider来使用WXAssetBundle。改变纹理压缩格式:勾选后可修改纹理压缩格式。

2024-06-28 23:46:13 1102 1

原创 提升Unity WebGL游戏启动速度

因此原始代码包(webgl/Build目录下的code文件)不超过30MB, 建议开发者勾选"Strip Engine Code"并设置"Managed Stripping Level"为High。同时,可以使用代码分包工具将代码包减少到原始尺寸的到1/3。初始场景中需要后续主场景或配置加载时可采取分帧策略,避免在Start或Awake方法中执行长时间的操作或阻塞调用,因为这会延长首帧的执行时间,影响用户体验。这个选项的作用是去除Unity引擎中未使用的代码,从而减少最终构建的代码包大小。

2024-06-28 00:29:24 1707

原创 FairyGUI框架下unity发布微信小游戏问题记录

代码分析:这行代码尝试创建一个新的DynamicFont实例,并使用Resources.Load方法加载位于Resources文件夹子目录下的字体资源。第一个参数"afont"是为DynamicFont实例设置的名称,这个名称将用于在FairyGUI中引用这个字体。首先将字体文件导入unity中,放在Assets/Resources/Fonts文件中,没有就新建一个。第二个参数是字体资源的路径,它应该指向Resources目录下的一个字体文件。3.设置文本字体为新注册的字体。// 设置字体为新注册的字体。

2024-06-27 02:27:19 697

原创 unity发布微信小游戏

所谓的分包加载,即把游戏内容按一定规则拆分这几包,在首次启动时先下载必要的包,这个必要的包我们称为「主包」,开发者可以在主包内触发其它分包的下载,从而把首次启动的下载耗时分散到游戏运行中。如果该节点上有所需内容的缓存副本,它会直接将内容返回给用户。选择小游戏,点击导入,选择之前导出的unity项目中的文件,然后选择minigame文件,这里也会使用到之前的APPID,设置好了之后就可以了。缓存策略: CDN 缓存系统根据网络服务器的状态,进行不同的网络请求信号的分配,使得闲置的网络服务器也能够得到利用。

2024-06-26 00:31:55 2052 1

原创 获取主页数据并显示流程笔记

MyLogger.Info("i的大小:"+i+"m_numbers的长度:"+m_numbers.Length+"m_numbers2.Length的长度"+m_numbers2.Length);这个字典用于存储主视图列表数据,其中键是整数类型,表示主视图列表的索引,值是一个列表,存储了 MainViewListItemData 类型的数据。设置为 -1,表示该事件的对象已经被回收了。这个方法的作用是获取特定标题索引的主视图数据列表,如果该索引对应的数据列表不存在,则创建一个新的列表并将其添加到字典中。

2024-04-14 00:11:58 515

原创 C#学习笔记

这是因为通常在 C# 中,事件可以被订阅,而当事件被触发时,所有订阅了该事件的方法都会被调用。System.Timers.Timer是在.NET中常用的定时器,类似于`System.Threading.Timer,但是它更适合于在单线程环境下使用,例如Windows服务等。事件是事件委托的实例,它提供了一种触发事件和订阅事件的机制。Invoke 方法用于触发事件,它的第一个参数是事件的发布者(通常是 this ,表示当前对象),第二个参数是一个包含事件信息的EventArgs 对象e。

2024-03-26 23:41:13 2424

原创 unity学习笔记

Canvas(画布)是 Unity 中用于创建用户界面(UI)的主要组件之一。Canvas 提供了一个用于呈现 2D 和 3D UI 元素的容器,任何一个,并且负责管理这些元素的渲染顺序、相对位置和缩放。

2024-03-24 00:00:29 759

原创 深入理解计算机系统学习笔记

所以,无论何 时汇编器遇到对最终位置未知的目标引用,它就会生成一个重定位条目,告诉链接器在将 目标文件合并成可执行文件时如何修改这个引用。(2)重定位节中的符号引用。在这一步中,链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址。call 指令开始于节偏移 0xe的地方,包括 1字节的操作码 0xe8, 后面跟着的是对目标 sum的 32 位PC相对引用的占位符。在分配栈、共享库、堆的运行时地址的时候,链接器还会使用地址空间布局随机化,所以每次程序运行时这些区域的地址都会改变。

2024-03-22 22:30:56 736

原创 深入理解计算机系统学习笔记

在这次扫描中,链接器维护一个可重定位目标文件的集合E(这个集合中的文件会被合并起来形成可执行文件),一个未解析的符号(即引用了 但是尚未定义的符号)集合U,以及一个在前面输人文件中已定义的符号集合D。集合的完全副本,这对磁盘空间是很大的浪费。另一个大的缺点是,对任何标准函数的任何改变,无论多么小的改变,都要求库的开发人员重新编译整个源文件,这是一个非常耗时的操作,使得标准函数的开发和维护变得很复杂。链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义关联起来。

2024-03-21 23:06:43 945

原创 深入理解计算机系统学习笔记

分块的大致思想是将一个程序中的数据结构组织成的大的片(chunk),称为块(block)。从技术上来说,一个目标模块(object module)就是一个字节序列,而一个目标文件(object file)就是一个以文件形式存放在磁盘中的目标模块。1) 让最常见的情况运行得快。如果我们反复以不同的size和stride值调用 run 函数,那么我们就能得到一个读带宽的时间和空间局部性的二维函数,称为存储器山。通过按照数据对象存储在内存中的顺序、以步长为1的来读数据,从而使得程序中的空间局部性最大。

2024-03-20 23:06:33 579

原创 深入理解计算机系统学习笔记

另一方面,写回高速缓存引起的传送比较少,它允许更多的到内存的带宽用于执行DMA的I/O设备。一种方法,称为写分配(write-allocate),加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。较高的相联度(也就 是£的值较大)的优点是降低了高速缓存由于冲突不命中出现抖动的可能性。对于给定的高速缓存大小,块越大就意味着高速缓存行数越少,这会损害时间局部性比空间局部性更好的程序中的命中率。全相联高速缓存中的行匹配和字选择与组相联高速缓存中的是一样的,如图6 -37所示。命中的内存引用比率。

2024-03-19 23:58:46 780

原创 深入理解计算机系统学习笔记

组相联高速缓存中的行匹配比直接映射高速缓存中的更复杂,因为它必须检查多个行的标记位和有效位,以确定所请求的字是否在集合中。如果缓存不命中,那么它需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中。简要来说就是,即使程序有良好的空间局部性,而且我们的高速缓存中也有足够的空间来存放x[i]和 y[i]的块,每次引用还是会导致冲突不命中,这是因为这些块被映射到了同一个高速缓存组。不幸的是,并不总是如此。它的组选择与直接映射高速缓存的组选择一样,组索引位标识组。

2024-03-18 22:36:12 1103

原创 深入理解计算机系统学习笔记

这种限制性的放置策略会引起一种不命中,称为冲突不命中(conflict miss),在这种情况中,缓存足够大,能够保存被引用的数据对象,但是因为这些对象会映射到同一个缓存块,缓存会一直不命中。因为缓存比低一层的存储设备更快,对后面的命中的服务会比最开始的不命中快很多。当发生缓存不命中时,第K层的缓存从第K+1层缓存中取出包含d的那个块,如果第K层的缓存已经满了,可能就会覆盖现存的一个块。存储器层次结构的中心思想是,对于每个K,位于K层的更快更小的存储设备作为位于 K+1层的更大更慢的存储设备的缓存。

2024-03-17 23:12:02 1010

原创 深入理解计算机系统学习笔记

其次,如果写操作试图修改一个包含已经有数据(也就是不是全为1)的页那么这个块中所有带有用数据的页都必须被复制到一个新(擦除过的)块, 然后才能进行对页的写。例如,上图中for循环体里的指令是按照连续的内存顺序执行的,因此循环有良好的空间局部性。在图b中看到的,向量v的元素是被顺序读取的,一个接一个,按照它们存储在内存中的顺序。局部性原理:倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理,是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。

2024-03-16 23:01:46 514

原创 升入理解计算机系统学习笔记

例如图形卡、监视器、鼠标、键盘和磁盘这样的输人/输出(I/O)设备,都是通过 I/O 总线,例如Intel 的外围设备互连(Peripheral Component Interconnect, PCI)总线连接到 CPU 和主存的。通用串行总线(Universal Serial Bus, USB)控制器是一个连接到 USB总线的设备的中转机构,USB总线是一个广泛使用的标准,连接各种外围I/O设备,包括键盘、鼠标、调制解调器、数码相机、游戏操纵杆、打印机、外部磁盘驱动器和固态硬盘。

2024-03-15 23:22:08 867

原创 深入理解计算机系统学习笔记

靠近CPU的小的、快速的高速缓存存储器(cache memory)作为一部分存储在相对慢速的主存储器(main memory)中数据和指令的缓冲区域。主存缓存存储在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。传统的 DRAM 将超单元的一整行复制到它的内部行缓冲区中,使用一个,然后丢弃剩余的。如果断电,DRAM和SRAM会丟失它们的信息,从这个意义上说,它们是易失的 (volatile)。总线是一组并行的导线,能携带地址、数据和控制信号。

2024-03-14 23:03:09 1239

原创 深入理解计算机系统学习笔记

程序剖析(profiling)运行程序的一个版本,其中插人了工具代码,以确定程序的各个部分需要多少时间。之前我们都是优化小的程序,在这样的小程序中有一些很明显限制性能的地 方,因此应该是集中注意力对它们进行优化。它的计时基于一个简单的间隔计数(intervalcounting)机制,编译过的程序为每个函数维护一个计数器,记录花费在执行该函数上的时间。第三列显示的是花费在这个函数上的时间,而第四列显示的是它被调用的次数(递归调用不计算在内)。相反,库函数的时间都被计算到调用它们的函数的时间中。

2024-03-13 23:01:46 540

原创 深入理解计算机系统学习笔记

后面寄存器%rdi 的每个值都依赖于加载操作的结果,而加载操作又以%rdi中的值作为它的地址。下面介绍加载(从内存读到寄存器)和存储(从 寄存器写到内存)操作的程序的性能,只考虑所有的数据都存放在高速缓存中的情况。可以看到错误的分支预测的影响可能非常大,但是这并不意味着所有的程序分支都会减缓程序的执行。实际上,现代处理器中的分支预测逻辑非常善于辨别不同的分支指令的有规律的模式和长期的趋势。与加载操作一样,在大多数情况中,存储操作能够在完全流水线化的模式中工作,每个周期开始一条新的存储。

2024-03-12 23:45:19 823

原创 深入理解计算机系统学习笔记

整数加的性能几乎与使用k*1展开的版本(combines)的性能相同,而其他三种情况则与使用并行累积变量的版本(combines)相同,是k*1扩展的性能的两倍。程序的性能是受运算单元的延迟限制的。虽然计算acc新值的功能单元能够每个时钟周期开始一个新的操作,但是它只会每L个周期开始一条新操作,这里L是合并操作的延迟。作为分析在现代处理器上执行的机器级程序性能的一个工具,我们会使用程序的数据流(data-flow)表示,这是一种图形化的表示方法,展现了不同操作之间的数据相关是如何限制它们的执行顺序的。

2024-03-11 23:22:20 922

原创 深入理解计算机系统学习笔记

在这段循环代码中,我们看到,指针dest的地址存放在寄存器 %rbx 中,它还改变了代码,将第i个数据元素的指针保存在寄存器 %rdx 中,注释中显示为 data+i。在处理任意的数组访问时,边界检查可能是个很有用的特性,但是对combine代码的简单分析表明所有的引用都是合法的。而后者执行这些操作。这些处理器在工业界称为超标量(superscalar), 意思是它可以在每个时钟周期执行多个操作,而且是乱序的(out-of-order),意思就是指令执行的顺序不一定要与它们在机器级程序中的顺序一致。

2024-03-10 23:25:46 1001

原创 深入理解计算机系统学习笔记

因为对lowerl的n次迭代的每一次都会调用strlen,所以 lowerl的整体运行时间是字符串长度的二次项,正比于n的平方。但是,考虑xp等于yp的情况,就是地址指向的值是一样的。编译器必须很小心地对程序只使用安全的优化,也就是说对于程序可能遇到的所有可能的情况,在C语言标准提供的保证之下,优化后得到的程序和未优化的版本有一样的行为。限制编译器只进行安全的优化,消除了造成不希望的运行时行为的一些可能的原因,但是这也意味着程序员必须花费更大的力气写出编译器能够将之转换成有效机器代码的程序。

2024-03-09 23:27:08 851

原创 深入理解计算机系统学习笔记

合并信号valA和valP的依据是,只有 call和跳转指令在后面的阶段中需要 valP 的值,而这些指令并不需要从寄存器文件 A端口中读出的值。例如,不可能同时既有加载/ 使用冒险又有预测错误的分支,因为加载/使用冒险要求执行阶段中是加载指令(mrmovq 或popq),而预测错误的分支要求执行阶段中是一条跳转指令。第三个细节问题的产生是因为流水线化的处理器会在不同的阶段更新系统状态的不同部分。异常:当一条指令导致异常,我们想要禁止后面的指令更新程序员可见的状态,并且在异常指令到达写回阶段时,停止执行。

2024-03-08 23:30:15 994

原创 深入理解计算机系统学习笔记

只有到指令到达执行阶段时才会发生那种情况,在执行阶段中,指令会改变条件码。我们只要在下一个周期往译码和执行阶段中插入气泡,并同时取出跳转指令后面的指令,这样就能取消(有时也称为指令排除(instruction squashing))那两条预测错误的指令。当指令addq处于译码阶段时,流水线控制逻辑发现执行、访存或写回阶段中至少有一条指令会更新寄存器处理器不会让addq指令带着不正确的结果通过这个阶段,而是会暂停指令,将它阻塞在译码阶段,时间为一个周期(对prog2来说)或者三个周期(对prog4来说)。

2024-03-08 00:34:28 837

原创 深入理解计算机系统学习笔记

图中的计算块是用组合逻辑来实现 的,意味着信号会穿过一系列逻辑门,在一定时间的延迟之后,输出就成为了输人的某个函数。在SEQ中,PC计 算发生在时钟周期结束的时候,根据当前时钟周期内计算出的信号值来计算PC寄存器的新值。在创建一个流水线化的Y86-64处理器的最初尝试中,我们要在SEQ+的各个阶段之间插人流水线寄存器,并对信号重新排列,得到PIPE— 处理器。下图的是一个理想的流水线化的系统,在这个系统中,我们可以将计算 分成三个相互独立的阶段,每个阶段需要的时间是原来逻辑需要时间的三分之一。

2024-03-07 00:10:17 1000

原创 深入理解计算机系统学习笔记

可以看到,通过将执行每条不同指令所需的步骤组织成一个统一的流程,就可以用很少量的各种硬件单元以及一个时钟来控制计算的顺序,从而实现整个处理器。执行:执行阶段会根据指令的类型,将算术/逻辑单元(ALU)用于不同的目的。SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令内存和数据内存)。valM,从内存读取的返回地址。指令和数据内存访问的是相同的内存位置,但是用于不同的目的。端口E用来写ALU计算出来的值,而端口M用来 写从数据内存中读出的值。

2024-03-06 00:06:22 954

原创 深入理解计算机系统学习笔记

上图所示的寄存器文件中,电路可以读两个程序寄存器的值,同时更新第三个寄存器的状态。信号沿着寄存器前面的组合逻辑传播,如果产生一个新的寄存器输人信号,这里用y表示,但只要时钟是低电位的,寄存器的输出就保持不变。执行(execute): 在执行阶段,算术/逻辑单元(ALU)要么执行指令指明的操作(根据ifun的值),计算内存引用的有效地址,要么增加或减少栈指针。当时钟变成高电位的时候,输人信号就加载到寄存器中,状态就成为状态 y,直到下一个时钟上升沿,这个状态就一直是寄存器的新输出。

2024-03-05 00:14:08 972

原创 深入理解计算机系统学习笔记

Y86-64 就具有这个性质,因为每条指令的第一个字节有唯一的代码和功能组合,给定这个字节,我们就可以决定所有其他附加字节的长度和含义。在当前的技术中,逻辑1是用1.0 伏特左右的高电压表示的,而逻辑0是用 0.0 伏特左右的低电压表示的。要实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组 合逻辑、存储位的存储器单元,以及控制存储器单元更新的时钟信号。这些指令的格式与寄存器-寄存器传送指令 rrmovq 一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。

2024-03-04 01:08:29 427

原创 深入理解计算机系统学习笔记

内存引用的指定方式与整数MOV指令的一样,包括偏移量、基址寄存器、变址寄存器和伸缩因子的所有可能的组合。由于机器采用的是小端法字节顺序,第一个 值给出的是低位4字节,第二个给出的是高位4字节。通过这些标号对应的值,可以看出每一个都是通过一对.long声明和十进制表示的值指定的。当函数包含指针、整数和浮点数混合的参数时,指针和整数通过通用寄存器传递,而浮点值通过XMM寄存器传递。可以通过栈传递额外的浮点参数。函数调用过程中保存寄存器的规则—例如,一些寄存器被指定为调用者保存,而其他的被指定为被调用者保存。

2024-03-02 23:09:17 1073

原创 深入理解计算机系统学习笔记

当我们写表达式p+ i, 这里指针P的值为p,得到的地址计算为P+L•i 这里L是与p相关联的数据类型的大小。我们已经看到,因为leaq指令是设计用来计算内存引用的地 址的,&运算符的机器代码实现常常用这条指令来计算表达式的值。通常,输人给程序一个字符串,这个字 符串包含一些可执行代码的字节编码,称为攻击代码(exploit code),另外,还有一些字节会用一个指向攻击代码的指针覆盖返回地址。对于所有运行同样程序和操作系统版本的系统来说,在不同的机器之间,栈的位置是相当固定的。指针也可以指向函数。

2024-03-02 00:10:21 897

原创 深入理解计算机系统笔记

类似于数组的实现,结构的所有组成部分都存放在内存中一段连续的区域内,而指向结构的指针就是结构第一个字节的地址。程序员需要变长数组时不得不用malloc或calloc这样的函数为这些数组分配存储空间,而且不得不显式地编码,用行优先索引将多维数组映射到一维数组,ISO C99引入了一种功能,允许数组的维度是表达式,在数组被分配的时候才计算出来。一种应用情况是,我们事先知道对一个数据结构中的两个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分,而不是结构的一 部分,会减小分配空间的总量。

2024-02-29 23:42:06 830

原创 深入理解计算机系统学习笔记

当过程P调用过程Q时,Q必须保存这些寄存器的值,保证它们的值在Q返回到P时与Q被调用时是一样的。也就是说,如果p是一个指向类型为T的数据的指针,p的值为Xp,那么表达式 P+i 的值为Xp + i,这里L是数据类型T的大小。例如,假设E是一个 int 型的数组, 而我们想计算E [i],在此,E的地址存放在寄存器%rdx中,而i存放在寄存器%rcx中。过程是软件中一种很重要的抽象。在进人过程Q的时候,程序计数器必须被设置为Q的代码的起始地址,然后在返回时,要把程序计数器设置为P中调用Q后面那条指令的地址。

2024-02-28 23:59:27 978

原创 深入理解计算机系统学习笔记

只有在一些受限制的情况中,这种策略才可行,但是如果可行,就可以用一条简单的条件传送指令来实现它,条件传送指令更符合现代处理器的性能特性。c语言中的某些结构,比如条件语句、循环语句和分支语句,要求有条件的执行,根据数据测k的结果来决定操作执行的顺序。通过使用jump指令可以改变一组机器代码指令的执行顺序,jump指令指定控制应该被传递到程序的某个其他部分,可能是依赖于某个测试的结果。1)可以根据条件码的某种组合, 将一个字节设置为0或者1,2)可以条件跳转到程序的某个其他的部分,3)可以有条件地 传送数据。

2024-02-28 00:03:22 1205

原创 深入理解计算机系统学习笔记

有的寄存器被用来记录某些重要的程序状态,而其 他的寄存器用来保存临时数据,例如过程的参数和局部变量,以及函数的返回值。第二种类型是寄存器(register), 它表示某个寄存器的内容,16个寄存器的低位1字节、2字节、4 字节或8字节中的一个作为操作数, 这些字节数分别对应于8位、16位、32位或64位。程序内存包含:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调 用和返回的运行时桟,以及用户分配的内存块(比如说用malloc库函数分配的)。只有有名字的寄存器才能作为指令的操作数。

2024-02-26 23:40:02 800

原创 深入理解计算机系统学习笔记

因此,对于值工,我们一般想用一种系统的方法,能够找到 “最接近的” 匹配值:c',它可 以用期望的浮点形式表示出来。但是当他的结果超过范围时,和的w+1 位 表示中的最高位会等于1,因此丢弃它就相当于从和中减去 了2的w次方。相反,我们希望通过给定x和j的值,来表示 形如:rX2> 的数。在64位情况下,如果浮点数的值超出了int能表示的范围,转换结果将会是未定义的行为,可能会产生不可预测的结果。它对执行涉及非常大的数字、非常接近于0的数字,以及更普遍地作为实数运算的近似值的计算,是很 有用的。

2024-02-25 23:46:51 924

原创 unity学习笔记----游戏练习07

还需要一个减少血量的方法,在这个方法里面需要设置一个血量的百分比,是为了当血量低于一定值时,执行特定的动画。在代码中,当子弹接触到僵尸时就播放这个动画,因为这个动画是这个物体的默认动画,将其设置为预制体然后实例化出来就行了。当子弹与敌人发生碰撞时,要得到敌人身上的脚本,调用这个脚本里面减少血量的方法,然后把伤害值传递过去。打开动画编辑器后,点击录制,在不同的关键去修改豌豆的缩放,达到先变大后减小最后消失的效果。当僵尸接触到植物开始攻击时会持续削减植物的血量,当植物血量为零时就销毁当前植物。

2024-01-25 23:14:57 1364

原创 unity学习笔记----游戏练习06

僵尸需要和植物之间进行检测,因此要在僵尸上添加刚体组件,既然僵尸身上有刚体组件,那么就可以使用刚体组件来控制他的移动。Move动画和LostHeadMove的切换时当血量达到某个值的时候进行切换,添加一个float类型的参数,此时会发现僵尸是在一边移动一边吃植物,因此还要为僵尸设置三个状态,在对应的状态播放对应的动画。在制作动画时,帧动画可以直接拖拽到游戏物体上,相当于给游戏物体上的动画状态机添加新的动画。在脚本中调用出发检测的方法,当与其碰撞的物体的标签为plant时,就会执行Eat动画。

2024-01-24 23:10:45 1223

原创 unity学习笔记----游戏练习05

在方法重写的情况下,多态允许你在不知道对象具体类型的情况下调用相同的方法名,而实际上会执行该对象实际类型的实现。一定时间间隔后就会在一个随机位置生成一个阳光的预制体,获取一个随机的下路位置。这里需要注意的是,由于地面也有碰撞器,他会优先去检测离相机近,如果他们一样近阳光身上的触发器就可能不会触发,就需要改变阳光的z坐标,让其离相机更近。1.收集阳光的思路:当鼠标点击到阳光的时候,就可以进行收集了。要实现这个方法时间间隔和计时器,在实例化豌豆时需要一个位置,在为豌豆设置创建一个子物体,将其调整到合适的位置。

2024-01-24 00:25:54 1226

原创 unity学习笔记----游戏练习04

由于生产阳光这个功能只在这个向日葵身上才有的这个功能,因此需要把这个生产阳光的功能放在一个子类身上。还要将PlantManager里面的用于切换植物为启用状态的方法设置为虚方法,并在其子类中重写,这样就控制植物的状态了。这个默认是播放Idle动画的,我们需要它在生产阳光的时候去播放Glowing动画,而且需要这两个动画同时去播放。这个方法用于阳光的实例化,然后获取一个位置来确定阳光移动的最远距离。这个方法是根据传入的参数来获取到三个点的位置,最后在调用DOPath方法来实现一个抛物线的动画效果。

2024-01-03 23:41:15 1221

原创 安卓学习笔记

MD5 的输出是固定长度的,不同的输入会生成不同的唯一的 MD5 值。"adb" 是 Android 调试桥(Android Debug Bridge)的缩写,它是 Android 开发工具中的一部分。唯一性:不同的输入数据生成的MD5值几乎是唯一的。理论上,不同的数据生成相同的MD5值(冲突)的概率很低,但由于MD5的一些安全性问题,不再推荐用于安全性要求较高的场景,如密码存储。通过计算文件的MD5值并与预先计算好的MD5值进行比较,可以确定文件是否被修改。这是通过将数据转换为固定长度的哈希值来实现的。

2024-01-02 23:15:26 587

原创 unity学习笔记----游戏练习03

创建一个物体用于判断点击到哪个格子,在其身上添加一个组件Box Collider 2D,这样才能判断鼠标是否点击到这个格子上。在CellControl中通过使用OnMouseDown()事件去检测自身点击,当被点击时就表示要被种植了,然后将这个点击事件传递给HandManager,因为HandManager是知道要种植的植物的。1.当手上存在植物时,再次点击卡片上的植物就会在手上添加新的植物,需要修改成只有手上没有植物时才能再次获取到植物。只有当手上没有植物时点击卡片上的植物才会获取植物。

2023-12-30 00:25:20 1228

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除