マップ内をランダムに徘徊する(2D)

float dx=0;
float dy=1f;
bool isMove=true;
bool isDead=false;
float fireTimer=0;
private BoxCollider2D boxCollider; 
private Rigidbody2D rb2D;
private float inverseMoveTime;

void Start () {
	boxCollider = GetComponent <BoxCollider2D> ();
	rb2D = GetComponent <Rigidbody2D> ();
	inverseMoveTime = 1f / moveTime;
	transform.position=new Vector2( Random.Range(1,15)*3-1.5f, Random.Range(1,9)*3+1.5f);
	player = GameObject.FindWithTag("Player").GetComponent<Player>();
	fire=Resources.Load<GameObject>("fire");
}
void Update () {
	if(isDead==true) return;

	fireTimer++;
	if(fireTimer>=400 && (dx!=0 || dy!=0) )
	{
		fireTimer=0;
		GameObject tmp=GameObject.Instantiate( fire, rb2D.position+new Vector2(dx,dy) , Quaternion.identity) as GameObject;
		tmp.GetComponent<fire>().dx=dx;
		tmp.GetComponent<fire>().dy=dy;
	}
		
	if(isMove==false ) return;
	count++;
	if( Random.Range(1,1000)<990 && this.name.IndexOf("Slime")!=-1 ) return;

	Vector2 start=rb2D.position;
	Vector2 end  =start + new Vector2(1.5f*dx,1.5f*dy);
	int dd = Random.Range(1,3);
	if(dd==2) dd=-1;
	if( move(end) )
	{
		if( count>5 && Random.Range(1,100)<90  )
		{
			if(dx==0)
			{
				end  =start + new Vector2(3*dd,0);
				if( move(end) )
				{
					dx=dd;dy=0;
					count=0;
				}
			}
			else
			{
				end  =start + new Vector2(0,3*dd);
				if( move(end) )
				{
					dx=0;dy=dd;
					count=0;
				}
			}
		}
		end  =start + new Vector2(3*dx,3*dy);
		StartCoroutine(SmoothMovement(end));
	}
	else
	{
		if(dx==0) { dx=dd;dy=0; }
		else if(dy==0) { dx=0;dy=dd; }
	}
}

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:18