在Godot-Nim项目中非导出方式暴露类型属性的技术解析

在Godot-Nim项目中非导出方式暴露类型属性的技术解析

gdext-nim Nim for Godot GDExtension. A pure library and a CLI tool. gdext-nim 项目地址: https://gitcode.com/gh_mirrors/gd/gdext-nim

前言

在Godot-Nim项目开发中,开发者经常需要将Nim代码中的属性暴露给Godot引擎使用,但又不希望这些属性出现在编辑器的检查器面板中。本文将深入探讨如何在Godot-Nim中实现这一需求,同时也会介绍如何处理Godot不直接支持的类型导出问题。

基础概念

在Godot-Nim中,.gdexport宏用于将属性暴露给Godot引擎。默认情况下,使用这个宏标记的属性不仅会在脚本中可见,还会出现在编辑器的检查器面板中。但有时我们只需要前者而不需要后者。

隐藏属性在编辑器中的显示

Godot-Nim提供了Appearance.storage选项来控制属性的可见性。通过将这个选项传递给.gdexport宏,可以实现在脚本中可用但在编辑器中不可见的效果。

type MyNode {.gdsync.} = ptr object of Node
  hidden_property* {.gdexport: Appearance.storage.}: gdref MyResource

这种技术特别适用于那些需要在运行时访问但不应该被编辑器修改的属性。

处理Godot不支持的类型导出

有时我们需要导出的类型是Godot原生不支持的,比如Nim特有的seqTable类型。这种情况下,我们需要为这些类型实现特定的转换函数。

以下是一个导出seq[int]类型的完整示例:

import gdext/private/typeshift

proc variantType*(T: typedesc[seq[int]]): VariantType = VariantTypeArray

template encoded*[T: seq[int]](_: typedesc[T]): typedesc[Array] = Array
template encode*[T: seq[int]](v: T; p: pointer) =
  encode(newTypedArray[int](v), p)
proc decode*[T: seq[int]](p: pointer; _: typedesc[T]): T =
  var arr = p.decode(TypedArray[int])
  result = newSeqofCap[int](arr.len)
  for i in 0..<arr.len:
    result.add arr[i]

proc variant*(self: seq[int]): Variant =
  variant newTypedArray[int](self)

proc get*(self: Variant; T: typedesc[seq[int]]): seq[int] =
  var arr = self.get(TypedArray[int])
  result = newSeqofCap[int](arr.len)
  for i in 0..<arr.len:
    result.add arr[i]

type MyNode* {.gdsync.} = ptr object of Node
  sequeance* {.gdexport.} : seq[int] = @[1, 2, 3, 4]

这个实现包含了类型转换所需的所有函数,使得seq[int]能够被Godot正确处理。虽然这种转换需要较多的代码,但它提供了极大的灵活性。

组合使用场景

在实际开发中,我们可能需要同时使用这两种技术:既需要导出Godot不支持的类型,又需要隐藏这些属性在编辑器中的显示。这时可以组合使用上述两种方法:

type MyNode* {.gdsync.} = ptr object of Node
  hidden_sequence* {.gdexport: Appearance.storage.}: seq[int] = @[1, 2, 3]

性能考虑

需要注意的是,自定义类型的导出转换可能会带来一定的性能开销。对于频繁访问的属性,建议考虑使用Godot原生支持的类型,或者优化转换函数的实现。

结论

Godot-Nim提供了灵活的属性暴露机制,既可以通过Appearance.storage控制属性的编辑器可见性,又可以通过实现特定函数来支持自定义类型的导出。这些技术为开发者提供了强大的工具,使得Nim代码能够更好地与Godot引擎集成。

在实际项目中,开发者应根据具体需求选择合适的方法,平衡功能需求与性能考虑,打造高效、可维护的游戏代码。

gdext-nim Nim for Godot GDExtension. A pure library and a CLI tool. gdext-nim 项目地址: https://gitcode.com/gh_mirrors/gd/gdext-nim

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎弋晨Lombard

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值