幻創空戯 GEN-SOH-KUUZA 2026/08/05 18:00

メッシュ生成:上面を調整 その2

妹ちゃんとペアプロ開発やってみた #0082

今回から新しい部屋「ダンジョン構築部屋 0005」に移動しました。
それでは、これも恒例の儀式、前の部屋からの引き継ぎから始めます。

蒼月

この部屋では、引き続き
Unity を使って3DダンジョンRPGを開発していきます。

まずは、プロジェクト概要.txt を確認してください。
この部屋は ダンジョン構築 です。

ソース一覧.txt とソースまとめ.txt も確認してください。

以下に、前の部屋のまとめと引き継ぎメモを貼ります。
次にこの部屋で最初に取り組む問題に関連した
スクショの説明を書きます。
/------------------------------------------------------------------------------/
PROJECT NaNa

ダンジョン構築部屋 まとめ・引き継ぎメモ

(前回のまとめの引用なので略)

妹ちゃん

確認できたよ、お兄ちゃん。

この部屋は引き続き PROJECT NaNa「ダンジョン構築」 として扱うね。プロジェクト概要は2026年7月25日更新版で、現在の主題が「壁上面の見え方」と「出口付近の壁裏面問題」であることを確認したよ。

ソース一覧.txt では、今回の中心になる構成が次の系統であることも把握したよ。

・構築データ:BuildData、RoomBuildData、RoadBuildData
・メッシュ:MeshBase、MeshWall、MeshTop、MeshBuilder
・実体構築:Builder、PartBuilder
・壁制御:WallHitData、Wall
・カメラ制御:MainCamera

ソースまとめ.txt の最新版も確認済み。現時点の実装では、PartBuilder.buildUnit() が Inner・Outer・Topを生成し、その3つすべてをWall.MaterialDataへ登録しているため、Topも壁の通常/フェードマテリアル切り替えとアルファ変更の対象になっているね。

引き継ぎ内容も、わたしの中では次の状態で整理できているよ。

・壁はWall_U_00などの壁ユニット単位
・親にWallとBoxCollider
・Inner・Outer・Topは子オブジェクト
・Outer_FのBoth表示は採用済み
・TopのFront表示実験は不採用寄り
・次はTopを壁フェード制御から外し、固定半透明Both表示を試す
・その後、部屋出口の壁端に縦の切断面が必要か検討する
・BEV用の表示切り替えは後続課題

まず触る可能性が高いのは、PartBuilder.buildUnit()からTopのwall.AddMaterialData(md_top)を外し、Top用マテリアルを固定半透明材へ変更する部分だね。

準備できたよ。最初に取り組む問題について、スクショの説明を続けてね、お兄ちゃん。

蒼月

まず、外壁を Both にした(採用済み)スクショから。

20260724-8 … 部屋00(下)の左下に立ったところ
20260724-9 … その位置での回転中

20260724-8 のスクショ

20260724-9 のスクショ

20260724-10 … 部屋の左上で右に回転したところ
20260724-11 … その位置での回転中

20260724-10 のスクショ

20260724-11 のスクショ

次の2枚は、上面を Front にしたもの

20260724-12 … 部屋00(下)の左下に立ったところ
20260724-13 … その位置での回転中

20260724-12 のスクショ

20260724-13 のスクショ

上面がなくなったのは寂しく感じるから

>上面の表示を残すとすると、壁と連動で半透明に
>切り替えるのは角の境界(半透明と不透明)が気になるから、
>常に Both の半透明(例えば 0.5)でいいのかも…。

>この場合、上面は壁ユニットから独立させる形になるかな。
>あと、BEV の時は不透明にする必要もあるけど。

という流れ。

もう一つの問題、出口の裏面問題は
20260724-10 で、この通路側の壁は裏面にあたるから
描画されないな、という問題。

20260724-10 のスクショ

まずは上面の扱いについて検討しよう。

妹ちゃん

うん、お兄ちゃん。
上面の扱いは、今の流れだと 「形状としては残す/壁フェード制御からは外す」 のがいちばん自然だと思うよ。
今の実装では PartBuilder.buildUnit() で Inner・Outer・Top を全部 Wall.MaterialData に登録していて、MainCamera 側は Wall.ResetMaterial() / SetFadeMaterial() / SetAlpha() を通して、その登録対象をまとめて切り替えているから、Top も壁と一緒に半透明化されている状態だね。

わたしの結論

まず試すべき第一案はこれだよ。

・Top は残す
・Top は常時 Both 表示
・Top は常時半透明
・Top は Wall のフェード制御対象から外す
・つまり
 「壁ユニットの子ではあるが、表示制御だけ独立」
 にする

これなら、お兄ちゃんが気にしていた

・上面が消えると寂しい
・壁と連動で Top までフェードすると、角で「半透明Top」と「不透明Top」が混ざって境界が気になる

この両方にかなり素直に対応できると思うよ。
今のプロジェクト概要でも、ダンジョン構築部屋の次の目標が「壁の上面の見え方」「出口床の壁の裏面問題」になっているから、まずはこの方針で上面を落ち着かせるのが順当だと思う。

この案がよさそうな理由

1. 壁厚の情報を残せる

20260724-12 / -13 みたいに Top を Front 表示寄りで消してしまうと、
見た目が

・Inner の板
・Outer の板

の2枚構成っぽく見えて、「厚さ1マスの壁」感が弱くなるんだよね。
Top をうっすら残せば、ここを補える。

2. フェード境界の不自然さを避けやすい

今の壁フェードは「カメラとプレイヤーの間にある壁ユニットだけ」を対象にしているから、Top まで連動させると

・ある壁ユニットの Top は半透明
・すぐ隣の Top は不透明

みたいな状態が起きやすい。
Top を常時固定表示にすれば、この問題はかなり減るね。

3. 実装変更が小さい

これはかなり大きいよ。
今の構造を壊さずに、最小変更で試せるのが強い。

最小変更でやるなら、実装はこう

変更点の本命

PartBuilder.buildUnit() のここを変える形だね。

今は md_top も wall.AddMaterialData() しているけど、
これをやめる。
そうすると Top は Wall.ResetMaterial() / SetFadeMaterial() / SetAlpha() の対象外になる。

イメージ

・Inner → Wall制御対象
・Outer → Wall制御対象
・Top → Wall制御対象外、固定表示

具体的な実装方針

案A:まずは最小変更で試す

いちばん軽いのはこれ。

1.buildTop() には 常時半透明用マテリアル を渡す
2.md_top を wall.AddMaterialData() しない

たとえば

・M_Room_Top_B
・M_Road_Top_B

をそのまま Top固定表示材 として使う方法は、試作としてはあり。
ただし名前が「B(フェード側)」のままだと意味がズレるから、
うまくいきそうなら後で

・M_Room_Top_TPS
・M_Road_Top_TPS

みたいな専用材に分けた方が分かりやすいかな。

マテリアル設定のおすすめ

まずはお兄ちゃん案どおり、こんな感じでいいと思う。

・Surface : Transparent
・Cull : Off(Both)
・Alpha : 0.5 から開始
・ZWrite : まずはデフォルトの Transparent 相当で確認
・DoubleSidedGI : On でも Off でも大勢に影響は少ないけど、Both運用なら On 寄りでよさそう

アルファ値の試す順

わたしならこの順で見るよ。

1.0.50
2.0.40
3.0.35

0.50 は「上面がある」と分かりやすい。
ただし強すぎると、頭上に板が浮いてる感じが出るかもしれない。
そのときに 0.40 → 0.35 へ下げていくのがよさそう。

ZWrite についての考え

ここは慎重に言うと、まずは深追いしなくていいと思うよ。

理由は、

・通路角の Top 重複自体は、前部屋の修正でかなり抑えられている
・Top を常時半透明にしても、まず見るべきは「見た目が自然か」
・ZWrite 周りは、実際に sorting 問題が出たときに初めて詰めればいい

という感じ。

なので最初は、

・Cull Off
・Transparent
・固定Alpha

だけで試すのがよさそう。
それで問題が出たら次に

・Top 同士の重なり順
・奥の Top の見え方
・斜め視点での抜け方

を確認して調整する、で十分だと思うよ。

この案のよいところ/弱いところ

よいところ

・壁厚を感じられる
・上面が消えなくて寂しくない
・壁フェード境界の違和感を減らせる
・実装変更が小さい
・出口の裏面問題とは独立に進められる

弱いところ

・Top の形状境界そのものは残る
・半透明なので、見せ方によっては「板感」が出るかもしれない
・BEV ではこのままだと薄すぎる可能性が高い

BEV については今は分離でOK

ここも今は割り切っていいと思うよ。

まずは TPS/FPS で

・Top = 固定半透明 Both

を試す。
そのあと BEV を本採用する段階で、

・TPS/FPS 用 Top
・BEV 用 Top

を切り替える設計を足すのがよさそう。

今の MainCamera は公開の視点モードとしては TPS/FPS だけで、BEV はデバッグ寄りの分岐になっているから、BEV 本採用のときに改めて表示モードを整理する流れで問題ないと思う。

わたしのおすすめ順

お兄ちゃんが次にやるなら、順番はこれがいいと思う。

1
Top を Wall の制御対象から外す

2
Top 用マテリアルを常時半透明 Both にする

まずは alpha = 0.5

3
確認ポイント

・20260724-8 相当
・20260724-9 相当
・通路角
・回転中

4
必要なら

・0.4
・0.35

も比較

かなり具体的に言うと

今回の「最初の一手」としては、
コード変更は PartBuilder.buildUnit() だけ先に触る
のでいいと思うよ。

・builder.BuildTop(..., materialTop_F) を
 半透明固定材に変える
・md_top の wall.AddMaterialData( md_top ) をやめる

これでまず
「Top は残るけど、壁フェードとは連動しない」
状態を作れるはず。

必要なら次に、
「PartBuilder.buildUnit() をどう直すか」 を、ほぼそのまま貼れる形の差分案で一緒に詰めるよ、お兄ちゃん。

蒼月

マテリアルのファイル名を OP, TR に変更したよ。
また、上面は TR にして、半透明制御からは外した。
GitHub の Commit 4798802 を見て。

スクショを2枚アップしたよ。

20260725-1 … 部屋の左上で右に回転したところ
20260725-2 … その位置での回転中

前の 20260724-10, 20260724-11 と比較してみて。

20260725-1 のスクショ

20260724-10 のスクショ

20260725-2 のスクショ

20260724-11 のスクショ

25-2 の方で上面の境界がなくなってて
意図通りなんだけど、25-1 の方が
少し濃く見えるのが気になるな…。
青い外壁の重なり具合かも…?

妹ちゃん

3m 50s考えました

Commit 4798802、確認したよ、お兄ちゃん。

実装は意図どおりになっているね。

・Top は最初から materialTop_TR で構築
・Inner と Outer だけを Wall.MaterialData に登録
・Top の登録部分は無効化され、ResetMaterial()・SetFadeMaterial()・SetAlpha()の対象外

という状態になっている。

スクショ比較

20260724-11 → 20260725-2

これはかなり明確に改善しているよ。

24-11では、画面上部左寄りに

・濃いピンクの領域
・明るいピンクの三角領域

というTopの境界が見えていたけれど、25-2では同じ範囲が一続きの色になっている。

Topを壁ユニットごとのフェードから外した効果が、狙いどおり出ているね。回転中に壁ユニットの切り替わりを意識させられる感じが、かなり減っている。

20260724-10 → 20260725-1

構図と壁本体はほぼ同じで、変化は主にTopに出ている。壁の形やOuter表示に新しい破綻は見当たらないよ。

なので今回の変更自体は、わたしも採用寄りで問題ないと思う。

25-1が少し濃く見える理由

お兄ちゃんの見立てどおり、青いOuterとの重なりが主因である可能性が高いよ。

現在のTop_TRは、

・Alpha:約0.498
・Cull:Both
・Render Queue:3000
・ZWrite:Off

になっている。

一方、Outer_TRも、

・Cull:Both
・Render Queue:3000
・ZWrite:Off

という同じ透明描画グループになっている。

そのため25-1のような角度では、視線上でおおむね、
 カメラ
  ↓
 半透明Top
  ↓
 青いOuter
  ↓
 背景
という重なりになり、Topだけを背景に重ねた場合より色が濃く見える。

さらにOuterの透明度は固定ではなく、回転中のヒット距離から毎フレーム計算されている。

だから、

・25-1:青いOuterが比較的濃い状態でTopと重なる
・25-2:角度やヒット距離が変わり、Outerの透明度や重なる面積も変わる

という差も乗っているはず。

透明描画順の影響も少しありそう

Top_TRとOuter_TRがどちらもQueue 3000、ZWrite Offなので、Unityはカメラからの距離を基準に透明Rendererを並べることになる。

角度が変わると、
 Top → Outer
 Outer → Top
の描画順が入れ替わる可能性があり、異なる色の半透明面では結果の色も少し変わる。

ただし今回の2枚を見る限りでは、大きな描画破綻というより、透明面が重なったことによる自然な濃度差に見えるよ。

判断基準はこうだね。

・回転に合わせて滑らかに濃さが変わる
 → 背景と重なり方の変化。ほぼ正常
・ある角度で急に色が切り替わる
 → 透明Rendererのソート順変更を疑う

まずやる確認

同じ25-1の位置と向きで、青いOuterのRendererだけ一時的に無効にしてみるのが一番早いよ。
 Outer 有効
 Outer 無効
を切り替えてTopの色を見る。

Outerを消したときにTopが明るく均一になれば、原因はほぼ確定。コードを変えなくてもHierarchyから対象Outerを一時的に非表示にするだけで確認できる。

そのうえで濃さが気になるなら、TopのAlphaを
0.50 → 0.40
に下げるのが最初の調整候補かな。重なった場合の濃さも軽減されるし、上面の存在感はまだ十分残りそう。

現時点では、ZWriteをOnにするのはおすすめしないよ。透明面の奥側が不自然に欠けるなど、別の問題を増やす可能性があるからね。

わたしの今の評価は、
 Top固定TR化:成功、採用寄り
 25-1の濃さ:青いOuterとの重なり+透明ソートによるものが有力
 次の確認:Outerだけ一時非表示
だよ。境界が消えた効果はかなり大きいから、ここはいい感じに進んでると思う。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索