ゲーム開発における物理的な動きのキャラクター(2D)

ゲーム開発における物理的な動きのキャラクター(2D)

前書き

はい、名前は奇妙に聞こえます。「スポーツの役割」。それは何ですか?この名前の理由は、物理エンジンが登場したとき、それらは「動的」エンジンと呼ばれていたためです(主に衝突応答を処理するため)。ダイナミックエンジンを使用してキャラクターコントローラーを作成するために、多くの試みがなされてきましたが、これは思ったほど簡単ではありません。Godotは(2D /プラットフォーマーのデモで見られるように)見つけることができる最高の動的キャラクターコントローラーの実装の1つですが、それを使用するには、かなりのレベルのスキルと物理エンジンの理解(または非常に忍耐強い試行錯誤)が必要です。

Havokなどの一部の物理エンジンは動的文字コントローラーが最良の選択であると考えているようですが、他の物理エンジン(PhysX)はキネマティクスエンジンをより積極的に推進しています。

では、違いは何ですか?

動的キャラクターコントローラーは、無限の慣性テンソルを持つ剛体を使用します。回転できない剛体です。物理エンジンは常にオブジェクトを移動させて衝突させ、次にそれらの衝突を一緒に解決します。プラットフォームゲームのデモに示されているように、これにより、動的キャラクターコントローラーが他の物理オブジェクトとシームレスに対話できるようになります。ただし、これらの相互作用は常に予測できるとは限りません。衝突は解決するのに1フレーム以上かかる場合があるため、一部の衝突は小さな部分しかシフトしないように見えます。これらの問題は解決できますが、特定のスキルが必要です。
移動するキャラクターコントローラーは、常に非衝突状態で起動し、常に非衝突状態に移行すると想定されています。衝突し始めると、剛体のように解放しようとしますが、これは例外であり、規則ではありません。これにより、制御と動きがより予測可能になり、プログラミングが容易になります。ただし、欠点は、コードを手動で記述しない限り、他の物理オブジェクトと直接対話できないことです。
この短いチュートリアルでは、モーションキャラクターコントローラーに焦点を当てます。基本的に、これは競合に対処するための昔ながらの方法です(必ずしも舞台裏で単純化されているわけではありませんが、十分に隠されており、優れた単純なAPIとして提示されています)。

物理的プロセス

移動体またはキャラクターのロジックを管理するために、物理プロセスを使用することを常にお勧めします。これは、物理ステップの前に呼び出され、その実行が常に同じ回数呼び出される物理サーバーと同期されるためです。毎秒。これにより、物理学とモーション計算の動作が従来のプロセスを使用するよりも予測可能になります。フレームレートが高すぎたり低すぎたりすると、従来のプロセスが急上昇したり、精度が低下したりする可能性があります。

using Godot;
using System;

public class PhysicsScript : KinematicBody2D
{
    
    
    public override void _PhysicsProcess(float delta)
    {
    
    
    }
}

シーン設定

ここに(タイルマップチュートリアルからの)シーンのいくつかのテストがありますkbscene.zip。キャラクターの新しいシーンを作成します。ロボットスプライトを使用して、次のようなシーンを作成します。

../../_images/kbscene.png

CollisionShape2Dノードの横に警告アイコンがあることに気付くでしょう。これは、形状をまだ定義していないためです。CollisionShape2Dのshape属性で新しいCircleShape2Dを作成します。クリックしてそのオプションに移動し、半径を30に設定します。

../../_images/kbradius.png

注:前の物理チュートリアルで説明したように、物理エンジンはほとんどの形状のスケールを処理できないため(衝突ポリゴン、平面、線分のみが有効です)、形状をスケーリングするのではなく、常に形状のパラメーター(半径など)を変更してください。 。それらの比率が形状の比率に影響を与えるため、同じことが移動/剛体/静的オブジェクト自体にも当てはまります。

ここで、キャラクターのスクリプトを作成します。上記の例で使用したスクリプトをベースとして使用する必要があります。

最後に、タイルマップでキャラクターシーンをインスタンス化し、再生が押されたときに実行するメインシーンとして使用します。

../../_images/kbinstance.png

運動学的特性

キャラクターシーンに戻り、スクリプトを開くと、魔法が始まります!移動体はデフォルトでは操作を実行しませんが、KinematicBody2D.move_and_collide()と呼ばれる便利な関数があります。この関数は、Vector2をパラメーターとして使用し、モーションを移動体に適用しようとします。衝突が発生した場合、衝突が発生するとすぐに停止します。

それでは、スプライトが地面に落ちるまで下に移動しましょう。

using Godot;
using System;

public class PhysicsScript : KinematicBody2D
{
    
    
    public override void _PhysicsProcess(float delta)
    {
    
    
        // Move down 1 pixel per physics frame
        MoveAndCollide(new Vector2(0, 1));
    }
}

その結果、キャラクターは移動しますが、床にぶつかるとすぐに停止します。かっこいいじゃないですか。

次のステップは、ミックスに重力を追加して、通常のゲームキャラクターのように動作するようにすることです。

using Godot;
using System;

public class PhysicsScript : KinematicBody2D
{
    
    
    const float gravity = 200.0f;
    Vector2 velocity;

    public override void _PhysicsProcess(float delta)
    {
    
    
        velocity.y += delta * gravity;

        var motion = velocity * delta;
        MoveAndCollide(motion);
    }
}

これで、キャラクターはスムーズに滑ります。矢印キーをタッチしながら左右に歩きましょう。使用される値(少なくとも速度の場合)は1秒あたりのピクセル数であることに注意してください。

これにより、左右を押すことで簡単な歩行サポートを追加できます。

using Godot;
using System;

public class PhysicsScript : KinematicBody2D
{
    
    
    const float gravity = 200.0f;
    const int walkSpeed = 200;

    Vector2 velocity;

    public override void _PhysicsProcess(float delta)
    {
    
    
        velocity.y += delta * gravity;

        if (Input.IsActionPressed("ui_left"))
        {
    
    
            velocity.x = -walkSpeed;
        }
        else if (Input.IsActionPressed("ui_right"))
        {
    
    
            velocity.x = walkSpeed;
        }
        else
        {
    
    
            velocity.x = 0;
        }

        // We don't need to multiply velocity by delta because "MoveAndSlide" already takes delta time into account.

        // The second parameter of "MoveAndSlide" is the normal pointing up.
        // In the case of a 2D platformer, in Godot, upward is negative y, which translates to -1 as a normal.
        MoveAndSlide(velocity, new Vector2(0, -1));
    }
}

そしてそれを試してみてください。

これは、プラットフォームゲームの良い出発点です。より完全なデモは、エンジンに付属のデモzipまたはhttps://github.com/godotengine/godot-demo-projects/tree/master/2d/kinematic_characterで見つけることができます

おすすめ

転載: blog.csdn.net/qq_44273429/article/details/111723406