yumeの日記: Unity制作 メデューサ・ゲーム #14
●ワールド1の続き
現状ではRayCastを壁や兵士を対象に飛ばし、当たった対象が壁でないなら、当たった対象を石化させるという仕組み。しかしこれでは、ある兵士の後ろに立っている兵士は、たとえ視界内でも石化が進行しない(手前の兵士にhitしてそこで止まるため)
視界内の兵士は前後関係を無視してすべて一斉に石化させられる、というのが直感的だし、今後のパズルにも都合がいいのでそのようにする。
private void EvilEyeSeeing()
{
///<summary>
///石化の対象(Charactersタグのオブジェクト)をLinecastし、
///壁が阻害されないならそれの石化タグをTrueにする
///</summary>
if (characters.Count == 0) return;
//仮想ポジションをBodyと同期
position2D = myFOV.position2D;
for (int i = 0; i < characters.Count; i++)
{
Vector2 hisPosition = characters[i].transform.position;
float goalRadian = GetRadian(position2D, hisPosition);
//弧度差チェック
float radDiff = Mathf.Abs(myFOV.ownerControll.aimRadian - goalRadian);
if (radDiff > Mathf.PI) radDiff = Mathf.Abs(radDiff - Mathf.PI * 2);
//距離チェック
float distance = Vector2.Distance(position2D, hisPosition);
//弧度差がviewingAngleを超えている、または、範囲より外にいる場合、無視。
if ((radDiff > myFOV.viewingAngle) || (distance > evilEyeRange) )
{
continue;
}
//Linecast。対象のポジションまで
hitSeeing = Physics2D.Linecast(position2D, hisPosition, layerMask);
//LineにPolyWallがひとつもない=対象地点まで壁が無いということなので、石化を開始する。
if (hitSeeing.collider == null)
{
themStatus[i].evilSeeing = true;
}
}
}
新たな仕組みでは、RayCastは兵士のポジションに飛ばすが、RayCastがhitする対象は壁だけで、壁に一度もヒットしないなら、それは対象に当たったものと解釈する。
ついでにいちいちGetComponentせずにすむよう、先にStatusスクリプト(兵士側の石化進行度などのクラス)をリストで取得しておく。
そして1-3を実装し、これでワールド1は完成した。
ワールド1はミスティ(主人公のメデューサ)と兵士のみのチュートリアルワールドで、現状の3ステージで:
・ミスティが見た兵士は一定時間で石化する
・兵士に捕獲されるとリスタート。ゆえに、兵士を石化させられるだけの時間=距離が必要である
・ミスティは同時に複数の対象を石化させられる
ということは伝えられているはずだ。
●ワールド2、猫、それと会話シーン。
ワールド2へ偏移する前に、カットシーンというか会話シーンだけを描写するシーンが欲しい。
ワールド1の冒頭にも同様の処理をしたい。
これは、ステージ1-1の画面を会話専用のスプライトで覆うとか、単にステージ1-1のオブジェクトをはじめは非表示にしておくなどで対応できそうだ。
まずは猫と、猫、兵士、ミスティの相互作用で起きるパズルを考える。
次は猫を実装しよう。いや、その前に、兵士や猫に共通する「影」などの描写も追加しておこう。
Unity制作 メデューサ・ゲーム #14 More ログイン