| Authors: | la.panon. |
|---|---|
| Version: | 0.15.1 |
- 1. ã¯ããã«
- 2. éçºç°å¢ã®æºå
- 3. ãããžã§ã¯ãã®äœæãããŒ
- 4. éçºã®åºæ¬ãµã€ã¯ã«
- 5. Godot à Nimã®æ©æž¡ã
- 6. å°ããªå®è·µäŸ
- 7. 次ã«èªãã¹ããªãœãŒã¹
1. ã¯ããã«
gdext-nim ãšã¯
gdext-nim 㯠Godot Engine ã®æ¡åŒµæ©æ§ GDExtension ãNim ããå©çšã§ããããã«ãããããžã§ã¯ãã§ãã
ããã«ãããGodotã®APIãNimããåŒã³åºããNimã®è¡šçŸåãæŽ»ãããŠæ¡åŒµæ©èœãã²ãŒã ããžãã¯ãéçºã§ããããã«ãªããŸãã
察象èªè
- Nim ãš Godot ã®åºæ¬çãªææ³ã»ã¯ãŒã¯ãããŒãçè§£ããŠããæ¹
ïŒäŸïŒNimã®åãã¢ãžã¥ãŒã«ãGodotã®ã·ãŒã³ã·ã¹ãã ãã¹ã¯ãªããã®äœ¿ãæ¹ïŒ
ã©ã¡ããã«äžæ £ããªå Žåã¯ã以äžã®å ¬åŒããã¥ã¡ã³ããå ã«åç §ããããšãæšå¥šããŸãïŒ
ãã®ã¬ã€ãã®ç®ç
ãã®ã¬ã€ãã§ã¯ãgdext-nim ãå§ããã«ããã£ãŠå¿
èŠãªæ
å ±ãäžéã解説ããŸãã
åºæ¬æŠå¿µãéçºç°å¢ã®æŽãæ¹ãgdext-nim ãçšããéçºãµã€ã¯ã«ãé ã«ç€ºãã
èªäºåŸã«ã¯ãgdext-nim ã䜿ã£ãŠèªåã§å°ããªæ¡åŒµããµã³ãã«ãäœãããç¶æ
ã«ãªãããšãç®æšãšããŠããŸãã
以éã¯ãããªãã®é¢å¿ã«å¿ããŠããã¢ãããžã§ã¯ããããã¥ãŒããªã¢ã«ããã¯ã€ãã¯ãªãã¡ã¬ã³ã¹ããAPIãªãã¡ã¬ã³ã¹ããªã©ã®è³æãèªã¿é²ããŠãã ããã
çšèªã®æŽç
-
ãã£ã¬ã¯ããª
windowsã«ããããã©ã«ãã§ãããã®ææžã§ã¯ãã£ã¬ã¯ããªè¡šèšã«çµ±äžããŸãã
-
åçã©ã€ãã©ãª
.so ã .dll ãªã©ã®ããã°ã©ã å®è¡æã«èªã¿èŸŒãŸãããã¡ã€ã«ã§ãã GDExtensionã¯gdext-nimã«ãã£ãŠãã«ããããåçã©ã€ãã©ãªãGodotã«èªã¿èŸŒãŸããããšã§åäœããŠããŸãã
2. éçºç°å¢ã®æºå
å¿ èŠãªããŒã«
å¿ é :
- Godot: >= 4.5.0
- Nim: >= 2.0.12
- gdext-nim
- C ã³ã³ãã€ã©
- Unixç³»: gcc ãŸã㯠clang
- Windows: MinGW
ãªãã·ã§ã³:
- emscripten: Webãã©ãŠã¶ã§ã®å®è¡ãæ³å®ããå Žå
- MinGW (ã¯ãã¹ã³ã³ãã€ã«çš): Linux/macOS ãã Windows åããã€ããªãçæãããå Žå
- Git (Git Bash): ãã®ã¬ã€ãã§ã¯Bashãåæã«ã³ãã³ãã玹ä»ããŸããWindowsãŠãŒã¶ãŒã§cmdãPowerShellã«æ £ããŠããªãå Žåã¯Git Bashã®ã€ã³ã¹ããŒã«ãæšå¥š
ã€ã³ã¹ããŒã«æé
Godot ã®ã€ã³ã¹ããŒã«
- å ¬åŒããŠã³ããŒãããŒãž ããå®å®çãååŸããŠãã ããã
- Windows/Mac/Linux åãã©ãããã©ãŒã çšã®ãã€ããªããããŸãã
- Steam / itch.io çµç±ã§ã®ã€ã³ã¹ããŒã«ãå¯èœã§ãã
Nim ã®ã€ã³ã¹ããŒã«
æãç°¡åãªã®ã¯ choosenim ãäœ¿ãæ¹æ³ã§ãã
curl https://nim-lang.org/choosenim/init.sh -sSf | sh
choosenim stable
Windows ã®å Žåã¯ å ¬åŒã€ã³ã¹ããŒã© ãå©çšãããšãMinGW ã忢±ããç°å¢ãæ§ç¯ã§ããŸãã ïŒNim 㯠C ã³ã³ãã€ã©ã«äŸåããŠãããWindows ã§ã¯ MinGW ãåæãšãªããŸããïŒ
ã€ã³ã¹ããŒã«åŸã以äžã§ããŒãžã§ã³ç¢ºèªããŠãã ããã
nim --version
# Nim Compiler Version 2.2.4 [Linux: amd64]
gdext-nim ã®å°å ¥
nimble ã䜿ã£ãŠã€ã³ã¹ããŒã«ã§ããŸãã
nimble install gdext
ã€ã³ã¹ããŒã«åŸã¯ gdextwiz ã³ãã³ããå©çšå¯èœã«ãªããŸããgdextwizã䜿ããããšã確èªããŠãã ããã
gdextwiz --help
3. ãããžã§ã¯ãã®äœæãããŒ
Godotãããžã§ã¯ãã®äœæ
ãšãã£ã¿ããæ°ãããããžã§ã¯ããäœæããããä»»æã®ãã£ã¬ã¯ããªã«ç©ºã®project.godotãã¡ã€ã«ãäœæããŸãã(touch project.godot)
gdext-nimã¯éçºãé²ãã ãããžã§ã¯ãã«åŸããå°å ¥ããããšãå¯èœã§ãããã§ã«ãããžã§ã¯ããååšããŠããå Žåã¯ãã®ã»ã¯ã·ã§ã³ãèªã¿é£ã°ããŠãã ããã
gdext-nimãšã¯ã¹ãã³ã·ã§ã³ã®äœæ
project.godotãã¡ã€ã«ããããã£ã¬ã¯ããªã«ç§»åããŠãã ããã
gdext-nim ã«ã¯è£å©ããŒã« gdextwiz ãä»å±ããŠããããšã¯ã¹ãã³ã·ã§ã³ã®é圢çæããã«ããèªååã§ããŸãã
gdextwiz new-extension [name]ãå®è¡ããæ°ãããšã¯ã¹ãã³ã·ã§ã³ãäœæããŸãããã
gdextwiz new-extension AwesomeExtension
ãã£ã¬ã¯ããªæ§æïŒäŸïŒ
ãããŸã§ã§ã次ã®ãããªãã£ã¬ã¯ããªæ§æã«ãªã£ãŠããã¯ãã§ãã
.
âââ project.godot
âââ nim
â âââ AwesomeExtension
â âââ bootstrap.nim
â âââ config.nims
â âââ src
â âââ classes
â âââ gdmyclass.nim
bootstrap.nim: gdext-nimãšã¯ã¹ãã³ã·ã§ã³ã®ãšã³ããªãŒãã€ã³ããšãªããã¡ã€ã«ã§ãããã®ãã¡ã€ã«ããã¯ã©ã¹å®çŸ©ãã¡ã€ã«ïŒäŸãã°gdmyclass.nimïŒçãã€ã³ããŒããããšããããGodotã«èªèãããŸãã
config.nims: ãã«ãèšå®ãèšè¿°ããŸãã
godot-cpp ãªã©ã䜿ã£ãããšãããæ¹ã¯ã.gdextension ãã¡ã€ã«ããªããããšã«éåæãèŠãããããããŸããããgdext-nim ã§ã¯èªåçæãããããåé¡ãããŸãããæåã§ç®¡çãããå Žåã¯Building & Exporting Guideã«åŸã£ãŠconfig.nimsãç·šéããŠãã ããã
ãµã³ãã«å®è¡
gdextwiz buildãå®è¡ããŠãæåã®ãšã¯ã¹ãã³ã·ã§ã³ããã«ãããŠã¿ãŸãããã
gdextwiz build
ânim/lib/âé äžã«åçã©ã€ãã©ãªãäœæãããŠããã¯ãã§ãã
.
âââ project.godot
âââ nim
+ â âââ lib
+ â â âââ libAwesomeExtension.linux.debug.x86_64.so
â âââ AwesomeExtension
â âââ bootstrap.nim
â âââ config.nims
â âââ src
â âââ classes
â âââ gdmyclass.nim
ç¶ããŠgdextwiz editorãŸãã¯godot --editorãå®è¡ããŠãšãã£ã¿ãç«ã¡äžããŸãã
gdextwiz editor &
MyClassããŒãã远å ã§ããã°æåã§ããããã§ Nim ã§äœã£ãæ¡åŒµã Godot ã«æ£ããèªèãããŠããŸãã
ã·ãŒã³ã« MyClass ã远å ããŠããäŸ:
4. éçºã®åºæ¬ãµã€ã¯ã«
åºæ¬çã«ã¯
- ã³ãŒããæžã
- ãã«ããã
- Godotã§ç¢ºèªãã
ã®ïŒã€ã®ããã»ã¹ãåããŠããããšã«ãªããŸãã
ã³ãŒããæžã
ããã§ã¯è©Šãã«ãâHello, world!âãåºåããMyFirstNodeãäœæããŠã¿ãŸãããã âsrc/classes/âã«âgdmyfirstnode.nimâãã¡ã€ã«ãäœæããå å®¹ãæ¬¡ã®ããã«ããŸãã
# src/classes/gdmyfirstnode.nim
import gdext
import gdext/classes/[gdNode]
type MyFirstNode* {.gdsync.} = ptr object of Node
method ready*(self: MyFirstNode) {.gdsync.} =
print "hello, world!"
-
import gdextgdext-nimã®APIã¯gdextã¢ãžã¥ãŒã«ãã€ã³ããŒãããããšã§äœ¿çšå¯èœã«ãªããŸãã
-
import gdext/classes/[gdNode]Godotã®ã¯ã©ã¹APIã¯èšå€§ã§ããããããå šãŠgdextã¢ãžã¥ãŒã«ã«å«ããŠããŸããšã³ã³ãã€ã«æéãå¢å€§ããŠããŸããããã¯ã©ã¹APIã®ã¿ã¯ã©ã¹ããšã«åå¥ã«ã€ã³ããŒããã仿§ã«ãªã£ãŠããŸãã芪ã¯ã©ã¹ã®APIãäžç·ã«ã€ã³ããŒãããããããgdObjectãšgdNodeã䜵ããŠã€ã³ããŒãããå¿ èŠã¯ãããŸããã
-
type MyFirstNode* {.gdsync.} = ptr object of NodeGodotã®ã¯ã©ã¹ãç¶æ¿ããæ°ããã¯ã©ã¹ãå®çŸ©ãGodotã«å ¬éããŠããŸãã{.gdsync.}ãã€ããããšãšãptr objectã§ããããšã¯å¿ããããã®ã§æ³šæããŠãã ããã
-
method ready*(self: MyFirstNode) {.gdsync.} =Nodeã¯ã©ã¹ã®ä»®æ³é¢æ°ã§ãã_ready()ããªãŒããŒã©ã€ãããŠããŸããNimã§ã¯leading underscoreã¯ã·ã³ãã«åã«äœ¿ããªãããé€ãããŠããŸãã funcãprocã§ã¯ãªãmethodã§ããããšã{.gdsync.}ãã€ããããšãæå±ããã¯ã©ã¹ã第äžåŒæ°ã«åãããšãå¿ èŠã«ãªããŸãã
bootstrap.nimã«gdmyfirstnode.nimãã€ã³ããŒãããŠGodotã«èªèãããŸãããã
# bootstrap.nim
import gdext
import classes/gdMyClass
+ import classes/gdMyFirstNode
GDExtensionEntryPoint
-
GDExtensionEntryPointæåéãgdext-nimãšã¯ã¹ãã³ã·ã§ã³ã®ãšã³ããªãŒãã€ã³ãã«ãªããŸããGodotAPIã®ååŸãGDExtensionã®åã颿°çã®ç»é²ãããããè¡ãããŸãã
ãã«ããã
gdextwiz buildãå®è¡ããšã¯ã¹ãã³ã·ã§ã³ããã«ãããŸãããã
gdextwiz build
gdext-nimã¯ããããªããŒãã«å¯Ÿå¿ããŠããã®ã§ããã«ãããŠåçã©ã€ãã©ãªãæŽæ°ããåŸã¯ãšãã£ã¿ã«ãã©ãŒã«ã¹ããã ãã§æ°ããåçã©ã€ãã©ãªãããŒããããŸãã
ãã ãããšã¯ã¹ãã³ã·ã§ã³ã«ããããªåäœãã¿ãããå Žåã«ã¯ãšãã£ã¿ã®åèµ·åãå¿
èŠã«ãªããŸãã
Godotã§ç¢ºèªãã
ã·ãŒã³ã«MyFirstNodeã远å ããF5ã§å®è¡ããŠã¿ãŸããããã³ã³ãœãŒã«ã«âHello, world!âãšè¡šç€ºãããŸãã
5. Godot à Nimã®æ©æž¡ã
GDScriptãšã®äœ¿ãåã
Godot ã§ã¯ GDScript ãš Nim (gdext-nim) ã䜵çšã§ããŸãã ããããã®åŸæåéã«å¿ããŠäœ¿ãåãããšå¹ççã§ãã
GDScript ã«åããŠããåŠç
- ã·ãŒã³ããªãŒãããŒãã®çµã¿ç«ãŠã»ã€ãã³ãæ¥ç¶ãªã©ãã²ãŒã ããžãã¯ãçŽ æ©ãæžããããéšå
- ãšãã£ã¿äžã§çŽæ¥èª¿æŽãããã¹ã¯ãªããïŒäŸ: UI ã®åããã·ãŒã³é·ç§»ïŒ
- å°èŠæš¡ã»è©Šè¡çãªã³ãŒãïŒçãæžããã®ã§ãããã¿ã€ãã³ã°ã«åãïŒ
Nim (gdext-nim) ã«åããŠããåŠç
- æ°å€èšç®ãã·ãã¥ã¬ãŒã·ã§ã³ãªã© ããã©ãŒãã³ã¹ãéèŠãªéšå
- ãããã¯ãŒã¯åŠçã»å€éšã©ã€ãã©ãªãšã®é£æº
- åå®å šæ§ã IDE è£å®ã掻ãããŠå€§èŠæš¡ã«èšèšãããã·ã¹ãã
- åå©çšããããã²ãŒã åºæã§ãªããããžãã¯ïŒãšã³ãžã³æ¡åŒµçãªã³ãŒãïŒ
å®éã®ãããžã§ã¯ãã§ã¯ãã²ãŒã éšå㯠GDScriptããéãåŠç㯠Nimããšåæ ããã®ãçŸå®çã§ãã ãã¹ãŠã Nim ã§æžãããšãå¯èœã§ãããã·ãŒã³èšèšãããŒã«é£æºã¯ GDScript ã®æ¹ãæè»ã§ãã
gdext-nimã®å©ç¹
-
åå®å š
Nim ã®åã·ã¹ãã ã«ãããåŒæ°ãæ»ãå€ã®äžäžèŽãã³ã³ãã€ã«æã«æ€åºã§ããŸãã GDScript ã§ã¯ã©ã³ã¿ã€ã ãšã©ãŒã«ãªããã¡ãªéšåãæ©æã«é²ããŸãã
-
ããã©ãŒãã³ã¹
Nim 㯠C ã«ã³ã³ãã€ã«ããããããGDScript ããé«éã«åäœããŸãã 倧éã®ãªããžã§ã¯ãå¶åŸ¡ã»ç©çèšç®ã»AI ããžãã¯ãªã©ã«åããŠããŸãã
-
IDEæ¯æŽ
Nim ã®ãšã³ã·ã¹ãã ïŒLSP, Nimble, NimblePackageïŒã«ãããè£å®ã»åæšè«ã»ãªãã¡ã¯ã¿ãªã³ã°ãå¯èœã§ãã å€§èŠæš¡ãããžã§ã¯ããé·æéçºã«åŒ·ã¿ãçºæ®ããŸãã
-
ã·ã³ãã«ãªçžäºéçš
Nim ã® importc ãçšããã°ãC/C++ ã®ã©ã€ãã©ãªãçŽæ¥å©çšã§ããŸãã Godot ãã²ãŒã ãšã³ãžã³ãšããŠäœ¿ãã€ã€ãå€éšã³ãŒãè³ç£ãçµ±åããããã®ã倧ããªç¹åŸŽã§ãã
APIåç §æ¹æ³
gdext-nim ã® API 㯠Godot æ¬äœã® API ã«æºæ ããŠããŸãã ã¯ã©ã¹åãã¡ãœããåã¯åºæ¬çã«åãã§ãããNim ã®åœåèŠåïŒcamelCase / PascalCaseïŒã«åŸã£ãŠå®çŸ©ãããŠããŸãã
å®è£ ã®éã¯ãŸã Godot å ¬åŒ API ãåç §ããããŸããããªãå Žåã«å¯Ÿå¿ããã¯ã©ã¹ãã¡ãœããã gdext-nim API Reference ã§ç¢ºèªããæµãã䟿å©ã§ãã
6. å°ããªå®è·µäŸ
ããã§ã¯åçŽã«ãGodotã¢ã€ã³ã³ãç¢å°ããŒã§åãããŠã¿ãŸãããã
âsrc/classes/âã«âgdcharacter.nimâãäœæããŸãã
# src/classes/gdcharacter.nim
import gdext
import gdext/classes/[gdSprite2D, gdInput]
type Character* {.gdsync.} = ptr object of Sprite2D
speed: float = 400
angular_speed: float = PI
method process(self: Character; delta: float64) {.gdsync.} =
var direction = 0
if Input.is_action_pressed("ui_left"):
direction = -1
if Input.is_action_pressed("ui_right"):
direction = 1
self.rotation = self.rotation + self.angular_speed * direction * delta
var velocity: Vector2
if Input.is_action_pressed("ui_up"):
velocity = Vector2.Up.rotated(self.rotation) * self.speed
self.position = self.position + velocity * delta
ãã«ãããäœæããCharacterããŒããã·ãŒã³ã«é
眮ããŸãã
Sprite2Dã®textureã«âres://icon.pngâãèšå®ããå®è¡ããŸãããã

7. 次ã«èªãã¹ããªãœãŒã¹
-
Godotå ¬åŒãã¥ãŒããªã¢ã«ãDodge the Creeps!ããgdext-nimã§åå®è£ ããŸãã éçºããã»ã¹ãå®è·µçã«èº«ã«ã€ãããæ¹ãž
-
éçºäžã®åç §ã«äŸ¿å©ãªæ§æèŸæžãã»ãã³ãã£ã¯ã¹ãGDScriptã·ã³ã¿ãã¯ã¹ããgdext-nimã®ã·ã³ã¿ãã¯ã¹ãåŒããŸãããã§ã«GDScriptã«æ £ããŠããæ¹ã¯ãã¡ã
-
gdext-nimã®ãã«ãã·ã¹ãã ããããžã§ã¯ããé åžå¯èœã«ããæé ã«ã€ããŠè©³ããæžãããã®
-
詳现ãªåã颿°ã®ããã¥ã¡ã³ããbridgeã¢ãžã¥ãŒã«ã®ããŒãžãç¹ã«æçã§ãã