SubViewportの正しい使い方が知りたい プレイ空間上の座標をマウスの座標から取得するには?、移動がガタガタする現象の対処方法

質問内容

画像ですが、ピクセルアートの2Dプロジェクトで画面解像度の上にCRTシェーダーを使った時に、プレイ空間の座標をマウスの座標から取得する方法が知りたいのですが、調べてもわかりません。おそらくSubViewportの使い方関連だと思うのですが、実装できません。

状況

  • プロジェクト設定

    • プロジェクト → ウインドウ → サイズ → 320x240
    • プロジェクト → ウインドウ → ウインドウのオーバーライド → 2560x1440
    • プロジェクト → ウインドウ → ストレッチモード → canvas_item
  • SubViewport

    • サイズ → 320x240
    • Update Mode → Always
  • ColorRect (*CRTシェーダーを適用)

    • サイズ → 320x240

知りたいこと

  • SubViewportを使用している場合でプレイ空間の座標をマウスの座標から取得する方法
  • スプライトなどが移動するときに、ガタガタ移動してしまうので、滑らかにするにはどうすればいいのか
    (*SubViewportを使用してないときは滑らかに移動できました)

環境

  • Godot Engine 4.6 C#
  • Windows 10

調べたこと

  • ChatGPTでいろいろ質問して変更しましたが、マウスの位置が正常に取得できない
  • SubViewportのサイズをプロジェクト設定のウインドウサイズと同じにしてみましたが、マウスの位置が正常に取得できない

デバッグ出力

GetGlobalMousePosition: (0, -67.900894)
GetViewport().GetMousePosition(): (0, 0)
subViewport.GetMousePosition(): (0, 0)

GetGlobalMousePosition: (0, -67.900894)
GetViewport().GetMousePosition(): (0, 0)
subViewport.GetMousePosition(): (0, 0)

GetGlobalMousePosition: (0, -67.900894)
GetViewport().GetMousePosition(): (0, 0)
subViewport.GetMousePosition(): (0, 0)

GetGlobalMousePosition: (0, -67.900894)
GetViewport().GetMousePosition(): (0, 0)
subViewport.GetMousePosition(): (0, 0)

追加情報


from Discord by amagichan00

自己解決です。 ColorRectに以下のスクリプトをアタッチして実装しました。 自分で変更処理を書く ```cs
public partial class MouseManager : Control
{
[Export] private SubViewport subViewport;

public override void _Input(InputEvent @event)
{
    GD.Print($"イベントを検知しました: {@event.GetType().Name}");

    if (@event is InputEventMouse mouseEvent)
    {
        // C#のInputEventMouseはプロパティを直接書き換えられないため、
        // 複製(Duplicate)して座標を再計算します
        var duplicatedEvent = (InputEventMouse)mouseEvent.Duplicate();

        // 座標を現在のノードのトランスフォームに合わせて調整
        duplicatedEvent.Position -= Position;
        
        // SubViewportと現在のサイズ比率に合わせて座標をスケーリング
        Vector2 sizeRatio = (Vector2)subViewport.Size / new Vector2(320,180); // ここはSubViewportの基準サイズに合わせて調整してください

        duplicatedEvent.Position *= sizeRatio;

        // 調整したイベントをSubViewportに渡す
        subViewport.PushInput(duplicatedEvent);

        GD.Print($"Mouse Position in SubViewport: {duplicatedEvent.Position}");
    }
    
}

}


---
*from Discord by amagichan00*