Skip to content

Commit b9ff6de

Browse files
author
JasonNumberThirteen
committed
Add boundaries for moving the main camera and dragged tiles
1 parent 2af3f3f commit b9ff6de

6 files changed

Lines changed: 174 additions & 4 deletions

File tree

Assets/Project/Scenes/AStarVisualiserScene.unity

Lines changed: 49 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Project/Scripts/Game Objects/Camera/Main/MainCameraMovementController.cs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class MainCameraMovementController : MonoBehaviour, IPrimaryWindowElement
77
private bool inputIsActive = true;
88
private Camera mainCamera;
99
private Vector2 movementDirection;
10+
private MapAreaManager mapAreaManager;
1011
private UserInputController userInputController;
1112

1213
public void SetPrimaryWindowElementActive(bool active)
@@ -22,6 +23,7 @@ public void SetPrimaryWindowElementActive(bool active)
2223
private void Awake()
2324
{
2425
mainCamera = Camera.main;
26+
mapAreaManager = FindFirstObjectByType<MapAreaManager>();
2527
userInputController = FindFirstObjectByType<UserInputController>();
2628

2729
RegisterToListeners(true);
@@ -36,20 +38,39 @@ private void RegisterToListeners(bool register)
3638
{
3739
if(register)
3840
{
41+
if(mapAreaManager != null)
42+
{
43+
mapAreaManager.mapAreaWasChangedEvent.AddListener(OnMapAreaWasChanged);
44+
}
45+
3946
if(userInputController != null)
4047
{
4148
userInputController.movementKeyPressedEvent.AddListener(OnMovementKeyPressed);
4249
}
4350
}
4451
else
4552
{
53+
if(mapAreaManager != null)
54+
{
55+
mapAreaManager.mapAreaWasChangedEvent.RemoveListener(OnMapAreaWasChanged);
56+
}
57+
4658
if(userInputController != null)
4759
{
4860
userInputController.movementKeyPressedEvent.RemoveListener(OnMovementKeyPressed);
4961
}
5062
}
5163
}
5264

65+
private void OnMapAreaWasChanged(Rect mapArea)
66+
{
67+
var cameraPosition = mainCamera.gameObject.transform.position;
68+
69+
cameraPosition.x = mapArea.center.x;
70+
cameraPosition.y = mapArea.center.y;
71+
mainCamera.gameObject.transform.position = cameraPosition;
72+
}
73+
5374
private void OnMovementKeyPressed(Vector2 movementVector)
5475
{
5576
if(inputIsActive)
@@ -60,9 +81,27 @@ private void OnMovementKeyPressed(Vector2 movementVector)
6081

6182
private void LateUpdate()
6283
{
63-
if(mainCamera != null && movementDirection != Vector2.zero)
84+
if(mainCamera == null || movementDirection == Vector2.zero)
6485
{
65-
mainCamera.gameObject.transform.Translate(movementSpeed*Time.deltaTime*movementDirection);
86+
return;
6687
}
88+
89+
mainCamera.gameObject.transform.Translate(movementSpeed*Time.deltaTime*movementDirection);
90+
ClampCameraPositionIfNeeded();
91+
}
92+
93+
private void ClampCameraPositionIfNeeded()
94+
{
95+
if(mapAreaManager == null)
96+
{
97+
return;
98+
}
99+
100+
var mapArea = mapAreaManager.GetMapArea();
101+
var clampedCameraPosition = mainCamera.transform.position;
102+
103+
clampedCameraPosition.x = Mathf.Clamp(clampedCameraPosition.x, mapArea.x, mapArea.width);
104+
clampedCameraPosition.y = Mathf.Clamp(clampedCameraPosition.y, mapArea.y, mapArea.height);
105+
mainCamera.transform.position = clampedCameraPosition;
67106
}
68107
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using UnityEngine;
2+
using UnityEngine.Events;
3+
4+
public class MapAreaManager : MonoBehaviour
5+
{
6+
public UnityEvent<Rect> mapAreaWasChangedEvent;
7+
8+
[SerializeField, Min(0)] private int additionalOffsetFromMapEdgesInTiles = 1;
9+
10+
private Rect mapArea;
11+
12+
private MapGenerationManager mapGenerationManager;
13+
14+
public Rect GetMapArea() => mapArea;
15+
16+
private void Awake()
17+
{
18+
mapGenerationManager = FindFirstObjectByType<MapGenerationManager>();
19+
20+
RegisterToListeners(true);
21+
}
22+
23+
private void OnDestroy()
24+
{
25+
RegisterToListeners(false);
26+
}
27+
28+
private void RegisterToListeners(bool register)
29+
{
30+
if(register)
31+
{
32+
if(mapGenerationManager != null)
33+
{
34+
mapGenerationManager.mapGeneratedEvent.AddListener(OnMapGenerated);
35+
}
36+
}
37+
else
38+
{
39+
if(mapGenerationManager != null)
40+
{
41+
mapGenerationManager.mapGeneratedEvent.RemoveListener(OnMapGenerated);
42+
}
43+
}
44+
}
45+
46+
private void OnMapGenerated()
47+
{
48+
if(mapGenerationManager == null)
49+
{
50+
return;
51+
}
52+
53+
var centerOfMap = mapGenerationManager.GetCenterOfMap();
54+
var halfOfMapSize = mapGenerationManager.GetMapSize()*0.5f;
55+
var additionalOffset = Vector2Int.one*additionalOffsetFromMapEdgesInTiles;
56+
57+
mapArea = new Rect(centerOfMap - halfOfMapSize - additionalOffset, centerOfMap + halfOfMapSize + additionalOffset);
58+
59+
mapAreaWasChangedEvent?.Invoke(mapArea);
60+
}
61+
}

Assets/Project/Scripts/Managers/MapAreaManager.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Project/Scripts/Managers/MapGenerationManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public void ChangeMapDimensionsIfNeeded(Vector2Int newMapSize)
4545
AddTilesFromExtendingIfNeeded(mapDimensions);
4646
EnsureExistanceOfMapTileOfType(MapTileType.Start, Vector2.zero);
4747
EnsureExistanceOfMapTileOfType(MapTileType.Destination, GetMapSize() - Vector2.one);
48+
mapGeneratedEvent?.Invoke();
4849
}
4950

5051
private void RemoveTilesFromShrinkingIfNeeded(Vector2Int newMapSize)
@@ -137,6 +138,5 @@ private void GenerateInitialMap(int size)
137138
var initialMapSize = Mathf.Clamp(size, MAP_DIMENSION_LOWER_BOUND, MAP_DIMENSION_UPPER_BOUND);
138139

139140
ChangeMapDimensionsIfNeeded(Vector2Int.one*initialMapSize);
140-
mapGeneratedEvent?.Invoke();
141141
}
142142
}

Assets/Project/Scripts/Managers/SelectedMapTileMovementManager.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class SelectedMapTileMovementManager : MonoBehaviour, IPrimaryWindowEleme
1111
private bool selectingTilesIsLocked;
1212
private bool panelUIHoverWasDetected;
1313
private Vector3 translationPositionOffset;
14+
private MapAreaManager mapAreaManager;
1415
private SelectedMapTileManager selectedMapTileManager;
1516
private PanelUIHoverDetectionManager panelUIHoverDetectionManager;
1617

@@ -32,6 +33,7 @@ public void SetMapEditingElementActive(bool active)
3233
private void Awake()
3334
{
3435
mainCamera = Camera.main;
36+
mapAreaManager = FindFirstObjectByType<MapAreaManager>();
3537
selectedMapTileManager = FindFirstObjectByType<SelectedMapTileManager>();
3638
panelUIHoverDetectionManager = FindFirstObjectByType<PanelUIHoverDetectionManager>();
3739

@@ -94,7 +96,7 @@ private void Update()
9496
}
9597

9698
var mapTileRealPosition = GetMousePositionToWorldPoint() + translationPositionOffset;
97-
var mapTileTiledPosition = mapTileRealPosition.ToTiledPosition();
99+
var mapTileTiledPosition = GetPositionWithinArea(mapTileRealPosition.ToTiledPosition());
98100

99101
if(!DetectedAnyUnacceptableCollider(mapTileTiledPosition))
100102
{
@@ -117,4 +119,21 @@ private bool DetectedAnyUnacceptableCollider(Vector2 position)
117119

118120
return colliders.Any(collider => collider.gameObject != gameObject);
119121
}
122+
123+
private Vector2 GetPositionWithinArea(Vector2 position)
124+
{
125+
if(mapAreaManager == null)
126+
{
127+
return position;
128+
}
129+
130+
var mapArea = mapAreaManager.GetMapArea();
131+
var positionWithinArea = new Vector2
132+
{
133+
x = Mathf.Clamp(position.x, mapArea.x + 0.5f, mapArea.width - 0.5f),
134+
y = Mathf.Clamp(position.y, mapArea.y + 0.5f, mapArea.height - 0.5f)
135+
};
136+
137+
return positionWithinArea;
138+
}
120139
}

0 commit comments

Comments
 (0)