地面にテクスチャと草木を配置できるようにする
日本の城郭を築城して、ねこ巫女が籠城するゲームを開発しています。
今回は寄り道して見た目についての実装です。
地面に草を配置する
以前に作った Terrain に草を追加しました。コードを抜粋するとこんな感じです。
var grassVariants = new List<DetailPrototype>();
var grassVariant = new DetailPrototype()
{
prototype = _grassPrefab,
prototypeTexture = _grassTexture,
useInstancing = true,
minWidth = 0.5f,
maxWidth = 1.0f,
minHeight = 0.5f,
maxHeight = 1.0f,
renderMode = DetailRenderMode.Grass,
};
grassVariants.Add(grassVariant);
_terrainData.detailPrototypes = grassVariants.ToArray();
int grassDensity = GrassDensityPerUnit * _gridsCount;
var grassMap = new int[grassDensity, grassDensity];
var alphaMap = new float[resolution, resolution, _terrainLayers.Count];
for (int y = 0; y < grassDensity; ++y)
{
for (int x = 0; x < grassDensity; ++x)
{
grassMap[y, x] = 1;
}
}
そして、平坦な地面に草を配置するとこんな感じです。
視点との距離が遠くなると草の描画をやめてしまい、その境界がはっきり見えてしまっているのは後でまた考えます。
それから、今は全面が草ですが土木工事や建築をしたグリッドや、人が何度も通った場所は草をなくしてテクスチャ色も変更しようと思っています。
↓草のあるグリッド、ないグリッドの描画はこんな感じにしたい。
この処理はまたいつか着手します。
地面に木を追加する
木も追加できるようにしました。
// 木の初期化を行う。
var treeVariants = new List<TreePrototype>();
for (int i = 0; i < _treePrefabs.Count; ++i)
{
var treeVariant = new TreePrototype()
{
prefab = _treePrefabs[i],
};
treeVariants.Add(treeVariant);
}
_terrainData.treePrototypes = treeVariants.ToArray();
(中略)
public void AddTree(TreeNames treeName, Vector2Int grid)
{
var tree = new TreeInstance();
tree.position = (Field.GroundVertexPosition(grid) + new Vector3(1, 0, 1)) / (GameConstant.GridMeter * _gridsCount);
tree.prototypeIndex = (int)treeName;
tree.widthScale = 1.0f;
tree.heightScale = 1.0f;
_terrain.AddTreeInstance(tree);
}
正直、詳しく理解できていませんが木が描画できたのでよいことにします。
これらの実装で木を3本追加してみた結果はこんな感じです。
草木は The Illustrated Nature というアセットを購入して使っています。
https://assetstore.unity.com/packages/3d/vegetation/the-illustrated-nature-153939?locale=ja-JP
これまた詳しくないのですが、色を自由に変更できて秋や冬の表現ができそうです。
現状では木の幹の影がなかったり、木の大きさや向きがランダムでなかったりもしますが、見た目のことはあとでまた着手します。
まとめと今後の予定
ちょっと寄り道して草木の描画まわりを実装しました。
次回以降は石垣や建物を建築するあたりの実装を再開したいです。がんばります。