Defoldを使ってみるが資料が少ないのでNotebookLMにDefold関連資料を突っ込んで先生になってもらう

Defoldを使ってゲームなど作ってみたいと思っているが資料が少ないので

NotebookLMにDefold関連資料を突っ込んでなんとかしてみることにする。英語資料ばかりでも安心。

 

  1. ドキュメントは下記からダウンロードできるのでダウンロードしてen以下のファイルをNotebookLMに突っ込む用のファイルにする。(右記にダウンロード先について記載あり https://forum.defold.com/t/about-offline-document/55436/22)

https://github.com/defold/doc/archive/master.zip

NotebookLMがファイル数が50まででtxtとかpdfにしないと読み込んでくれなさそうだったのでまとめる。「manual」「Tutorials」「FAQ」毎に下記のような感じでtxtにまとめる。

cat *.md > hoge.txt

しかし、ダウンロードで網羅できるのは「manual」「Tutorials」「FAQ」のみ。APIリファレンスも欲しい。

下記のページをPDF化して食わせると良い

https://defold.com/ref/stable/go/

 

2. puppeteerを使ってAPIリファレンスを取得

npm install puppeteer

下記をhoge.jsとして保存

import puppeteer from "puppeteer";

import fs from "fs";

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

    // extensionのAPIリファレンスの時は下記を変更する:https://defold.com/ref/stable/overview_extension/

  const startUrl = "https://defold.com/ref/stable/";

  await page.goto(startUrl, { waitUntil: "networkidle2" });

  // ページ内の API リファレンスリンクを収集

  let links = await page.$$eval("a", as =>

    // extensionのAPIリファレンスの時は下記を変更する:https://defold.com/ref/stable/overview_extension/

    as.map(a => a.href).filter(href => href.startsWith("https://defold.com/ref/stable/"))

  );

  links = [...new Set(links)];

  console.log("対象リンク数:", links.length);

  let combinedHtml = "<html><head><meta charset='utf-8'></head><body>";

  for (const url of links) {

    try {

      await page.goto(url, { waitUntil: "networkidle2" });

      // ページ本文だけ抜き出し

      const content = await page.evaluate(() => {

        const main = document.querySelector("main") || document.body;

        return `<h1>${document.title}</h1>` + main.innerHTML;

      });

      combinedHtml += `<div style="page-break-after: always;">${content}</div>`;

      console.log(`追加完了: ${url}`);

    } catch (err) {

      console.error("エラー:", url, err.message);

    }

  }

  combinedHtml += "</body></html>";

  fs.writeFileSync("combined.html", combinedHtml, "utf-8");

  // 保存したHTMLを開く

  await page.goto("file://" + process.cwd() + "/combined.html", {

  waitUntil: "domcontentloaded",

  timeout: 0

});

  

  await page.pdf({ path: "defold-ref.pdf", format: "A4", printBackground: true });



  await browser.close();

  console.log("PDF作成完了: defold-ref.pdf");

})();



下記で実行すると、defold-ref.pdfが作成される。c++とluaは一度に取れるが、extensionsはソース中のコメントに従って編集して取り直して。冗長な部分もあるがNotebookLMに食わせるならこれでいいでしょう。

npm hoge.js

3. もし、APIファイルを1つのファイルにしたいなら

brew install poppler

下記実行。

pdfunite defold-ref.pdf defold-ref2.pdf defold-api.pdf
    • 出力ファイルは defold-api.pdf

    • 順序はコマンドに渡した順

4. なにかトラブルがあって、さっきのプログラムの中間ファイルをPDFにしたい場合は下記を使用する。

(取得し直さなくて済むよね)

import puppeteer from "puppeteer";
import path from "path";
import { fileURLToPath } from "url";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const inputFile = path.join(__dirname, "combined.html");
const outputFile = path.join(__dirname, "defold-ref.pdf");

(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ["--no-sandbox", "--disable-setuid-sandbox"],
});

const page = await browser.newPage();

// ローカルファイルを開く
await page.goto("file://" + inputFile, {
waitUntil: "networkidle0", // 画像やCSSの読み込み完了まで待つ
timeout: 0,
});

// PDFを出力
await page.pdf({
path: outputFile,
format: "A4",
printBackground: true,
});

console.log(`PDFを作成しました: ${outputFile}`);

await browser.close();
})();

 

5. examplesも突っ込んどいたほうが良いと思う。欲しかったら先程のプログラムのURLを変えて実行。

https://defold.com/examples/

これでDefoldを教えてくれるAIができた。

試しにTilemapの編集の仕方を聞いたらちゃんと教えてくれた。