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;
}
最終更新:2015年06月21日 10:20