一谈到返回上一层,我们首先想到的自然是用栈来存放已经打开的所有Panel。(涉及到先进先出)
而在打开背包时,想要把某个Panel(比如背包层界面)放入栈中,自然会涉及到如何监测到这个界面的打开操作。
在手机上监测,那肯定是监测触摸,所以我是用了UGUI中的eventsystem。然后使用UGUI中自带的OnPointerDown方法监测所点击的物体。
但在这个过程中,出现一个重大问题。除了像button之类外,点击任何物体都能正确返回到控制台。因为这方法是基于eventsystem的,而button被点击时也会用到eventsystem。
我怀疑因为button先使用了eventsystem中的eventdata,导致我的OnPointerDown方法中的参数(eventdata)get不到,所以自然就无任何返回结果。
而我最终只好帮每个button手动(或者用脚本)加上一点效果来实现被点了也会有作用产生。
但我认为要实现这功能还是用射线简单,既然UGUI的射线不能监测,我觉得用通用Raycast监测应该会监测出所有接触到的物体。事后我会去尝试一下。
因为监测不到button,为了使button强行被监测到,我写了挺多无谓的脚本。所以这里就不贴代码了。我在此再讲下详细的思路和步骤。
1.需要一个GameManager脚本来监控游戏,在脚本中创建用来存放所打开的Panel的栈。(主场景怎么点都不会不入栈)
2.射线监测,如果目标物体所属的Panel没包含在栈中,将该Panel入栈,并把CurrentPanel=栈顶元素。
3.射线监测,(在栈非空的时候)如果目标物体所属的Panel不是CurrentPanel,将栈顶元素出栈,将对应Panel隐藏,CurrentPanel=栈顶元素或null。null即为主场景
在这么查这个点击的物体属于哪个Panel,我设计一个方法,通过不断向上一层找他的parent,判断他有无parents的tag属于某个Panel。
即 如果有10个Panel,设10个tag,给对应的Panel的tag改好就行。由于Panel是很少的,所以操作极其方便省事,拓展也很方便。