本文重点: 1、按下按键的时候随机产生一个立方体 2、使用泛型和虚函数 3、把数据写进文件再读取出来 4、保存游戏状态之后再加载回来 5、封装数据持久化的细节
什么时候Input.GetKeyDown返回true? 它只在key的状态从未按下到按的帧里才会返回true,因为玩家按了键。通常情况下,按键会在几个帧内保持按下状态,直到玩家放开按键,但Input.GetKeyDown只在第一帧中返回true。相比之下,Input.GetKey在键被按下的每一帧都返回true。还有Input.GetKeyUp,它在玩家放开键的帧中返回true。
为什么不直接用GameObject.Find呢? 对于简单的情况(在对象之间很容易区分并且场景中没有很多对象),这是可以的。对于较大的场景,依赖GameObject.Find是个差的选择。GameObject.FindWithTag更好,但是如果你知道以后会需要它们,最好的方式就是自己追踪。
List的大小如何动态变化? 在内部,List使用数组存储其内容,并以某种大小对其进行初始化。添加到List中的Item将放入此数组中,直到它满为止。如果还要添加更多Item,List将把整个数组的内容复制到一个新的更大的数组中,并从当下开始使用该数组。我们可以手动执行此数组管理,但List会为我们处理。同样,Unity支持List字段,就像它支持数组字段一样。它们可以通过检查器进行编辑,其内容由编辑器保存,并且在播放模式下可以重新编译。
我们是否必须等到CreateObject结束才添加引用? 不用,可以在拥有引用后立即将引用添加到列表中,因此在将Instantiate结果分配给局部变量之后即可添加。我只是在最后指出,将完全初始化好的内容添加到列表中。
使用PlayerPrefs如何? 顾名思义,PlayerPrefs的设计考虑了游戏设置和偏好,而不是游戏状态。尽管可以将游戏状态打包为字符串,但这效率低下,难以管理并且无法扩展。
什么时候应该使用var? var关键字是语法糖,你根本不需要使用它。尽管你可以在编译器可以推断出类型的含义的任何地方使用它,但最好仅在提高可读性且类型明确时才执行此操作。在这些教程中,我仅在使用new关键字声明变量并立即将其分配给变量时使用var。因此,仅在形式为var t = new Type的表达式中。
为什么不使用BinaryFormatter? 尽管依赖BinaryFormatter可能很方便,但无法仅使用BinaryFormatter序列化游戏对象层次结构,并在以后对其进行反序列化。游戏对象层次结构必须手动重新创建。同样,我们自己编写每一个数据可以使我们完全控制和理解。除此之外,手动写入数据需要较少的空间和内存,速度更快,并且可以更轻松地支持不断发展的保存文件格式。有时,已经发布的游戏在更新或扩展后会大大改变存储的内容。这样,其中一些游戏将无法再加载玩家的旧存档文件。理想情况下,游戏与其所有保存文件版本都应该向后兼容。
如果在保存任何内容之前加载,会发生什么? 尝试打开一个不存在的文件,这会导致异常。本教程不会费心检查文件是否存在或是否包含有效数据,但我们将在以后的教程中注意这些。
我在保存之前加载了游戏对象,而游戏对象的位置又变了呢? 如果此时要加载较旧的保存文件,则最终会数据错位。计数整数将被误认为X位置,第一个保存的位置的X和Y最终将被用作Y和Z位置,然后旋转将被下一个值填充,依此类推。如果保存的位置少于四个,则该文件包含的数据太少,无法加载完整的转换。然后,你会收到一个错误消息,报错说你试图读取文件末尾之外的内容。
virtual 关键字是什么意思? 在非常低的层级上,实际上并没有对象或方法。仅存在数据,其中一部分被用作要由CPU执行的指令。除非经过优化,否则方法调用会成为告诉CPU跳转到另一个数据点并从那里继续执行的指令。除此之外,它还可能放置一些参数值。因此,当PersistentStorage调用PersistableObject类型的Save方法时,它成为跳转到固定位置的指令。我们为其传递了一个Game实例(PersistableObject的子类型),完全没有影响。用于调用该方法的对象实例只是另一个参数。
您需要 登录 才可以下载或查看,没有账号?立即注册
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )
GMT+8, 2025-6-5 23:08 , Processed in 0.320678 second(s), 27 queries .
Powered by Discuz! X3.5 Licensed
© 2001-2025 Discuz! Team.