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

「カーソルキーでマップ内を移動する(2D)」の編集履歴(バックアップ)一覧に戻る

カーソルキーでマップ内を移動する(2D) - (2015/06/21 (日) 10:20:46) のソース

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