这能叫例行更新吗

Signed-off-by: TRAfoer <lhf190@outlook.com>
This commit is contained in:
2026-02-09 23:10:55 +08:00
parent 77726bcb6c
commit a76f650998
40 changed files with 1323 additions and 866 deletions

View File

@@ -11,26 +11,28 @@ 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 = new();
public GameCamera gameCamera;
public bool haveGameCamera => gameCamera != null;
public Camera currentCamera => haveGameCamera && !isSceneCameraActive ? gameCamera.gameCamera : 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.gameCamera.enabled = !isSceneCameraActive;
@@ -41,17 +43,33 @@ namespace Ichni.Editor
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);
if (!panelDrawer.isEditing)
{
var butt1 = inspector.GenerateButton(this, camMethods, "startEdit", () =>
{
panelDrawer.startEdit();
});
}
else
{
var butt2 = inspector.GenerateButton(this, camMethods, "endEdit", () =>
{
panelDrawer.endEdit();
});
}
sceneCamera.SetUpInspector();
}
}
}

View File

@@ -68,66 +68,69 @@ namespace Ichni.Editor
private bool isRotatingSceneCamera;
private Transform sceneCameraTransform;
private Vector3 _currentRotation; // 在类成员中缓存旋转角度
private void SceneCameraOperation()
{
if (Keyboard.current.ctrlKey.isPressed || Keyboard.current.altKey.isPressed || Keyboard.current.shiftKey.isPressed)
var kb = Keyboard.current;
var mouse = Mouse.current;
var camManager = EditorManager.instance.cameraManager;
// 1. 组合按键拦截(保持原有逻辑,但缓存引用)
if (kb.ctrlKey.isPressed || kb.altKey.isPressed || kb.shiftKey.isPressed) return;
bool isActive = camManager.isSceneCameraActive;
// 2. 位移逻辑优化
if (isActive && !isPointerOverUI)
{
return;
}
float moveSpeed = camManager.sceneCameraMoveSpeed * Time.deltaTime;
Vector3 moveDir = Vector3.zero;
if (EditorManager.instance.cameraManager.isSceneCameraActive && !isPointerOverUI) // 场景相机的移动和旋转
{
float cameraMoveSpeed = EditorManager.instance.cameraManager.sceneCameraMoveSpeed * Time.deltaTime;
// 计算合成位移向量
if (kb.wKey.isPressed) moveDir += sceneCameraTransform.forward;
if (kb.sKey.isPressed) moveDir -= sceneCameraTransform.forward;
if (kb.dKey.isPressed) moveDir += sceneCameraTransform.right;
if (kb.aKey.isPressed) moveDir -= sceneCameraTransform.right;
if (kb.eKey.isPressed) moveDir += sceneCameraTransform.up;
if (kb.qKey.isPressed) moveDir -= sceneCameraTransform.up;
if (Keyboard.current.wKey.isPressed)
// 一次性应用位移(如果存在移动)
if (moveDir != Vector3.zero)
{
sceneCameraTransform.position += sceneCameraTransform.forward * cameraMoveSpeed;
}
if (Keyboard.current.sKey.isPressed)
{
sceneCameraTransform.position -= sceneCameraTransform.forward * cameraMoveSpeed;
}
if (Keyboard.current.dKey.isPressed)
{
sceneCameraTransform.position += sceneCameraTransform.right * cameraMoveSpeed;
}
if (Keyboard.current.aKey.isPressed)
{
sceneCameraTransform.position -= sceneCameraTransform.right * cameraMoveSpeed;
}
if (Keyboard.current.eKey.isPressed)
{
sceneCameraTransform.position += sceneCameraTransform.up * cameraMoveSpeed;
}
if (Keyboard.current.qKey.isPressed)
{
sceneCameraTransform.position -= sceneCameraTransform.up * cameraMoveSpeed;
sceneCameraTransform.position += moveDir.normalized * moveSpeed;
}
}
if (EditorManager.instance.cameraManager.isSceneCameraActive)
// 3. 旋转状态切换
if (isActive)
{
if (Mouse.current.rightButton.wasPressedThisFrame && !isPointerOverUI)
if (mouse.rightButton.wasPressedThisFrame && !isPointerOverUI)
{
isRotatingSceneCamera = true;
// 初始化当前旋转角度,防止旋转跳变
_currentRotation = sceneCameraTransform.eulerAngles;
}
else if (Mouse.current.rightButton.wasReleasedThisFrame)
else if (mouse.rightButton.wasReleasedThisFrame)
{
isRotatingSceneCamera = false;
}
}
if (isRotatingSceneCamera)
// 4. 旋转逻辑优化:使用欧拉角避免万向节锁
if (isRotatingSceneCamera && EditorManager.instance.cameraManager.sceneCamera.CanBeFreeRotate)
{
float cameraRotateSpeed = EditorManager.instance.cameraManager.sceneCameraRotateSpeed * Time.deltaTime;
Vector2 mouseDelta = Mouse.current.delta.ReadValue();
sceneCameraTransform.Rotate(Vector3.up, -mouseDelta.x * cameraRotateSpeed, Space.World);
sceneCameraTransform.Rotate(sceneCameraTransform.right, mouseDelta.y * cameraRotateSpeed, Space.World);
float rotateSpeed = camManager.sceneCameraRotateSpeed * Time.deltaTime;
Vector2 mouseDelta = mouse.delta.ReadValue();
// 计算新的旋转角度Y轴左右转X轴上下抬头
_currentRotation.y += mouseDelta.x * rotateSpeed;
_currentRotation.x -= mouseDelta.y * rotateSpeed;
// 限制抬头角度(防止翻转)
_currentRotation.x = Mathf.Clamp(_currentRotation.x, -89f, 89f);
sceneCameraTransform.rotation = Quaternion.Euler(_currentRotation.x, _currentRotation.y, 0f);
}
}

View File

@@ -19,24 +19,40 @@ namespace Ichni.Editor
public BaseElement_BM matchedBM { get; set; }
[HideInInspector]
public Vector3 cameraPosition; //注意这里的Position和EulerAngles是transform的中介变量仅能用于Inspector显示
public Vector3 cameraPosition
{
get => sceneCamera.transform.position;
set
{
sceneCamera.transform.position = value;
}
}
[HideInInspector]
public Vector3 cameraEulerAngles;
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 =
var viewTypeDropdown =
inspector.GenerateDropdown(this, cameraSettings, "View Type", typeof(GameCamera.CameraViewType), nameof(viewType))
.AddListenerFunction(() => sceneCamera.orthographic = viewType == GameCamera.CameraViewType.Orthographic);
var perspectiveAngleField =
var perspectiveAngleField =
inspector.GenerateInputField(this, cameraSettings, "Perspective Angle", nameof(perspectiveAngle))
.AddListenerFunction(() => sceneCamera.fieldOfView = perspectiveAngle);
var orthographicSizeField =
var orthographicSizeField =
inspector.GenerateInputField(this, cameraSettings, "Orthographic Size", nameof(orthographicSize))
.AddListenerFunction(() => sceneCamera.orthographicSize = orthographicSize);
@@ -45,7 +61,7 @@ namespace Ichni.Editor
var positionInputFields =
inspector.GenerateVector3InputField(this, transformSettings, "Position", nameof(cameraPosition), true)
.AddListenerFunction(() => sceneCamera.transform.position = cameraPosition);
var eulerAnglesInputFields =
var eulerAnglesInputFields =
inspector.GenerateVector3InputField(this, transformSettings, "Euler Angles", nameof(cameraEulerAngles), true)
.AddListenerFunction(() => sceneCamera.transform.eulerAngles = cameraEulerAngles);
}