<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>物理 on Godot 4 レシピ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/index.html</link><description>Recent content in 物理 on Godot 4 レシピ</description><generator>Hugo -- gohugo.io</generator><language>ja</language><atom:link href="https://kamera25.github.io/godot_recipes/4.x/ja/physics/index.xml" rel="self" type="application/rss+xml"/><item><title>RigidBody2D で対象物を見る</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/smooth_rigid_rotate/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/smooth_rigid_rotate/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;対象物を観察するため、リジッドに滑らかな回転動作をしたい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;&lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt; の操作は少し複雑です。Godot の物理エンジンで制御されるため、直接移動させるのではなく、力を加える必要があります。リジッドボディを扱う前に、&lt;a href="https://docs.godotengine.org/ja/stable/classes/class_rigidbody2d.html" target="_blank"&gt;RigidBody2D API ドキュメント&lt;/a&gt; を読むことを強くオススメします。&lt;/p&gt;
&lt;p&gt;物体を回転させるには、回転力である&lt;strong&gt;トルク&lt;/strong&gt;を加える必要があります。一度物体が回転し始めたら、最終回転に近づくにつれてトルクを小さくしていきたいものです。&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="https://kamera25.github.io/godot_recipes/4.x/ja/math/dot_cross_product/"&gt;ベクトル: 内積と外積の使い方&lt;/a&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;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;RigidBody2D&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; angular_force &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;50000&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; target &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; position &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;RIGHT
&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; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; dir &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;y&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;dot&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;position&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;direction_to&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;target&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; constant_torque &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; dir &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; angular_force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで&lt;code&gt;transform.y&lt;/code&gt;を使用している理由について疑問に思われるかもしれません。というのも、&lt;code&gt;transform.x&lt;/code&gt;はボディの前方ベクトルを表すからです。もし&lt;code&gt;transform.x&lt;/code&gt;を使用していれば、ドット積が最大となるのはボディが完全にターゲット方向を向いている時になりますが、その時点でトルク値をゼロにしたいです。一方、&lt;code&gt;transform.y&lt;/code&gt;を使用することで、ターゲット方向に完全に揃っていない状態ほどトルク値が増加するようになります。&lt;/p&gt;
&lt;h3 id="リジッドボディを完全にスキップする"&gt;リジッドボディを完全にスキップする&lt;/h3&gt;
&lt;p&gt;リジッドボディを一切回転させないことで、これらの問題をすべて回避できます！代わりに、子スプライトの&lt;code&gt;rotation&lt;/code&gt;プロパティをターゲット方向に合わせるように変更してください。&lt;code&gt;lerp()&lt;/code&gt;関数や&lt;i class="gd-Tween"&gt;&lt;/i&gt;&lt;code&gt;Tween&lt;/code&gt;を使用することで、滑らかにアニメーションさせることが可能になります。&lt;/p&gt;
&lt;p&gt;多くの場合、これは有効な解決策となります。覚えておいてください。基底体の向きは、付属するスプライトと必ずしも揃える必要はないのです！&lt;/p&gt;
&lt;h2 id="関連レシピ"&gt;関連レシピ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/math/dot_cross_product/index.html"&gt;ベクトル演算：内積と外積の活用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/physics/smooth_rigid_move/"&gt;RigidBody2D：目標位置への移動方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CharacterBody3D : 坂道で停止する</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/kinematicbody_slopes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/kinematicbody_slopes/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;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;&lt;i class="gd-KinematicBody3D"&gt;&lt;/i&gt;&lt;code&gt;CharacterBody3D&lt;/code&gt; が坂道を滑り落ちてしまいます。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;まず、最小限の機能で構成された &lt;i class="gd-KinematicBody3D"&gt;&lt;/i&gt;&lt;code&gt;CharacterBody3D&lt;/code&gt; から始め、以下のスクリプトで &lt;code&gt;move_and_slide()&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;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;@export&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;10.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&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;5.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; rot_speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&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;5.0&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:#81a1c1"&gt;.&lt;/span&gt;ZERO
&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; jumping &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&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;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; &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;Vector3&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO
&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;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 &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;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;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 &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;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;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; &lt;span style="color:#88c0d0"&gt;rotate_y&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;rot_speed &lt;span style="color:#81a1c1"&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; &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;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; &lt;span style="color:#88c0d0"&gt;rotate_y&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rot_speed &lt;span style="color:#81a1c1"&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;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; input&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; 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;z
&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; &lt;span style="color:#88c0d0"&gt;get_input&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; 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&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;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;if&lt;/span&gt; jumping &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;is_on_floor&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; jumping &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&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;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_just_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;jump&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:#88c0d0"&gt;is_on_floor&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; jumping &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&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; jump_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>RigidBody2D で目標位置へ移動</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/smooth_rigid_move/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/smooth_rigid_move/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;リジッドボディを目標位置へ移動させたい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;&lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt; の操作は少し複雑です。Godot の物理エンジンで制御されるため、直接移動させるのではなく、力を加える必要があります。リジッドボディを扱う前に、&lt;a href="https://docs.godotengine.org/ja/stable/classes/class_rigidbody2d.html" target="_blank"&gt;RigidBody2D API ドキュメント&lt;/a&gt; を読むことを強くオススメします。&lt;/p&gt;
&lt;p&gt;物体を移動させるには、特定の方向に力を加える必要があります - これが「&lt;em&gt;力&lt;/em&gt;」です。物体が動き始めたら、最終位置に近づくにつれてこの力は徐々に小さくなるようにします。&lt;/p&gt;
&lt;p&gt;この場合、まさに&lt;code&gt;Vector2.distance_to()&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:#616e87;font-style:italic"&gt;# Smoothly move to target&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;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;RigidBody2D&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; linear_force &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&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; target &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; position
&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;_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; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; dist &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; position&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;distance_to&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;target&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; constant_force &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; dir &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; linear_force &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; dist
&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;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt; でこの操作を試みると、物体が目標を通り過ぎてしまうことがわかります。これはオブジェクトの&lt;strong&gt;Linear/Damp&lt;/strong&gt; プロパティによるものです（デフォルト値は &lt;code&gt;1&lt;/code&gt; のプロジェクト設定にあります）。この値は「摩擦」を表しており、力を加えない場合に可動式リジッドボディがどのくらいの速さで停止するかを制御します。この値を大きくすると、物体が目標地点でスムーズに減速するようになります。この値と &lt;code&gt;linear_force&lt;/code&gt; がどのように相互作用するかを調整することで、まさに求めている動きを実現できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="関連レシピ"&gt;関連レシピ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kamera25.github.io/godot_recipes/4.x/physics/smooth_rigid_rotate/"&gt;RigidBody2D: ターゲットに向ける&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>衝突レイヤーとマスク</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/collision_layers/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/collision_layers/index.html</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;衝突レイヤーとマスクは、Godot 4においてどのオブジェクト同士が相互作用するかを制御する上で不可欠な要素です。&lt;/p&gt;
&lt;h3 id="システム"&gt;システム&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Collision Layer(衝突判定レイヤー)&lt;/strong&gt;：オブジェクトが &lt;strong&gt;存在する&lt;/strong&gt; レイヤを指定します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collision Mask(衝突検知マスク)&lt;/strong&gt;：オブジェクトが &lt;strong&gt;衝突を検出する&lt;/strong&gt; 対象のレイヤを指定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="サンプルプロジェクトでの設定例"&gt;サンプルプロジェクトでの設定例&lt;/h3&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;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;&lt;strong&gt;プレイヤー&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;1&lt;/td&gt;
&lt;td style="text-align: left"&gt;2, 3&lt;/td&gt;
&lt;td style="text-align: left"&gt;敵とコインをスキャン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;敵キャラ&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;2&lt;/td&gt;
&lt;td style="text-align: left"&gt;1&lt;/td&gt;
&lt;td style="text-align: left"&gt;プレイヤーをスキャン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;コイン&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;3&lt;/td&gt;
&lt;td style="text-align: left"&gt;(なし)&lt;/td&gt;
&lt;td style="text-align: left"&gt;特にスキャンする必要がない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="セットアップ方法"&gt;セットアップ方法&lt;/h3&gt;
&lt;p&gt;Godot 4では、プロジェクト設定の［レイヤー名］＞［2D物理］でレイヤーに名前を付けられます。これにより、インスペクターでの管理が大幅に効率化されます。&lt;/p&gt;
&lt;h3 id="ノードの選択方法"&gt;ノードの選択方法&lt;/h3&gt;
&lt;p&gt;Godot 4では、ビット操作を容易にするため、&lt;code&gt;get_collision_layer_value(layer_number)&lt;/code&gt;と&lt;code&gt;set_collision_layer_value(layer_number, value)&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:#616e87;font-style:italic"&gt;# Enable layer 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#88c0d0"&gt;set_collision_layer_value&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# Check if masking layer 3&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:#88c0d0"&gt;get_collision_mask_value&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&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"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Scanning layer 3&amp;#34;&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 tip"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-lightbulb"&gt;&lt;/i&gt; Godot 3から4への移行ポイントまとめ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;ul&gt;
&lt;li&gt;レイヤー用インスペクタUIが改善されました&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set_collision_layer_value()&lt;/code&gt;などの新ヘルパーメソッドにより、複雑なビット演算処理(例: &lt;code&gt;1 &amp;lt;&amp;lt; (layer - 1)&lt;/code&gt;)が不要になりました&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>動摩擦</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/kinematic_friction/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/kinematic_friction/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;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;運動キャラクターに摩擦と加速度を加え、より自然な動きを実現したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;多くのゲームにおいて、必ずしも完全な物理シミュレーションを求めているわけではありません。重要なのはアクション性、反応の良さ、そしてアーケードならではの爽快感です。だからこそ、RigidBodyではなくKinematicBodyを選択するのです - これによって物体の動きを直接制御できるようになります。ただし、ある程度の物理的な挙動は必要です。これはつまり、オブジェクトが突然方向を変えたり停止したりしないようにするためです。&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;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;CharacterBody2D&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; speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1200&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:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1800&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:#b48ead"&gt;4000&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;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO
&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; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&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;ui_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; velocity&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; &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;ui_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; velocity&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;
&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; &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; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;y &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;move_and_slide&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;is_action_just_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;ui_select&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:#88c0d0"&gt;is_on_floor&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;y &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; jump_speed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードを実行すると、キャラクターの&lt;strong&gt;x&lt;/strong&gt;方向速度が瞬時に変化してしまうことに気づくでしょう。これを修正するために、&lt;code&gt;lerp()&lt;/code&gt;関数を使用して速度を徐々に増減させるようにします。&lt;/p&gt;
&lt;h4 id="lerpの使用例"&gt;&lt;code&gt;lerp&lt;/code&gt;の使用例&lt;/h4&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"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;start_value&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; end_value&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; amount&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;lerp()&lt;/code&gt;（線形補間）は、2つの数値間で「ブレンドされた」値を求める関数です。詳細は&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/math/interpolation/"&gt;補間処理&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;p&gt;以下のコードでは、&lt;code&gt;friction(摩擦係数)&lt;/code&gt;はキャラクターが停止する速度を、&lt;code&gt;acceleration(加速力)&lt;/code&gt;は最大加速するまでの速度を決定する要素です。どちらも値が&lt;code&gt;0.0&lt;/code&gt;から&lt;code&gt;1.0&lt;/code&gt;の範囲内で設定されます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;get_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;var&lt;/span&gt; friction &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.1&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; acceleration &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.5&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_dir &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&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;ui_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; &lt;span style="color:#b48ead"&gt;1&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;ui_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:#b48ead"&gt;1&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; dir &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&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;# accelerate when there&amp;#39;s input&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; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dir &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; speed&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; acceleration&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;else&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;# slow down when there&amp;#39;s no input&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; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; friction&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;h3 id="解説"&gt;解説&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;friction(摩擦係数)&lt;/code&gt;と&lt;code&gt;acceleration(加速力)&lt;/code&gt;をブレンド量として使用します。&lt;code&gt;speed&lt;/code&gt;には、現在速度から最大速度までの適切な値を求めます。減速時には、現在速度を徐々に&lt;code&gt;0&lt;/code&gt;へ減衰させます。&lt;/p&gt;</description></item><item><title>RigidBody2D: ドラッグ＆ドロップ操作</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/rigidbody_drag_drop/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/rigidbody_drag_drop/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;マウスでリジッドボディを選択して移動させたい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;リジッドボディを扱う際には注意が必要です。Godotの物理演算エンジンがこれらの動きを制御しており、これに干渉すると予期しない結果を招くことがあります。重要なのは、オブジェクトの&lt;code&gt;mode&lt;/code&gt;プロパティを活用する点です。これは2Dでも3Dでも同様に適用されます。&lt;/p&gt;
&lt;h3 id="ボディ設定"&gt;ボディ設定&lt;/h3&gt;
&lt;p&gt;はじめに、リジッドボディオブジェクトを作成します。まず&lt;i class="gd-Sprite2D"&gt;&lt;/i&gt;&lt;code&gt;Sprite2D&lt;/code&gt;と&lt;i class="gd-CollisionShape2D"&gt;&lt;/i&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;を追加してください。さらに物理特性を設定したい場合は&lt;code&gt;PhysicsMaterial&lt;/code&gt;も追加できます。このマテリアルでは &lt;em&gt;Bounce（反発係数）&lt;/em&gt; と &lt;em&gt;Friction（摩擦係数）&lt;/em&gt; のプロパティを調整できます。&lt;/p&gt;
&lt;p&gt;物理演算エンジンの制御から一時的に解放するために、リジッドボディの &lt;code&gt;freeze&lt;/code&gt; プロパティを使用します。ドラッグ操作中も移動可能にしておく必要があるため、デフォルト値である「静的モード」ではなく、&lt;strong&gt;フリーズモード&lt;/strong&gt;を「運動学的」に設定します。&lt;/p&gt;
&lt;p&gt;体を「pickable」というグループに配置します。この設定により、メインシーンで複数のpick可能オブジェクトインスタンスを使用可能になります。Bodyにスクリプトをアタッチし、その&lt;code&gt;_input_event&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;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;RigidBody2D&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;signal&lt;/span&gt; clicked
&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; held &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&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;_on_input_event&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;viewport&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; event&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; shape_idx&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;font-weight:bold"&gt;is&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;InputEventMouseButton&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; event&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;button_index &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; MOUSE_BUTTON_LEFT&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;pressed&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"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;clicked&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; clicked&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;emit&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;self&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;held(ホールド)&lt;/code&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;_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; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; held&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;origin &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;get_global_mouse_position&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;freeze&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;に変更すると物理演算エンジンの処理から除外されます。ただし、他のオブジェクトはこの物体に衝突する可能性がある点に注意してください。もしこれを望まない場合は、ここで&lt;code&gt;collision_layer&lt;/code&gt;および/または&lt;code&gt;collision_mask&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;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;pickup&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; held&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; freeze &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; held &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&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;drop&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;impulse&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO&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; held&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; freeze &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;apply_central_impulse&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;impulse&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; held &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;drop&lt;/code&gt;関数内では、&lt;code&gt;freeze&lt;/code&gt;を再び&lt;code&gt;false&lt;/code&gt;に設定した後、ボディは物理エンジンの制御下に戻ります。オプションで衝撃値を指定することで、リリース時にオブジェクトを『投げる』機能を追加することも可能になります。&lt;/p&gt;
&lt;h3 id="メインシーン"&gt;メインシーン&lt;/h3&gt;
&lt;p&gt;メインシーンを作成し、静的な障害物を配置するか、&lt;i class="gd-TileMap"&gt;&lt;/i&gt;&lt;code&gt;TileMap&lt;/code&gt;を使用して、選択可能なボディのインスタンスを作成してください。&lt;/p&gt;
&lt;p&gt;メインシーン用のスクリプトです。まず、シーンで使用可能なすべてのボディに対して &lt;code&gt;clicked&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;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Node2D&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; held_object &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;null&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;_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:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; node &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&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;get_nodes_in_group&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;pickable&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; node&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;clicked&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;connect&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;_on_pickable_clicked&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;held_object&lt;/code&gt;変数を設定して現在ドラッグ中のものを記録し、ボディの&lt;code&gt;pickup()&lt;/code&gt;メソッドを呼び出してオブジェクトのピックアップ操作を開始します。&lt;/p&gt;</description></item><item><title>CharacterとRigidBodyの相互作用</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/character_vs_rigid/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/character_vs_rigid/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;キャラクターのボディをリジッドボディと相互作用させたい場合に使用します。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&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;このレシピは2Dノードと3Dノードの両方に同様に適用できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;デフォルトでは、 &lt;code&gt;move_and_slide()&lt;/code&gt; または &lt;code&gt;move_and_collide()&lt;/code&gt; で移動させた &lt;i class="gd-CharacterBody2D"&gt;&lt;/i&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt; は、衝突する任意の &lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt; を押しません。リジッドボディは全く反応せず、単なる &lt;i class="gd-StaticBody2D"&gt;&lt;/i&gt;&lt;code&gt;StaticBody2D&lt;/code&gt; と同じように振る舞います。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-02ceb4de84ce3ddd0282688de11a05f1" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/char_push_default.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-02ceb4de84ce3ddd0282688de11a05f1"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/char_push_default.gif" 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="https://kamera25.github.io/godot_recipes/4.x/ja/2d/platform_character/"&gt;プラットフォーマー用キャラクター&lt;/a&gt; レシピで解説されている2Dキャラクターを使用します。この例ではキャラクター移動の最も一般的な方法である &lt;code&gt;move_and_slide()&lt;/code&gt; を採用しています。もし代わりに &lt;code&gt;move_and_collide()&lt;/code&gt; を使用している場合は、以下の実装を適切に変更してください。&lt;/p&gt;
&lt;p&gt;リジッドボディとのインタラクション方法を決定する際には、以下の2つの選択肢があります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;物理を無視して直接押すこともできます。Godot 3.x に慣れている方なら、これは&amp;quot;infinite inertia(無限慣性)&amp;ldquo;オプションと同等の機能です。&lt;/li&gt;
&lt;li&gt;キャラクターの想定する「質量」と「速度」に基づいて押力を発揮させることもできます。これにより「リアルな」結果が得られます - 重い物体は少し、軽い物体は大きく押し出されるようになります。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下の両方のオプションを試してみます。&lt;/p&gt;
&lt;h3 id="無限の慣性力"&gt;無限の慣性力&lt;/h3&gt;
&lt;p&gt;この設定には長所と短所があります。最大の利点は、追加コードが不要であることです。必要なのはオブジェクトの衝突レイヤー/マスクを正しく設定することだけです。本事例では、以下の3つの物理レイヤを定義しています。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-b0de1848a465e548fdc5090eaed7e8c9" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/2d_physics_layers_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-b0de1848a465e548fdc5090eaed7e8c9"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/2d_physics_layers_01.png" 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-140b48bb3f7e7b14bdefbfbcc87030b4" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/physics_layers_box.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-140b48bb3f7e7b14bdefbfbcc87030b4"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/physics_layers_box.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;a href="#image-9d26827898b7e8748ade853975c61144" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/physics_layers_player.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-9d26827898b7e8748ade853975c61144"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/physics_layers_player.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;a href="#image-7622531675cd77cfe16b6344ca1d1a5f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/char_push_inf.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-7622531675cd77cfe16b6344ca1d1a5f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/char_push_inf.gif" 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;h3 id="インパルスの適用方法"&gt;インパルスの適用方法&lt;/h3&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:#616e87;font-style:italic"&gt;# This represents the player&amp;#39;s inertia.&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; push_force &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;80.0&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;_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; &lt;span style="color:#616e87;font-style:italic"&gt;# after calling move_and_slide()&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;for&lt;/span&gt; i &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;get_slide_collision_count&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; c &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;get_slide_collision&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;i&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; c&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_collider&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;is&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;RigidBody2D&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; c&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_collider&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;apply_central_impulse&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;c&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_normal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; push_force&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;push_force&lt;/code&gt; 係数を適用します。これで再び押す動作が可能になります。なお、壁越しにリジッドボディを移動させることはできません。&lt;/p&gt;</description></item><item><title>2Dジョイントを使う</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/joints_2d/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/joints_2d/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;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;Godotの&lt;code&gt;Joint2D&lt;/code&gt;ノードについて理解したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;ジョイントは、接続された物理オブジェクトの動きを制限するために使います。任意のジョイントノードには、&lt;code&gt;PhysicsObject2D&lt;/code&gt; から拡張される2つのボディを結合が必要です。&lt;/p&gt;
&lt;h4 id="プロパティ"&gt;プロパティ&lt;/h4&gt;
&lt;p&gt;これらのプロパティはすべての関節ノードに共通です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Node A&lt;/em&gt; and &lt;em&gt;Node B&lt;/em&gt;：割り当てられた物理ボディ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Bias&lt;/em&gt;：両オブジェクトが離れる方向に関節が引き寄せる速度。デフォルト値は &lt;code&gt;0&lt;/code&gt; です&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Disable Collisions&lt;/em&gt;：接続されたオブジェクト間の衝突を考慮しないようにできます。デフォルトは &lt;code&gt;true&lt;/code&gt;（有効）です&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下の3種類の &lt;i class="gd-Joint2D"&gt;&lt;/i&gt;&lt;code&gt;Joint2D&lt;/code&gt; があります。すべての例で、1つの &lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt; がジョイントを介して &lt;i class="gd-StaticBody2D"&gt;&lt;/i&gt;&lt;code&gt;StaticBody2D&lt;/code&gt; に接続されています。画面で「コリジョン形状を表示」が有効化されているため、ジョイントの表現を確認できます。&lt;/p&gt;
&lt;h3 id="hahahugoshortcode340s4hbhb-pinjoint2d"&gt;&lt;i class="gd-PinJoint2D"&gt;&lt;/i&gt; PinJoint2D&lt;/h3&gt;
&lt;p&gt;「ピン接合」は、2つの部材を1点で接続し、自由に回転できるようにします。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-ec12b1de75c028e8eda31422ff3a6c84" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/pinjoint_example.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-ec12b1de75c028e8eda31422ff3a6c84"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/pinjoint_example.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ピン接合部の &lt;em&gt;Softness&lt;/em&gt; プロパティにより、接続にある程度の「弾力」が与えられます。この値はデフォルト値の &lt;code&gt;0&lt;/code&gt;（移動不可）から最大値 &lt;code&gt;16&lt;/code&gt; まで設定できます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-532573fd1f2b30bf8f754b980e9e9260" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/pinjoint_example2.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-532573fd1f2b30bf8f754b980e9e9260"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/pinjoint_example2.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="hahahugoshortcode340s5hbhb-dampedspringjoint2d"&gt;&lt;i class="gd-DampedSpringJoint2D"&gt;&lt;/i&gt; DampedSpringJoint2D&lt;/h3&gt;
&lt;p&gt;この継手はスプリング状の力によって2つの部材を連結します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-90881551a27ca6e638db2e73d1b07118" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/springjoint_example.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-90881551a27ca6e638db2e73d1b07118"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/springjoint_example.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下のプロパティでスプリングの挙動を調整できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Length&lt;/em&gt; : 関節の最大許容長値&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Rest Length&lt;/em&gt; : 外力や運動が作用していない状態における関節の長さ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stiffness&lt;/em&gt; : ばねの「伸びにくさ」、すなわち外力に対する抵抗強度を表す指標&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Damping&lt;/em&gt; : ばねが「反発動作」を停止する速度特性を示すパラメータ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hahahugoshortcode340s6hbhb-groovejoint2d"&gt;&lt;i class="gd-GrooveJoint2D"&gt;&lt;/i&gt; GrooveJoint2D&lt;/h3&gt;
&lt;p&gt;この関節は、接続された物体が直線的に移動するように制約します。&lt;/p&gt;</description></item><item><title>コンベアベルト</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/conveyor_belt/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/conveyor_belt/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;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;キャラクターまたはリジッドボディを移動させるコンベアベルトオブジェクトを作成したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;constant_linear_velocity&lt;/code&gt; プロパティを使用することで、&lt;i class="gd-StaticBody2D"&gt;&lt;/i&gt;&lt;code&gt;StaticBody2D&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環境で解決する方法については&lt;a href="#3d"&gt;以下を参照&lt;/a&gt;ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下に具体例を示します。&lt;i class="gd-StaticBody2D"&gt;&lt;/i&gt;&lt;code&gt;StaticBody2D&lt;/code&gt;と&lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt;を使用しています。追加コードは一切ありません。スタティックボディの&lt;em&gt;線速度一定&lt;/em&gt;は &lt;code&gt;(200, 0)&lt;/code&gt; に設定されています。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-e0b86845bffb3744a032b06c6d2f9aa8" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_02.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-e0b86845bffb3744a032b06c6d2f9aa8"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_02.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="ベルトの動きをアニメーション化"&gt;ベルトの動きをアニメーション化&lt;/h3&gt;
&lt;p&gt;コンベアベルトの「外観」を表現する方法は、使用するアートアセットによって異なります。今回のデモプロジェクトでは、以下の単一サイズ88×88ピクセルのタイルマップのみを使用しています。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-1af2bf953a22c81a56ed1372dbc8fa26" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/tileGreen_03.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-1af2bf953a22c81a56ed1372dbc8fa26"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/tileGreen_03.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;スタティックボディに &lt;i class="gd-Sprite2D"&gt;&lt;/i&gt;&lt;code&gt;Sprite&lt;/code&gt; を追加し、 &lt;em&gt;テクスチャ&lt;/em&gt; セクションで「新規AtlasTexture」を選択してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-4d5a7f1896bb5815b91ee78bb2b54b54" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_04.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-4d5a7f1896bb5815b91ee78bb2b54b54"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_04.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;タイルテクスチャをプロパティの&lt;em&gt;Texture&lt;/em&gt;項目に配置し、&lt;em&gt;Region&lt;/em&gt;を&lt;code&gt;(0, 0, 880, 88)&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-98445e307a35e16bb1b8000b5bc5027f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_05.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-98445e307a35e16bb1b8000b5bc5027f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_05.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;880&lt;/code&gt;を選択すれば、幅が正確に10タイルのコンベアベルトを作成できます。必要な幅を自由に設定できます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-86e8a26384fb1430d8b1f27fa5111f44" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_06.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-86e8a26384fb1430d8b1f27fa5111f44"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/conveyor_06.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&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;em&gt;リピート&lt;/em&gt; フラグを「有効」に設定して再インポートしてください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Region&lt;/em&gt; プロパティの &lt;code&gt;x&lt;/code&gt; の値を調整してみてください。タイルがずれるのが確認できるはずです。これがベルトのアニメーションに必要な動きです。このアニメーションは &lt;i class="gd-AnimationPlayer"&gt;&lt;/i&gt;&lt;code&gt;AnimationPlayer&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;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;StaticBody2D&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;@export&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;100&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;_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; constant_linear_velocity&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;
&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;_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; $Sprite&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;texture&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;region&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;-=&lt;/span&gt; speed &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードは、ベルトが目標速度で動作することと、アニメーションが物理効果と同期することを保証します。注意点として、方向は反対になっています。領域の &lt;code&gt;x&lt;/code&gt; 値を増やすと画像は左方向に移動します。&lt;/p&gt;</description></item><item><title>アステロイド風物理演算（RigidBody2Dを使用）</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/physics/asteroids_physics/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/physics/asteroids_physics/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;「Astroids」のような半リアルな宇宙船を作成するため、&lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt;を使いたい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;&lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody2D&lt;/code&gt; を使用する際には少し注意が必要です。Godotの物理エンジンによって制御されるため、直接移動させるのではなく力を加える必要があります。リジッドボディを扱う前に、&lt;a href="https://docs.godotengine.org/ja/stable/classes/class_rigidbody2d.html" target="_blank"&gt;RigidBody2D APIドキュメント&lt;/a&gt;を必ず確認することを強くオススメします。これからこの例を進めていく過程で、このドキュメントを参照しながら進めていきます。&lt;/p&gt;
&lt;p&gt;本例では、以下のノード設定を使用します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&lt;i class="gd-RigidBody2D"&gt;&lt;/i&gt; RigidBody2D (Ship)
&lt;i class="gd-Sprite2D"&gt;&lt;/i&gt; Sprite2D
&lt;i class="gd-CollisionShape2D"&gt;&lt;/i&gt; CollisionShape2D
&lt;/code&gt;&lt;/pre&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; Spriteの向き&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;必ずスプライトを正しく配置してください。回転していないオブジェクトは &lt;strong&gt;+X軸&lt;/strong&gt; 方向に向くようにしてください（つまり右方向を向いている状態）。スプライトのアートワークが別の方向を向いて描かれている場合は、 &lt;i class="gd-Sprite2D"&gt;&lt;/i&gt;&lt;code&gt;Sprite2D&lt;/code&gt;（親ボディではなく）を適切に整列させるために回転させてください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下の入力を「インプットマップ」で使用します。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アクション&lt;/th&gt;
&lt;th&gt;キー&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thrust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;w&lt;/strong&gt; または ↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rotate_right&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;d&lt;/strong&gt; または →&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rotate_left&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;a&lt;/strong&gt; または ←&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;RigidBody2Dにスクリプトを追加し、変数を定義します。&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;RigidBody2D&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;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; engine_power &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; spin_power &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10000&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; thrust &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO
&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; rotation_dir &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最初の2つの変数は、船の「操縦性」を制御する方法を決定します。&lt;code&gt;engine_power&lt;/code&gt;は加速と最高速度に影響を与えます。&lt;code&gt;spin_power&lt;/code&gt;は船が回転する速さを調整します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;thrust&lt;/code&gt; と &lt;code&gt;rotation_dir&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;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; thrust &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO
&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;thrust&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; thrust &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; engine_power
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rotation_dir &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_axis&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;rotate_left&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;rotate_right&amp;#34;&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;&amp;quot;thrust&amp;quot;&lt;/code&gt;入力が有効になっている場合、&lt;code&gt;thrust&lt;/code&gt;ベクトルを船の進行方向に設定します。一方、&lt;code&gt;rotation_dir&lt;/code&gt;は回転入力に応じて &lt;code&gt;+/-1&lt;/code&gt; に設定されます。&lt;/p&gt;
&lt;p&gt;これらの値を &lt;code&gt;_physics_process()&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;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; &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; constant_force &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; thrust
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; constant_torque &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; rotation_dir &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; spin_power
&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>