AIゲーム制作ラボ
Unity×AI5分で読めます

単色の図形だけのゲームを「安っぽくない」見た目にする(加算合成を自作)

素材ファイルを使わずに作ったゲームが、単色の図形が並ぶだけの画面になりました。作り直して分かったのは、形ではなく光り方だということ。加算合成のシェーダーを自作するときに踏んだ3つの穴(テクスチャが渡らない・色が白のまま・Webビルドに入らない)を、前後の画面つきで残します。

Libra

公開 2026年9月19日

この記事の要点4 points

  1. 足りなかったのは形ではなく光り方 ふつうの半透明では、暗い背景に重ねてもかすむだけだった。
  2. 自作マテリアルにすると、SpriteRenderer は絵のテクスチャを渡してくれない(真っ白な四角になる)。
  3. SpriteRenderer.color は頂点色ではなく `_RendererColor` 掛け忘れると色を変えても白いまま。
  4. Shader.Find だけだと Web ビルドにシェーダーが入らない(Always Included Shaders に登録する)。
目次5
検証した環境最終確認 2026年9月19日
  • Windows 11
  • Unity 6.6(6000.6.0f1)・URP 2D・WebGL ビルド
  • Claude Code(Opus 5 / 思考レベル 高)

書いてあるのは、この環境で実際に試した結果です。ツールの仕様や料金は変わるので、重要な判断の前には公式の情報も確認してください。

画像も音も素材ファイルを1つも使わない方針で4本目を作りました。動いて、テストも通って、公開しました。そして言われました。

「デザインひど過ぎだろ 演出も」

そのとおりでした。下が、言われたときの画面(左)と、作り直したあと(右)です。形はほとんど同じです。

作り直す前の画面。単色の三角と四角が、真っ黒な背景に並んでいる
前:単色の図形が並ぶだけ
作り直したあとの画面。敵も弾も光り、撃破の破片と輪が出ている
後:同じ図形。光り方と演出だけ足した

足りなかったのは形ではなく「光り方」

最初の実装は、白い四角と三角に色を付けて置いただけでした。そこに足したのはこれだけです。

足したもの(形は変えていない)

ぼかした丸(グロー)を、自機・弾・敵の下に重ねる
背景を真っ黒ではなく、上が少し明るい縦のグラデーションにする
3層の速さで流れる星(奥行き)
撃破:破片が飛ぶ+輪が広がる+わずかに画面が揺れる
被弾:強い揺れ+赤い明滅+無敵中のリング
文字は必ず下敷きの上に置く

いちばん効いたのは加算合成です。ふつうの半透明で光を重ねても、暗い背景では白っぽくかすむだけで、光って見えません。足し込みにすると、重なったところが明るくなります。

自作シェーダーで踏んだ3つの穴

URP 2D にはそのまま使える加算のスプライトシェーダーが無いので、20行ほどのシェーダーを書きました。ここで3回つまずきました。

01

真っ白な四角が出る

症状
グローを出したはずの場所に、のっぺりした四角が出る
原因
自作のマテリアルに替えると、SpriteRenderer は絵のテクスチャを渡してくれない。`_MainTex` が既定の白のままになる
対処
絵ごとにマテリアルを作り、`mainTexture` に自分で入れる(このゲームでは6枚ぶん・辞書に持って使い回す)
02

色を変えても白いまま

症状
敵は赤、弾は青のはずが、光だけ全部白い
原因
SpriteRenderer.color は頂点色ではなく `_RendererColor` に入って来る
対処
シェーダーで `_RendererColor` を掛ける(`[PerRendererData]` として宣言する)
03

エディターでは光るのに、Web ビルドでは光らない

気づかないと「本番だけ見た目が違う」になる
症状
ビルドしたページだけ、加算の絵が出ない
原因
Shader.Find でしか参照していないシェーダーは、ビルドに含まれない
対処
Project Settings の Always Included Shaders に登録する(ProjectSettings に記録され、git にも入る)
Additive.shader(要点だけ)OK
Blend SrcAlpha One      // 足し込み

// ⚠️ SpriteRenderer.color はここに来る(頂点色ではない)
float4 _RendererColor;

OUT.color = IN.color * _Color * _RendererColor;

演出はゲームの中身に触らせない

演出を足すときに怖いのは、当たり判定や点が変わってしまうことです。分け方はこうしました。

  1. STEP 01

    Core:起きたことを置く

    撃破・被弾・発射(固定配列)

  2. STEP 02

    演出:それを読む

    破片・輪・揺れ・音

  3. STEP 03

    描画:一覧にして出す

    使い回した絵に流し込む

演出を止めても、点も当たり判定も同じ

この形にしたので、1フレームあたりの確保は0バイトのまま(自動テストで見張っている)で、演出を足せました。

ついでに直した:終わったあとも時間を進める

ゲームオーバー後に Tick を呼ぶのをやめていたら、「被弾した」という出来事が片づかずに残り、画面が赤いままになりました。終わっていても呼ぶ(中では何もしない)ようにして解決しています。

数字で見た変化

作り直しの前後で、公開したページを自動で撮って数えました(この検査自体の作り方は別の記事に書きました)。

  • はっきり違う色:1種類
  • 撃破・被弾の反応:無し
  • 背景:真っ黒

  • はっきり違う色:4〜5種類
  • 撃破:破片+輪+揺れ/被弾:赤い明滅
  • 背景:グラデーション+流れる星

ビルドは 6,944,159 バイト(作り直し後)。サイズはほとんど変わりません(図形を計算で作っているので、増えたのはコードだけ)。

まとめ

  • 素材を使わないゲームで足りないのは、形ではなく光り方
  • 加算合成の自作シェーダーは、テクスチャ・色・ビルド収録3か所でつまずく
  • 演出はゲームの中身に触らせない(起きたことを読むだけにする)
  • 🔴 見た目を最後に回さない。あとから足すと描画まわりを書き直すことになる

FAQ

よくある質問

画像素材を使わないゲームを、安っぽく見せないコツは?

形を凝るより、光り方に差をつけるほうが効きます。ぼかした丸(グロー)と輪を加算合成で重ねるだけで、同じ図形が別物に見えます。背景も真っ黒にせず、わずかなグラデーションを敷きます。

加算合成のシェーダーを自作するときの落とし穴は?

3つあります。①自作マテリアルにすると SpriteRenderer が絵のテクスチャを渡さないので、絵ごとにマテリアルを作って mainTexture を自分で入れる ②SpriteRenderer.color は _RendererColor に来るので掛ける ③Shader.Find で使うシェーダーは Always Included Shaders に登録しないと Web ビルドに入らない。

演出を足すと、ゲームの中身に影響しませんか?

分けて作れば影響しません。このゲームでは Core(判定・点)が「この1フレームに起きたこと」を固定配列に置き、描画側がそれを読んで破片や光を出しています。演出を止めても点は同じです。

どのタイミングで見た目を作り込むべきですか?

最初からです。あとから足すと描画まわりを書き直すことになります。4本目では最後に回してしまい、作り直しに2時間かかりました。

この記事は役に立ちましたか?

NEXT