🐙

ゲーム開発で必須なUnity×C#×コンポーネント:極めるマテリアル【Material】の使い方

2025/01/19に公開

Unity×C#で極めるマテリアルの使い方

ゲームの世界を彩るには“マテリアル”の活用が欠かせません。キャラクターやオブジェクトがどんな色・質感を持つのかは、プレイヤーの没入感を大きく左右します。Unityには、マテリアルやシェーダーを簡単に設定できる機能がそろっており、C#スクリプトと組み合わせることで動的に見た目を変えることも可能。本記事では、マテリアルをうまく操るための基礎知識から応用テクニックまでを解説していきます。

マテリアルが持つ力:ゲームの見た目を根本から変える

マテリアルって何?

マテリアル(Material)とは、オブジェクトの「質感」や「色合い」、さらには「反射」「透明度」といった見た目の要素を統合的に管理するための設定ファイルです。Unityでは以下のようなパラメータを自由に調整できます。

  • Color(色)
  • Main Texture(アルベドテクスチャ)
  • Metallic(金属っぽさ)
  • Smoothness(表面の滑らかさ)
  • Normal Map(凹凸表現)
  • Emission(自己発光)

実際には、マテリアルには「シェーダー」という描画プログラムが紐づいており、どんなパラメータを扱えるかは使用するシェーダーによって変化します。たとえば“Standard”シェーダーを使えば、金属感や光沢をリアルに表現できますし、2Dゲーム向けの単純なシェーダーを使えば、色や透明度だけを管理するシンプルなマテリアルになります。

なぜマテリアルが大事?問題点と解決策

問題1:オブジェクトが地味で没入感が低い

ゲーム開発を始めたばかりのころは、オブジェクトにデフォルトの白っぽいマテリアルが設定されており、見た目が味気ない場合が多いです。淡白な空間ではプレイヤーがゲーム世界に入りこみにくくなるという問題があります。

問題2:動的に色や質感を変えたいのに操作が難しい

「キャラクターがダメージを受けた瞬間に赤く光らせたい」「アイテムを取得したら金属っぽい輝きにしたい」など、状況によってマテリアルを変化させる演出を入れたいけれど、どのAPIを使っていいかわからないという声も少なくありません。

解決のカギ:C#とマテリアルの連携

マテリアルに関する基本的な概念と、C#スクリプトからマテリアルを制御する方法をセットで学べば、上記の問題は一気に解決します。Unityエディタ上でマテリアルを編集するだけでなく、コードから動的に色やテクスチャを切り替える、パラメータをアニメーションさせるなど、よりリッチな表現が可能になります。

マテリアルの基本設定:色・テクスチャ・シェーダー

シェーダーの種類と役割

シェーダーとは、GPU上で「このオブジェクトはどう描画されるか」を決めるプログラムのことです。Unityには以下のように多彩なシェーダーが用意されています。

  • Standard Shader:金属やプラスチック、木材、布など、現実的な質感を幅広く表現できる
  • URP / HDRP用のシェーダー:ライトの計算方法が異なり、よりリアルまたはパフォーマンス重視の描画が可能
  • Unlit Shader:ライティングの影響を受けずに、テクスチャや色をシンプルに描画
  • Custom Shader:Shader GraphやC#で独自に作成して独特な表現を実装

ゲームのスタイルやパフォーマンス要件に応じて最適なシェーダーを選びましょう。一般的には Standard Shader あるいは URP/HDRP 用の Lit Shader が汎用的で使いやすいです。

Unityエディタでの設定手順

  1. マテリアルアセットの作成
    • Projectウィンドウで右クリック → CreateMaterial
  2. シェーダーを選択
    • Inspectorビューで Shader から Standard などを選ぶ
  3. 色やテクスチャを設定
    • Albedo に色、あるいはテクスチャ画像をアサイン
    • MetallicSmoothnessNormal Map など、必要なパラメータを調整
  4. オブジェクトにマテリアルを適用
    • シーン内のオブジェクトにドラッグ&ドロップするか、MeshRendererの Material スロットにセット

C#スクリプトでマテリアルを操作する

1. マテリアルを取得・参照する

オブジェクトの見た目を変えるために、まずはRendererからマテリアルを取得します。たとえば MeshRenderer を使う場合は下記のように書きます。

using UnityEngine;

public class MaterialChanger : MonoBehaviour
{
    private Material myMat;

    void Start()
    {
        // このオブジェクトのMeshRendererが持つマテリアルを取得
        MeshRenderer mr = GetComponent<MeshRenderer>();
        myMat = mr.material; 
    }
}

2. 色を動的に変える方法

Standard Shader の場合は、メインカラーを "_Color" プロパティで管理しています。以下のように書くと、オブジェクトの色をコードで切り替えられます。

myMat.SetColor("_Color", Color.red);

もしURP(Universal Render Pipeline)やHDRP(High Definition Render Pipeline)を使っている場合、プロパティ名が"_BaseColor"など異なる場合があるので確認してください。

myMat.SetColor("_BaseColor", new Color(0.2f, 0.5f, 1.0f, 1.0f));

3. テクスチャを差し替える

メインテクスチャを動的に変える場合は、以下のように SetTexture を用います。

Texture2D newTex = Resources.Load<Texture2D>("Textures/myTex");
myMat.SetTexture("_MainTex", newTex);

Resources フォルダ内のアセットを読み込み、_MainTex へ差し替えています。エフェクト演出として、ゲーム中に違うテクスチャを当てることでオブジェクトを変身させたり、切り替えアニメーションを作ったりできます。

4. メタリックや光沢の制御

Standardシェーダーなら、_Metallic (0〜1) と "_Glossiness" (0〜1) を調整することで金属度や光沢をコントロール可能です。

myMat.SetFloat("_Metallic", 0.8f);  // 金属感を強める
myMat.SetFloat("_Glossiness", 0.4f); // 光沢度を適度に設定

こうすることで、キャラクターやアイテムが金属っぽく輝くように見せる、あるいはプラスチックのような質感に変化させることができます。

応用:マテリアルの使い分けとパフォーマンス最適化

マテリアルインスタンスと描画負荷

同じマテリアルを複数のオブジェクトで使い回すと、DrawCall数(描画コスト)を抑えられます。逆に、material プロパティ経由でマテリアルを複製すると、それぞれが別のマテリアルインスタンスとして扱われることに注意が必要です。

  • sharedMaterial : オリジナルのマテリアルを共有
  • material : 個別のマテリアルインスタンスを生成
マテリアルインスタンスの仕組み
  1. RendererがsharedMaterialを参照している場合:同じマテリアルをみんなで使う
  2. Rendererがmaterialを参照して変更した場合:変更があったオブジェクト用に新しいマテリアルインスタンスが作られる

大量のオブジェクトがあるシーンで個別にmaterialを操作するとパフォーマンスに影響が出る場合があります。
可能な限りsharedMaterialを使い、全体の見た目を統一したいときのみインスタンス化する、という運用がおすすめです。

テクスチャサイズや圧縮設定

複数の大きなテクスチャを読み込むと、メモリ使用量が急増し、ビルドサイズや読み込み時間が長くなる原因に。Unityエディタのインスペクタでテクスチャインポート設定を開き、以下をチェックしましょう。

  • 圧縮形式(DXT、ETC、ASTCなど)
  • Max Size(最大サイズ)
  • Mipmap生成の有無(遠景では画質を落とした方が描画効率が上がる)

余計な大きさのテクスチャを使わないだけでも、パフォーマンス改善に大きく寄与します。

シェーダーのバリアント削減

Standardシェーダーを使う場合でも、不要な機能(スペキュラ、メタリック、パララックス、サブサーフェススキャッタリング等)を無闇に有効にしない方がビルド時のシェーダーバリアント数を減らせます。URP/HDRPのShader Graphでも同様に、未使用のノードや機能を削ることで、コンパイル負荷を低減できます。

まとめ:マテリアルを自在に扱ってビジュアルを強化しよう

  • 基本はシェーダー選びから:StandardかURP/HDRPの標準シェーダーを使えば、幅広い表現が可能
  • C#で動的に変更SetColorSetTexture を活用すると、演出が格段にアップ
  • sharedMaterial vs material:描画負荷とインスタンス管理に注意しながら運用
  • テクスチャ管理やシェーダー最適化:パフォーマンスを意識すると、ゲーム全体のクオリティが上がる

マテリアルの編集は3Dゲームだけに限らず、2DゲームやUI表現でも大いに役立ちます。オブジェクトの見た目が変わるだけで、プレイヤーの没入感や操作感は大きく変化するものです。ぜひ今回紹介したノウハウをもとに、あなただけの美麗なゲーム世界を作り上げてください!

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

たった5日でFPSゲームが作れる自分に変わる教材はこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion