知了
偷了你的回忆
留下整夏的聒噪
你渴望的清凉
在未来期待着邂逅
知了
偷了你的回忆
留下整夏的聒噪
你渴望的清凉
在未来期待着邂逅
人生就是一所医院,每个病人都渴望调换床位。
—— 波德莱尔
国际空间站的一个主要目标是研究人在太空中待久了会怎样。我可以告诉你会怎样:他们的对象会给他们戴绿帽子。
—— 《时代》乔伊 · 斯恩特的专栏说,国际空间站很没劲
在中国,既然一切人民在皇帝面前都是平等的,换句话说,大家一样是卑微的,因此,自由民和奴隶的区别必然不大。大家既然没有荣誉心,人与人之间又没有一个人的权利,自贬自抑的意识便极其通行,这种意识很容易变为极度的自暴自弃。
—— 黑格尔《历史哲学》
盗版这种行为,反映了一个国家的经济状况和消费者的支付能力。这不是人们的观念问题,而是他们钱包里有多少钱的问题。我强调一下,我们对于盗版没有任何打击措施。我坚信消费者变得富裕,只是时间问题,有了钱,他们会购买正版软件的
—— 卡巴斯基
思想总是晚来一步,诚实的糊涂却从不迟到;理解总是稍显滞后,正义而混乱的愤怒却一马当先;想法总是姗姗来迟,幼稚的道德说教却捷足先登。
—— 特里林,1946,引自《知性乃到的责任》
你越特别,你将越平常。
—— 莉赛特 · 莫德尔
我说这不是解数学题,不是在沙滩上找鹅卵石,更像在沙滩上学习堆沙子。
—— 王小妮在《“孩纸们”》一文中对在肯德基晋升失败后的卢小平同学说的话
你们哪里知道什么叫饿,你们以为想吃饭的感觉就叫饿?不对。“饿” 是什么?“饿”,是肚子里已经撑得不行了,心里还是饿,还想吃,那才叫 “饿”!
——杜元在《饕餮在六零年》中写道,她的哥哥小林如此教训他的子孙们
有一个简单的办法可以知道是谁统治着你,那就是看看你不能批评谁。
——美国自由防御倡议(AFDI)的主席帕米拉·盖勒(Pamela Geller)对于在 AFDI 组织的穆罕默德艺术展和漫画比赛上出现的伊斯兰圣战者恐怖袭击时间的回应和生命中提到
她捱到回家,土豆和幽默感都完好无损。
——庄加逊在《女诗人相册》一文中对茨维塔耶娃在受到士兵的冷嘲热讽之后,依然坚强地把领到的土豆用女儿阿利娅的破雪橇拉回了家中。
优于别人,并不高贵,真正的高贵应该是优于过去的自己
——海明威曾经这样说过
我们爱一个对象的时候,一般不会寻找同好者,甚至会把跟我们爱同一对象的人视为竞争者和侵犯者。但我们恨一个对象时,却总会寻求有志一同的人。
—— 霍弗 《狂热分子》
我们不会被意大利队击败,但我们会输给他们。
——克鲁伊夫的足球观念颇有哲学意味
不论是民主党、法西斯独裁的、议会制的,还是共产主义专政的国家,人民总是被教导要听从领袖的召唤。领袖所做的,就是告诉人民,他们正遭到攻击,然后谴责和平人士缺乏爱心。
—— 赫尔曼 · 戈林 1946 年 4 月 18 日在纽伦堡审判中的证词
我是不可知论者,不要叫我什么无神论者。你听过一个不打高尔夫的人自称不打高尔夫球者吗?你见过他们聚集在一起讨论为什么不打高尔夫吗?
——美国天体物理学家兼科普作家尼尔 · 德格拉斯 · 泰森说
傻瓜不跟聪明人学,聪明人从傻瓜那里学到很多。
—— 瑞士人拉瓦特的名言
在 Unity3D 开发的过程中,我们经常会有选取指定层的需求,例如设定某个摄像机只渲染某几个层的对象,UI 摄像机通常就只选取 UI 所在的层进行渲染,而对于其他层的对象进行忽略;场景摄像机通常会对非 UI 层的所有对象进行渲染,那么除了在 Unity3D Editor 中对场景中已有的 GameObject 直接进行设置之外,我们还有更为灵活的方法吗?当然有了,只要通过简单的位运算就可以把这个需求满足了。
我们先用摄像机来举例吧,Camera 的 cullingMask 属性就是用来设置摄像机渲染层用的,例如我们想设置名为 mainCamera 的摄像机的渲染层为 UI 层和 PopUI 层,那么代码应该如下:
mainCamera.cullingMask = LayerMask.GetMask ("UI", "PopUI");
上面的这段代码非常容易理解,如果我们的需求就是针对有限的少数几个层进行设置的话,这种方法是最好用的。但是,我们通常都会有一些针对特定层进行动态设置的需求,例如我们需要动态地将 PopUI 层从 mainCamera 的 cullingMask 中剔除掉,那么我们应该怎么做呢?可以简单地依照上方的代码来做:
mainCamera.cullingMask = LayerMask.GetMask ("UI");
这样确实能满足我们的需求,但是这是在我们已经完全知道 mainCamera 具体需要渲染哪些层的前提下才可行的。例如我们有一个名为 fightCamera 的摄像机,其对非 UI 和 PopUI 层之外的所有层进行渲染,由于游戏中设计的层数较多,其渲染的层总数可能达到20个,那么此时使用上面的这种方式来关闭某个层那么就显得非常的蛋疼了,我们总不能把那20层的名称都写到代码里头吧,咱们暂且不说可能会写错,这看上去就不是个聪明的办法啊。
这个时候,我们就需要使用到位运算了,例如我们想确保名为 FX 的层在 fightCamera 的 cullingMask 中,那么我们只需要使用下面的代码就可以了:
int layerFXMask = LayerMask.GetMask ("UI"); // 这段代码和上面的代码功能是一样滴 // int layerFXMask = 1 << LayerMask.NameToLayer ("UI"); fightCamera.cullingMask |= layerFXMask;
如果想把 FX 所处的层给关闭了呢,那么使用下面的代码就行了:
int layerFXMask = LayerMask.GetMask ("UI"); // int layerFXMask = 1 << LayerMask.NameToLayer ("UI"); fightCamera.cullingMask &= ~layerFXMask;
如果是想开/关,这样来回切换 FX 所在层的开启状态,那么使用下面的代码就行了:
int layerFXMask = LayerMask.GetMask ("UI"); // int layerFXMask = 1 << LayerMask.NameToLayer ("UI"); fightCamera.cullingMask ^= layerFXMask;
以上这三种情况,分别为开启、关闭和开/关这三种状态,对应的是位运算的按位或、按位与(取反)和按位异或操作。
以上三种情况中最终得到的 cullingMask 值实际上就是一个 int 类型的数字,该方式适用于 Unity3D 中所有接受 LayerMask 作为参数的方法,例如 Physics.Raycast 方法:
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers);
这个方法最后的参数就可以传入我们通过位运算获得的 LayerMask 值,用于指定我们需要进行碰撞检测的层。