ターゲット(標的)をめがけて発射したとき、正確に命中するのは、ある意味で当たり前の動作です。
今回は、発射のタイミングであえて誤差をつけて、命中率を下げるような仕組みをつくってみましょう。
まず先に、完成作品を見てみます。
発射するたびに、空のオブジェクトがCubeの周りをランダム移動します。
その空のオブジェクトを標的とすることで、誤差をつけています。
関連記事:
プレハブ出現のたびに角度をランダムで変化
1秒おきにランダムで回転角を変える
発射したオブジェクトを回転させる
全方位に向けてランダム発射
360°全方位に向けて発射
プレーヤーの向いている方向に発射する
弾幕のように全方向へ発射するしくみ
n秒おきに回転しながら前方へ発射
Instantiateでオブジェクトの角度を変える
ランダムで周囲を移動する
Cube、Sphere、GameObject(空のオブジェクト)、Planeをそれぞれ1つずつ用意します。
CubeとSphereは、ある程度の距離を取りましょう。
CubeとSphereにリジッドボディを追加します。
OffsetPosition.csを作成し、GameObject(空のオブジェクト)に追加します。
OffsetPosition.csのコードを以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class OffsetPosition : MonoBehaviour { private float randomX; private float randomZ; public Transform target; public Vector3 offset; public void GetCloser() { randomX = Random.Range(-2,2); randomZ = Random.Range(-2,2); offset = new Vector3(randomX, 0, randomZ); this.transform.position = target.position + offset; } } |
GameObjectのインスペクターを確認しましょう。
ターゲットのフィールドが追加されているので、ここにはCubeを入れます。
発射のタイミングで誤差をつける
次はボールの方をつくっていきましょう。
SphereShot.csを作成し、Sphereに追加します。
SphereShot.csを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereShot : MonoBehaviour { private float power; public Rigidbody rb; public GameObject target; void Start() { power = 30; target = GameObject.Find("GameObject"); } void OnMouseDown() { target.GetComponent<OffsetPosition>().GetCloser(); transform.LookAt(target.transform); rb = GetComponent<Rigidbody>(); rb.velocity = transform.forward.normalized * power; } } |
Sphereのインスペクターを確認します。
ターゲットのフィールドには、GameObjectを入れましょう。
プレイしてみます。
ボールの発射は1回しかできないので、何回かプレイしてみます。
1回目。
2回目。
ボールを発射するたびに、GameObject(空のオブジェクト)が動きます。
これで、本来のターゲットであるCubeへの命中率は下がりました。
関連記事:
プレハブ出現のたびに角度をランダムで変化
1秒おきにランダムで回転角を変える
発射したオブジェクトを回転させる
全方位に向けてランダム発射
360°全方位に向けて発射
プレーヤーの向いている方向に発射する
弾幕のように全方向へ発射するしくみ
n秒おきに回転しながら前方へ発射
Instantiateでオブジェクトの角度を変える