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

「マップ内をランダムに徘徊する(2D)」の編集履歴(バックアップ)一覧はこちら

マップ内をランダムに徘徊する(2D) - (2015/06/21 (日) 10:18:45) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

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

表示オプション

横に並べて表示:
変化行の前後のみ表示: