对 Godot 中节点设计的思考

单个节点的功能设计的想法,体会 Godot 的设计思想

低耦合

设计单个节点可复用的节点时,调用方法尽量只对当前节点可获取到的变量或方法进行使用,比如我写一个可以控制 KinematicBody2D 节点的“控制器节点”,这时我们需要设计一个获取要控制对应节点的方法,以 get_host() 作为获取要控制的节点的方法举例。

比如我想获取当前场景的根节点作为控制的对象:

## 返回操控的宿主
func get_host() -> KinematicBody2D:return get_owner() as KinematicBody2D

或者是以 NodePath 作为获取要控制的节点:

export var host = @""
func get_host() -> KinematicBody2D:return get_node(host) as KinematicBody2D

也可以通过变量进行获取,我以前喜欢这样写,但是现在不喜欢这样,因为有时候我可能计划有变,需要在获取 host 时对 host 作出一些判断或修改,这样写又该重新再写个方法。

onready var host = get_owner() as KinematicBody2D

不要直接通过指定固定的值来获取外部的节点的方式!

func get_host() -> KinematicBody2D:return get_node("../Player") as KinematicBody2D  # 不要这样写

因为这样写在后来修改节点结构时,或者用在其他名字不为 Player 的节点下时,需要进行频繁的修改,这样做会非常容易出现 bug。

如果想要对节点进行"不属于当前节点功能的操作"时,需要发射信号进行处理

比如在节点向前冲刺时想要将碰撞到的节点进行“眩晕操作”,那么将其分开处理,一个冲刺节点,一个眩晕节点

将冲刺时碰撞到的节点发出信号

signal collision_to_unit(collider_list)      # 碰撞到单位

然后连接到眩晕节点的对一组节点“进行眩晕”的操作的方法。

func vertigo(collider_list: Array):for node in collider_list:# 下面写对接点的眩晕操作pass

如果这时想扩展冲刺方法,想在升级时再造成伤害,那么就可以创建一个伤害节点,或者直接连接到主场景,在里边写如何造成伤害的方法

# 连接sprint(冲刺)节点的 collision_to_unit 信号
func _on_Sprint_collision_to_unit(collider_list):for node in collider_list:# 下面写对节点造成伤害操作pass

这样写完,你的 冲刺节点 可以重新拿来在其他新的游戏中再次被重新利用,不需再重新写代码,节约时间。降低耦合度。

看一个示例:

下面的 技能1 是一个复合型的技能,它包含 冲刺、眩晕、伤害 的能力,如下

这样一看一目了然。

调用 技能1 的方法时,比如 cast_skill 进行调用技能,会在 cast_skill 下调用 冲刺 节点的调用技能的方法。然后连接冲刺节点的 collision_to_unit 信号到 技能1 的场景中,对碰撞到的单位进行一个循环遍历,然后调用 眩晕 伤害 节点的技能,逐个造成伤害和眩晕。提高了 技能1 节点的可扩展性,也降低了耦合,节点结构也清晰。

高内聚

一个节点的功能会根据不同的节点的变化而变化,比如 CollisionObject2D 类型的节点

下面可以添加 规则碰撞图形不规则碰撞图形

CollisionObject2D 类型的节点,只对碰撞的结果进行处理,而碰撞形状不属于 碰撞的对象,而将功能分离,单独做成碰撞形状节点,和 CollisionObject2D 类型的节点一起使用。



如果一个功能是在需要时才用到的,那么将它设计成 Resource 属性或者独立的方法,比如 RigidBody2D中的 Physics Material 属性。

CollisionShape2Dshape 属性

【Godot】对 Godot 节点设计的思考相关推荐

  1. 服务拆分的设计和思考(B2B 技术共享第九篇)

    本文主要想给大家分享一下,宋小菜这三年来,是如何从单点巨石系统演变成领域驱动的服务化设计的.这个演变现在还在继续,我们在实践过程中遇到了很多坑,也收获了经验和思考. 一.早期的系统 1.1 唯快不破 ...

  2. SAP MM 关于采购组设计的思考

    SAP MM 关于采购组设计的思考 在项目实践中,SAP MM中的采购组的设计有如下2种常见的方式: 1)采购组与采购员对应起来.一个采购组可以对应一个采购员,也可以对应一组采购员.笔者参与的好几个项 ...

  3. HDLBits答案(6)_硬件模块设计的思考方式

    硬件模块设计的思考方式 HDLBits链接 基本的逻辑门操作 题目描述1:将输入端口in和输出端口out连接. Solution1: module top_module (input in,outpu ...

  4. 【案例讨论】从案例引发的对缓存设计的思考,干货讨论,绝对不玩虚的

    主题:从案例引发的对缓存设计的思考 背景: 谈到性能优化,势必要谈到缓存架构的设计与使用.几乎是所有人都知道缓存的威力,但是知道终归只是知道,如何真正合理的在自己的项目中进行使用,又是另外一回事了.我 ...

  5. 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝

    生鲜配送ERP系统_对商品模块数据模型与界面设计的思考及简要分析[Java 开源版]杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝 一直在研究与改造自己的生鲜配送系统,越来越觉得后 ...

  6. 手机游戏的分析,设计,思考

    问题导向 本文是对于手机游戏产品的分析,设计,思考 如果你都有了答案,可以忽略本文章,或去产品学习地图寻找更多答案 前言 本文将分享作者对于游戏的一些理解与分析,主要分为几个方面,并且简单分析< ...

  7. 计算机导论第五讲MOOC模拟答案,MOOC理念指导下的计算机导论课程_微课堂_设计与思考_朱淑鑫...

    MOOC理念指导下的计算机导论课程 "微课堂"设计与思考 朱淑鑫,徐焕良,任守纲,李晓晖 (南京农业大学 信息科学与技术学院,江苏 南京210095) 摘要:在MOOC理念的指导下 ...

  8. 关于小梅哥ADC128S022驱动设计的思考

    此篇文章,主要讲述经过视频点拨后自己动手写adc_driver.v代码所遇到的若干问题. 文章目录 1. 开篇,各模块连接关系 2. ADC时序分析 2.1 DIN的变化 2.2 rdata的变化 2 ...

  9. 网站设计的思考 (转)

    1.定位你的网站主题和名称 2.定位你的网站CI形象 3.确定网站的栏目和版块 4.确定网站的目录结构和链接结构 5.确定网站的整体风格和创意设计 6.首页的设计 7.版面布局的原理 8.网页色彩搭配 ...

  10. 网站设计的思考(藏)

    1.定位你的网站主题和名称 2.定位你的网站CI形象 3.确定网站的栏目和版块 4.确定网站的目录结构和链接结构 5.确定网站的整体风格和创意设计 6.首页的设计 7.版面布局的原理 8.网页色彩搭配 ...

最新文章

  1. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射
  2. python自学_为什么要选择Python怎样系统的自学并快速学习Python
  3. 团队项目第二阶段冲刺站立会议04
  4. Java实现敏感词过滤 - IKAnalyzer中文分词工具
  5. ORACLE初始化参数文件详细文档
  6. mysql-nt.exe w3wp.exe cpu 100%_w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法
  7. hashmap 从头到尾_如何从头到尾设计一个简单的复古徽标
  8. 各国网络安全审查制度及案例分析
  9. 上架服务器必须做的准备工作
  10. hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...
  11. 15款最佳的 jQuery 分步引导插件
  12. 遥感基础编程语言IDL介绍
  13. 大连理工计算机博士,【看完窒息】大连理工大学博士遗书
  14. python 视频字幕合并_怎么把字幕和视频合并(教你两者合并方法)
  15. Vi编辑异常退出解决
  16. 【论文解读】Exploring Complementary Strengths of Invariant and Equivariant Representations(小样本等变和不变的互补)
  17. 软件项目管理实践经验谈
  18. LTDC-DMA2D显示屏显示-编码标准(三)
  19. 5、中小企业网络架构-核心层交换机基本配置
  20. 软件project师周兆熊给IT学子的倾情奉献

热门文章

  1. 怎么让自媒体文章原创度变高?原创度达到多少才算合格?
  2. v-for中为何要使用key
  3. 什么是技术交底书? 如何撰写技术交底书
  4. 苹果应用ipa安装包下载
  5. Google Chrome 49.0.2623.112 XP系统最终版离线安装包官方下载地址
  6. 程序员修炼之道(通俗版)——第八章
  7. 阿里矢量图库icomoon的icon引用方法
  8. 迅雷SVIP版(资源下载神器)官方中文版V11.1.2.1078 | 迅雷不限速版下载
  9. Java拦截器和过滤器
  10. ifix与mysql_基于ODBC技术实现iFix组态软件与关系数据库通讯接口