From 3fb6766520b069cf9c010fab8e9ba0e2c70fd642 Mon Sep 17 00:00:00 2001 From: pengjunwu <1263019465@qq.com> Date: Fri, 19 Jan 2024 16:05:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=BA=E6=99=AF=E5=8D=B8?= =?UTF-8?q?=E8=BD=BDbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Framework/Input/InputManager.cs | 2 +- .../Gameplay/SubSystems/GameSceneManager.cs | 27 +++++++++-- ProjectNLD/Assets/Scenes/StartScene.unity | 45 +++++++++++++++++++ 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/ProjectNLD/Assets/Code/Scripts/Framework/Input/InputManager.cs b/ProjectNLD/Assets/Code/Scripts/Framework/Input/InputManager.cs index 2d56d89f8c3..75ae5db36f8 100644 --- a/ProjectNLD/Assets/Code/Scripts/Framework/Input/InputManager.cs +++ b/ProjectNLD/Assets/Code/Scripts/Framework/Input/InputManager.cs @@ -1 +1 @@ -using Framework; using PhxhSDK; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.EnhancedTouch; using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch; public class InputManager : SingletonMono { public delegate void OnFingerMoveEvent(Vector2 delta); public delegate void OnFingerUpEvent(Vector2 screenPosition); public delegate void OnFingersMoveEvent(float delta); public OnFingerMoveEvent OnFingerMove; public OnFingerMoveEvent OnFingerMoveUI; public OnFingerUpEvent OnFingerUp; public OnFingerUpEvent OnFingerUpUI; public OnFingerUpEvent OnClick; public OnFingersMoveEvent OnFingersMove; private bool handledThisFrame; private bool isOverUI = false; public bool IsOverUI => isOverUI; # if UNITY_STANDALONE || UNITY_EDITOR private float moveDelta = 2f; private bool isMousePressedLastFrame; private bool isMouseMovedSincePressed; private Vector2 lastMousePosition; private ButtonControl mouseButtonAsFinger; private bool isMosuePressUI; #endif private void OnEnable() { EnhancedTouchSupport.Enable(); Touch.onFingerMove += _OnFingerMove; Touch.onFingerUp += _OnFingerUp; # if UNITY_STANDALONE || UNITY_EDITOR mouseButtonAsFinger = Mouse.current.leftButton; #endif } private void OnDisable() { Touch.onFingerMove -= _OnFingerMove; Touch.onFingerUp -= _OnFingerUp; EnhancedTouchSupport.Disable(); } private void Update() { isOverUI = IsPointerOverUI(); //CheckIsBackKeyDown(); # if UNITY_STANDALONE || UNITY_EDITOR if (IsPointerOverUI() && mouseButtonAsFinger.isPressed && !isMousePressedLastFrame) { isMosuePressUI = true; } if (!IsPointerOverUI() && !mouseButtonAsFinger.isPressed) { isMosuePressUI = false; } var currentMouse = Mouse.current; if (isMousePressedLastFrame && mouseButtonAsFinger.isPressed) { var delta = currentMouse.position.ReadValue() - lastMousePosition; isMouseMovedSincePressed |= delta.sqrMagnitude > float.Epsilon; if (IsPointerOverUI() || isMosuePressUI) { OnFingerMoveUI?.Invoke(delta); } else { OnFingerMove?.Invoke(delta); } } if (!IsPointerOverUI() && !isMosuePressUI) { if (isMousePressedLastFrame && !mouseButtonAsFinger.isPressed) { if (!isMouseMovedSincePressed) { OnClick?.Invoke(currentMouse.position.ReadValue()); } OnFingerUp?.Invoke(currentMouse.position.ReadValue()); isMouseMovedSincePressed = false; } } if (IsPointerOverUI()) { if (isMousePressedLastFrame && !mouseButtonAsFinger.isPressed) { OnFingerUpUI?.Invoke(currentMouse.position.ReadValue()); isMouseMovedSincePressed = false; } } // cache mouse state for next frame isMousePressedLastFrame = mouseButtonAsFinger.isPressed; if (isMousePressedLastFrame) { lastMousePosition = currentMouse.position.ReadValue(); } if (Mouse.current.scroll.ReadValue().y != 0) { OnFingersMove?.Invoke(Mouse.current.scroll.ReadValue().y); } if (Keyboard.current.aKey.isPressed) { OnFingerMove?.Invoke(new Vector2(moveDelta, 0)); } if (Keyboard.current.dKey.isPressed) { OnFingerMove?.Invoke(new Vector2(-moveDelta, 0)); } if (Keyboard.current.wKey.isPressed) { OnFingerMove?.Invoke(new Vector2(0, -moveDelta)); } if (Keyboard.current.sKey.isPressed) { OnFingerMove?.Invoke(new Vector2(0, moveDelta)); } #endif } private void LateUpdate() { handledThisFrame = false; } # if UNITY_STANDALONE || UNITY_EDITOR public bool IsLeftButton(int buttonIndex) { return buttonIndex == 1; } public bool IsRightButton(int buttonIndex) { return buttonIndex == 2; } #endif public void SetHandledThisFrame() { handledThisFrame = true; } public bool HandledThisFrame() { return handledThisFrame; } public bool HasTouch() { #if UNITY_EDITOR || UNITY_STANDALONE return mouseButtonAsFinger?.isPressed ?? false; #else return Touch.activeTouches.Count > 0; #endif } public Vector2 GetTouchPosition() { #if UNITY_EDITOR || UNITY_STANDALONE return Mouse.current?.position.ReadValue() ?? Vector2.zero; #else if (Touch.activeTouches.Count > 0) { return Touch.activeTouches[0].screenPosition; } if (Mouse.current != null) { return Mouse.current.position.ReadValue(); } return Vector2.zero; #endif } private void _OnFingerUp(Finger finger) { var touch = Touch.activeTouches[0]; if (isOverUI) { OnFingerUpUI?.Invoke(touch.screenPosition); return; } if (finger.currentTouch.delta.sqrMagnitude < float.Epsilon) { OnClick?.Invoke(touch.screenPosition); } OnFingerUp?.Invoke(touch.screenPosition); } private Vector2 touch1PrevPos; private Vector2 touch2PrevPos; private float prevTouchDeltaMag; private void _OnFingerMove(Finger finger) { if (Touch.activeTouches.Count == 1) { var touch = Touch.activeTouches[0]; if (touch.phase == UnityEngine.InputSystem.TouchPhase.Moved) { if (isOverUI) { OnFingerMoveUI?.Invoke(touch.delta); } else { OnFingerMove?.Invoke(touch.delta); } } } else if (Touch.activeTouches.Count >= 2) { var touch1 = Touch.activeTouches[0]; var touch2 = Touch.activeTouches[1]; if (touch1.phase == UnityEngine.InputSystem.TouchPhase.Moved && touch2.phase == UnityEngine.InputSystem.TouchPhase.Moved) { var touch1Pos = touch1.screenPosition; var touch2Pos = touch2.screenPosition; var deltaPos1 = touch1Pos - touch1PrevPos; var deltaPos2 = touch2Pos - touch2PrevPos; var touchDeltaMag = (touch1Pos - touch2Pos).magnitude; var deltaMagnitudeDiff = touchDeltaMag - prevTouchDeltaMag; OnFingersMove?.Invoke(deltaMagnitudeDiff); touch1PrevPos = touch1Pos; touch2PrevPos = touch2Pos; prevTouchDeltaMag = touchDeltaMag; } else if (touch1.phase == UnityEngine.InputSystem.TouchPhase.Began && touch2.phase == UnityEngine.InputSystem.TouchPhase.Began) { touch1PrevPos = touch1.screenPosition; touch2PrevPos = touch2.screenPosition; prevTouchDeltaMag = (touch1PrevPos - touch2PrevPos).magnitude; } } } private bool IsPointerOverUI(int pointerId) { return EventSystem.current.IsPointerOverGameObject(pointerId); } private bool IsPointerOverUI() { return EventSystem.current.IsPointerOverGameObject(); } public bool CheckIsBackKeyDown() { #if UNITY_ANDROID if (Input.GetKeyDown(KeyCode.Escape)) { EventManager.Instance.Send(EventManager.EventName.Android_Click_Back); return true; } #endif return false; } } \ No newline at end of file +using System; using Framework; using PhxhSDK; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.EnhancedTouch; using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch; public class InputManager : SingletonMono { public delegate void OnFingerMoveEvent(Vector2 delta); public delegate void OnFingerUpEvent(Vector2 screenPosition); public delegate void OnFingersMoveEvent(float delta); public OnFingerMoveEvent OnFingerMove; public OnFingerMoveEvent OnFingerMoveUI; public OnFingerUpEvent OnFingerUp; public OnFingerUpEvent OnFingerUpUI; public OnFingerUpEvent OnClick; public OnFingersMoveEvent OnFingersMove; private bool handledThisFrame; private bool isOverUI = false; public bool IsOverUI => isOverUI; # if UNITY_STANDALONE || UNITY_EDITOR private float moveDelta = 2f; private bool isMousePressedLastFrame; private bool isMouseMovedSincePressed; private Vector2 lastMousePosition; private ButtonControl mouseButtonAsFinger; private bool isMosuePressUI; #endif private void Awake() { DontDestroyOnLoad(gameObject); var eventSystem = FindObjectOfType(); if (eventSystem == null) { DebugUtil.LogError($"找不到EventSystem!"); return; } DontDestroyOnLoad(eventSystem.gameObject); } private void OnEnable() { EnhancedTouchSupport.Enable(); Touch.onFingerMove += _OnFingerMove; Touch.onFingerUp += _OnFingerUp; # if UNITY_STANDALONE || UNITY_EDITOR mouseButtonAsFinger = Mouse.current.leftButton; #endif } private void OnDisable() { Touch.onFingerMove -= _OnFingerMove; Touch.onFingerUp -= _OnFingerUp; EnhancedTouchSupport.Disable(); } private void Update() { isOverUI = IsPointerOverUI(); //CheckIsBackKeyDown(); # if UNITY_STANDALONE || UNITY_EDITOR if (IsPointerOverUI() && mouseButtonAsFinger.isPressed && !isMousePressedLastFrame) { isMosuePressUI = true; } if (!IsPointerOverUI() && !mouseButtonAsFinger.isPressed) { isMosuePressUI = false; } var currentMouse = Mouse.current; if (isMousePressedLastFrame && mouseButtonAsFinger.isPressed) { var delta = currentMouse.position.ReadValue() - lastMousePosition; isMouseMovedSincePressed |= delta.sqrMagnitude > float.Epsilon; if (IsPointerOverUI() || isMosuePressUI) { OnFingerMoveUI?.Invoke(delta); } else { OnFingerMove?.Invoke(delta); } } if (!IsPointerOverUI() && !isMosuePressUI) { if (isMousePressedLastFrame && !mouseButtonAsFinger.isPressed) { if (!isMouseMovedSincePressed) { OnClick?.Invoke(currentMouse.position.ReadValue()); } OnFingerUp?.Invoke(currentMouse.position.ReadValue()); isMouseMovedSincePressed = false; } } if (IsPointerOverUI()) { if (isMousePressedLastFrame && !mouseButtonAsFinger.isPressed) { OnFingerUpUI?.Invoke(currentMouse.position.ReadValue()); isMouseMovedSincePressed = false; } } // cache mouse state for next frame isMousePressedLastFrame = mouseButtonAsFinger.isPressed; if (isMousePressedLastFrame) { lastMousePosition = currentMouse.position.ReadValue(); } if (Mouse.current.scroll.ReadValue().y != 0) { OnFingersMove?.Invoke(Mouse.current.scroll.ReadValue().y); } if (Keyboard.current.aKey.isPressed) { OnFingerMove?.Invoke(new Vector2(moveDelta, 0)); } if (Keyboard.current.dKey.isPressed) { OnFingerMove?.Invoke(new Vector2(-moveDelta, 0)); } if (Keyboard.current.wKey.isPressed) { OnFingerMove?.Invoke(new Vector2(0, -moveDelta)); } if (Keyboard.current.sKey.isPressed) { OnFingerMove?.Invoke(new Vector2(0, moveDelta)); } #endif } private void LateUpdate() { handledThisFrame = false; } # if UNITY_STANDALONE || UNITY_EDITOR public bool IsLeftButton(int buttonIndex) { return buttonIndex == 1; } public bool IsRightButton(int buttonIndex) { return buttonIndex == 2; } #endif public void SetHandledThisFrame() { handledThisFrame = true; } public bool HandledThisFrame() { return handledThisFrame; } public bool HasTouch() { #if UNITY_EDITOR || UNITY_STANDALONE return mouseButtonAsFinger?.isPressed ?? false; #else return Touch.activeTouches.Count > 0; #endif } public Vector2 GetTouchPosition() { #if UNITY_EDITOR || UNITY_STANDALONE return Mouse.current?.position.ReadValue() ?? Vector2.zero; #else if (Touch.activeTouches.Count > 0) { return Touch.activeTouches[0].screenPosition; } if (Mouse.current != null) { return Mouse.current.position.ReadValue(); } return Vector2.zero; #endif } private void _OnFingerUp(Finger finger) { var touch = Touch.activeTouches[0]; if (isOverUI) { OnFingerUpUI?.Invoke(touch.screenPosition); return; } if (finger.currentTouch.delta.sqrMagnitude < float.Epsilon) { OnClick?.Invoke(touch.screenPosition); } OnFingerUp?.Invoke(touch.screenPosition); } private Vector2 touch1PrevPos; private Vector2 touch2PrevPos; private float prevTouchDeltaMag; private void _OnFingerMove(Finger finger) { if (Touch.activeTouches.Count == 1) { var touch = Touch.activeTouches[0]; if (touch.phase == UnityEngine.InputSystem.TouchPhase.Moved) { if (isOverUI) { OnFingerMoveUI?.Invoke(touch.delta); } else { OnFingerMove?.Invoke(touch.delta); } } } else if (Touch.activeTouches.Count >= 2) { var touch1 = Touch.activeTouches[0]; var touch2 = Touch.activeTouches[1]; if (touch1.phase == UnityEngine.InputSystem.TouchPhase.Moved && touch2.phase == UnityEngine.InputSystem.TouchPhase.Moved) { var touch1Pos = touch1.screenPosition; var touch2Pos = touch2.screenPosition; var deltaPos1 = touch1Pos - touch1PrevPos; var deltaPos2 = touch2Pos - touch2PrevPos; var touchDeltaMag = (touch1Pos - touch2Pos).magnitude; var deltaMagnitudeDiff = touchDeltaMag - prevTouchDeltaMag; OnFingersMove?.Invoke(deltaMagnitudeDiff); touch1PrevPos = touch1Pos; touch2PrevPos = touch2Pos; prevTouchDeltaMag = touchDeltaMag; } else if (touch1.phase == UnityEngine.InputSystem.TouchPhase.Began && touch2.phase == UnityEngine.InputSystem.TouchPhase.Began) { touch1PrevPos = touch1.screenPosition; touch2PrevPos = touch2.screenPosition; prevTouchDeltaMag = (touch1PrevPos - touch2PrevPos).magnitude; } } } private bool IsPointerOverUI(int pointerId) { return EventSystem.current.IsPointerOverGameObject(pointerId); } private bool IsPointerOverUI() { return EventSystem.current.IsPointerOverGameObject(); } public bool CheckIsBackKeyDown() { #if UNITY_ANDROID if (Input.GetKeyDown(KeyCode.Escape)) { EventManager.Instance.Send(EventManager.EventName.Android_Click_Back); return true; } #endif return false; } } \ No newline at end of file diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/SubSystems/GameSceneManager.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/SubSystems/GameSceneManager.cs index 8ba6d932e0b..4a49a6da475 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/SubSystems/GameSceneManager.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/SubSystems/GameSceneManager.cs @@ -29,6 +29,8 @@ namespace Gameplay.SubSystems private Dictionary> _sceneOpDic = new(); + private string _lastSceneToBeUnload; + private string GetPostProcessedScenePath(string scenePath) => PostProcessData.Instance[scenePath]; public async UniTask LoadSceneAsync(string scenePath, LoadSceneMode mode = LoadSceneMode.Single) @@ -41,7 +43,10 @@ namespace Gameplay.SubSystems } if (mode == LoadSceneMode.Single) + { _sceneOpDic.Clear(); + _lastSceneToBeUnload = null; + } if (!_sceneOpDic.TryGetValue(scenePath, out var op)) { @@ -49,7 +54,13 @@ namespace Gameplay.SubSystems _sceneOpDic.Add(scenePath, op); } - await op.ToUniTask(); + await op; + if (!string.IsNullOrEmpty(_lastSceneToBeUnload)) + { + UnLoadSceneAsync(_lastSceneToBeUnload); + _lastSceneToBeUnload = null; + } + return new(op.Result.Scene); } @@ -64,12 +75,20 @@ namespace Gameplay.SubSystems if (!_sceneOpDic.TryGetValue(scenePath, out var op)) { - Debug.LogError($"该场景没有被加载过 scenePath:{scenePath}"); + DebugUtil.LogError($"该场景没有被加载过 scenePath:{scenePath}"); return; } - _sceneOpDic.Remove(scenePath); - await Addressables.UnloadSceneAsync(op).ToUniTask(); + if (_sceneOpDic.Count == 1) + { + //如果只剩下一个场景了,那么此次unload必然失败,要等到下一次load新场景后重新unload + _lastSceneToBeUnload = scenePath; + } + else + { + _sceneOpDic.Remove(scenePath); + await Addressables.UnloadSceneAsync(op); + } } /// diff --git a/ProjectNLD/Assets/Scenes/StartScene.unity b/ProjectNLD/Assets/Scenes/StartScene.unity index 0bf7c21af49..ee6c89ae065 100644 --- a/ProjectNLD/Assets/Scenes/StartScene.unity +++ b/ProjectNLD/Assets/Scenes/StartScene.unity @@ -1761,6 +1761,50 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 600099759} m_CullTransparentMesh: 1 +--- !u!1 &603448208 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 603448210} + - component: {fileID: 603448209} + m_Layer: 0 + m_Name: InputManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &603448209 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 603448208} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a12e0c357618e41119174f3503c902dd, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &603448210 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 603448208} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.9085703, y: -2.0125678, z: -1.524627} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &617269941 GameObject: m_ObjectHideFlags: 0 @@ -8641,3 +8685,4 @@ SceneRoots: - {fileID: 408243506} - {fileID: 2046660689} - {fileID: 14261388} + - {fileID: 603448210}