Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by SpectreCular · Dec 01, 2020 at 06:17 AM · 2duitilemapzoompan

Clamping tilemaps to screen (without moving camera)?

I really hope someone can help, because we've been stuck on this for 4 days straight...


Our 2D text adventure project is composed almost entirely out of UI elements, and so there hasn't been any need to move our 2D orthographic camera for anything at all. But after adding a map system into the game, we decided on using Tilemaps to visually represent it, and then add the ability to pan/zoom the tilemap itself inside the UI Canvas, over the top of the rest of the UI.


Here is a simplified version of our hierarchy: Hierarchy


After adding this functionality, we also decided it would be best to keep the map within the boundaries of the screen, even when zooming in or out.


Here's how we're handling input:

InputUtils.cs (a singleton class attached to EventSystem):

 void HandlePan(float panSpeed) {
     Vector3 newPanPos = Input.mousePosition;
     Vector3 offset = Camera.main.ScreenToViewportPoint(prevPanPos - newPanPos);
     Vector3 panDelta = new Vector3(offset.x * panSpeed, offset.y * panSpeed);
 
     if(move.magnitude > 0.01f) {
         if(onPan != null && onPan.Target != null)
             onPan.Invoke(panDelta); // Broadcast this event to listeners
     }
 
     prevPanPos = newPanPos; // Store this most recent input to check against it later
 }
 
 void HandleZoom(float zoomSpeed) {
     float offset = Input.GetAxis("Mouse ScrollWheel");
     if (offset == 0 || onZoom == null || onZoom.Target == null)
         return;
 
     onZoom.Invoke(offset * zoomSpeed); // Broadcast this event to listeners
 }


And here's how we're handling panning & zooming:

Areamap.cs (attached to MapPanel):

 private void Start()
 {
     mapPanel = transform; // This is only here for the sake of clarity
 
     // Called from the InputUtils singleton when the user pans the tilemap
     InputUtils.onPan += (Vector3 delta) => {

         // Here, we would need to calculate panBoundsMin & panBoundsMax
         //     to keep the map within screen bounds

         // This works, but how to calculate panBoundsMin & panBoundsMax,
         //     while also taking mapPanel.localScale into account?
         delta.x = Mathf.Clamp(
             floorMap.transform.localPosition.x + delta.x,
             panBoundsMin.x, panBoundsMax.x
         );
         delta.y = Mathf.Clamp(
             floorMap.transform.localPosition.y + delta.y,
             panBoundsMin.y, panBoundsMax.y
         );
         
         floorMap.transform.localPosition = delta; // >> These perform the actual tilemap pan <<
         overlayMap.transform.localPosition = delta; // >> These perform the actual tilemap pan <<
     };
     
     // Called from the InputUtils singleton when the user zooms in/out on the tilemap
     InputUtils.onZoom += (float delta) => {
         zoomValue += delta * zoomScalar; // zoomValue and zoomScalar are private variables
         zoomValue = Mathf.Clamp(delta, minZoom, maxZoom); // min & maxZoom are defined in editor
         if(mapPanel != null) {
             var newScale = new Vector3(zoomValue, zoomValue, 1);
             mapPanel.localScale = newScale; // >> This performs the actual tilemap zoom <<
             
             // Here, we would need to pan the map back onto the screen,
             //     or un-zoom the map if it shows any part outside of map bounds,
             //     or simply prevent zooming if we can pre-calculate such an event
             
         }
     };
     
     Generate(); // This creates or loads the map, which I think is out of scope of this question
 }


How can we calculate panBoundsMin and panBoundsMax taking mapPanel.localScale into account to clamp the map onto the screen while panning/zooming? or how else can we go about this?

screenshot-1.png (15.7 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

381 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Fix for offset tiles in tilemap and palette 1 Answer

2D: Best way to group a type of tile based on their neighbors similar type? 1 Answer

Tile collision by sprite is not accurate with Tilemap Collider 0 Answers

2D Tilemap prefab brush doesn't paint the tile in the right place 0 Answers

[4.6 2D] Making UI image stick to the side 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges