坂道に草を生やしたい
IccoProjectのステージは景観がカチッと決まっている固定マップと動的に生成されるランダムマップの2種類で構成されます。
ランダムマップはまず最初に地面を敷いて、その上に草木などのオブジェクトを設置していきます。
IccoProjectでは有機的な地形を作りたかったのでマップチップをタイル状に敷き詰めていく手法ではなく、2D Sprite Shapeというアセットを利用して滑らかな曲線を描く地面を形成しています。
しかしここで問題になったのが坂道問題。
上の図のように坂道に横長の草を生やそうとすると端っこが宙に浮いてしまうのです。
そこで坂道でも違和感が生じないよう4つの対策を施しました。
その1 傾斜に合わせて傾ける
まず最初に思いついたのは傾斜に合わせてオブジェクトを傾ける手法です。
スプライトの左右の端二点から真下に向かってレイキャストを飛ばして接点から傾きの角度を調べ、それに合わせてオブジェクトも回転させます。
ただし坂道の終端では傾いた草木が宙に浮く恐れもあるので回転させた後もう一度スプライトの底の左右の二点を調べてどちらも地面に着いていればセーフという判定を行っています。
実際に傾けるとこんな感じ
茂みなどのまるっこいオブジェクトはだいたいこれで対応出来ました
その2 細かいパーツに分割して設置する
しかし中には傾けると不自然になってしまう植物もあります。
例えばひょろ長い草花やキノコなんかは傾斜でも真上に向かって育ちますよね。
そういった類の植物は予めスプライトを細かいパーツに分割しておき、それぞれを真下にストンと落として地面に着地させる感じで生やしています。
適用するとこんな感じ
だいぶ手間ではあるんですが傾くことなく地面の形状に沿って生えてくれます
その3 地下部分まで描く
中には傾けることも出来ず、パーツに分割することも出来ない植物もあります。
例えば樹木なんかはこれに該当します。
そういったオブジェクトはある程度地面から露出してもいいように予め地下部分を描いておきます。
※木の根っこは通常放射状に広がりますが、露出した場合はこんな風に曲がりくねって土のあるところに戻ろうとするだろうってことでそれを見越してこういう形状にしています。
その4 それでもダメなら弾く
それでもダメな場合は弾く!
最初からそこに無ければ違和感も生まれません。
1月中はこういった対策を施したり植物のグラフィック素材を描き溜めていました。