namespace FishingGame
{
public class SkyCubeUpdater : MonoBehaviour
{
[SerializeField] private int cubemapSize = 128;
[SerializeField] private LayerMask mask;
[SerializeField] private float updateInterval = 1f; // время между рендерами И длительность лерпа
[SerializeField] private Camera cam;
[SerializeField] private UniStormClouds clouds;
private RenderTexture renderTexture0;
private RenderTexture renderTexture1;
private bool currentIs0 = true; // какая текстура сейчас "активна" (в _Cube)
private float lastRenderTime;
IEnumerator Start()
{
yield return null;
for (int i = 0; i < 20; i++)
{
if (clouds != null) clouds.UpdateTex(); // ← раскомментируйте, если метод существует
}
}
void OnDisable()
{
DestroyImmediate(cam);
if (renderTexture0 != null) DestroyImmediate(renderTexture0);
if (renderTexture1 != null) DestroyImmediate(renderTexture1);
}
void LateUpdate()
{
if (renderTexture0 == null)
{
renderTexture0 = CreateCubemapRT("Cube0");
currentIs0 = true;
UpdateCubemap(55);
}
if (renderTexture1 == null)
{
renderTexture1 = CreateCubemapRT("Cube1");
currentIs0 = false;
UpdateCubemap(55);
}
// Всегда обновляем _Lerp
float timeSinceRender = Time.time - lastRenderTime;
float lerp = Mathf.Clamp01(timeSinceRender / updateInterval);
GetComponent<Renderer>().sharedMaterial.SetFloat("_Lerp", lerp);
// Пора рендерить новую кубмапу?
if (timeSinceRender >= updateInterval)
{
// Переключаем буфер
currentIs0 = !currentIs0;
// Обновляем облака (если нужно)
if (clouds != null) clouds.UpdateTex(); // ← раскомментируйте, если метод существует
// Рендерим в "новую" текстуру
UpdateCubemap(55);
// Запоминаем время рендера — начало нового цикла
lastRenderTime = Time.time;
}
}
void UpdateCubemap(int faceMask)
{
if (!cam)
{
GameObject obj = new GameObject("CubemapCamera", typeof(Camera));
obj.hideFlags = HideFlags.HideAndDontSave;
obj.transform.position = transform.position;
obj.transform.rotation = Quaternion.identity;
cam = obj.GetComponent<Camera>();
cam.clearFlags = CameraClearFlags.Skybox;
cam.farClipPlane = 100;
cam.enabled = false;
cam.cullingMask = mask;
}
//if (renderTexture0 == null)
//{
// renderTexture0 = CreateCubemapRT("Cube0");
//}
//if (renderTexture1 == null)
//{
// renderTexture1 = CreateCubemapRT("Cube1");
//}
// Рендерим в текстуру, которая НЕ является текущей
RenderTexture newRT = currentIs0 ? renderTexture0 : renderTexture1;
cam.transform.position = transform.position;
cam.RenderToCubemap(newRT, faceMask);
// Назначаем текстуры в материал:
// _Cube — старая (активная до этого момента)
// _Cube1 — новая (только что отрендеренная)
Renderer renderer = GetComponent<Renderer>();
Material mat = renderer.sharedMaterial;
if (currentIs0)
{
// Новая — renderTexture0, значит старая — renderTexture1
mat.SetTexture("_Cube", renderTexture1); // старая
mat.SetTexture("_Cube1", renderTexture0); // новая
}
else
{
// Новая — renderTexture1, значит старая — renderTexture0
mat.SetTexture("_Cube", renderTexture0); // старая
mat.SetTexture("_Cube1", renderTexture1); // новая
}
GetComponent<Renderer>().sharedMaterial.SetFloat("_Lerp", 0);
// _Lerp будет начинаться с 0 автоматически, потому что lastRenderTime = Time.time
}
RenderTexture CreateCubemapRT(string name)
{
RenderTexture rt = new RenderTexture(cubemapSize, cubemapSize, 0);
rt.dimension = UnityEngine.Rendering.TextureDimension.Cube;
rt.hideFlags = HideFlags.HideAndDontSave;
rt.name = name;
rt.useMipMap = true; // ← добавьте это
rt.autoGenerateMips = true; // ← и это
return rt;
}
}
}