Thanks, I’m still trying to work out the best way to attack this.
Let me go back to my original ‘SOKOBAN’ style, to explain some of the problems I’ve been having, apologies, this is going to get long ( ANYBODY else fee free to chime in ! ) 
basic synopsis, sokoban style in 3d, not 2d, I have a player that I want to move around in a grid based movement, player can then push crates to locations to perform tasks and also utilise said crates to create bridges, etc.
Now, CRATES first :
my CRATES have 5 collisions boxes
the main cube box collider, set at a size of 0.9, 1, 0.9
then I have 4 smaller box colliders, one for each side, left, right, front and back, these are small in size, and set slightly within the crates outer shell size, this is so I can move around the box with my player cube without pushing it, you have to physically enter the grid position the crate is occupying for the crate to be pushed away. The crates can be moved 1 unit at a time, using Transform.Translate in the appropriate direction. You can drop crates to form bridges, when you do this, all 4 directional colliders are set to false, but I leave the main box collider on, so I can walk across, and I also freeze all transform constraints so that you cannot push it again, should you fall into a pit, etc. This is all working PERFECTLY.
Now, the PLAYER movement
Ideally, the PLAYER should also move in a GRID Like style, 1 unit at a time
Script 1 - snippet
void FixedUpdate () {
transform.Translate(Input.GetAxisRaw("Horizontal")*Time.deltaTime, 0f, Input.GetAxisRaw("Vertical")*Time.deltaTime);
}
Pros : Works, I can push crates as required
Cons : Not grid based movement so Transform positions not ideal, not what I want
Script 2 - snippet
void Update () {
if (Input.GetKeyDown(KeyCode.LeftArrow)) {
transform.position += Vector3.left;
}
if (Input.GetKeyDown(KeyCode.RightArrow)) {
transform.position += Vector3.right;
}
if (Input.GetKeyDown(KeyCode.UpArrow)) {
transform.position += Vector3.forward;
}
if (Input.GetKeyDown(KeyCode.DownArrow)) {
transform.position += Vector3.back;
}
}
Pros : Works, I have grid based movement 1 unit at a time
Cons : Physics turns to shit as soon as I try to push cube, I get pushed back, pushing me off nice grid and then messing up any further movement
Script 3 - snippet
void FixedUpdate () {
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 5;
var z = Input.GetAxis("Vertical") * Time.deltaTime * 5;
Vector3 direction = Quaternion.AngleAxis(0,Vector3.up) * new Vector3(x, 0, z);
transform.Translate(direction);
}
Pros : Works, I can move around and push cubes, also at whatever speed I define
Cons : Not grid based movement, so useless to me
Script 4 - full source
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class tumbleCube : MonoBehaviour {
public float tumblingDuration = 0.25f;
void Update () {
var dir = Vector3.zero;
if (Input.GetKey(KeyCode.UpArrow))
dir = Vector3.forward;
if (Input.GetKey(KeyCode.DownArrow))
dir = Vector3.back;
if (Input.GetKey(KeyCode.LeftArrow))
dir = Vector3.left;
if (Input.GetKey(KeyCode.RightArrow))
dir = Vector3.right;
if (dir != Vector3.zero && !isTumbling) {
StartCoroutine(Tumble(dir));
}
}
bool isTumbling = false;
IEnumerator Tumble(Vector3 direction) {
isTumbling = true;
var rotAxis = Vector3.Cross(Vector3.up, direction);
var pivot = (transform.position + Vector3.down*0.5f) + direction * 0.5f;
var startRotation = transform.rotation;
var endRotation = Quaternion.AngleAxis(90.0f, rotAxis) * startRotation;
var startPosition = transform.position;
var endPosition = transform.position + direction;
var rotSpeed = 90.0f / tumblingDuration;
var t = 0.0f;
while (t < tumblingDuration) {
t += Time.deltaTime;
transform.RotateAround(pivot, rotAxis, rotSpeed * Time.deltaTime);
yield return null;
}
transform.rotation = endRotation;
transform.position = endPosition;
isTumbling = false;
}
}
Pros : Tumble movement, actually grid based movement, and ideally my first choice of movement for my game mockup, I can push crates around level no problem
Cons : If I drop a crate off a ledge to form a bridge, then ‘tumble’ onto it, the physics interaction jumps my player cube out of whack with the grid movement, so positional transform values are all over the place, I can still tumble, but I am no longer on a nice grid, I’m offset. Also it keeps trying to ‘climb / tumble’ other objects within the level, again offsetting my grid position, so currently unreliable
Script 5 - snippet
void Update () {
if (Input.GetKey(KeyCode.RightArrow) && playerTransform.position == playerPosition) {
playerPosition += Vector3.right;
}
if (Input.GetKey(KeyCode.LeftArrow) && playerTransform.position == playerPosition) {
playerPosition += Vector3.left;
}
if (Input.GetKey(KeyCode.UpArrow) && playerTransform.position == playerPosition) {
playerPosition += Vector3.forward;
}
if (Input.GetKey(KeyCode.DownArrow) && playerTransform.position == playerPosition) {
playerPosition += Vector3.back;
}
transform.position = Vector3.MoveTowards(transform.position, playerPosition, Time.deltaTime * speed);
}
Pros : Nice sliding movement, Grid Based also
Cons : If I hit object in level, player just keeps trying to push through ‘forever’, breaking all movement code, also, if I push crate of ledge to create a bridge, then walk on it, I then get stuck on top, can’t move off it to cross to other side or fall down.
ALTERNATIVELY, I have attached a project file with some of my tests within it, easier to look at, just disable / enable scripts if looking at the different versions ! 
3268066–252312–UNew.zip (1.86 MB)