using UnityEngine; public class MouseInMap : MonoBehaviour { public Camera playCamera; public GameObject environmentObj; public GameObject selectEffect; public GameObject enemyContainerObj; public GameObject sceneBlockContainerObj; public GameObject targetControllerObj; public GameObject HUDObj; private Vector3 mouseInMapPosition = Vector3.zero; private Vector3 nowHitPosition = Vector3.zero; private LayerMask groundMask; private int randBlockNum; private GameObject preSet; private TargetController targetCon; private MousePreview mousePreviewCon; private EnemyContainer enemyCon; private SceneBlockContainer sceneBlockCon; private TargetUIController targetUICon; public enum MouseMode { Default, AttackSet, GotoSet, EnemySet } public MouseMode mouseMode = MouseMode.Default; private void Start() { groundMask = LayerMask.GetMask("Ground"); targetCon = targetControllerObj.GetComponent(); mousePreviewCon = this.GetComponent(); enemyCon = enemyContainerObj.GetComponent(); sceneBlockCon = sceneBlockContainerObj.GetComponent(); targetUICon = HUDObj.GetComponent(); } private void Update() { nowHitPosition = GetMouseOnMapPosition(); // if mouse position in area, update mouseInMapPosition as nowHitPosition if (nowHitPosition.x < targetCon.maxAgentAreaX && nowHitPosition.x > targetCon.minAgentAreaX && nowHitPosition.z < targetCon.maxEnemyAreaZ && nowHitPosition.z > targetCon.minAgentAreaZ) { mouseInMapPosition = nowHitPosition; mousePreviewCon.UpdatePreviewPosition(mouseInMapPosition); // Mouse button R pressed if (Input.GetMouseButtonDown(1)) { switch (mouseMode) { case MouseMode.AttackSet: sceneBlockCon.CreateNewBlock(SceneBlockContainer.Targets.Attack, randBlockNum, mouseInMapPosition); sceneBlockCon.InitializeBlock(environmentObj); targetCon.AttackModeChange(); ChangeMouseModeTo(MouseMode.Default); break; case MouseMode.GotoSet: sceneBlockCon.CreateNewBlock(SceneBlockContainer.Targets.Go, randBlockNum, mouseInMapPosition); sceneBlockCon.InitializeBlock(environmentObj); targetCon.GotoModeChange(); ChangeMouseModeTo(MouseMode.Default); break; case MouseMode.EnemySet: enemyCon.InitEnemyAtHere(new Vector3(mouseInMapPosition.x, 1, mouseInMapPosition.z)); break; default: break; } } } } public void ChangeMouseModeTo(MouseMode thisMouseMode) { mouseMode = thisMouseMode; switch (thisMouseMode) { case MouseMode.AttackSet: // random choose attack scene block type and set as preview randBlockNum = Random.Range(0, sceneBlockCon.attackBlockPrefabs.Length); preSet = sceneBlockCon.attackBlockPrefabs[randBlockNum]; mousePreviewCon.ChangePreviewTo(preSet); break; case MouseMode.GotoSet: // random choose Goto scene block type and set as preview randBlockNum = Random.Range(0, sceneBlockCon.goBlockPrefabs.Length); preSet = sceneBlockCon.goBlockPrefabs[randBlockNum]; mousePreviewCon.ChangePreviewTo(preSet); break; case MouseMode.EnemySet: preSet = enemyCon.enemyPrefab; mousePreviewCon.ChangePreviewTo(preSet); break; default: mousePreviewCon.DeleteAllPreviewModele(); break; } } // get mouse position on map, return a Vector3 public Vector3 GetMouseOnMapPosition() { // shoot raycast from mainCamera center to mousepositon RaycastHit thisHit; Color rayColor = Color.red; Vector3 onMapPosition; Ray ray = playCamera.ScreenPointToRay(Input.mousePosition); // if raycast hit gameobject if (Physics.Raycast(ray, out thisHit, Mathf.Infinity, groundMask)) { //draw raycast Debug.DrawRay(ray.origin, ray.direction * 100, rayColor); return onMapPosition = thisHit.point; } else { return Vector3.zero; } } }