- Home /
 
Collision with grid based movement
Hi, I am looking for a way to stop the player from moving into an object that has collision before it tries to move into it.
Currently whenever I press the button to move the player when standing next to a wall, for example, the player tries to move into the other tile which also has a collider which causes the player to get stuck in the wall.
I have tried a lot of different ways to fix this but nothing seems to work. If someone can show me an working example that I could look into to try to fix this I would really apprieciate it.
 using UnityEngine;
 using System.Collections;
 
 public class PlayerScript : EntityScript
 {
     private Vector3 pos;
 
     void Start ()
     {
         pos = transform.position;
     }
     
     void Update ()
     {
         if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) && transform.position == pos)
         {
             pos += Vector3.up / 2;
         }
         
         if ((Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) && transform.position == pos)
         {
             pos += Vector3.right / 2;
         }
         
         if ((Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) && transform.position == pos)
         {
             pos += Vector3.down / 2;
         }
         
         if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) && transform.position == pos)
         {
             pos += Vector3.left / 2;
         }
         
         transform.position = Vector3.MoveTowards(transform.position, pos, moveSpeed * Time.deltaTime);
     }
 }
 
               And here is how I create the level (this might change in the future).
 using UnityEngine;
 using System.Collections;
 
 public class LevelScript : MonoBehaviour
 {
     public Texture2D[] layers;
     
     public Transform[] tiles;
     
     public Color[] tileColours;
     public Color spawnColour;
     
     public EntityScript player;
 
     void Start ()
     {
         for (int i = 0; i < layers.Length; i++)
         {
             loadLayer(i);
         }
     }
     
     void loadLayer (int layer)
     {
         Color[] blockColours = new Color[layers[layer].width * layers[layer].height];
         blockColours = layers[layer].GetPixels();
     
         for (int y = 0; y < layers[layer].height; y++)
         {
             for (int x = 0; x < layers[layer].width; x++)
             {
                 for (int t = 0; t < tiles.Length; t++)
                 {
                     if (blockColours[x + y * layers[layer].width] == tileColours[t])
                     {
                         Instantiate(tiles[t], new Vector3 (x, y), Quaternion.identity);
                     }
                     
                     if (blockColours[x + y * layers[layer].width] == spawnColour)
                     {
                         Instantiate(tiles[0], new Vector3 (x, y), Quaternion.identity);
                         Vector2 pos = new Vector2 (x, y);
                         player.transform.position = pos;
                     }
                 }
             }
         }
         
         blockColours = new Color[0];
     }
 }
 
 
              Your answer
 
             Follow this Question
Related Questions
Applying the pathfinder component to 2d grids 1 Answer
How to detect collision of a wall with grid movement? 1 Answer
!URGENT! How to make a grid of clickable objects. 1 Answer
How can i make the Unity2d grid use rounded numbers? 1 Answer
Controlling a 3rd Person 2D Sprite in a 3D Environment 0 Answers