原本我只想制作一个简单的卡牌悬浮效果,然后再制作拖动卡牌使用的效果,可是不巧,一个小小的效果卡住了我很久。
我的UI知识不多,所以原本我认为,只要当鼠标悬浮在这张卡牌上,便将其显示在最上层,更大一些(这样就能看清),就可以。
但是这不是个一行代码就能解决的问题——在UI系统中,所有元素都是按照层级显示的,从上到下,从父元素到子元素,依次渲染覆盖,想让某个UI元素显示在其他UI上层,1,修改它的层级关系。但这只是一个悬浮效果,你的鼠标挪开了,又要把层级关系改回去,这太麻烦了。
第二个办法同样麻烦:给它增加一个子canvas,然后选择override sort order,让这个子canvas有自己的显示顺序。这看描述就同样麻烦,谁知道未来做别的效果会不会又要改这个canvas? 但目前来看只有这两个办法了。
还有第三个办法,让这个游戏拥有第三个维度,让它变成3D游戏,然后只用修改悬浮卡牌的Y轴坐标离相机更近就行了。——算了,这么做弊端更大了,这不能算一个解决办法。
简单的显示图层解决了,但是还有更多问题。
有请我们的模特——杀戮尖塔——杀戮尖塔本身没有问题,只是做一个模特
右边的卡牌,会有一个倾斜度,但是进入检视状态时,它会变直,虽然变大了一些,但是不再覆盖这个三角区域,这样子的话,如果你的鼠标放在这个三角区域,会先因为卡牌倾斜,鼠标在卡牌上——让这张卡进入检视状态,然后卡牌不再倾斜——不再覆盖鼠标——回到普通状态——鼠标在卡牌上——进入检视状态——不再倾斜
它进入无限抽搐状态。
杀戮尖塔本身是没有这个问题的,它的卡牌在检视的时候会变大,刚好能覆盖这个弧度,不过,如果你的卡牌太大了,又会怎么样?
再看下面的情况:
如果你的卡太大了,就会把所有其他卡挡住,那么你该怎么移动鼠标,检视被挡住的卡(你甚至不知道被挡住的那两张卡叫什么名字)
这个时候,该怎么解决问题?杀戮尖塔有一个办法。
杀戮尖塔的办法是:把两边的卡推开,这样就不会挡住了。
而炉石的办法更加复杂一些,炉石把卡牌的判定区域和显示区域分开了——或者说检视的时候你是在看着另一个对象,而不是你鼠标正在悬浮着的那一个。
如图所示,你的鼠标只有在下方这个区域悬浮,才能检视这个卡,一旦挪开这个区域,就回到了普通状态。而并不会推开旁边的卡牌。
对于图形显示来说,这简直是耦合度的噩梦——要么因为一张卡,你要改变其他所有卡的位置。要么你要更改这张卡的raycast范围和显示范围,让它俩分开,没有所谓的对扩展开放,对修改封闭。
这两种办法都会对后续的其他操作造成影响——其他卡的位置会不会又在另一个情况需要变动?这时候检视卡的优先级更高,还是另一个需求的优先级更高?有没有其他情况需要用到卡牌的raycast范围?比如要做拖动卡牌的时候怎么办?
我看了一些卡牌游戏的教程,似乎他们有更简单的情况——要么不放大和变更卡牌的位置,要么用更宽的卡槽,不让卡牌挡住其他卡,要么根本没有检视功能。
不放大,不变位置——只有一圈阴影表示选择。
稍微抬起一些——不显示在最上层
也许我只是太完美主义了,其他卡牌教程根本不把这个当作重点,所以这或许根本不重要。总之,这就是第二期的内容——卡牌悬浮的困难之处。
暂无关于此日志的评论。