Defoldを使ってゲームなど作ってみたいと思っているが資料が少ないので
NotebookLMにDefold関連資料を突っ込んでなんとかしてみることにする。英語資料ばかりでも安心。
- ドキュメントは下記からダウンロードできるのでダウンロードして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の編集の仕方を聞いたらちゃんと教えてくれた。