前回紫の球を落とす処理を加えましたので、障害物とゴールを配置して落とし球ゲームを完成させたいと思います。
跳ね返りアクション
まず障害物ですがimageオブジェクトとして:小さい四角と:大きい丸を用意します。そして紫の球同様colider2Dを設定するのですが、ピンボールゲームのように接触したら跳ね返る設定を付けたいと思います。
Assets>Create>PhysicMaterial2Dを作成しましょう。詳細はこちらになりますが小さい四角と大きい丸のcolider2D>Materialにそれぞれ別のPhysicMaterial2Dを設定する事により、衝突するオブジェクトの摩擦(Friction)や跳ね返り効果(Bounciness)を個別に調整できるようになります。
これで機能はするのですが紫の球に衝突した瞬間効果音が欲しいので、前回のリトライ処理の要領で小さい四角と大きい丸にタグ付け→MoveBallクラスのOnCollisionEnter2Dメソッドに追加してみましょう。
ネットインでクリア
次にimageオブジェクトとしてゴールを用意します。落とすのは球なのでこの枠にネットイン=クリアの処理を行いたいと思います。まずはcolider2Dになりますがこれまでとは違い辺を組み合わせたカゴの形になるので複数設定する必要があります。又ゴールの子として空オブジェクトを設置しカゴの中にもクリア処理用のcolider2Dを設定しましょう。クリア処理=カゴに入った判定になりますのでIsTriggerを有効にします(衝突しない)。後はそれぞれにタグを設定したらMoveBallクラスに以下追加します。
//MoveBallクラス
public AudioClip clearSE;
public AudioClip goods;//ガチャン
public static bool clearGoods;//room1でのクリア判定用
void OnTriggerEnter2D(Collider2D inv)//侵入
{
if(inv.gameObject.tag == "cleararea")//クリア処理のタグ
{
audioSource.PlayOneShot(clearSE);
if (!clearGoods)
{
audioSource.PlayOneShot(goods);
}
clearGoods = true;
}
}
OnTriggerEnter2DメソッドはOnCollisionEnter2Dと違いIsTriggerを有効にしたオブジェクトに対し反応し、紫の球がクリア処理に接触したらSEやclearGoodsをtrueにしています。このclearGoodsフラグはstaticでroom1でも検知可能なので次回以降の新しい展開に繋げてゆきます。
オブジェクトの自動移動
一応完成したのですがもうひと捻りさせようと思います。BallManagerクラスに以下追加しましょう。
//BallManagerクラス
public GameObject Clear;//ゴール
public string direction = "left";
float speed = 1.0f;
float range = 4.0f;
Vector2 defPos;
void Start()//追加分のみ記載
{
defPos = Clear.transform.position;//ゴールの初期位置を保存
}
void Update()
{//左右切り替え
if (range > 0.0f)
{
if (Clear.transform.position.x < defPos.x - (range / 2))
{
direction = "right";
}
else if (Clear.transform.position.x > defPos.x + (range / 2))
{
direction = "left";
}
}
}
void FixedUpdate()
{//左右移動
Rigidbody2D rbody = Clear.GetComponent<Rigidbody2D>();
if (direction == "right")
{
rbody.velocity = new Vector2(speed, rbody.velocity.y);
}
else
{
rbody.velocity = new Vector2(-speed, rbody.velocity.y);
}
}
まずゴールの初期位置を保存した上でFixedUpdateメソッドで左右移動させます。ちなみにvelocityでRigidbody2Dの速度ベクトルの事でオブジェクトが移動する速度を指定できますのでx座標は自由に設定、y座標はずっと初期位置のままにしておきます。canvas自体のワールド座標は(100, 0, 0)にしてある事を忘れずに初期配置の中心軸としてrange左端までいったらrightに方向転換、range右端までいったらleftに方向転換するようにしています。以下デモ。
その他
Updateメソッド(毎フレーム)への集中が原因で固まるリスクを考慮してFixed(初期0.02秒/回)と分けてますが、一緒にしても問題はないと思います。
コメント