public LayerMask blockingLayer; public float moveTime = 0.1f; float dx=0; float dy=0; bool isMove=true; private BoxCollider2D boxCollider; private Rigidbody2D rb2D; private float inverseMoveTime; void Start () { boxCollider = GetComponent <BoxCollider2D> (); rb2D = GetComponent <Rigidbody2D> (); inverseMoveTime = 1f / moveTime; transform.position=new Vector2(3f*8f+1.4f,3f*4f+1.5f); } void Update () { if(!isMove) return; float ax = Input.GetAxisRaw("Horizontal"); float ay = Input.GetAxisRaw("Vertical"); if(ax!=0 || ay!=0 ) { Vector2 start=rb2D.position; Vector2 end =start + new Vector2(1.5f*ax,1.5f*ay); if( move(end) ) { StartCoroutine(SmoothMovement(end)); } } } bool move(Vector2 end) { Vector2 start=rb2D.position; boxCollider.enabled = false; RaycastHit2D hit = Physics2D.Linecast(start,end, blockingLayer); boxCollider.enabled = true; if(hit.transform==null) return true; return false; } private IEnumerator SmoothMovement(Vector2 end) { isMove=false; float sqrRemainingDistance = (rb2D.position-end).sqrMagnitude; while(sqrRemainingDistance > float.Epsilon) { Vector2 newPostion = Vector2.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime); rb2D.MovePosition (newPostion); sqrRemainingDistance = (rb2D.position - end).sqrMagnitude; yield return null; } isMove=true; }