fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【エディタ拡張】Project Settings (Graphics Settings) をスクリプトで変更する

【Unity】【エディタ拡張】Project Settings (Graphics Settings) をスクリプトで変更する  


 う~む、Unity 標準の Fog (Light Settings にあるやつ) を実験してたんだけど、どうやら Android でビルドすると、アプリサイズが肥大化するみたいだな。3種類(Linear, Exponential, ExponentialSquared) 入れてみたら、200MB も増えた…。そしてスマホだとメモリー不足で落ちる…。|||orz

 しかし、PC 版には入れたい(PC 版ではあまりサイズは増えない)。だけど Graphics Settings って、Shader stripping 以下の項目ってプラットフォームごとに設定できないんだよね。PC 版では Custom で 3種類(Linear, Exponential, ExponentialSquared) 入れて、Android 版では入れないようにしたい。でも毎回手動で設定するのは面倒くさい…。

 Editor~系のクラスでできるのかな?と思ったけど、どうもできそうなのが見つからないので、ググってみたら、似たようなことをやってるのを見つけた。これを改造したら、どうやら上手く行くようだ。そのメモ。

(参考)
Project Settings の「Disable Unity Audio」をスクリプトから操作する方法

(※) Unity 2020.3.26f1 / Windows11(x64) で確認

●Graphics Settings の Fog 設定をスクリプトで変更する (メニュー)
using System.Linq;
using UnityEngine;
using UnityEditor;

namespace Exsample
{
//※Editor フォルダに配置
public static partial class GraphicsSettingsEdit //※クラス名は任意
{
//フォグ設定をビルドに含める
[MenuItem("Tools/Include Fog in Build")]
private static void IncludeFogInBuild()
{
var path = "ProjectSettings/GraphicsSettings.asset";
var manager = AssetDatabase.LoadAllAssetsAtPath(path).FirstOrDefault();
var obj = new SerializedObject(manager);
var prop = obj.FindProperty("m_FogStripping");
prop.intValue = 1; //0: Automatic, 1: Custom
prop = obj.FindProperty("m_FogKeepLinear");
prop.boolValue = true;
prop = obj.FindProperty("m_FogKeepExp");
prop.boolValue = true;
prop = obj.FindProperty("m_FogKeepExp2");
prop.boolValue = true;
obj.ApplyModifiedProperties();
}

//フォグ設定をビルドから除外
[MenuItem("Tools/Exclude Fog in Build")]
private static void ExcludeFogInBuild()
{
var path = "ProjectSettings/GraphicsSettings.asset";
var manager = AssetDatabase.LoadAllAssetsAtPath(path).FirstOrDefault();
var obj = new SerializedObject(manager);
var prop = obj.FindProperty("m_FogStripping");
prop.intValue = 1; //0: Automatic, 1: Custom
prop = obj.FindProperty("m_FogKeepLinear");
prop.boolValue = false;
prop = obj.FindProperty("m_FogKeepExp");
prop.boolValue = false;
prop = obj.FindProperty("m_FogKeepExp2");
prop.boolValue = false;
obj.ApplyModifiedProperties();
}
}
}

 これは Unity プロジェクトのルートにある ProjectSettings フォルダ内の GraphicsSettings.asset の内容を書き換えるものだ。各 ~.asset ファイルは YAML(?)なので、テキストエディタで開ける。"m_~" でプロパティ名で保存されているので、何でもできそうだ(名前がわからないのなら、一度エディタで変更して、差分を見ればわかる)。

 ここでは余談だが、Automatic だと、エディタではオフで、ランタイムでオンに切り替えたりする使い方の場合、stripping されるのでビルドに含まれなくなってしまう。必ず Custom にして、使いたい FogMode をオンにしておく必要がある。



 上記のスクリプトはメニューから変更するものだけど、これと以前作ったプラットフォーム切り替えのコールバックを合わせれば、自動で設定変更もできる

Unity2020 でプラットフォーム切り替えをすると、Run In Background が勝手にオフになってしまう

●プラットフォーム切り替え・ビルド開始時にフォグ設定を強制的に更新するスクリプト
using UnityEngine;
using UnityEditor;
using UnityEditor.Build;

//※Editor フォルダに配置
public class EditorPlatformSetting : IActiveBuildTargetChanged, IPreprocessBuild //※クラス名は任意
{
public int callbackOrder => 0;

//ビルドターゲットを変更したときのコールバックハンドラ
public void OnActiveBuildTargetChanged(BuildTarget previousTarget, BuildTarget newTarget)
{
Debug.Log("BuildTarget is " + newTarget);
UpdateFogSettingsByPlatform(newTarget);
}

//ビルド開始するときのコールバックハンドラ
public void OnPreprocessBuild(BuildTarget target, string path)
{
UpdateFogSettingsByPlatform(target);
}

//プラットフォームにより、強制的にフォグ設定を更新する
void UpdateFogSettingsByPlatform(BuildTarget target)
{
switch (target)
{
//※必要なら、プラットフォームを追加する
case BuildTarget.StandaloneWindows:
case BuildTarget.StandaloneWindows64:
IncludeFogInBuild(); //フォグをビルドに含める
break;

case BuildTarget.Android:
ExcludeFogInBuild(); //フォグをビルドから除外
break;
}
}
}

 OnActiveBuildTargetChanged(BuildTarget previousTarget, BuildTarget newTarget) でプラットフォーム判別できるので、ここで IncludeFogInBuild() または ExcludeFogInBuild() を呼べば良いね。path と FindProperty() のプロパティ名を変えれば、色々自動化できそうだ。ただし、Unity はバージョンによって、たまにプロパティ名が変わるので、そこだけは注意だけどね。







(関連記事)
Unity】Unity2020 でプラットフォーム切り替えをすると、Run In Background が勝手にオフになってしまう


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  エディタ拡張 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/410-19849cbc
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

PR

▲ Pagetop