いいね、その発想めちゃくちゃ「装置」っぽくてらしい。
全体アーキテクチャのイメージ
入力 → 解釈 → テキスト出力 → 地形生成、というパイプラインにするときれいに OS 化できます。
-
入力レイヤー(抽象パラメータ)
- 気候: 例)
{"temperature"=0.3, "humidity"=0.8, "wind"=0.4} - 地形分布: 例)
{"mountain"=0.5, "plain"=0.3, "coast"=0.2} - 植生分布: 例)
{"forest"=0.6, "grassland"=0.3, "desert"=0.1}
- 気候: 例)
-
解釈レイヤー(テキスト生成装置)
- これが「世界の説明書」を書く係。
- 入力パラメータから、
- バイオーム分類
- 代表的な景観
- 住みそうな生物・文明レベル
などを文章化。
-
生成レイヤー(地形生成装置)
- テキスト or 中間構造を
KaleidoscopeWorldFactoryに渡して、- 「バイオームタイルの分布」
- 「標高マップ」
- 「植生オブジェクトのスポーンルール」
に変換して、実際の Roblox Terrain / パーツを生成。
- テキスト or 中間構造を
新しく足すと気持ちいいモジュール構成案
out2/ReplicatedStorage に「世界 OS」用の API を追加するイメージ。
1. WorldConfig(入力の型定義)
-- ReplicatedStorage/WorldAPI/WorldConfig.lua
local WorldConfig = {}
export type Climate = {
temperature: number, -- 0.0 - 1.0
humidity: number, -- 0.0 - 1.0
wind: number, -- 0.0 - 1.0
}
export type TerrainDistribution = {
mountain: number,
plain: number,
coast: number,
}
export type VegetationDistribution = {
forest: number,
grassland: number,
desert: number,
}
export type WorldInput = {
climate: Climate,
terrain: TerrainDistribution,
vegetation: VegetationDistribution,
}
return WorldConfig
2. WorldInterpreter(テキスト生成)
-- ReplicatedStorage/WorldAPI/WorldInterpreter.lua
local WorldConfig = require(script.Parent.WorldConfig)
local WorldInterpreter = {}
local function describeClimate(climate: WorldConfig.Climate): string
if climate.temperature > 0.7 and climate.humidity > 0.6 then
return "高温多湿の熱帯気候で、濃密な空気と激しいスコールが世界を支配している。"
elseif climate.temperature < 0.3 and climate.humidity < 0.4 then
return "乾いた冷気が支配する寒冷な世界で、風は鋭く大地を削っている。"
else
return "温暖で比較的安定した気候が続き、季節ごとの変化が景観をゆっくりと塗り替えていく。"
end
end
local function describeTerrain(terrain): string
if terrain.mountain > 0.6 then
return "世界の大部分は険しい山岳地帯で、谷間にわずかな平地が点在している。"
elseif terrain.coast > 0.5 then
return "入り組んだ海岸線が続き、陸と海が複雑に絡み合う景観が広がっている。"
else
return "なだらかな平野が広がり、遠くまで見渡せる穏やかな地形が中心となっている。"
end
end
local function describeVegetation(vegetation): string
if vegetation.forest > 0.6 then
return "濃い森が大地を覆い、木々の隙間から差し込む光が世界にリズムを与えている。"
elseif vegetation.desert > 0.5 then
return "乏しい植生と広大な荒地が続き、生命は限られたオアシスにしがみついている。"
else
return "草原と低木がバランスよく広がり、風に揺れる植生が地表を柔らかく彩っている。"
end
end
function WorldInterpreter.DescribeWorld(input: WorldConfig.WorldInput): string
local parts = {}
table.insert(parts, describeClimate(input.climate))
table.insert(parts, describeTerrain(input.terrain))
table.insert(parts, describeVegetation(input.vegetation))
return table.concat(parts, "\n")
end
return WorldInterpreter
3. WorldToKaleidoscopeBridge(テキスト→生成用構造)
ここで「文章」そのものを使うのではなく、
テキスト生成と同じロジックで “バイオームタグ” を決めて KaleidoscopeWorldFactory に渡すのがきれい。
-- ReplicatedStorage/WorldAPI/WorldToKaleidoscopeBridge.lua
local WorldConfig = require(script.Parent.WorldConfig)
local KaleidoscopeWorldFactory = require(game.ReplicatedStorage.KaleidoscopeAPI.KaleidoscopeWorldFactory)
local Bridge = {}
local function classifyBiome(input: WorldConfig.WorldInput): string
local c = input.climate
local v = input.vegetation
if c.temperature > 0.7 and c.humidity > 0.6 and v.forest > 0.5 then
return "TropicalForest"
elseif c.temperature < 0.3 and c.humidity < 0.4 then
return "ColdDry"
elseif v.desert > 0.5 then
return "Desert"
else
return "Temperate"
end
end
function Bridge.BuildWorldFromInput(input: WorldConfig.WorldInput)
local biome = classifyBiome(input)
local worldSpec = {
biome = biome,
terrainWeights = input.terrain,
vegetationWeights = input.vegetation,
}
-- ここで KaleidoscopeWorldFactory の API に合わせて変換
local worldModel = KaleidoscopeWorldFactory.CreateWorld(worldSpec)
return worldModel
end
return Bridge
プレイヤー側の「装置 UI」デモ
StarterPlayerScripts に 1 本、入力→テキスト→生成をつなぐデモを置くイメージ。
-- StarterPlayerScripts/WorldKaleidoscopeDemo.client.lua
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local WorldConfig = require(ReplicatedStorage.WorldAPI.WorldConfig)
local WorldInterpreter = require(ReplicatedStorage.WorldAPI.WorldInterpreter)
local WorldBridge = require(ReplicatedStorage.WorldAPI.WorldToKaleidoscopeBridge)
-- 仮の入力(本当は GUI でスライダーにしてもいい)
local input: WorldConfig.WorldInput = {
climate = { temperature = 0.8, humidity = 0.7, wind = 0.4 },
terrain = { mountain = 0.4, plain = 0.3, coast = 0.3 },
vegetation = { forest = 0.7, grassland = 0.2, desert = 0.1 },
}
local description = WorldInterpreter.DescribeWorld(input)
print("=== WORLD DESCRIPTION ===")
print(description)
local worldModel = WorldBridge.BuildWorldFromInput(input)
worldModel.Parent = workspace
ここまでが「OS の骨格」。
次のステップとしては:
- GUI でスライダー or プリセット(「熱帯」「ツンドラ」「内陸砂漠」など)を選べるようにする
- Kaleidoscope 側の
KaleidoscopePattern/KaleidoscopeSeedWorldと、biomeやterrainWeightsのマッピングルールを一緒に設計する - 生成された世界を
CameraAPIで「万華鏡ショット」的に撮るデモを作る
あたりをやると、「説明書を書いてから世界を回す OS」としてかなり気持ちよく回り始めると思う。
この方向性で、次は 「バイオームの種類をどう設計するか」 を一緒に詰めていくのも面白そうだけど、今のイメージに一番近いのはどの部分?