RimworldでWidnowの作り方

MOD製作者でちょっとggったら出てくる話


indexへ

Rimworldにおける画面の描写

Rimworldの画面描写は、Window抽象クラスをoverrideしたクラス上で、DoWindowContent上に書いてある処理が毎フレーム(?)読み込まれることで実行される。

あとはだいたいWidgets上のメソッドを適当に呼び出すといい感じの画面ができる。

Windowの追加はFind.WindowStack.Add(window)でできて、Find.WindowStack.Remove()で取り除ける。

■Rect

UnityEngineで使ってる(と思う)。四角形の範囲を表し、x, y, width, height の4つのパラメータがある。

※ 実態は xの最小値(xMin)、yの最小値(yMin)と、幅(width)と高さ(height)だが、

■Window

だいたいこれをoverrideしていろいろ実装する。

InitialSize

Vector2型。画面の大きさ(幅と高さ)。

public override Vector2 InitialSize
{
    get {
      // float型の幅700と高さ500の Window を作る
        return new Vector2(700f, 500f);
    }
}

PreOpen, PostOpen

Windowを開くときのいろいろな処理はココに書く。 例えば、Window内で使用するリストをここで初期化するとか。

PreClose, PostClose

Windowを閉じるときのいろいろな処理はココに書く。 例えば、Window内で使用したリストをメモリから解放するとか。

DoWindowContents(Rect inRect)

InitialSizeのサイズのWindowを作ってinRect内に描写したいWindowの内容を書く。

細かいあれこれ

ILSpyとかでWindowの中をみて変数名で実現したいのをtrueにしろ

■Widgets

Rimworldでよく使う画面操作系のWindow周りをまとめたクラス。基本ここに実装してあるメソッドを書けば大体の画面は実装できる。

ILSpyとかを見て手を動かして確認しろ。

よく使える便利なメモ

■Tab系

Tab作りたいときはこれ。ただRimworld準拠なので結構無駄が多そう。 タブの実装は、タブ本体(TabRecord)と、タブの描写(TabDrawer)を使って実装できる。

TabRecord(string label, Action clickedAction, bool selected)

TabDrawer.DrawTabs(Rect baseRect, List tabs, float maxTabWidth = 200f)

TabDrawer.DrawTabs(Rect baseRect, List tabs, int rows)

まとめ

  private override void PreOpen(){
    tabList.Clear();

    tabList.Add(new TabRecord("タブA",
      ()=>{
        nowTab = myTab[0];
        nowTab.Init();
      },
      ()=> nowTab == myTab[0])
    );

    // 同じようにTabを追加する。
    ...
  }

  public override void DoWindowContents(Rect inRect) {
    ...
    TabDrawer.DrawTabs(rect, tabList, 26f * tabList.Count() );
    nowTab.Draw(rect2);
    ...
  }

その他