99jamin af8790f026 인테리어 추가
Interior 폴더에 정리
2025-04-16 11:42:07 +09:00

102 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
#if UNITY_EDITOR
using Seagull.Interior_01.Utility.Inspector;
#endif
namespace Seagull.Interior_01.Utility {
public class YureiManagerBRP : MonoBehaviour {
public GameObject postProcessVolumePrefab;
[Tooltip("Post Process effect including glowing will only show to these cameras")]
public List<Camera> gameCameras = new();
[Tooltip("Which layer should Yurei Post Processor Volume use")]
public int yureiLayer = -1;
[YureiButton("Initialize")] [IgnoreInInspector]
public Action initialize;
private void Reset() {
initialize = init;
}
private void init() {
if (gameCameras == null || gameCameras.Count == 0) {
Debug.LogError("Please provide at least 1 valid camera to Game Cameras field.");
return;
}
if (string.IsNullOrEmpty(LayerMask.LayerToName(yureiLayer))) {
Debug.LogError("Please provide a valid layer ID in Yurei Layer field.");
return;
}
setupPostProcessorVlume();
foreach (var camera in gameCameras) {
PostProcessLayer ppl = camera.GetComponent<PostProcessLayer>();
if (ppl) {
ppl.volumeLayer |= LayerMask.GetMask(LayerMask.LayerToName(yureiLayer));
continue;
}
ppl = camera.gameObject.AddComponent<PostProcessLayer>();
ppl.volumeLayer = LayerMask.GetMask(LayerMask.LayerToName(yureiLayer));
}
Debug.Log($"[Yurei] Init post-processor settings for Built-in Rendering Pipeline successfully.");
}
private void setupPostProcessorVlume() {
// 检查现在有没有 Yurei Post Processor
bool hasValidPostProcessor = false;
GameObject globalPPVGobj = GameObject.Find("Yurei Post Process Volume");
PostProcessVolume globalPPV = null;
if (globalPPVGobj != null) {
globalPPV = globalPPVGobj.GetComponent<PostProcessVolume>();
YureiPostProcessorIdentifier yppi = globalPPVGobj.GetComponent<YureiPostProcessorIdentifier>();
if (yppi != null) hasValidPostProcessor = true;
}
// 如果没有,则创建 Yurei Post Process Volume
if (!hasValidPostProcessor) {
GameObject postProcessor = GameObject.Instantiate(postProcessVolumePrefab);
postProcessor.layer = yureiLayer;
postProcessor.name = "Yurei Post Process Volume";
}
// 如果有 则检查它的完整性
else {
globalPPVGobj.layer = yureiLayer;
if (globalPPV.sharedProfile == null) {
globalPPV.sharedProfile = ScriptableObject.CreateInstance<PostProcessProfile>();
// 保存资产到指定路径
#if UNITY_EDITOR
AssetDatabase.CreateAsset(globalPPV.sharedProfile, "Assets/Yurei Post Process Volume.asset");
AssetDatabase.SaveAssets();
#endif
}
if (globalPPV.sharedProfile.GetSetting<Bloom>() == null)
globalPPV.sharedProfile.AddSettings<Bloom>();
Bloom b = globalPPV.sharedProfile.GetSetting<Bloom>();
if (!b.active) b.active = true;
if (!b.enabled) b.enabled.value = true;
b.intensity.value = 14.5f;
b.intensity.overrideState = true;
b.threshold.value = 2f;
b.threshold.overrideState = true;
}
}
}
#if UNITY_EDITOR
[CustomEditor(typeof(YureiManagerBRP))]
public class YureiInitializerInspector : YureiInspector { }
#endif
}