@@ -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();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user