tag:crieit.net,2005:https://crieit.net/tags/GDScript/feed 「GDScript」の記事 - Crieit Crieitでタグ「GDScript」に投稿された最近の記事 2023-10-01T16:19:48+09:00 https://crieit.net/tags/GDScript/feed tag:crieit.net,2005:PublicArticle/18585 2023-09-30T00:02:50+09:00 2023-10-01T16:19:48+09:00 https://crieit.net/posts/GDScript GDScript を覚えようぜ(^~^)? <h1 id="親記事から来た"><a href="#%E8%A6%AA%E8%A8%98%E4%BA%8B%E3%81%8B%E3%82%89%E6%9D%A5%E3%81%9F">親記事から来た</a></h1> <p>📖 <a href="https://crieit.net/posts/Godot-65115761b6a17">Godot って何だぜ(^~^)?</a></p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👇 <strong>GDScript</strong> の説明は 下のリンク先にあるぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/scripting_languages.html#doc-scripting">Godot Engine 4.2の日本語のドキュメント / スクリプト言語</a></p> <h1 id="ノード"><a href="#%E3%83%8E%E3%83%BC%E3%83%89">ノード</a></h1> <p><a href="https://crieit.now.sh/upload_images/fdd39aeaa2d5c671f89ffed9d658be156516e889b7f77.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fdd39aeaa2d5c671f89ffed9d658be156516e889b7f77.png?mw=700" alt="202309__godot__30-0005--Node-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <strong>Godot</strong> にあるものは全て ノード(Node)で、<br /> <strong>GDScript</strong> というのは そのノードを操作するものみたいだな」</p> <h1 id="Python に似ているが全然別物"><a href="#Python+%E3%81%AB%E4%BC%BC%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8C%E5%85%A8%E7%84%B6%E5%88%A5%E7%89%A9">Python に似ているが全然別物</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 GDScript は Python に似ているが 全然別物ということだぜ。<br /> 新しく覚え直せだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 また、GDScript の実行速度は遅いらしいぜ。<br /> GDScript は C++ 言語で書かれたプログラムを呼び出すから、内部的な処理は速いらしいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 Python と同じ生き方してんな」</p> <h1 id="Godot の独特な用語: シーン"><a href="#Godot+%E3%81%AE%E7%8B%AC%E7%89%B9%E3%81%AA%E7%94%A8%E8%AA%9E%EF%BC%9A%E3%80%80%E3%82%B7%E3%83%BC%E3%83%B3">Godot の独特な用語: シーン</a></h1> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 Godot には ノードと シーンという用語が出てくるんだけど、<br /> 計算機科学の わたしたちから見ると 造語のクセがあるわよ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/nodes_and_scenes.html">ノードとシーン</a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 えーと、つまり」</p> <p><a href="https://crieit.now.sh/upload_images/3f070cde77a220f4642ea4987d8605926516ee88a3639.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3f070cde77a220f4642ea4987d8605926516ee88a3639.png?mw=700" alt="202309__godot__30-0031--GraphTheory.png" /></a></p> <p>.<a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 グラフセオリー(Graph Theory;グラフ理論)の一題材の ツリー・ストラクチャー(Tree Structure;木構造)を<br /> わたしたちは 知っているが」</p> <p><a href="https://crieit.now.sh/upload_images/0c720d2ecfdc095edc3554898aae1be36516ef2d9a4a9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0c720d2ecfdc095edc3554898aae1be36516ef2d9a4a9.png?mw=700" alt="202309__godot__30-0035--GodotScene.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 Godot は ツリーのことを シーン(Scene)と言い換えているのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 多分そう」</p> <p><a href="https://crieit.now.sh/upload_images/c723716349b74fe153556ddc74bae6306516f01b5fe5a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c723716349b74fe153556ddc74bae6306516f01b5fe5a.png?mw=700" alt="202309__godot__30-0039--SubTree.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 さらに 計算機科学の わたしたちは 木の中に含まれるサブツリー(Subtree;部分木)を知っているぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 部分木もまた 木よね」</p> <p><a href="https://crieit.now.sh/upload_images/5e451eea55c0b09804de8b311bfb3e1c6516f0ee9926c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5e451eea55c0b09804de8b311bfb3e1c6516f0ee9926c.png?mw=700" alt="202309__godot__30-0043--GodotSceneNest.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Godot では、 シーンもまた ノードになる、という <strong>言い方</strong> をしている」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 じゃあ シーンは ツリーなんだ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 シーン、つまり サブツリーのファイルの拡張子は  <code>.tscn</code> のようね」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 なんて発音するか分からん嫌な拡張子だ…… ティーシーン?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Godot は、 <code>.tscn</code> を再生するプレイヤーなのよ」</p> <h1 id="GDScript Reference"><a href="#GDScript+Reference">GDScript Reference</a></h1> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👇 GDScript のリファレンスがあるそうだぜ。リンクをメモしておこう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/ja/4.x/tutorials/scripting/gdscript/gdscript_basics.html#doc-gdscript">GDScript reference</a></p> <h1 id="なんか 画像素材を1つ用意しろだぜ"><a href="#%E3%81%AA%E3%82%93%E3%81%8B%E3%80%80%E7%94%BB%E5%83%8F%E7%B4%A0%E6%9D%90%E3%82%92%EF%BC%91%E3%81%A4%E7%94%A8%E6%84%8F%E3%81%97%E3%82%8D%E3%81%A0%E3%81%9C">なんか 画像素材を1つ用意しろだぜ</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 プログラムのレッスンを進めていくんで、なにか 小さな画像素材を 1つ用意してくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/81b266d4e53136836776cee61a431baf6516f3666e8a1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/81b266d4e53136836776cee61a431baf6516f3666e8a1.png?mw=700" alt="2016_8_6_0_20_30_88_c1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 わたしで いいかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 しかたないな…… じゃあ それで」</p> <h1 id="新規プロジェクト作成"><a href="#%E6%96%B0%E8%A6%8F%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E4%BD%9C%E6%88%90">新規プロジェクト作成</a></h1> <p><a href="https://crieit.now.sh/upload_images/ea6276feae259d433b92b132db97782f6516f47a9b839.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ea6276feae259d433b92b132db97782f6516f47a9b839.png?mw=700" alt="202309__godot__30-0059--NewProject.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Godot で新規プロジェクトを作成するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/43d0406d967c661b9a56c44ee32f73736516f6f639a5a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/43d0406d967c661b9a56c44ee32f73736516f6f639a5a.png?mw=700" alt="202309__godot__30-0059--o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 最初に選ぶのが <strong>その他のノード</strong> って どうかしてるよな?」</p> <p><a href="https://crieit.now.sh/upload_images/ebbf6b76ee6b2b6cb31f73d22a9c18456516f770eb735.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ebbf6b76ee6b2b6cb31f73d22a9c18456516f770eb735.png?mw=700" alt="202309__godot__30-0111--Sprite2D-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 その中から <strong>Sprite2D</strong> を選ぶなんて、直観的に無理だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/cde187520b2984c5e82ab352c09a72336516f7d29430c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cde187520b2984c5e82ab352c09a72336516f7d29430c.png?mw=700" alt="202309__godot__30-0113--Editor-Sprite2DNode-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 これが Sprite2D をルート(Root;根)に持つ シーン(※つまりサブツリー)を作成したところだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/0173158b360e46e8e9d15af9ad0e82c66516f9b5b2965.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0173158b360e46e8e9d15af9ad0e82c66516f9b5b2965.png?mw=700" alt="202309__godot__30-0120--Texture-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 テクスチャー欄へ さっきの画像を読み込めだぜ」</p> <h1 id="新規 GDScript 作成: ハローワールド"><a href="#%E6%96%B0%E8%A6%8F+GDScript+%E4%BD%9C%E6%88%90%EF%BC%9A%E3%80%80%E3%83%8F%E3%83%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89">新規 GDScript 作成: ハローワールド</a></h1> <p><a href="https://crieit.now.sh/upload_images/745d4a4ff407d1709f9bd69da1ef33316516fa965af4c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/745d4a4ff407d1709f9bd69da1ef33316516fa965af4c.png?mw=700" alt="202309__godot__30-0125--NewScript-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 次に <strong>新規スクリプト</strong> を作ったらいいのかな?」</p> <p><a href="https://crieit.now.sh/upload_images/0272a6f6df3677df1bea5cc0205b74396516fb13d82ab.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0272a6f6df3677df1bea5cc0205b74396516fb13d82ab.png?mw=700" alt="202309__godot__30-0127--TemplateEmpty-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 テンプレートを <strong>Object:Empty</strong> にしとけだそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/72a1822b4b069e6a7830155b071d2a1a6516fb775159f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/72a1822b4b069e6a7830155b071d2a1a6516fb775159f.png?mw=700" alt="202309__godot__30-0129--CodeEditor.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんか コード・エディターが出てくるな。ここに GDScript を書けばいいのだろう」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 かっこいいコードを書いてくれよ」</p> <pre><code class="gd">extends Sprite2D func _init(): print("Hello, world!") </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 サンプル通り書いてみよう」</p> <p><a href="https://crieit.now.sh/upload_images/e2052a5a11d13176660d735f7b4f60916516fc9c87956.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e2052a5a11d13176660d735f7b4f60916516fc9c87956.png?mw=700" alt="202309__godot__30-0133--Run-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんか 分からんな…… <strong>現在のものを選択</strong> で」</p> <p><a href="https://crieit.now.sh/upload_images/a8b6e722733ba947f41399dfc81efc226516fd219827a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a8b6e722733ba947f41399dfc81efc226516fd219827a.png?mw=700" alt="202309__godot__30-0135--HelloWorld-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <strong>Hello, world!</strong> と出力ビューに表示されたな」</p> <h2 id="コンストラクター: _init()"><a href="#%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%EF%BC%9A%E3%80%80_init%28%29">コンストラクター: _init()</a></h2> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>func _init():</code> メソッドは コンストラクタなんだ」</p> <h1 id="くるくる回す"><a href="#%E3%81%8F%E3%82%8B%E3%81%8F%E3%82%8B%E5%9B%9E%E3%81%99">くるくる回す</a></h1> <p><a href="https://crieit.now.sh/upload_images/b489de93c54dc490ea700d674f50189d6516ff5b4b686.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b489de93c54dc490ea700d674f50189d6516ff5b4b686.png?mw=700" alt="202309__godot__30-0145--Rotation.png" /></a></p> <pre><code class="gd">extends Sprite2D var speed = 400 var angular_speed = PI func _init(): print("Hello, world!") func _process(delta): rotation += angular_speed * delta </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 サンプル通り書いてみよう。 くるくる回ってるぜ」</p> <h2 id="時間軸の1つ分の処理: _process(delta)"><a href="#%E6%99%82%E9%96%93%E8%BB%B8%E3%81%AE%EF%BC%91%E3%81%A4%E5%88%86%E3%81%AE%E5%87%A6%E7%90%86%EF%BC%9A%E3%80%80_process%28delta%29">時間軸の1つ分の処理: _process(delta)</a></h2> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>func _process(delta):</code> メソッドは 時間 delta 分の処理なんだ」</p> <h2 id="Tips: Ctrl + Click"><a href="#Tips%3A+Ctrl+%2B+Click">Tips: Ctrl + Click</a></h2> <p><a href="https://crieit.now.sh/upload_images/aa78c037ac0389d5c9bc1824581f2b4465170065e891a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aa78c037ac0389d5c9bc1824581f2b4465170065e891a.png?mw=700" alt="202309__godot__30-0149--CtrlClick-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Ctrl</code> キーを押しながら コードをクリックすると 説明が出てきたり、定義に飛んだりするようだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 そんな裏技仕込むの 止めてほしいわね」</p> <h2 id="洗濯機の中の衣類のように周る"><a href="#%E6%B4%97%E6%BF%AF%E6%A9%9F%E3%81%AE%E4%B8%AD%E3%81%AE%E8%A1%A3%E9%A1%9E%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%91%A8%E3%82%8B">洗濯機の中の衣類のように周る</a></h2> <pre><code class="gd">extends Sprite2D var speed = 400 var angular_speed = PI func _init(): print("Hello, world!") func _process(delta): # その場で ねずみ花火のように くるくる回る rotation += angular_speed * delta # 洗濯機の中の衣類のように 周る var velocity = Vector2.UP.rotated(rotation) * speed position += velocity * delta </code></pre> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://x.com/muzudho1/status/1707801968616550478?s=20">動画</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 分かったぜ」</p> <h1 id="入力"><a href="#%E5%85%A5%E5%8A%9B">入力</a></h1> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 次の課題は 入力よ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/scripting_player_input.html">プレイヤーの入力を聞く</a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 入力のインプットを受け取る方法は 2種類あって、<br /> <code>Input</code> シングルトンを使う方法と、 <code>_unhandled_input()</code> コールバック関数を使う方法があるようだぜ」</p> <pre><code class="gd">extends Sprite2D var speed = 400 var angular_speed = PI func _init(): print("Hello, world!") func _process(delta): # その場で ねずみ花火のように くるくる回る rotation += angular_speed * delta # 洗濯機の中の衣類のように 周る var velocity = Vector2.UP.rotated(rotation) * speed var movement = velocity * delta # 何も押さなければその場で回転 var direction = 0 # 左キー押下で頭上の方へ進む if Input.is_action_pressed("ui_left"): direction = -1 # 右キー押下で足下の方へ進む if Input.is_action_pressed("ui_right"): direction = 1 movement *= direction # 移動ベクトルを足す position += movement </code></pre> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://x.com/muzudho1/status/1707956784898646248?s=20">動画</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/29befd42d7210ed69b9a1b70f6752dc465179e8c10f1f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/29befd42d7210ed69b9a1b70f6752dc465179e8c10f1f.png?mw=700" alt="202309__godot__30-1304--inputMap-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <strong>プロジェクト設定</strong> の <strong>インプットマップ</strong> タブを見れば <code>Input.is_action_pressed()</code> メソッドの引数に何書いたらいいか<br /> 自分で調べられるそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 助かるぜ」</p> <pre><code class="gd">extends Sprite2D var speed = 400 var angular_speed = PI func _init(): print("Hello, world!") func _process(delta): var velocity = Vector2.ZERO # 上キーを押していなければ進まない仕組み if Input.is_action_pressed("ui_up"): velocity = Vector2.UP.rotated(rotation) * speed # その場で ねずみ花火のように くるくる回る rotation += angular_speed * delta # 洗濯機の中の衣類のように 周る var movement = velocity * delta # 何も押さなければその場で回転 var direction = 0 # 左キー押下で頭上の方へ進む if Input.is_action_pressed("ui_left"): direction = -1 # 右キー押下で足下の方へ進む if Input.is_action_pressed("ui_right"): direction = 1 movement *= direction # 移動ベクトルを足す position += movement </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 上キーを押していなければ 進まないという仕組みも追加したぜ」</p> <h1 id="Godot の言うシグナル: イベントハンドラーみたいなもん"><a href="#Godot+%E3%81%AE%E8%A8%80%E3%81%86%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%EF%BC%9A%E3%80%80%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E3%83%BC%E3%81%BF%E3%81%9F%E3%81%84%E3%81%AA%E3%82%82%E3%82%93">Godot の言うシグナル: イベントハンドラーみたいなもん</a></h1> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 次の課題は シグナル(Signal;信号)よ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/signals.html">シグナルの使用</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 イベントハンドラーじゃないのかだぜ? Linux みたいだな」</p> <p><a href="https://crieit.now.sh/upload_images/99baf2fc25b81d2b4454f7d6714e42546517a4ae6c418.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/99baf2fc25b81d2b4454f7d6714e42546517a4ae6c418.png?mw=700" alt="202309__godot__30-1331--NewScene-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 新しいシーンを作れとのことだぜ。 シーンって何なんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 サブツリーのルートノード(Root Node;根)なんじゃないか?</p> <p><a href="https://crieit.now.sh/upload_images/4f13481d8de1a65c0cac3a780c634a436517a5507a118.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4f13481d8de1a65c0cac3a780c634a436517a5507a118.png?mw=700" alt="202309__godot__30-1333--RootNode-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 シーンは サブツリーなのよ。 サブツリーのルートをさらに選ぶのよ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 シーンなんて用語 造語されたら ぐちゃぐちゃだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/a22c3b41e3c53784f790b75fec6b4f0c6517a5ff240a4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a22c3b41e3c53784f790b75fec6b4f0c6517a5ff240a4.png?mw=700" alt="202309__godot__30-1336--2DScene-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>2D シーン</code> を選べとのことだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/f6006ebcdbdaea3a731e81340cdd49196517a668cf652.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f6006ebcdbdaea3a731e81340cdd49196517a668cf652.png?mw=700" alt="202309__godot__30-1338--Node2DRoot-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんで <code>2D シーン</code> を選んで、出てくるのが <code>Node2D</code> なんだぜ? 技術的に ぐちゃぐちゃだな」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 べつに 技術をウリにしてないんだろ」</p> <p><a href="https://crieit.now.sh/upload_images/0bf11477147a15aebd932108aa9843a46517a74fb3b22.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0bf11477147a15aebd932108aa9843a46517a74fb3b22.png?mw=700" alt="202309__godot__30-1342--AddChildNode-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 子ノードとして <code>Button</code> を追加しろとのことだぜ」</p> <p><code>Node/CanvasItem/Control/BaseButton/Button</code></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 なんか クラス階層図みたいなツリー構造だな。 <code>BaseButton</code> の下に <code>Button</code> が出てくるの カッコ悪いよな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 みたい、じゃなくて、クラス階層図なんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/4ca275d7f406ce30952797a9881296166517a86d669a7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4ca275d7f406ce30952797a9881296166517a86d669a7.png?mw=700" alt="202309__godot__30-1347--ButtonSubTree.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 あれっ? きふわらべ どこに行ったんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 お父んの方が 別のサブツリーに行ったんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 だいたい わかった」</p> <p><a href="https://crieit.now.sh/upload_images/e58955b63e12b4eeed2b796d5867e0976517a9bfc0a76.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e58955b63e12b4eeed2b796d5867e0976517a9bfc0a76.png?mw=700" alt="202309__godot__30-1351--ButtonLabel-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 フォント・サイズはどこで変えれるんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Godot は ノードを主張してるくせに <code>Button</code> のサブ・ノードが見えないじゃない」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 べつに 技術をウリにしてないんだろ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 もう 先々 苦労しそうだな」</p> <p><a href="https://crieit.now.sh/upload_images/b859aa8fe93be25c91b7fd1aa0349a746517aacdc271b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b859aa8fe93be25c91b7fd1aa0349a746517aacdc271b.png?mw=700" alt="202309__godot__30-1357--F6Key.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 <code>F6</code> キーを打鍵すると サブツリーを 動作テストできるそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 そんな裏技仕込むの 止めてほしいわね」</p> <p><a href="https://crieit.now.sh/upload_images/a26a07191c5b071b3095a61455d0c8516517abf3bffd6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a26a07191c5b071b3095a61455d0c8516517abf3bffd6.png?mw=700" alt="202309__godot__30-1401--NodeSignal-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 <code>ノード</code> タブをクリックすると シグナルの一覧が出てくるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 お前は <strong>インスペクター</strong> なんじゃないの?<br /> なんで インスペクターの隣の <strong>ノード</strong> タブをクリックしたんだぜ?<br /> ノード タブは、インスペクターじゃないってのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ノード タブは インスペクター じゃないのよ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Godot の国語は ぐちゃぐちゃ だな。技術的にクソだ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 べつに 国語も 技術も ウリにしてないんだろ」</p> <p><a href="https://crieit.now.sh/upload_images/1a87f1b891e9098385263a910011c31b6517ad1f459da.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1a87f1b891e9098385263a910011c31b6517ad1f459da.png?mw=700" alt="202309__godot__30-1406--pressed-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 <code>BaseButton</code> の下に <code>pressed()</code> メソッドがあるから ダブル・クリックしろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>pressed()</code> は メソッドなの? シグナルなの?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>pressed()</code> メソッドは <code>pressed</code> メッセージが送られてきたときに実行されるイベントハンドラーなんじゃないか?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 本当にそうだろうか?」</p> <p><a href="https://crieit.now.sh/upload_images/d0842a41d7e9ab37b679a9c8bdd5b7126517aeaa021fe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d0842a41d7e9ab37b679a9c8bdd5b7126517aeaa021fe.png?mw=700" alt="202309__godot__30-1413--cutAndPaste-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 きふわらべが 別のサブツリーに居て アクセスできなかったので、<br /> カット&ペーストで 連れてきたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 じゃあ 元 居たツリーは 今 どうなってんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/6a399bc7533aade13f12f764ec4068fe6517af1e7eaf0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6a399bc7533aade13f12f764ec4068fe6517af1e7eaf0.png?mw=700" alt="202309__godot__30-1415--emptyTree.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 エンプティセット(Empty Set;空集合,くうしゅうごう)だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 保存はできるのか?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 不思議な話だが、エンプティセットは 保存できないぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ウィンドウを閉じれば 同値よ」</p> <p><a href="https://crieit.now.sh/upload_images/27ed21a44294aba69a62282080a3e4226517b28e975af.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/27ed21a44294aba69a62282080a3e4226517b28e975af.png?mw=700" alt="202309__godot__30-1429--signal-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 センダー(Sender;送信者)である BaseButton の <code>pressed()</code> メソッドが呼び出されたとき、<br /> さらに レシーバー(Receiver;受信者)である Sprite2D の <code>_on_button_pressed</code> メソッドが呼び出される」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 と考えたらいいんじゃないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 シグナルは どこにあんのよ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Godot の開発者たちは 国語のセンスがないことが分かった。わたしが 言い換えてやるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/bdf08988dc220681738ec431998dedeb6517b43438745.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bdf08988dc220681738ec431998dedeb6517b43438745.png?mw=700" alt="202309__godot__30-1436--eventHandler-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 わたしのコードに イベントハンドラーが 勝手に追加されたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ そこに ボタンが押されたときに やりたい処理を書けばいいのよ」</p> <p><a href="https://crieit.now.sh/upload_images/1b59db21bf318cbc6210dba1942042116517b4da4112d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1b59db21bf318cbc6210dba1942042116517b4da4112d.png?mw=700" alt="202309__godot__30-1436--eventHandler-o3o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 イベントハンドラーのシグネチャーの左横に 緑色の矢印が表示されていて、クリックできるそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/475243ba585fc69677ea7b372cce6f066517b53a0dc81.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/475243ba585fc69677ea7b372cce6f066517b53a0dc81.png?mw=700" alt="202309__godot__30-1441--connection.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 説明が出てきた。まあ そうなんだろうな」</p> <pre><code class="gd">func _on_button_pressed(): # 働いてたら休む。 # 休んでたら働く。 set_process(not is_processing()) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ボタンを押下したときのコードを サンプルに従って書いたぜ。<br /> メソッド名が悪いよな。意味が分からん。まあ Godot は、国語がウリではないから 仕方ない」</p> <p><a href="https://crieit.now.sh/upload_images/2ee823104a0e92408e6e199ef46551826517b6cd8c024.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2ee823104a0e92408e6e199ef46551826517b6cd8c024.png?mw=700" alt="202309__godot__30-1448--run.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 あれっ? ボタンが無いぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 エンプティセットを保存してないから、古いサブツリーを実行しているのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 実行ボタンをクリックしたときに実行される サブツリー は、どこで変更できる?」</p> <p><a href="https://crieit.now.sh/upload_images/04be6e51c0bb8bdaf1852ebfec8b9f126517b80f7cc83.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/04be6e51c0bb8bdaf1852ebfec8b9f126517b80f7cc83.png?mw=700" alt="202309__godot__30-1453--applicationRun.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 プロジェクト設定の中を探していけば あるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/c17285e0414e680f05bac7104e07b5546517b856121d7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c17285e0414e680f05bac7104e07b5546517b856121d7.png?mw=700" alt="202309__godot__30-1455--run.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よしでけた」</p> <h1 id="Ctrl + F1"><a href="#Ctrl+%2B+F1">Ctrl + F1</a></h1> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 エディターに戻って <code>Ctrl + F1</code> キーを押してみろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/c69d8e288cdddacee1e04b1d561688d06517bd9322f97.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c69d8e288cdddacee1e04b1d561688d06517bd9322f97.png?mw=700" alt="202309__godot__30-1517--CtrlF7.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 お前が出てきたけど……」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ルートに戻ったんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 メイン・シーンの方に戻ってほしいぜ」</p> <h1 id="Timer"><a href="#Timer">Timer</a></h1> <p><a href="https://crieit.now.sh/upload_images/e43a695421dbe4546c001fc1af7372796517bee511c38.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e43a695421dbe4546c001fc1af7372796517bee511c38.png?mw=700" alt="202309__godot__30-1522--Timer-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 サンプルに従って タイマーを追加するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/79f0e556a695b23730a04ea3079a7d636517bf3fe9c6e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/79f0e556a695b23730a04ea3079a7d636517bf3fe9c6e.png?mw=700" alt="202309__godot__30-1524--AutoStart-o2o0.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Autostart をオンに設定」</p> <p><a href="https://crieit.now.sh/upload_images/380aefc0bfd1d42c51a0c6b20163b6ef6517c0752e112.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/380aefc0bfd1d42c51a0c6b20163b6ef6517c0752e112.png?mw=700" alt="202309__godot__30-1530--ScriptButton.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 上図のボタンをクリックすると スクリプトのページが開くそうだぜ」</p> <pre><code class="gd">extends Sprite2D var speed = 400 var angular_speed = PI func _init(): print("Hello, world!") func _process(delta): var velocity = Vector2.ZERO # 上キーを押していなければ進まない仕組み if Input.is_action_pressed("ui_up"): velocity = Vector2.UP.rotated(rotation) * speed # その場で ねずみ花火のように くるくる回る rotation += angular_speed * delta # 洗濯機の中の衣類のように 周る var movement = velocity * delta # 何も押さなければその場で回転 var direction = 0 # 左キー押下で頭上の方へ進む if Input.is_action_pressed("ui_left"): direction = -1 # 右キー押下で足下の方へ進む if Input.is_action_pressed("ui_right"): direction = 1 movement *= direction # 移動ベクトルを足す position += movement func _on_button_pressed(): # 働いてたら休む。 # 休んでたら働く。 set_process(not is_processing()) # サブツリーが全てインスタンス化されたときに呼び出される func _ready(): # タイマーノード取得 var timer = get_node("Timer") # timer ソースの timeout シグナルに _on_timer_timerout メソッドを接続 timer.timeout.connect(_on_timer_timeout) func _on_timer_timeout(): # 可視性を反転 visible = not visible </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 全部のコード載せたろ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://x.com/muzudho1/status/1708008555952132115?s=20">動画</a></p> <h1 id="カスタムシグナル"><a href="#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB">カスタムシグナル</a></h1> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 シグナルを自作する方法の解説も載ってるわよ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/signals.html#custom-signals">カスタムシグナル</a></p> <h1 id="このあと"><a href="#%E3%81%93%E3%81%AE%E3%81%82%E3%81%A8">このあと</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 このあとも チュートリアルは続くが、洋ゲーなんで 興味無いんで スキップする!」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 よっしゃ!」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ 本題へ戻りましょう</p> <h1 id="親記事へ戻る"><a href="#%E8%A6%AA%E8%A8%98%E4%BA%8B%E3%81%B8%E6%88%BB%E3%82%8B">親記事へ戻る</a></h1> <p>📖 <a href="https://crieit.net/posts/Godot-65115761b6a17">Godot って何だぜ(^~^)?</a></p> <h1 id="以下、独習"><a href="#%E4%BB%A5%E4%B8%8B%E3%80%81%E7%8B%AC%E7%BF%92">以下、独習</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html">GDScript reference</a></p> <h2 id="列挙型"><a href="#%E5%88%97%E6%8C%99%E5%9E%8B">列挙型</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Godot に 列挙型は有るのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👇 書き方がいくつか有るようだぜ。これを読んで分かるか?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#enums">Enum</a></p> <pre><code class="gd">enum State {STATE_IDLE, STATE_JUMP = 5, STATE_SHOOT} func _ready(): # Access values with Name.KEY, prints '5' print(State.STATE_JUMP) # Use constant dictionary functions # prints '["STATE_IDLE", "STATE_JUMP", "STATE_SHOOT"]' print(State.keys()) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あとは 調べてみるぜ」</p> <h2 id="別ファイルで定義した列挙型をインポートするには?"><a href="#%E5%88%A5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E5%88%97%E6%8C%99%E5%9E%8B%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F">別ファイルで定義した列挙型をインポートするには?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 別ファイルで定義した列挙型をインポートするには どうやったらいいんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👇 書き方がいくつか有るようだぜ。これを読んで分かるか?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.reddit.com/r/godot/comments/jfdxke/how_to_export_an_enum_and_import_to_another_script/">How to export an enum and import to another script</a></p> <pre><code class="gd"># Author: samsfacee # state_machine.gd extends Node2D class_name StateMachine enum State { STATE_STANDING, STATE_JUMPING, STATE_DUCKING, STATE_DIVING} # player.gd var state = StateMachine.State.STATE_STANDING </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 クラスに名前を付けて グローバルに公開するのか。それ以外の方法は?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://ask.godotengine.org/40827/how-to-declare-a-global-named-enum">How to declare a global named enum?</a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👇 <code>preload</code> を使う方法がありそうだぜ」</p> <pre><code class="gd"># Author: Zylann const MyNamedEnum = preload("path/to/MyNamedEnum.gd") func _ready(): print(MyNamedEnum.TYPE1) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あとは 調べてみるぜ」</p> <h2 id="別ファイルで定義されたクラスを生成するには?"><a href="#%E5%88%A5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F">別ファイルで定義されたクラスを生成するには?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 別ファイルで定義されたクラスを生成するには どうやったらいいんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👇 この記事が参考になるかだぜ?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://ask.godotengine.org/80159/instantiating-object-class_name-differs-preload-functions">class_nameを使用した新しいオブジェクトのインスタンス化は、preload()関数やload()関数とは異なりますか?</a></p> <p>Question: Robotex<br /> Answer: klaas</p> <p>あるファイルでクラスを定義:</p> <pre><code class="gd">extends Object class_name MyClass </code></pre> <p>生成方法1:</p> <pre><code class="gd"># 名前付きスクリプトは起動時にグローバルに登録されます。 var obj = MyClass.new() </code></pre> <p>生成方法2:</p> <pre><code class="gd"># プリロードされたスクリプトは、コンパイル時にクラスの var または const にロードされます。 # これらはグローバルにアクセス可能ではありません。 var MyClass = preload("MyClass.gd") var obj = MyClass.new() </code></pre> <p>生成方法3:</p> <pre><code class="gd"># ロードされたスクリプトは、実行時にクラス変数にロードされます。 # これらはグローバルにアクセス可能ではありません。 var MyClass = load("MyClass.gd") var obj = MyClass.new() </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あとは 調べてみるぜ」</p> <p>.</p> むずでょ tag:crieit.net,2005:PublicArticle/15534 2019-11-08T21:29:19+09:00 2020-06-25T22:45:24+09:00 https://crieit.net/posts/Godot-AdMob-Android GodotでAdMobを使う - Androidの場合 <p>追記)Godot3.2以降は簡単になったので下記参照。</p> <p><a href="https://crieit.net/posts/Godot3-2-AdMob">Godot3.2以降でAdMobを使う</a></p> <p>追記終わり。</p> <p>GodotでもAdMobを使うことが出来る。コード自体はGodot上にてGDScriptで書けばいいだけなので簡単だけど、ちょっと仕組み的には複雑かもしれない。ただ、やってみると、あーなるほど、そういう仕組で動いてるのか、と分かる。ちなみにGodot3.1.1現在。</p> <p>iOSの場合はこちら。Godotのビルドの解説をしていたり、Godot3.2を使っていたり、Android、iOS両方に対応したGodotのコードの例もある。(ビルドはもしかしたらAndroid側は関係なくなっているのかもしれないが)</p> <p><a href="https://crieit.net/posts/Godot-AdMob-Android">GodotでAdMobを使う - iOSの場合</a></p> <h2 id="モジュールを追加"><a href="#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E8%BF%BD%E5%8A%A0">モジュールを追加</a></h2> <p>具体的には下記のリポジトリにあるモジュールを利用する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/kloder-games/godot-admob">kloder-games/godot-admob: Module Admob for Godot engine</a></p> <p>詳しい説明もここに書かれている。2つやり方があって、「Using precompiled templates (Second Option)」と書かれている方が簡単。そこの説明のhereと書かれているリンクをクリックすると下記に遷移する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/Shin-NiL/godot-custom-mobile-template">Shin-NiL/godot-custom-mobile-template: Godot Game Engine Custom Mobile Template</a></p> <p>ここのReleaseに色々あるので、自分が使っているGodotのバージョンと同じ番号のものをダウンロードする。それを解凍したら、GodotのエクスポートメニューのAndroidの設定のところに、「Custom Package」という設定があるのでそこにDebugとRelease用のパッケージを指定する。</p> <p>あとは説明にあるように下記のパーミッションを有効にしておく。</p> <ul> <li>Access Network State</li> <li>Internet</li> </ul> <h3 id="一体何をやっているのか"><a href="#%E4%B8%80%E4%BD%93%E4%BD%95%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B">一体何をやっているのか</a></h3> <p>これは一体何をやっているのかというと、簡単に言えばAndroid Studioで作られたプロジェクトの部分がこのCustom Packageとして提供されている感じなのではないかと思う。なのでAdMobのようにネイティブ側で対応が必要な機能を提供する際にはそういったモジュールを追加してビルドされたCustom Packageを利用することで、Godot側でも利用できるようになる、という感じだと思われる。</p> <p>実際問題Second Optionではない正規の方法では、モジュールを追加して自分でビルドしてくれ、という形になっている。今回はAdMobを使いたいだけなのでビルド済みのもので問題ないが、色々とモジュールを必要に応じて追加したプロジェクトを使う場合には自分でビルドしないといけないと思う。</p> <p>が、Godot3.2からはもっと簡単にできるようになるよ、ということも最初のリポジトリの説明に書かれている。なのでまあとりあえず今はビルド済みのを使っておいたほうが楽かもしれない。</p> <h2 id="Godot側にモジュール追加設定"><a href="#Godot%E5%81%B4%E3%81%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E8%BF%BD%E5%8A%A0%E8%A8%AD%E5%AE%9A">Godot側にモジュール追加設定</a></h2> <p>Custom Packageの準備ができたら、今度はGodotのプロジェクト側にモジュールの追加設定を行う。Godotのプロジェクトファイルがテキストファイルになっており、それを直接いじるので恐らくGodotを起動していると勝手に書き換えられて無効になってしまう。そのため一旦Godotを終了してから、下記のテキストをproject.godotに追加する。</p> <pre><code class="ini">[android] modules="org/godotengine/godot/GodotAdMob" </code></pre> <h2 id="AdMobを表示するコードを追加"><a href="#AdMob%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0">AdMobを表示するコードを追加</a></h2> <p>そしたらあとはAdMobを表示するコードをシーンに追加するだけ。僕の場合は下記のようにした。デバッグ時にはテスト広告を表示し、且つAdMobモジュールが正常にロードできているかをLabelに表示して確認している。ちなみに実機でしか動作しない。</p> <pre><code class="python">var admob = null func _ready(): if Engine.has_singleton("AdMob"): admob = Engine.get_singleton("AdMob") # 一般向けの場合 # init(isReal, instance_id) # 子ども向けの場合 admob.initWithContentRating(!OS.is_debug_build(), get_instance_id(), true, 'G') if OS.is_debug_build(): admob.loadBanner('ca-app-pub-3940256099942544/6300978111', false) $UILayer/DebugLabel.set_text('ad initialized') else: admob.loadBanner('本番の広告ユニットID', false) else: if OS.is_debug_build(): $UILayer/DebugLabel.set_text('ad not initialized') </code></pre> <p>ということでちょっと面倒くさい…けどビルド済みCustom Packageだとだいぶ楽。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15533 2019-11-07T23:49:04+09:00 2020-06-19T18:18:44+09:00 https://crieit.net/posts/Godot-Tween GodotでTweenを動的に使ってアニメーションする <p>GodotのTweenは他の言語やライブラリでもよくあるように、いちいち細かい処理を書かなくてもパラメータを指定するだけでアニメーションを行ってくれるもの。Cocos2dxでいうアクションみたいなもの。それの実際の使い方をいくつかメモ。</p> <p>よく見かける例だとシーンに配置されているTweenを使っている物が多いので、その都度dynamicallyにTweenを使う方法。</p> <h2 id="パラメータを変動させるTween"><a href="#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%A4%89%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8BTween">パラメータを変動させるTween</a></h2> <p>移動したりサイズを変えたりというパラメータを変動させるタイプのTweenは<code>interpolate_property</code>というメソッドを使う。例えば下記のような感じ。</p> <pre><code class="python"> var tween = Tween.new() tween.interpolate_property(node, 'position', Vector2(0, 0), Vector2(100, 100), 10, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) tween.start() scene.add_child(tween) </code></pre> <p>この例だとnodeを10秒かけて座標(0, 0)から(100, 100)に一定の速度で移動させるアニメーションを実行する、というもの。動的に作る場合の注意点としてTween自体もシーンにadd_childしておく必要がある。しないと多分そのまま消えてしまって何も起こらない。アニメーションするnodeに入れる形でも大丈夫。</p> <p>連続してアクションを行いたい場合はTweenを作るわけではなく続けて必要な分だけinterpolate_property等を呼び出せばいい。</p> <h2 id="コールバックを呼ぶためのTween"><a href="#%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%92%E5%91%BC%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AETween">コールバックを呼ぶためのTween</a></h2> <p>Tweenでアニメーションした後に例えばそのNodeを削除したりなど、特定の処理を実行させることも出来る。その場合は<code>interpolate_callback</code>というメソッドを使う。例えば下記のような感じ。</p> <pre><code class="python"> var tween = Tween.new() tween.interpolate_callback(self, 10, 'remove_node', node) tween.start() scene.add_child(tween) func remove_node(node): remove_child(node) node.queue_free() </code></pre> <p>これは10秒経ったらnodeをremove_nodeというメソッドを呼んでその中で削除する、というTween。さっきの処理と合わせるとアニメーションした後に自動的に削除することが出来る。メソッド名の後には5つくらいメソッドに渡す引数を指定することが出来る。</p> <p>この例だとシーン上で行っているが、実際にはnode自体のスクリプト上でやった方がシンプルだと思う。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/en/3.1/classes/class_tween.html">Tween — Godot Engine latest documentation</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15531 2019-11-06T09:54:55+09:00 2019-11-06T09:54:55+09:00 https://crieit.net/posts/Godot-ScrollContainer GodotのScrollContainerを使ってスマホでスワイプ出来ない場合 <p>GodotのScrollContainerはその下にContainerを入れておくとそのサイズによって勝手にスクロールをしてくれる便利なもの。しかし実際に試してみるとPCのデバッグ時にはマウスホイールでスクロールできるのに、実際にスマホで試してみるとスワイプしてみてもスクロールできない、ということがある。</p> <h2 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h2> <p>原因は、ScrollContainerの下に入れてあるContainerがスワイプのイベントを全部取ってしまっているため。</p> <h2 id="修正方法"><a href="#%E4%BF%AE%E6%AD%A3%E6%96%B9%E6%B3%95">修正方法</a></h2> <p>下のContainerはイベントを取らないようにする。具体的には下記の画像のMouse > Filterのところ。デフォルトではStopになっているので、ここをIgnoreにしてイベントを取得しないようにする。Passでもいいらしい。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5dc2198397048.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5dc2198397048.png?mw=700" alt="" /></a></p> <p>たしかになんか他のフレームワークでも同じような現象よくあるような気がする。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15530 2019-11-06T09:47:35+09:00 2019-11-07T10:02:50+09:00 https://crieit.net/posts/Godot-Node Godotで他のNodeを取得する <p>Godotでコードを書いていると、他のNodeを操作したり取得したりという連携が必要になる場合がある。その際に他の要素を取得するための方法。</p> <h2 id="指定して取得"><a href="#%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%8F%96%E5%BE%97">指定して取得</a></h2> <p><code>get_node</code>メソッドで取得できる。下記のような感じで自分の位置からの相対パス、絶対パスを指定できる。</p> <pre><code class="python">var node = get_node('../SelectBox/TrainsScrollContainer/Container') </code></pre> <p>ドルマークをつけて直接アクセスする方法もあるっぽい。</p> <pre><code class="python">$SelectBox/TrainsScrollContainer/Container.visible = false </code></pre> <h2 id="親を取得"><a href="#%E8%A6%AA%E3%82%92%E5%8F%96%E5%BE%97">親を取得</a></h2> <p>親を取得したいときもある。たとえばモーダルの閉じるボタンとか。</p> <pre><code class="python">var parent = get_parent().visible = false </code></pre> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://docs.godotengine.org/en/3.1/classes/class_node.html">Node — Godot Engine latest documentation</a></p> だら@Crieit開発者