Files
JJBB/Assets/Project/Script/GUI/Map/SceneMapFix.cs
2024-08-23 15:49:34 +08:00

131 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<BoxCollider>();
}
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);
}
}