private void Start()
    {
        this.movement = this.GetComponent <SnapGridMovement>();
        Assert.IsNotNull(this.movement, "Missing asset in component");

        this.currentMoveDirection = this.movement.GetRandomSnapGridDirection();
    }
    // -------------------------------------------------------------------------

    private Vector2 GetNormVectorFromDirection(SnapGridMovementDirection moveDirection)
    {
        Vector2 result = new Vector2(0.0f, 0.0f);

        switch (moveDirection)
        {
        case SnapGridMovementDirection.LEFT:
            result.x = -1.0f;
            break;

        case SnapGridMovementDirection.RIGHT:
            result.x = 1.0f;
            break;

        case SnapGridMovementDirection.UP:
            result.y = 1.0f;
            break;

        case SnapGridMovementDirection.DOWN:
            result.y = -1.0f;
            break;

        default:
            Assert.IsTrue(false, "Unsupported direction");
            break;
        }
        return(result);
    }
    public SnapGridMovementDirection GetRandomSnapGridDirection()
    {
        float rand = Random.Range(0, 10000); // Arbitrary high number
        SnapGridMovementDirection dir = (SnapGridMovementDirection)(rand % (float)SnapGridMovementDirection.DIRECTIONS_COUNT);

        return(dir);
    }
    public void ChangeRandomMovementNewDirection()
    {
        SnapGridMovementDirection newMovementDirection = this.movement.GetRandomSnapGridDirection();

        while (newMovementDirection == this.currentMoveDirection)
        {
            newMovementDirection = this.movement.GetRandomSnapGridDirection();
        }
        this.currentMoveDirection = newMovementDirection;
    }
    public bool CanMoveInDirection(SnapGridMovementDirection direction)
    {
        Vector2 moveVector = GetNormVectorFromDirection(direction) * this.snapGridData.snapDistanceInUnityUnits;

        Physics2D.queriesStartInColliders = false;
        RaycastHit2D hit = Physics2D.Raycast(this.transform.position, moveVector, this.snapGridData.snapDistanceInUnityUnits);

        if (hit.collider == null)
        {
            return(true);
        }
        return(false);
    }
    public bool Move(SnapGridMovementDirection moveDirection)
    {
        if (this.IsMoving() || !this.canMove)
        {
            return(false);
        }

        if (this.CanMoveInDirection(moveDirection))
        {
            Vector2 moveVector = GetNormVectorFromDirection(moveDirection) * this.snapGridData.snapDistanceInUnityUnits;
            Debug.DrawLine(this.transform.position, this.transform.position + new Vector3(moveVector.x, moveVector.y, 0.0f), Color.yellow, 0.5f);

            Vector3 oldPosition = this.transform.position;
            this.moveReloadAccumulatorInSec = this.moveDurationInSec;
            this.movementState = SnapGridMovementState.MOVING;
            this.transform.Translate(moveVector);
            this.spriteRenderer.transform.position = oldPosition; // The sprite stays at the old position. Then lerp to new
            return(true);
        }

        return(false);
    }