進捗
そんなに進んでませんが、グロブダーが逃げるやつは、まずブラスター発射後のターゲットスコープを追加して、それのコライダーがグロブダーと接していると、グロブダーがtriggerで動くようにしました。ターゲットスコープ自体は、ブラスター着弾後にDestroyします。
ギドスパリオ追加は簡単。スプライト画像を登録するだけ。こいつはただ上から降りてくるだけだから、アルゴリズムも何もない。
ソルバルウが自動的に逃げる
強化学習したいところだけど、どうやるかが煮詰まらないので、まずは自動的に弾から逃げる処理を入れてみる。
まず画面上の敵弾をFindGameObjectsWithTagですべて引いてきて、その弾から弾の進行方向にRaycastをやって、ソルバルウに当たるなら、放っておくと着弾する可能性があると判断。
その際、ソルバルだけを調べられるようにLayerMaskを仕込む。
逃げ方としては、もし弾が一つなら弾の進行方向と直角に逃げるのが最短経路でしょう。
しかし、弾が複数ある場合は、どっちに逃げたらいいかは解析的にはすぐには求まらない。
よって、ランダムにテキトウに逃げてみて、再度、Raycastしてみて、すべての敵弾から避けている状態になるまで繰り返す。
ある意味、モンテカルロ法みたいなアルゴリズム放棄的な手法をやってみました。
結論から言うとRaycast的には逃げてるはずなのに、弾に当ってしまう orz
raycastが線だからかな? 3DにはSphereCastって太いRaycastがあるけど、2Dにはない模様。
Rigidbody2DもRigidbodyも速度的には大差ないらしいので、3Dにしてみるかな?
ちょっと思案中。
Raycastを繰り返すのは重いかもしれないし、ここは直線と座標の距離を求めるやりかたでやりますか。
たしか公式は、Distance = |ay+bx+c|/√a^2+b^2 だっけ?
これであってる。
距離がソルバルウの半径以内なら、直線と近い位置にいるので当たる。
ただ、弾には方向があるので、それは考慮しないといけない。
点と直線の距離の公式は、「y=mx + n」の 形の場合が格段に易しい。なぜ、このような証明が教科書に採用されないのか、 とても不思議である。
確かに。すごい不思議だ。
Vector3 StartPos=transform.position; GameObject[] ebs = GameObject.FindGameObjectsWithTag("ebullet"); for(int i=0;i<10;i++) { bool Danger=false; foreach(GameObject eb in ebs) { ebullet obj = eb.GetComponent<ebullet>(); if(obj) { int layermask = 1 << LayerMask.NameToLayer ("Solval"); RaycastHit2D hit = Physics2D.Raycast( eb.transform.position, new Vector3( obj.vx,obj.vy,0f),30f,layermask ); if(hit.collider && hit.collider.name=="solval" ) { print("hit:" + hit.collider.name); Danger=true; break; } } } if(Danger) { Vector3 escape = new Vector3(Random.Range(-0.5f,0.5f),Random.Range(-0.5f,0.5f),0); transform.position = StartPos + escape; Clamp (); } if(!Danger && i>=1 ) { print("escape"); break; } if(!Danger ) break; }