- 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