コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】ミップマップで使用されるテクスチャをカスタマイズして、距離によって見え方を変えてみる

はじめに

Unity ではミップマップテクスチャをカスタマイズすることができるので

f:id:baba_s:20190602155544g:plain

f:id:baba_s:20190602154709g:plain

普通はカメラからの距離が変わっても見た目は変わらないところも

f:id:baba_s:20190602155608g:plain

例えば、3D キャラの装飾の色がカメラからの距離に応じて変わるようにしてみたり

f:id:baba_s:20190602154738g:plain

2D 画像がカメラからの距離によって変化するようにしてみたりできます

方法

f:id:baba_s:20190602160327p:plain

ミップマップテクスチャをカスタマイズしたいテクスチャを選択して
「Read/Write Enabled」と「Generate Mip Maps」をオンにします

f:id:baba_s:20190602160331g:plain

現状、ミップマップテクスチャには、
単純に縮小されたテクスチャが割り当てられていることを確認しておきます

f:id:baba_s:20190602160338p:plain

ミップマップテクスチャに設定したいテクスチャを選択して
「Read/Write Enabled」をオンにし、「Format」を「RGBA 32 bit」にします

f:id:baba_s:20190602160343p:plain

f:id:baba_s:20190602160346p:plain

f:id:baba_s:20190602160350p:plain

ミップマップテクスチャに設定したいテクスチャは
ミップマップレベルに応じたサイズにしておきます

using UnityEditor;
using UnityEngine;

public class Example : AssetPostprocessor
{
    // Unity プロジェクトにテクスチャが追加されたり、
    // Unity プロジェクトのテクスチャが変更されたりした時に呼び出されます
    private void OnPostprocessTexture( Texture2D texture )
    {
        // ミップマップテクスチャに設定するテクスチャを読み込みます
        var tex1 = AssetDatabase.LoadAssetAtPath<Texture2D>( "Assets/001.png" );
        var tex2 = AssetDatabase.LoadAssetAtPath<Texture2D>( "Assets/002.png" );
        var tex3 = AssetDatabase.LoadAssetAtPath<Texture2D>( "Assets/003.png" );
        
        // ミップマップテクスチャを設定します
        // 第2引数でミップマップレベルを指定できます
        texture.SetPixels( tex1.GetPixels( 0 ), 1 );
        texture.SetPixels( tex2.GetPixels( 0 ), 2 );
        texture.SetPixels( tex3.GetPixels( 0 ), 3 );

        // 変更を適用します
        texture.Apply( false );
    }
}

上記のようなスクリプトを作成して
Unity プロジェクトの「Editor」フォルダに追加します

f:id:baba_s:20190602161348p:plain

ミップマップテクスチャをカスタマイズしたいテクスチャを右クリックして
「Reimport」を選択します

f:id:baba_s:20190602161352g:plain

これで、ミップマップテクスチャをカスタマイズできたことが確認できます

f:id:baba_s:20190602161746g:plain

ミップマップテクスチャをカスタマイズしたテクスチャを
シーンに存在するゲームオブジェクトに割り当てて、
カメラからの距離を変えてみると、距離に応じて見え方が変わることが確認できます

f:id:baba_s:20190602161824p:plain

初期状態では、一定距離に達するとテクスチャがくっきりと切り替わる状態ですが、
「Fadeout Mip Maps」をオンにすることで

f:id:baba_s:20190602161828g:plain

フェードしながらだんだんとテクスチャが切り替わるようになります