using System.Collections; using Games.Events; using Games.Scene; using GCGame.Table; using Module.Log; using UnityEngine; using UnityEngine.SceneManagement; public class SceneMapFix : MonoBehaviour { private static SceneMapFix _Instance; //public Transform m_childPoint_MapToScene; public Transform m_childPoint_SceneToMap; public Transform m_FixRectObj; private BoxCollider _fixRectCollider; private int InitMapInfoScene = -100; private SceneMapFixData m_FixData; public static SceneMapFix Instance() { return _Instance; } public static void SetInstance(SceneMapFix instance) { _Instance = instance; } private void OnDestroy() { SetInstance(null); InitMapInfoScene = -100; } private void Awake() { SetInstance(this); InitMapInfoScene = -100; DontDestroyOnLoad(gameObject); _fixRectCollider = m_FixRectObj.GetComponent(); } public string CurrSceneName { get { return m_FixData == null ? "" : m_FixData.SceneName; } } public Vector3 ScenePosToMapPosVec2(Vector2 scenePos, RectTransform m_Rect = null) { var realScenePos = new Vector3(scenePos.x, 0, scenePos.y); realScenePos = ActiveScene.GetTerrainPosition(realScenePos); return ScenePosToMapPosVec3(realScenePos, m_Rect); } public Vector3 ScenePosToMapPosVec3(Vector3 scenPos, RectTransform m_Rect = null) { var result = Vector3.zero; if (m_FixData != null) { var dir = -m_FixRectObj.forward; var ray = new Ray(scenPos, dir); RaycastHit hit; if (_fixRectCollider.Raycast(ray, out hit, float.PositiveInfinity)) result = m_FixRectObj.worldToLocalMatrix.MultiplyPoint3x4(hit.point); if (m_Rect != null) { var x = m_Rect.sizeDelta.x * result.x; var y = m_Rect.sizeDelta.y * result.y; result.x = x; result.y = y; } } return result; } //mapPos 范围在(-0.5,-0.5)-- (0.5,0.5) public Vector3 MapPosToScenePos(Vector2 mapPos) { if (m_FixData == null) return Vector3.zero; var raySource = m_FixRectObj.localToWorldMatrix.MultiplyPoint3x4(new Vector3(mapPos.x, mapPos.y, 0.5f)); var ray = new Ray(raySource, m_FixRectObj.forward); var result = ActiveScene.GetTerrainPosition(ray); return result == null ? Vector3.zero : result.Value; } public void Start() { transform.position = Vector3.zero; transform.localEulerAngles = Vector3.zero; transform.localScale = Vector3.one; if (InitMapInfoScene == GameManager.gameManager.RunningScene && m_FixData!=null && m_FixRectObj!=null) return; var curScene = TableManager.GetSceneClassByID(GameManager.gameManager.RunningScene, 0); if (null == curScene) { LogModule.ErrorLog("load scene map table fail :" + GameManager.gameManager.RunningScene); return; } if (curScene.SceneMapTexture == null || curScene.SceneMapTexture.Length <= 0) return; if (curScene.SceneMapTexture.ToLower().Contains(SceneManager.GetActiveScene().name.ToLower()) == false) return; InitMapInfoScene = GameManager.gameManager.RunningScene; var table = new Hashtable(); table["AssetType"] = typeof(SceneMapFixData); var sceneName = SceneManager.GetActiveScene().name.ToLower(); LoadAssetBundle.Instance.LoadAsset(LoadAssetBundle.BUNDLE_PATH_Other + sceneName, sceneName, delegate (string assetName, Object resObj, Hashtable hashParam) { if (resObj != null) { m_FixData = resObj as SceneMapFixData; InitFixData(); } }, table, true); } private void InitFixData() { if (m_FixData == null) return; m_FixRectObj.localPosition = m_FixData.m_Pos; m_FixRectObj.localEulerAngles = m_FixData.m_EulerAngles; m_FixRectObj.localScale = new Vector3(m_FixData.m_SizeRect.x, m_FixData.m_SizeRect.y, 1); EventDispatcher.Instance.Dispatch(Games.Events.EventId.OnSceneMapFixLoadOver); } }