Files
2026-02-23 22:24:46 +07:00

162 lines
3.9 KiB
C#

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace AllIn13DShader
{
public class DemoExpositor : MonoBehaviour
{
public DemoExpositorData expositorData;
[SerializeField] private DemoElement[] demoElements;
private int currentDemoIndex;
public DemoElement CurrentDemoElement => demoElements[currentDemoIndex];
public int CurrentDemoElementIndex => currentDemoIndex;
public void Init(DemoSceneConfiguration demoSceneConfig)
{
for (int i = 0; i < demoElements.Length; i++)
{
demoElements[i].Init(demoSceneConfig, i);
}
}
public void SetDemoExpositor(int newIndex)
{
currentDemoIndex = newIndex;
}
public DemoElement GetNextDemoElement()
{
int nextIndex = currentDemoIndex + 1;
if (nextIndex >= demoElements.Length)
{
nextIndex = 0;
}
DemoElement res = demoElements[nextIndex];
return res;
}
public DemoElement GetPreviousDemoElement()
{
int nextIndex = currentDemoIndex - 1;
if (nextIndex < 0)
{
nextIndex = demoElements.Length - 1;
}
DemoElement res = demoElements[nextIndex];
return res;
}
public void NextDemoElement(Vector3 demoPos)
{
CurrentDemoElement.Hide();
currentDemoIndex++;
if (currentDemoIndex >= demoElements.Length)
{
currentDemoIndex = 0;
}
CurrentDemoElement.transform.position = demoPos;
CurrentDemoElement.Show();
}
public void PreviousDemoElement(Vector3 demoPos)
{
CurrentDemoElement.Hide();
currentDemoIndex--;
if (currentDemoIndex < 0)
{
currentDemoIndex = demoElements.Length - 1;
}
CurrentDemoElement.transform.position = demoPos;
CurrentDemoElement.Show();
}
public void SetElementDemoIndex(int demoIndex)
{
currentDemoIndex = Mathf.Min(demoIndex, demoElements.Length - 1);
}
public DemoElement FindNearestElement(Vector3 referencePosition, out int demoIndex)
{
DemoElement res = null;
float minSqrDistance = float.MaxValue;
demoIndex = 0;
Vector3 referencePositionWithoutY = referencePosition;
referencePositionWithoutY.y = 0f;
for (int i = 0; i < demoElements.Length; i++)
{
Vector3 demoElementWithoutY = demoElements[i].transform.position;
demoElementWithoutY.y = 0f;
float sqrDistance = (referencePositionWithoutY - demoElementWithoutY).sqrMagnitude;
if (sqrDistance <= minSqrDistance)
{
minSqrDistance = sqrDistance;
res = demoElements[i];
demoIndex = i;
}
}
if(CurrentDemoElement.demoElementData.environment == res.demoElementData.environment &&
res.demoElementData.environment != null)
{
res = CurrentDemoElement;
demoIndex = CurrentDemoElement.demoIndex;
}
return res;
}
#if UNITY_EDITOR
public void Setup(DemoExpositorData expositorData, DemoSceneConfiguration demoSceneConfig)
{
this.expositorData = expositorData;
if (demoElements != null)
{
ArrayUtility.Clear(ref demoElements);
}
else
{
demoElements = new DemoElement[0];
}
DemoEnvironment lastEnvironment = null;
Vector3 lastLocalPosition = new Vector3(-demoSceneConfig.distanceBetweenDemos, 0f, 0f);
for (int i = 0; i < expositorData.demos.Length; i++)
{
DemoElementData demoElementData = expositorData.demos[i];
GameObject demoElementGo = (GameObject)PrefabUtility.InstantiatePrefab(demoElementData.prefab, transform);
lastLocalPosition.x += demoSceneConfig.distanceBetweenDemos;
lastEnvironment = demoElementData.environment;
demoElementGo.transform.localPosition = lastLocalPosition;
demoElementGo.transform.localRotation = Quaternion.identity;
Debug.LogError($"{gameObject.name} - {demoElementGo.name} at {demoElementGo.transform.localPosition} -t:{Time.time}", demoElementGo);
DemoElement demoElement = demoElementGo.GetComponent<DemoElement>();
ArrayUtility.Add(ref demoElements, demoElement);
}
currentDemoIndex = 0;
}
#endif
}
}