新Head
This commit is contained in:
@@ -1,72 +1,66 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Ichni.RhythmGame;
|
||||
using Ichni.RhythmGame.Beatmap;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Ichni.Editor
|
||||
{
|
||||
public class CameraManager : MonoBehaviour, IBaseElement
|
||||
{
|
||||
public Camera backgroundCamera;
|
||||
|
||||
public bool isSceneCameraActive;
|
||||
public SceneCamera sceneCamera;
|
||||
public float sceneCameraMoveSpeed;
|
||||
public float sceneCameraRotateSpeed;
|
||||
|
||||
public PanelDrawer panelDrawer => EditorManager.instance.panelDrawer;
|
||||
|
||||
public GameCamera gameCamera;
|
||||
public bool haveGameCamera => gameCamera != null;
|
||||
public Camera currentCamera => haveGameCamera && !isSceneCameraActive ? gameCamera.cam : sceneCamera.sceneCamera;
|
||||
|
||||
public BaseElement_BM matchedBM { get; set; }
|
||||
|
||||
public void SwitchCamera()
|
||||
{
|
||||
if (!haveGameCamera)
|
||||
{
|
||||
LogWindow.Log("GameCamera is not assigned", Color.red);
|
||||
return;
|
||||
}
|
||||
|
||||
isSceneCameraActive = !isSceneCameraActive;
|
||||
sceneCamera.sceneCamera.enabled = isSceneCameraActive;
|
||||
gameCamera.cam.enabled = !isSceneCameraActive;
|
||||
|
||||
EditorManager.instance.backgroundController.backgroundCanvas.worldCamera = currentCamera;
|
||||
}
|
||||
|
||||
public void SetUpInspector()
|
||||
{
|
||||
string ShowCameraType() => isSceneCameraActive ? "Scene Camera" : "Game Camera";
|
||||
|
||||
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
|
||||
|
||||
var container = inspector.GenerateContainer("Camera Manager");
|
||||
|
||||
//切换摄像机,设置场景相机
|
||||
var cameraSettings = container.GenerateSubcontainer(3);
|
||||
var cameraTypeText = inspector.GenerateHintText(this, cameraSettings, ShowCameraType);
|
||||
var switchCameraButton = inspector.GenerateButton(this, cameraSettings, "Switch Camera", SwitchCamera);
|
||||
var cameraMoveSpeedField = inspector.GenerateInputField(this, cameraSettings, "Scene Camera Move Speed", nameof(sceneCameraMoveSpeed));
|
||||
var camMethods = container.GenerateSubcontainer(1);
|
||||
|
||||
{
|
||||
var butt1 = inspector.GenerateButton(this, camMethods, panelDrawer.isEditing ? "End Edit" : "Start Edit", () =>
|
||||
{ });
|
||||
butt1.AddListenerFunction(() =>
|
||||
{
|
||||
panelDrawer.SwitchEditing();
|
||||
butt1.buttonText.text = panelDrawer.isEditing ? "End Edit" : "Start Edit";
|
||||
});
|
||||
}
|
||||
|
||||
sceneCamera.SetUpInspector();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Ichni.RhythmGame;
|
||||
using Ichni.RhythmGame.Beatmap;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Ichni.Editor
|
||||
{
|
||||
public class CameraManager : MonoBehaviour, IBaseElement
|
||||
{
|
||||
public Camera backgroundCamera;
|
||||
|
||||
public bool isSceneCameraActive;
|
||||
public SceneCamera sceneCamera;
|
||||
public float sceneCameraMoveSpeed;
|
||||
public float sceneCameraRotateSpeed;
|
||||
|
||||
public PanelDrawer panelDrawer => EditorManager.instance.panelDrawer;
|
||||
|
||||
public GameCamera gameCamera;
|
||||
public bool haveGameCamera => gameCamera != null;
|
||||
public Camera currentCamera => haveGameCamera && !isSceneCameraActive ? gameCamera.cam : sceneCamera.sceneCamera;
|
||||
|
||||
public BaseElement_BM matchedBM { get; set; }
|
||||
|
||||
public void SwitchCamera()
|
||||
{
|
||||
if (!haveGameCamera)
|
||||
{
|
||||
LogWindow.Log("GameCamera is not assigned", Color.red);
|
||||
return;
|
||||
}
|
||||
|
||||
isSceneCameraActive = !isSceneCameraActive;
|
||||
sceneCamera.sceneCamera.enabled = isSceneCameraActive;
|
||||
gameCamera.cam.enabled = !isSceneCameraActive;
|
||||
|
||||
EditorManager.instance.backgroundController.backgroundCanvas.worldCamera = currentCamera;
|
||||
}
|
||||
|
||||
public void SetUpInspector()
|
||||
{
|
||||
var editBtnRef = new ElementRef<DynamicUIButton>();
|
||||
|
||||
InspectorBuilder.For(this)
|
||||
.Section("Camera Manager")
|
||||
.HintText(() => isSceneCameraActive ? "Scene Camera" : "Game Camera")
|
||||
.Button("Switch Camera", SwitchCamera)
|
||||
.InputField(nameof(sceneCameraMoveSpeed), "Scene Camera Move Speed")
|
||||
.Button(panelDrawer.isEditing ? "End Edit" : "Start Edit", () => { })
|
||||
.Span(3)
|
||||
.WithRef(editBtnRef)
|
||||
.OnChanged(() =>
|
||||
{
|
||||
panelDrawer.SwitchEditing();
|
||||
if (editBtnRef.Value != null)
|
||||
editBtnRef.Value.buttonText.text = panelDrawer.isEditing ? "End Edit" : "Start Edit";
|
||||
})
|
||||
.Build();
|
||||
|
||||
sceneCamera.SetUpInspector();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,60 +57,64 @@ namespace Ichni
|
||||
#region [编辑器界面] Inspector
|
||||
public override void SetUpInspector()
|
||||
{
|
||||
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
|
||||
|
||||
var container = inspector.GenerateContainer("Editor Manager");
|
||||
|
||||
var inGameSettings = container.GenerateSubcontainer(3);
|
||||
inspector.GenerateDropdown(this, inGameSettings, "Judge Type",
|
||||
typeof(NoteBase.NoteJudgeType), nameof(currentJudgeType))
|
||||
.AddListenerFunction(() =>
|
||||
{
|
||||
foreach (GameElement gameElement in beatmapContainer.gameElementList)
|
||||
{
|
||||
if (gameElement is NoteVisualBase noteVisual)
|
||||
InspectorBuilder.For(this)
|
||||
.Section("Editor Manager")
|
||||
.Dropdown(nameof(currentJudgeType), typeof(NoteBase.NoteJudgeType), "Judge Type")
|
||||
.OnChanged(() =>
|
||||
{
|
||||
noteVisual.Recover();
|
||||
}
|
||||
}
|
||||
});
|
||||
inspector.GenerateToggle(this, inGameSettings, "Use Note Prefab", nameof(useNotePrefab));
|
||||
inspector.GenerateToggle(this, inGameSettings, "Use Click Select", nameof(useClickSelect));
|
||||
inspector.GenerateToggle(this, inGameSettings, "Use Quick Move", nameof(useQuickMove));
|
||||
|
||||
var generation = container.GenerateSubcontainer(3);
|
||||
inspector.GenerateButton(this, generation, "Generate Folder",
|
||||
() => ElementFolder.GenerateElement("Folder", Guid.NewGuid(), new List<string>(), true, null));
|
||||
inspector.GenerateButton(this, generation, "Generate Background Setter",
|
||||
() => BackgroundSetter.GenerateElement("Background Setter", Guid.NewGuid(),
|
||||
new List<string>(), true, null, false, "basic", "Skybox", "Background"));
|
||||
inspector.GenerateButton(this, generation, "Generate Variables Container",
|
||||
() => VariablesContainer.GenerateElement("Variables Container", Guid.NewGuid(),
|
||||
new List<string>(), true, null, new Dictionary<string, int>()));
|
||||
foreach (GameElement gameElement in beatmapContainer.gameElementList)
|
||||
{
|
||||
if (gameElement is NoteVisualBase noteVisual)
|
||||
noteVisual.Recover();
|
||||
}
|
||||
})
|
||||
.Toggle(nameof(useNotePrefab), "Use Note Prefab")
|
||||
.Toggle(nameof(useClickSelect), "Use Click Select")
|
||||
.Toggle(nameof(useQuickMove), "Use Quick Move")
|
||||
.Button("Generate Folder", () =>
|
||||
ElementFolder.GenerateElement("Folder", Guid.NewGuid(), new List<string>(), true, null))
|
||||
.Button("Generate Background Setter", () =>
|
||||
BackgroundSetter.GenerateElement("Background Setter", Guid.NewGuid(),
|
||||
new List<string>(), true, null, false, "basic", "Skybox", "Background"))
|
||||
.Button("Generate Variables Container", () =>
|
||||
VariablesContainer.GenerateElement("Variables Container", Guid.NewGuid(),
|
||||
new List<string>(), true, null, new Dictionary<string, int>()))
|
||||
.Build();
|
||||
|
||||
projectInformation.SetUpInspector();
|
||||
songInformation.SetUpInspector();
|
||||
EditorManager.instance.cameraManager.SetUpInspector();
|
||||
|
||||
var oo = inspector.GenerateContainer("Grid");
|
||||
var p = oo.GenerateSubcontainer(3);
|
||||
var po = inspector.GenerateToggle(this, p, "Enable Grid");
|
||||
po.AddListenerFunction(() =>
|
||||
{
|
||||
EditorManager.instance.gridController.gameObject.SetActive(po.toggle.isOn);
|
||||
});
|
||||
var o = inspector.GenerateInputField(p, "Grid Size",
|
||||
(EditorManager.instance.gridController.baseGridSize * 10).ToString());
|
||||
o.AddListenerFunction(() =>
|
||||
{
|
||||
EditorManager.instance.gridController.baseGridSize = float.Parse(o.inputField.text) / 10;
|
||||
});
|
||||
var sc = inspector.GenerateToggle(this, p, "Show Coordinates");
|
||||
sc.toggle.isOn = EditorManager.instance.gridController.showCoordinates;
|
||||
sc.AddListenerFunction(() =>
|
||||
{
|
||||
EditorManager.instance.gridController.showCoordinates = sc.toggle.isOn;
|
||||
});
|
||||
// Grid 设置使用 RawSection 处理无绑定 Toggle/InputField 交互
|
||||
var gridToggleRef = new ElementRef<DynamicUIToggle>();
|
||||
var gridSizeRef = new ElementRef<DynamicUIInputField>();
|
||||
var showCoordsRef = new ElementRef<DynamicUIToggle>();
|
||||
|
||||
InspectorBuilder.For(this)
|
||||
.RawSection("Grid", int.MaxValue, (insp, container) =>
|
||||
{
|
||||
var p = container.GenerateSubcontainer(3);
|
||||
var gridToggle = insp.GenerateToggle(this, p, "Enable Grid");
|
||||
gridToggle.AddListenerFunction(() =>
|
||||
{
|
||||
EditorManager.instance.gridController.gameObject.SetActive(gridToggle.toggle.isOn);
|
||||
});
|
||||
|
||||
var gridSizeInput = insp.GenerateInputField(p, "Grid Size",
|
||||
(EditorManager.instance.gridController.baseGridSize * 10).ToString());
|
||||
gridSizeInput.AddListenerFunction(() =>
|
||||
{
|
||||
EditorManager.instance.gridController.baseGridSize = float.Parse(gridSizeInput.inputField.text) / 10;
|
||||
});
|
||||
|
||||
var showCoords = insp.GenerateToggle(this, p, "Show Coordinates");
|
||||
showCoords.toggle.isOn = EditorManager.instance.gridController.showCoordinates;
|
||||
showCoords.AddListenerFunction(() =>
|
||||
{
|
||||
EditorManager.instance.gridController.showCoordinates = showCoords.toggle.isOn;
|
||||
});
|
||||
})
|
||||
.Build();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,75 +1,67 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Ichni.RhythmGame;
|
||||
using Ichni.RhythmGame.Beatmap;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Ichni.Editor
|
||||
{
|
||||
public class SceneCamera : MonoBehaviour, IBaseElement
|
||||
{
|
||||
[FormerlySerializedAs("camera")] public Camera sceneCamera;
|
||||
|
||||
public GameCamera.CameraViewType viewType;
|
||||
public float perspectiveAngle;
|
||||
public float orthographicSize;
|
||||
|
||||
public BaseElement_BM matchedBM { get; set; }
|
||||
|
||||
[HideInInspector]
|
||||
public Vector3 cameraPosition
|
||||
{
|
||||
get => sceneCamera.transform.position;
|
||||
set
|
||||
{
|
||||
sceneCamera.transform.position = value;
|
||||
}
|
||||
}
|
||||
[HideInInspector]
|
||||
public Vector3 cameraEulerAngles
|
||||
{
|
||||
get => sceneCamera.transform.eulerAngles;
|
||||
set
|
||||
{
|
||||
sceneCamera.transform.eulerAngles = value;
|
||||
}
|
||||
}
|
||||
public bool CanBeFreeRotate => !EditorManager.instance.cameraManager.panelDrawer.isEditing;
|
||||
|
||||
|
||||
public void SetUpInspector()
|
||||
{
|
||||
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
|
||||
var container = inspector.GenerateContainer("Scene Camera");
|
||||
|
||||
//摄像机参数设置
|
||||
var cameraSettings = container.GenerateSubcontainer(3);
|
||||
var viewTypeDropdown =
|
||||
inspector.GenerateDropdown(this, cameraSettings, "View Type", typeof(GameCamera.CameraViewType), nameof(viewType))
|
||||
.AddListenerFunction(() => sceneCamera.orthographic = viewType == GameCamera.CameraViewType.Orthographic);
|
||||
var perspectiveAngleField =
|
||||
inspector.GenerateInputField(this, cameraSettings, "Perspective Angle", nameof(perspectiveAngle))
|
||||
.AddListenerFunction(() => sceneCamera.fieldOfView = perspectiveAngle);
|
||||
var orthographicSizeField =
|
||||
inspector.GenerateInputField(this, cameraSettings, "Orthographic Size", nameof(orthographicSize))
|
||||
.AddListenerFunction(() => sceneCamera.orthographicSize = orthographicSize);
|
||||
|
||||
//摄像机位置与旋转设置
|
||||
var transformSettings = container.GenerateSubcontainer(1);
|
||||
var positionInputFields =
|
||||
inspector.GenerateVector3InputField(this, transformSettings, "Position", nameof(cameraPosition), true)
|
||||
.AddListenerFunction(() => sceneCamera.transform.position = cameraPosition);
|
||||
var eulerAnglesInputFields =
|
||||
inspector.GenerateVector3InputField(this, transformSettings, "Euler Angles", nameof(cameraEulerAngles), true)
|
||||
.AddListenerFunction(() => sceneCamera.transform.eulerAngles = cameraEulerAngles);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
cameraPosition = sceneCamera.transform.position;
|
||||
cameraEulerAngles = sceneCamera.transform.eulerAngles;
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Ichni.RhythmGame;
|
||||
using Ichni.RhythmGame.Beatmap;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Ichni.Editor
|
||||
{
|
||||
public class SceneCamera : MonoBehaviour, IBaseElement
|
||||
{
|
||||
[FormerlySerializedAs("camera")] public Camera sceneCamera;
|
||||
|
||||
public GameCamera.CameraViewType viewType;
|
||||
public float perspectiveAngle;
|
||||
public float orthographicSize;
|
||||
|
||||
public BaseElement_BM matchedBM { get; set; }
|
||||
|
||||
[HideInInspector]
|
||||
public Vector3 cameraPosition
|
||||
{
|
||||
get => sceneCamera.transform.position;
|
||||
set
|
||||
{
|
||||
sceneCamera.transform.position = value;
|
||||
}
|
||||
}
|
||||
[HideInInspector]
|
||||
public Vector3 cameraEulerAngles
|
||||
{
|
||||
get => sceneCamera.transform.eulerAngles;
|
||||
set
|
||||
{
|
||||
sceneCamera.transform.eulerAngles = value;
|
||||
}
|
||||
}
|
||||
public bool CanBeFreeRotate => !EditorManager.instance.cameraManager.panelDrawer.isEditing;
|
||||
|
||||
|
||||
public void SetUpInspector()
|
||||
{
|
||||
InspectorBuilder.For(this)
|
||||
.Section("Scene Camera")
|
||||
.Dropdown(nameof(viewType), typeof(GameCamera.CameraViewType), "View Type")
|
||||
.OnChanged(() => sceneCamera.orthographic = viewType == GameCamera.CameraViewType.Orthographic)
|
||||
.InputField(nameof(perspectiveAngle), "Perspective Angle")
|
||||
.OnChanged(() => sceneCamera.fieldOfView = perspectiveAngle)
|
||||
.InputField(nameof(orthographicSize), "Orthographic Size")
|
||||
.OnChanged(() => sceneCamera.orthographicSize = orthographicSize)
|
||||
.Vector3Field(nameof(cameraPosition), "Position")
|
||||
.AutoUpdate()
|
||||
.OnChanged(() => sceneCamera.transform.position = cameraPosition)
|
||||
.Vector3Field(nameof(cameraEulerAngles), "Euler Angles")
|
||||
.AutoUpdate()
|
||||
.OnChanged(() => sceneCamera.transform.eulerAngles = cameraEulerAngles)
|
||||
.Build();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
cameraPosition = sceneCamera.transform.position;
|
||||
cameraEulerAngles = sceneCamera.transform.eulerAngles;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user