カーソルキーでマップ内を移動する(2D)

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;
}

タグ:

sample
最終更新:2015年06月21日 10:20