这些书是好书,但是挺难读的,所以我定了一个学习计划。第一,每个主题限定在三个月内学完一遍。第二,不做课后题,但是每读完一章,画图总结一下。限定时间是因为哪怕延长到六个月,未必能收获双倍的知识,反而有可能消磨学习热情。不如先快速浏览一遍,按自己的理解画图标记重点,之后重新深入学习。
到现在为止,我看完了 SICP 前三章,正在学习 Nand2Tetris。因为没做题,对写代码帮助有限,但是满足了很多好奇心。比方说怎样用过程(procedure)而不是数据(data)定义有理数;怎样用接口组合一系列模块,然后添加抽象层隐藏细节;怎样让计算姬理解二进制代码。这些奇妙的知识常常令我感慨——白金齿轮驱动的神之机器啊,你真美丽。暂停吧,世界!
Unity 提供了若干方法搜索游戏对象,不过这些方法在某些场合无法满足我们的需求。比方说,FindGameObjectsWithTag() 只能接受一个参数,如果我们希望用两个标签描述一个对象该怎么办?对于一个 2D 战棋类游戏,怎样找到处于 [2, 2] 位置的所有对象?
假设我们已经设计好了一个自定义方法 Search(),显然它应该输出一系列符合搜索条件的游戏对象,那么输入是什么呢?上文说了,输入可以是一对整数,或者是自定义的数据标签。所以我们可以这样定义 ISearchObject:
接下来要解决两个问题。第一,怎样创建一个对象集合?第二,当我们遍历上述集合中的每一个元素时,怎样判断当前元素是否符合搜索条件?这是下图所示的解决方案之一。
既然游戏对象的位置能够表示为一对整数,每次创建新对象时,我们不妨把它存放进二维数组 GameObject [,] dungeonBoard。接下来,我们能够直接获取特定位置的对象,或者遍历整个数组,找到符合条件的对象。有两个注意事项。第一,如果多个对象可能堆叠在同一位置,我们可以把它们存入不同的二维数组,或者把单个二维数组的元素从游戏对象改成字典:Dictionary<CustomTag, GameObject>。第二,当我们移动或删除游戏对象时,必须及时更新二维数组的内容。
每个游戏对象检查自己的位置和数据标签,如果符合条件,把自己压进 Stack<GameObject> Data。
总结一下,每次创建新对象时,我们可以把它存入某个集合,或者让它订阅某些事件。接下来在需要的时候,遍历集合中的所有元素,或者发布搜索事件,由此找到需要的对象。
第三个说:我就是——不是,在玫瑰色的宝可梦里寻找真实,______________。(2 分)
评论区
共 14 条评论热门最新