<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>3D入門講座 on Godot 4 レシピ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/index.html</link><description>Recent content in 3D入門講座 on Godot 4 レシピ</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sat, 09 Mar 2019 05:22:12 -0700</lastBuildDate><atom:link href="https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/index.xml" rel="self" type="application/rss+xml"/><item><title>3Dエディター</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_01/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_01/index.html</guid><description>&lt;p&gt;本チュートリアルでは、以下のGodotで3D制作を始める方法について解説します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3Dエディタ内での移動方法&lt;/li&gt;
&lt;li&gt;3Dオブジェクトの作成と操作方法&lt;/li&gt;
&lt;li&gt;カメラやライティングなど、Godotの基本的な3Dノードの使い方&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="準備はok"&gt;準備はOK？&lt;/h3&gt;
&lt;p&gt;注意点として、3D開発は2D制作と比べて格段に複雑になる場合があります。ノードの操作やスクリプト記述、ロジック／データ管理など、多くの基本原則は同じですが、3Dではその他にも考慮すべき要素が数多くあります。そのため、最初の数プロジェクトは2Dで進めることをオススメし、ゲーム開発プロセスをしっかり理解した上で3Dに移行すると良いでしょう。このチュートリアルでは、&lt;a href="https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/index.html" target="_blank"&gt;公式Godotチュートリアル&lt;/a&gt;にあるような初心者向けGodot 2Dプロジェクトを既に作ったことがあることを前提としています。&lt;/p&gt;
&lt;h2 id="3d制作を始めるための基本ガイド"&gt;3D制作を始めるための基本ガイド&lt;/h2&gt;
&lt;p&gt;Godotの大きな強みの一つは、2Dゲームと3Dゲームの両方を開発できる点です。これまで2Dプロジェクトで習得した知識（ノード、シーン、シグナルなど）の多くは3D環境でも同様に適用できますが、同時に全く新しいレベルの複雑さと機能も追加されています。まず初めに、3Dエディターウィンドウで利用できる新機能をご紹介します。&lt;/p&gt;
&lt;h2 id="3d空間での方向把握"&gt;3D空間での方向把握&lt;/h2&gt;
&lt;p&gt;Godotで新しいプロジェクトを初めて開くと、3Dプロジェクトビューが表示されます。&lt;/p&gt;
&lt;!-- &lt;figure&gt;&lt;img src="https://kamera25.github.io/godot_recipes/4.x/godot_recipes/img/3d_intro_01.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;3D view&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
--&gt;
&lt;p&gt;
&lt;a href="#image-2a188d681cb16ae462da22de9024811d" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_workspace.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-2a188d681cb16ae462da22de9024811d"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_workspace.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まず最初に注目すべきは、中心に配置された3本の色分け軸です。
これらは&lt;strong&gt;x軸&lt;/strong&gt;（赤色）、&lt;strong&gt;y軸&lt;/strong&gt;（緑色）、&lt;strong&gt;z軸&lt;/strong&gt;（青色）を表しています。これらが交わる点を &lt;em&gt;原点&lt;/em&gt; と呼び、座標値は&lt;code&gt;(0, 0, 0)&lt;/code&gt;です。なお、この配色は他のインスペクタ画面でも一貫したルールで適用されていることに気づくでしょう。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;異なる3Dアプリケーションでは、座標軸の向きに関してそれぞれ独自の規約を採用しています。
Godotでは&lt;strong&gt;Y軸上方&lt;/strong&gt;方式を採用しているため、座標軸を見た場合、&lt;strong&gt;x軸&lt;/strong&gt;が左右方向を指すとき、&lt;strong&gt;y軸&lt;/strong&gt;は上下方向を、&lt;strong&gt;z軸&lt;/strong&gt;は前後方向を示します。
他の多くの人気3Dソフトウェアでは&lt;strong&gt;Z軸上方&lt;/strong&gt;方式が使われています。アプリケーション間を行き来する際には、この違いを把握しておくことが重要です。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3D空間での移動操作は、マウスとキーボードを使用して行います。以下に、ビューカメラの基本コントロールについて説明します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;マウスホイール上下&lt;/em&gt;：拡大／縮小表示・縮小表示切り替え&lt;/li&gt;
&lt;li&gt;中ボタン＋ドラッグ操作_：現在のターゲットを中心にカメラを周回移動&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Shift + 中ボタン＋ドラッグ操作&lt;/em&gt;：カメラ視点を平行移動&lt;/li&gt;
&lt;li&gt;&lt;em&gt;右クリック＋ドラッグ操作&lt;/em&gt;：その場でカメラ向きを回転&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さらに、もし人気のある3Dゲームに慣れているなら、 &lt;em&gt;フリールックモード&lt;/em&gt; が適しているかもしれません。これは &lt;em&gt;Shift+F&lt;/em&gt; キーで切り替えできます。このモードでは以下の操作ができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WASDキーを使ってシーン内を自由に移動しながら視点を変更&lt;/li&gt;
&lt;li&gt;マウスを使ってカメラの狙いを調整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、左上隅の &lt;code&gt;[透視投影]&lt;/code&gt; をクリックすることで特定の向きにカメラ視点を変更できます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-b1340f416a5552987591fcd7a41ae432" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_intro_perspective.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-b1340f416a5552987591fcd7a41ae432"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_intro_perspective.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="3dオブジェクトの追加方法"&gt;3Dオブジェクトの追加方法&lt;/h2&gt;
&lt;p&gt;では、最初の3Dノードを追加してください。2Dノードがすべて&lt;i class="gd-Node2D"&gt;&lt;/i&gt;&lt;code&gt;Node2D&lt;/code&gt;を継承しているのと同様に、
&lt;code&gt;position&lt;/code&gt;や&lt;code&gt;rotation&lt;/code&gt;などのプロパティを提供しているように、3Dノードは&lt;i class="gd-Node3D"&gt;&lt;/i&gt;&lt;code&gt;Node3D&lt;/code&gt;を継承しており、同じプロパティの3Dバージョンを提供しています。シーンに1つ追加すると、原点位置に以下のオブジェクトが表示されるでしょう。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-d45122d87b2a72e6fe4bbd5ab3c2a6aa" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_gizmo.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-d45122d87b2a72e6fe4bbd5ab3c2a6aa"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_gizmo.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このオブジェクトはノードではありません。3D &lt;em&gt;ギズモ&lt;/em&gt; と呼ばれるものです。ギズモとは、空間内でオブジェクトを移動・回転させるためのツールです。3つのリングで回転操作を行い、3本の矢印でオブジェクトを各軸方向に平行移動させます。なお、リングと矢印はそれぞれ対応する軸の色に合わせて配色されています。&lt;/p&gt;
&lt;p&gt;数分間かけて操作に慣れ、機能の使い方に慣れてください。もし迷ってしまったら、「元に戻す」機能を使ってみてください。&lt;/p&gt;
&lt;div class="box notices cstyle tip"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-lightbulb"&gt;&lt;/i&gt; ヒント&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;ギズモを煩わしく感じる場合は、モードアイコンをクリックすれば、「移動」「回転」「スケール(拡大縮小)」に限定できます。
&lt;a href="#image-d8f92929f67bf089381e83d438e208c8" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_intro_mode_buttons.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-d8f92929f67bf089381e83d438e208c8"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_intro_mode_buttons.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;</description></item><item><title>3Dオブジェクトのインポート</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_02/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_02/index.html</guid><description>&lt;p&gt;最終パートでは、3Dプロジェクトを開始し、3D空間のナビゲーション方法とオブジェクト作成について学びました。このセクションでは、自分で作成したまたはダウンロードした既存の3Dオブジェクトのインポート方法と、Godotのより高度な3Dノード機能の使い方をマスターしましょう。&lt;/p&gt;
&lt;h2 id="3dオブジェクトのインポート方法"&gt;3Dオブジェクトのインポート方法&lt;/h2&gt;
&lt;p&gt;Blenderなどの3Dモデリングソフトに慣れている方なら、ゲーム用のモデルを作成することもできます。そうでない場合でも、特定のゲームタイプ向けに作られたオブジェクトや、複数のオブジェクトがセットになったコレクションをダウンロードできるリソースは数多くあります。個人的にオススメするフリーゲームアートの制作者の一つに&lt;a href="https://kenney.nl/" target="_blank"&gt;Kenney.nl&lt;/a&gt;があります。&lt;/p&gt;
&lt;p&gt;チュートリアルで使用するのはKenneyの「&lt;em&gt;プラットフォーマーキット&lt;/em&gt;」です。こちらからダウンロードできます。&lt;a href="https://kenney.nl/assets/platformer-kit" target="_blank"&gt;https://kenney.nl/assets/platformer-kit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このキットには、Godotの3Dスキルを習得するために使用できる豊富なオブジェクトが揃っています。以下にキットの外観サンプルをご紹介します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-df257ae95e7777768bd8c1ea4335d986" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/kenney_3d_platform_sample.png?width=100" alt="alt" style="height: auto; width: 100;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-df257ae95e7777768bd8c1ea4335d986"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/kenney_3d_platform_sample.png?width=100" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ダウンロードしたキットを開くと、内部にはさまざまな形式のオブジェクトが含まれています。Godotは複数のフォーマットを使用できますが、このパックではGLTFが利用可能であるため、他の形式よりも推奨されます。&lt;code&gt;GLTF format&lt;/code&gt;フォルダをそのままGodotプロジェクトフォルダにコピーし、ファイル名を「platformer_kit」にリネームしてください。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; 3Dファイル形式について&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;自分でモデルを作成する場合も、外部でダウンロードしたデータを使用する場合も、それがGodot環境で正しく読み込める形式で保存されている必要があります。Godotは以下の主要な3Dファイル形式をサポートしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;glTF&lt;/strong&gt; - &lt;code&gt;.gltf&lt;/code&gt;（テキスト形式）と&lt;code&gt;.glb&lt;/code&gt;（バイナリ形式）の両方に対応&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DAE (Collada)&lt;/strong&gt; - 古いフォーマットながら現在もサポート継続中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OBJ (Wavefront)&lt;/strong&gt; - こちらも旧式フォーマットですが、現代の他のフォーマットに比べると使える機能に制限があります&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FBX&lt;/strong&gt; - 商用フォーマットであり、限定的な互換性しか備えていません&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Godotウィンドウに戻ると、フォルダのスキャンとオブジェクトのインポート処理中に進捗バーが表示されます。その中の一つをクリックして中身を確認してみます。&lt;strong&gt;ファイルシステム&lt;/strong&gt;タブで、&lt;code&gt;crate.glb&lt;/code&gt;をダブルクリックしてください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-6ab2f6c2f4d806a2907149d6ee097073" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_import.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-6ab2f6c2f4d806a2907149d6ee097073"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_import.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここでオブジェクトがシーンとしてインポートされ、ルートのが &lt;i class="gd-Node3D"&gt;&lt;/i&gt;&lt;code&gt;Node3D&lt;/code&gt; に設定され、「Scene Root」という名前になっていることを確認できます。これらを変更してください。ルートの型を &lt;i class="gd-RigidBody3D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody3D&lt;/code&gt; に、ルート名を「Crate」に設定したら、「再インポート」ボタンをクリックしてください。&lt;/p&gt;
&lt;p&gt;次に「crate.glb」を右クリックし、&lt;strong&gt;新しい継承シーン&lt;/strong&gt;を選択します。ここでクラシックなゲームオブジェクトである箱が登場します。シーンのルートノードは、求めていた通り「Crate」という名前の&lt;i class="gd-RigidBody3D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody3D&lt;/code&gt;となっています。&lt;/p&gt;
&lt;!-- より適切な方法は、コンテナ要素を親ノードの中心座標に合わせて配置することです。こうすることで、`RigidBody`が自身の重心を軸に回転すると、メッシュも同時に回転するようになります。この問題を解決するには、`MeshInstance`ノードを選択して、_移動プロパティ_を `(-0.5, -0.25, 0.5)` に設定してください。 --&gt;
&lt;p&gt;最後に、ボディに衝突形状を追加する必要があります。通常は 2D ゲームで行うように &lt;i class="gd-CollionShape3D"&gt;&lt;/i&gt; &lt;code&gt;CollionShape3D&lt;/code&gt;を追加することも可能ですが、より効率的な方法があります。&lt;/p&gt;
&lt;p&gt;メッシュ &lt;code&gt;crate2&lt;/code&gt; を選択すると、ビューポート上部に &lt;strong&gt;Mesh&lt;/strong&gt; メニューが表示されます。クリックして「コリジョンシェイプを作成」から「Collision Shape Placement」で&lt;strong&gt;兄弟&lt;/strong&gt; を選択してください。Godotは自動的にメッシュに対応した衝突形状の &lt;i class="gd-CollionShape3D"&gt;&lt;/i&gt;&lt;code&gt;CollionShape3D&lt;/code&gt; を追加してください。&lt;/p&gt;
&lt;p&gt;これでオブジェクトの設定は完了です。&lt;code&gt;Crate&lt;/code&gt;シーンを保存して、実際にどのように使用できるか見てみてください。&lt;/p&gt;
&lt;h2 id="3dシーンの構築"&gt;3Dシーンの構築&lt;/h2&gt;
&lt;p&gt;&lt;i class="gd-Node3D"&gt;&lt;/i&gt;&lt;code&gt;Node3D&lt;/code&gt;をルートとして新規シーンを作成します。最初に追加する子オブジェクトは、木箱を積み上げるための「地面」機能を提供するものです。&amp;ldquo;Ground&amp;quot;という名前の &lt;i class="gd-StaticBody3D"&gt;&lt;/i&gt;&lt;code&gt;StaticBody3D&lt;/code&gt;を作成し、それに &lt;i class="gd-MeshInstance3D"&gt;&lt;/i&gt;&lt;code&gt;MeshInstance3D&lt;/code&gt;を追加してください。&lt;strong&gt;メッシュ&lt;/strong&gt; プロパティから 新規で「BoxMesh」 を選択し、クリックしてそのプロパティを開きます。&lt;strong&gt;サイズ&lt;/strong&gt; を &lt;code&gt;(10, 0.1, 10)&lt;/code&gt; に設定することで、広々とした表面を確保できます。ただし、白色一色では見た目がやや単調になるため、もう少し工夫を加えます。&lt;/p&gt;</description></item><item><title>3Dキャラクターを作る</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_03/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_03/index.html</guid><description>&lt;p&gt;前回の解説では、3Dオブジェクトのインポート方法とシーン内での配置方法について取り上げました。今回のチュートリアルでは、さらにオブジェクトを追加し、ユーザー操作可能なキャラクターも実装していきます。&lt;/p&gt;
&lt;h2 id="シーンの構築"&gt;シーンの構築&lt;/h2&gt;
&lt;p&gt;引き続き、&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_02/"&gt;パート2&lt;/a&gt;でダウンロードしたKenney Platformer Kitを使用します。すべての&lt;code&gt;block*.glb&lt;/code&gt;ファイルを選択し、&lt;strong&gt;インポート&lt;/strong&gt;タブでその&lt;strong&gt;ルートの型&lt;/strong&gt;を&lt;i class="gd-StaticBody3D"&gt;&lt;/i&gt;&lt;code&gt;StaticBody3D&lt;/code&gt;に設定してください。&lt;strong&gt;ルート名&lt;/strong&gt;プロパティはチェックを外しておき、&lt;strong&gt;再インポート&lt;/strong&gt;をクリックします。&lt;code&gt;blockLarge.glb&lt;/code&gt;を選択して新しい継承シーンを作成します。前回のチュートリアルと同様に、メニューからメッシュに対して &lt;strong&gt;「Collision Shape Placement」で兄弟&lt;/strong&gt; オプションを使いましょう。これでシーンを保存できます。また別にフォルダを作成することをオススメします。なぜなら、すぐに様々な形状のプラットフォームパーツを表すシーンが大量に出来上がるからです。&lt;/p&gt;
&lt;p&gt;前のステップで作成した「Ground」平面と木箱を含むシーンを開いてください。
まず、木箱を削除し、大型ブロックのインスタンスを追加してください。これらのブロックを整列させて配置できるようにしたいので、以下の手順を実行してください。
ビューポート上部の「Transform」メニューから「スナップ設定」を選択します → &lt;em&gt;移動スナップ&lt;/em&gt; を &lt;code&gt;0.5&lt;/code&gt; に設定します。
次に、「スナップモード」ボタンをクリックするか（または &lt;strong&gt;&lt;code&gt;Y&lt;/code&gt;&lt;/strong&gt; キーを押す）ことでスナップモードを有効にします。これでブロックを複製し、ドラッグして配置できるようになります。&lt;/p&gt;
&lt;p&gt;ご希望であれば、他のプラットフォームブロック用のシーンを追加し、
魅力的なレベルに構成してみます。創造力を発揮してください！&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-ae1a70be9cb3f74319b90e9d0bc00c94" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_scene_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-ae1a70be9cb3f74319b90e9d0bc00c94"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_scene_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="キャラクターの追加方法"&gt;キャラクターの追加方法&lt;/h2&gt;
&lt;p&gt;次に、プラットフォーム上を歩き回れるようにキャラクターを作成します。
新しいシーンを開き、&amp;ldquo;Character&amp;quot;という名前の&lt;i class="gd-CharacterBody3D"&gt;&lt;/i&gt;&lt;code&gt;CharacterBody3D&lt;/code&gt;コンポーネントを追加してください。この&lt;code&gt;PhysicsBody&lt;/code&gt;ノードは2D版とほぼ同じ動作をします（2Dチュートリアルはお済みですか？）。このコンポーネントには&lt;code&gt;move_and_slide()&lt;/code&gt;メソッドが用意されており、これを使って移動と衝突検出を行います。&lt;/p&gt;
&lt;p&gt;メッシュインスタンス3D用のカプセル型&lt;i class="gd-MeshInstance3D"&gt;&lt;/i&gt;&lt;code&gt;MeshInstance3D&lt;/code&gt;と、それに対応させた衝突形状&lt;i class="gd-CollionShape3D"&gt;&lt;/i&gt;&lt;code&gt;CollionShape3D&lt;/code&gt;を追加してください。また、メッシュに&lt;code&gt;StandardMaterial3D&lt;/code&gt;を追加して&lt;strong&gt;アルベド/カラー&lt;/strong&gt;プロパティを設定すれば、色を変更できることも覚えておいてください。&lt;/p&gt;
&lt;p&gt;カプセル自体は良好ですが、回転方向を正確に把握するのは困難です。そこで、もう一つのメッシュを追加してください。今回は &lt;code&gt;CylinderMesh3D&lt;/code&gt; 形状を使用します。
&lt;strong&gt;Top Radius&lt;/strong&gt; を &lt;code&gt;0.2&lt;/code&gt;、&lt;strong&gt;Bottom Radius&lt;/strong&gt; を &lt;code&gt;0.001&lt;/code&gt;、&lt;strong&gt;Height&lt;/strong&gt; を 0.5 に設定し、その後 &lt;strong&gt;x軸&lt;/strong&gt; 回転を &lt;code&gt;-90&lt;/code&gt;度に変更します。これで円錐形の形状が完成します。ボディから外側に向かって伸びるように、このメッシュを配置してください。その際、&lt;em&gt;負方向&lt;/em&gt;の &lt;strong&gt;z軸&lt;/strong&gt; に沿って配置します（ギズモの矢印が正方向に表示されている方が、マイナス方向です）。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-b3675e64144cbdb6747d4b8ed9d84923" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_character_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-b3675e64144cbdb6747d4b8ed9d84923"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_character_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この画像では、さらにキャラクター性を高めるために、目用に2つの球状メッシュを追加しています。ご自由にお好みのディテールを追加してください。&lt;/p&gt;
&lt;p&gt;シーンに &lt;i class="gd-Camera3D"&gt;&lt;/i&gt;&lt;code&gt;Camera3D&lt;/code&gt; オブジェクトも追加してください。プレイヤーが移動すると追従するように設定します。キャラクターの後方かつ少し上方に配置し、わずかに下向きに角度を調整してください。「プレビュー」ボタンをクリックするとカメラ視点で確認できます。&lt;/p&gt;
&lt;p&gt;スクリプトを追加する前に、「プロジェクト設定」を開き、「インプットマップ」タブで以下の入力を追加してください。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;アクション&lt;/th&gt;
&lt;th style="text-align: left"&gt;キー&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;move_forward&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;W&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;move_back&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;S&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;strafe_right&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;strafe_left&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;jump&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Space&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;それでは、ボディ部分にスクリプトを追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;CharacterBody3D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; gravity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ProjectSettings&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_setting&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;physics/3d/default_gravity&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4.0&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# movement speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; jump_speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;6.0&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# determines jump height&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; mouse_sensitivity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.002&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# turning speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;get_input&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; input &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_vector&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;strafe_left&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;strafe_right&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;move_forward&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;move_back&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; input&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; speed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; input&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;y &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; speed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_physics_process&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;delta&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;y &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;gravity &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;get_input&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;move_and_slide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_physics_process()&lt;/code&gt;内のコードは非常にシンプルです。重力を加えて &lt;strong&gt;Y方向（下向き）&lt;/strong&gt; に加速し、&lt;code&gt;get_input()&lt;/code&gt;を呼び出して入力をチェックした後、&lt;code&gt;move_and_slide()&lt;/code&gt;を使用して速度ベクトルの方向に移動させます。&lt;/p&gt;</description></item><item><title>エッジ検出 &amp; マウスキャプチャ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_05/index.html</link><pubDate>Sat, 09 Mar 2019 05:22:12 -0700</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_05/index.html</guid><description>&lt;p&gt;このパートでは、オブジェクト間の接触を検出するためにArea3Dノードを活用する方法を学びました。コインや弾丸、スパイクなどのアイテムをキャラクターが操作できるように実装しました。では更に改良点を見ていきましょう：マウスイベントの取得機能の追加、コインアニメーションの実装、そしてキャラクターが落ちないようにエッジ検出を実装します。&lt;/p&gt;
&lt;h2 id="マウスのキャプチャ"&gt;マウスのキャプチャ&lt;/h2&gt;
&lt;p&gt;マウス操作における一つの問題点は、マウスを画面横から横へ移動させる過程で、最終的にゲームウィンドウの枠を越えて画面上部まで移動してしまうことです。この問題を解決するためには、「マウスカーソルをロックする」必要があります。しかし、これを実装すると、ウィンドウのクローズやその他の操作ができなくなり、完全にマウスが使えなくなってしまいます！再びマウスを自由に使えるようにする仕組みが必要になります。&lt;/p&gt;
&lt;p&gt;まず、マウスをキャプチャするには、メインシーンに以下を追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_ready&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_CAPTURED&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定で最初の部分が完了しました。これでマウスがゲームウィンドウに捕捉されます。次に、「Esc」キーを押したときにマウス操作を再開させる必要があります。これもメインスクリプトに追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_input&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;event&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; event&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;ui_cancel&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_VISIBLE&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ゲームを実行して実際に試してみます。&lt;/p&gt;
&lt;p&gt;マウス操作がキャプチャされていない場合はその動きを無視するようにします。キャラクタースクリプト内で、&lt;code&gt;_unhandled_input()&lt;/code&gt; 関数内の該当行を変更してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; event &lt;span style="color:#81a1c1;font-weight:bold"&gt;is&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;InputEventMouseMotion&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_CAPTURED&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;現在別の問題が発生しています。「Esc」キーを押した後、キャプチャ状態に戻る手段がありません。以下の方法でこれを解決します。ウィンドウをクリックすると：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_input&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;event&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; event&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;ui_cancel&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_VISIBLE&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; event&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;shoot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_VISIBLE&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_CAPTURED&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この実装は問題なく動作しますが、マウスクリックを再取得するためにクリックすると、同時に弾丸も発射されてしまいます。これはマウスクリックでも同様の処理が行われるためです。これを解決するには、入力イベントを「処理済み」としてマークし、Godotが他のノードにこのイベントを渡さないようにすればよいでしょう。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; event&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;shoot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_VISIBLE&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_mouse_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;MOUSE_MODE_CAPTURED&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;get_tree&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_input_as_handled&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;現在は、最初のクリックでマウスをキャプチャしても、弾丸が発射されることはありません。&lt;/p&gt;
&lt;h2 id="アニメーション付きコイン"&gt;アニメーション付きコイン&lt;/h2&gt;
&lt;p&gt;現在の手順では、前回作成したコインアセットをより動的で魅力的なものに仕上げていきます。&lt;code&gt;Coin.tscn&lt;/code&gt;ファイルを開き、シーンにAnimationPlayerを追加してください。&lt;/p&gt;
&lt;p&gt;「アニメーション」ボタンをクリックして、「新規作成」を選択し、
「bounce」という名前の新しいアニメーションを作成してください。1秒の再生時間で十分ですが、ループ機能を有効にすることを忘れないでください。&lt;/p&gt;
&lt;p&gt;コインの2つのプロパティをアニメーション化します。位置（&lt;strong&gt;Y&lt;/strong&gt;軸方向、上下）と回転です。スクラバーが時刻&lt;code&gt;0&lt;/code&gt;にあることを確認し、両方の［変換］と［回転角度］にキーフレームを追加してください。&lt;/p&gt;
&lt;p&gt;スクラバーを&lt;code&gt;0.5&lt;/code&gt;秒の位置に移動させ、翻訳ベクトルの &lt;strong&gt;Y&lt;/strong&gt; 成分を&lt;code&gt;0.3&lt;/code&gt;に設定し、キーフレームボタンをクリックします。次に、スクラバーを&lt;code&gt;1.0&lt;/code&gt;まで完全に動かし、回転を &lt;strong&gt;Y&lt;/strong&gt; 軸方向で &lt;code&gt;180&lt;/code&gt;° の時点でキーフレーム化します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-ef91a34019500c3143c9a54d72c81d2f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_05_02.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-ef91a34019500c3143c9a54d72c81d2f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_05_02.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;アニメーションの仕上がりを確認するには「再生」ボタンを押してください。各個別キーフレームをクリックして、イージング値を調整してみます。&lt;/p&gt;
&lt;p&gt;最後に、「自動再生」ボタンをクリックして、ゲームを実行するとアニメーションが自動的に開始されるようにしてください。&lt;/p&gt;
&lt;h2 id="エッジ検出"&gt;エッジ検出&lt;/h2&gt;
&lt;p&gt;最後に、キャラクターが崖から転落して命を落とすのを防げるか試してみよう。&lt;/p&gt;
&lt;p&gt;以下の手順で進めてください。&lt;/p&gt;
&lt;p&gt;まず、プレイヤーノードに&lt;code&gt;RayCast&lt;/code&gt;ノードを追加してください。これは細い青色の線として表示されます。デフォルトでは、&lt;em&gt;キャスト方向&lt;/em&gt; プロパティは &lt;code&gt;(0, -1, 0)&lt;/code&gt; に設定されており、下向きを指しています。これは正しい設定ですが、さらに前方に移動させて、キャラクターの&lt;em&gt;前面&lt;/em&gt;に向かって下向きを指すようが必要です。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-4b431d3be7da2af7f38dc08da7e7b992" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_05_01.png?width=250" alt="alt" style="height: auto; width: 250;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-4b431d3be7da2af7f38dc08da7e7b992"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_05_01.png?width=250" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;さらに、[有効]プロパティも確認してください。これをチェックしないと、レイキャストは機能しません。&lt;/p&gt;
&lt;p&gt;スクリプト側では、前進時にレイキャストが障害物に衝突していないか確認し、安全に移動できるかを判断します。&lt;/p&gt;
&lt;p&gt;現在の状況は以下の通りです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;move_forward&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; velocity &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; speed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;レイが衝突している場合、速度のみを加算する方法を試してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;move_forward&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; $RayCast&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_colliding&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; velocity &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; speed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;試してみてください。端まで近づくと止まりますが、ちょっと待ってください - ジャンプして前進したことはありますか？今や空中にいるときは前方への移動がキャンセルされます！
一からやり直しです。&lt;/p&gt;</description></item><item><title>CSGを使う</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_06/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_06/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これまで、インポートしたモデルを使って3D環境を設計する方法を見てきました。では、壁やドア、スロープなどの要素を含む部屋のようなものを作りたい場合、すでに適切なモデルがない場合どうすればいいでしょうか？そこで活躍するのがCSGです！&lt;/p&gt;
&lt;h2 id="csgとは何ですか"&gt;CSGとは何ですか？&lt;/h2&gt;
&lt;p&gt;CSGは&lt;strong&gt;Constructive Solid Geometry&lt;/strong&gt;（空間領域構成法）の略です。これにより、基本的な形状を組み合わせて複雑な立体図形を構築できます。形状は、&lt;em&gt;ユニオン（結合）&lt;/em&gt;、&lt;em&gt;インターセクション（交差）&lt;/em&gt;、&lt;em&gt;サブトラクション（減算）&lt;/em&gt; といった論理演算によって組み合わせることができます。&lt;/p&gt;
&lt;p&gt;CSGは環境やゲームオブジェクトのプロトタイピングに最適なツールです。このチュートリアルの後半では、この技術を活用して、スロープや壁、プラットフォームを備えたシンプルなFPS風レベルを作成します。&lt;/p&gt;
&lt;p&gt;その前に、まずCSGノードの動作原理について簡単にご説明します。&lt;/p&gt;
&lt;h2 id="csgの基本概念"&gt;CSGの基本概念&lt;/h2&gt;
&lt;p&gt;新しいシーンを &lt;code&gt;Node3D&lt;/code&gt; ルートで作成し、その後子ノードを追加して検索ボックスに「CSG」と入力してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-2d0c6486a4dd97a77eb96279d60af93a" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_01.png?width=400" alt="alt" style="height: auto; width: 400;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-2d0c6486a4dd97a77eb96279d60af93a"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_01.png?width=400" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下が利用可能なCSG形状です。開始するには&lt;code&gt;CSGBox&lt;/code&gt;を選択してください。以下のような基本キューブメッシュが表示されます。
プロパティは以下の通りです。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-af3d7a9ecd93691bc44ad553d70152cc" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_02.png?width=200" alt="alt" style="height: auto; width: 200;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-af3d7a9ecd93691bc44ad553d70152cc"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_02.png?width=200" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;操作プロパティは、CSG形状の組み合わせ方法を決定するものです。選択可能なオプションは以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Union(結合)&lt;/strong&gt; - 図形が統合され、内側の領域は削除されます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intersection(交差)&lt;/strong&gt; - 重なっている部分のみ保持されます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subtraction(差集合)&lt;/strong&gt; - 2つ目の形状が1つ目の形状から「切り取られ」ます。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSG操作は子形状を追加することで行われます。&lt;code&gt;CSGBox&lt;/code&gt;に&lt;code&gt;CSGCylinder&lt;/code&gt;の子要素を追加してください。上部のサイズハンドル（オレンジ色のドット）をドラッグして少し高さを変更できます。さらに、プロパティ_Sides_を増やすことでより円筒形に近い見た目になります（ここでは値を&lt;code&gt;20&lt;/code&gt;に設定しています）：&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-82d0bb83bf8ee38b5056bf48cce67179" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_03.png?width=200" alt="alt" style="height: auto; width: 200;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-82d0bb83bf8ee38b5056bf48cce67179"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_03.png?width=200" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;デフォルトでは、形状の演算は［結合］に設定されています。円柱形状がキューブに
［追加］されようとしています。これを［交差］に変更してみてください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-950da4cfbb8efc9e2d3e556900c46789" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_04.gif?width=200" alt="alt" style="height: auto; width: 200;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-950da4cfbb8efc9e2d3e556900c46789"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_04.gif?width=200" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「減算」について説明します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-5a51c4fb1bf27633b7aa2aeea51a1398" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_05.gif?width=200" alt="alt" style="height: auto; width: 200;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-5a51c4fb1bf27633b7aa2aeea51a1398"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_05.gif?width=200" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これら3つの操作を通じて、複雑な形状を作成する可能性がすでにお分かりいただけたことでしょう。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-c4fa64e2ae912ddece04c5126f4b0dc5" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_06.png?width=300" alt="alt" style="height: auto; width: 300;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-c4fa64e2ae912ddece04c5126f4b0dc5"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_06_06.png?width=300" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="csgcombiner"&gt;CSGCombiner&lt;/h3&gt;
&lt;p&gt;このノードは「空の」形状です。図形を整理する際に使用します。&lt;code&gt;CSGCombiner&lt;/code&gt; の子要素は、上記と同様のルールに従って統合されます。&lt;/p&gt;
&lt;h2 id="部屋の構築"&gt;部屋の構築&lt;/h2&gt;
&lt;p&gt;以下の機能を備えた実用的なシーンを作成しましょう：障害物を配置した広い部屋と、キャラクターが操作可能で、今後のチュートリアルで活用できる要素。まず、作業を開始できるルートノードとして &lt;code&gt;Node3D&lt;/code&gt; を持つ新しいシーンを作成してください。&lt;/p&gt;
&lt;p&gt;まず &lt;code&gt;CSGBox&lt;/code&gt; を作成し、以下のプロパティを設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;幅 (Width) と奥行き (Depth) を &lt;code&gt;20&lt;/code&gt; に設定&lt;/li&gt;
&lt;li&gt;高さ (Height) を &lt;code&gt;5&lt;/code&gt; に設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このボックスは内部に侵入するものとして扱う必要があるため、[面反転] (Invert Faces) プロパティも有効にしてください。これにより形状が反転し、内側の壁面が外側になります。さらに、[衝突機能使用] (Use Collision) プロパティもチェックしてください。これにより、物理エンジンはこの形状を静止物体オブジェクトとして適切に処理します。&lt;/p&gt;</description></item><item><title>一人称キャラクター</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_07/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/g101/3d/101_3d_07/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;今回の連載では、一人称視点キャラクターの作成方法について解説します。前回作成したCSGベースのレベルを歩行テスト用のステージとして使用し、移動機能を検証していきます。&lt;/p&gt;
&lt;h2 id="キャラクターシーン"&gt;キャラクターシーン&lt;/h2&gt;
&lt;p&gt;FPSや類似ゲームにおいて、プレイヤーに「キャラクターの目を通して世界を見ている」という臨場感を与えたいものです。素晴らしい点は、最初はモデル自体が必ずしも必要ではないという点です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CharacterBody3D&lt;/code&gt; オブジェクトを用意します。このオブジェクトに以下の2つの &lt;code&gt;CollisionShape&lt;/code&gt; ノードを追加してください。「ボディ用」と「足用」です。また、&lt;code&gt;カメラ&lt;/code&gt;も必要ですが、回転処理には注意が必要です。&lt;em&gt;キャラクター&lt;/em&gt;は&lt;strong&gt;Y軸&lt;/strong&gt;に沿ってのみ回転し、一方でカメラのみが&lt;strong&gt;X軸&lt;/strong&gt;方向に回転する必要があります（上下方向の視点移動のため）。これを実現するために、新たに &lt;code&gt;Node3D&lt;/code&gt; オブジェクトを作成し、「ピボット」と呼ぶことにします。このピボットノードに&lt;code&gt;Camera&lt;/code&gt;を追加してください。&lt;/p&gt;
&lt;p&gt;「Body」衝突形状はプレイヤーの身体を表現するものです。ここでは &lt;code&gt;CapsuleShape&lt;/code&gt; を使用します（&lt;strong&gt;X&lt;/strong&gt; 軸を中心に&lt;code&gt;90&lt;/code&gt;度回転させて設定）。半径を&lt;code&gt;0.5&lt;/code&gt;、高さを&lt;code&gt;1&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CapsuleShape&lt;/code&gt;を使用する際の問題点は、底面が丸みを帯びている点です。これは小さな障害物を自然に乗り越える際には便利ですが、同時に、プレイヤーが表面の縁に立った場合に「不自然に転がり落ちる」という問題を引き起こします。この問題を解決するには、衝突判定用に｢&lt;code&gt;BoxShape&lt;/code&gt;｣を使用することが有効です。ボックスの範囲は&lt;code&gt;(0.4, 0.1, 0.4)&lt;/code&gt;とし、カプセルシェイプの底面より少し上に位置するように配置します。これにより、物体を乗り越えるための丸みを帯びた底面を確保しつつ、箱型形状のおかげで段差から滑り落ちるのを防ぐことができます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pivot&lt;/code&gt;ノードを少し上に移動させ、カメラが身体の中心から外れて向かないようにします。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-649bdce67032b14d30a12fb3574c2226" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_07_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-649bdce67032b14d30a12fb3574c2226"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_07_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="移動方法"&gt;移動方法&lt;/h2&gt;
&lt;p&gt;移動関連のコードは、本シリーズで先に紹介した サードパーソン型キャラクターと同様です。まずは変数宣言から始めてください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;CharacterBody3D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@onready&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; camera &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $Pivot/Camera
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; gravity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; max_speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; mouse_sensitivity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.002&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# radians/pixel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; velocity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;&lt;code&gt;mouse_sensitivity&lt;/code&gt; の値は、マウスの移動距離（ピクセル単位）を角度回転に変換します。つまり、マウスが1ピクセル移動するごとに、&lt;code&gt;0.002&lt;/code&gt;ラジアン（約&lt;code&gt;0.1&lt;/code&gt;度）だけ回転します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;get_input&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; input_dir &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# desired move in camera direction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;move_forward&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_dir &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;move_back&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_dir &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;strafe_left&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_dir &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Input&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_action_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;strafe_right&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_dir &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_dir &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; input_dir&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;normalized&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; input_dir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;入力を検知した際は、体の向いている方向に移動させたい。&lt;/p&gt;</description></item></channel></rss>