真空消火を実装しました。
- まず火事を起こします。
- 火事は徐々に延焼度が進みます(酸素が濃いほど早い)
- 次に外壁エアロックを開けます。
- 部屋の酸素濃度が下がっていきます。
- 酸素濃度減少で、火事の延焼速度も遅くなります。
- 酸素減少で、急速に火事が沈下します。
- 外壁エアロックを戻します。
- 酸素濃度が上昇していきます。
床の上に、透明のシェーダーのGameObjectをかぶせておいて、酸素濃度に応じて透明度を調整して真空状態を表現しています。
床に火事を起こすと、床の炎上値が上昇を初めます。火が消えると、火事のParticleをDestroyします。
延焼度100で壁が無い場合は隣に燃え広がるを実装。
void FireUpdate() { for (int i = 0; i < floor.Count; i++) { if (floor[i].fire == 0) continue; int x = (int)floor[i].o2Filter.transform.position.x; int y = (int)floor[i].o2Filter.transform.position.z; int no = GetRoomNo(x, y);// 床が所属する部屋番号を取得 if(no==-1) Debug.Log("Unknown Room Error"); if (no != -1 && floor[i].fire < 100) { floor[i].fireUp(room[no].o2 / 50);//酸素濃度に応じて延焼が進む if (floor[i].fire == 100) FireAdvance(x, y); //隣に燃え広がる } if (no != -1 && floor[i].fire > 0) { floor[i].fireDown((100f - room[no].o2) / 10f);//酸素薄いと鎮火進む if (room[no].o2 == 0) floor[i].fireDown(10); //真空では急速に鎮火 if (floor[i].fire == 0) { Destroy(floor[i].fireParticle); } //完全に消火 } } }