Files
JJBB/Assets/Project/Script/GUI/Map/SceneMapFix.cs

131 lines
4.3 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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);
}
}