前面讲到Defold中的元素组成都是有层级结构的,那么为了能快速的定位到某一个元素,Defold也有一套自己的元素定位策略,通过给元素编制URL进行定位。在读下去之前,建议你先读一下《Defold核心概念之Building Blocks》。
URL表达式
首先,我们以下图中的main.collection文件中的层级结构为示例,如下图所示:
从上图中可以看到这个main.collection中包含多个game object,每个game object中又包含多个component。就以以上图为示例来说明URL定位的示例。
- 在background这个game object中的sprite组件,它相对于game object的URL为 #sprite。
- 在factory这个game object中的factroy脚本组件中,如果在访问同级的star_factory,可以直接使用 #star_factory这个URL,如果想要访问background这个game object下的sprite组件,那么就要使用 /background#sprite 这个URL。
- 如果在另一个Collection中要访问当前Collection中的spaceship这个game object下的sprite组件,因为当前这个Collection的Name属性值为main,所以就应该使用main:/spaceship#sprite 这个URL。
- 可以使用 . 这个URL表示当前game object,比如在当前game object的script组件中给自己发消息时,使用的URL就可以是 . 。
- 可以使用 # 这个URL表示当前component,比如在当前script组件中给当前script组件发送消息,使用的URL就可以是 # 。
- 通过URL访问时可以依据层级关系使用相对地址,比如在main这个game object中,script组件脚本中可以直接使用 #gui 这个层级相对地址来访问 gui 组件。
- 在任何情况下,都可以使用绝对地址,进行访问。如果在某一个Collection中,就使用/开头的绝对地址进行访问,如果不在同一个Collection中,就使用Collection的name属性值做为协议进行访问,比如 main:/factory#star_factory 。
最后:理解Defold中的元素定位非常重要,在非常多的场景下都需要能通过URL找到元素,或通过URL向元素发送相关消息以修改其行为。