Keita_Nakamoriです。
前回やった、オブジェクトの召喚(Summon.cs)を発展させて、出現と同時に、別のスクリプト(Shooter.cs)を追加し初速度を与えることにより、砲弾のようにオブジェクトを前方へ発射させてみましょう。
スクリプト Shooter.cs
これはまだ、Summon.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 25 26 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Shooter : MonoBehaviour { //当該スクリプトは、任意の3Dオブジェクトを任意の座標から発射します。 //当該スクリプトは、予め作っておいたEmptyObjectであるゲームコントローラーに入れます。 //インスペクタ上で代入:発射する弾丸のオブジェクトをアタッチする [SerializeField] GameObject bulletObject; //インスペクタ上で代入:弾丸の発射地点の座標をもつオブジェクトをアタッチする。またはEmptyObjectでも良い。 [SerializeField] Transform mazzlePosition; private void Update () { //DaydreamコントローラーのAppButtonをクリックダウンすると下記関数Shoot()が発動する。 if (GvrControllerInput.AppButtonDown){ Shoot(); } } void Shoot(){ Instantiate(bulletObject,mazzlePosition.position,mazzlePosition.rotation); } } |
Shooter.csを設置するヒエラルキーの場所
新規にEmptyObjectを追加し、オブジェクトの名前をわかりやすくShooterにします。
置き場所はどこでもいいのですが、オブジェクトを発射するのは自分であるということで、MeMyselfEyeに入れました。またDayDreamコントローラーのAppボタンによって発射するということで、GrvControllerPointerの下に入れました。
インスペクターに Objectをアタッチする
Bullet Object : 砲弾として打ち出すオブジェクト。今回はCubeで作ったボール字形状のものを2個中心座標を若干ずらして重ねたものを設定した。(本当は半球を2つ合わせたほうが良いです。)
Mazzle Psition:オブジェクトを出現させる初期位置のオブジェクト。今回は目の前のカーソルを設定した。
Shooter2.cs
では、Shooter.csで召喚したモンスターボールオブジェクトに対して、当該Shooter2.csによりオブジェクトに初速を与えてみます。Shooter2.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 25 |
using System.Collections; using System.Collections.Generic; using UnityEngine; //このスクリプトに必要なコンポーネントを指定する [RequireComponent(typeof(Rigidbody))] public class Shooter2 : MonoBehaviour { //当該スクリプトはShooterクラスで召喚した3Dオブジェクトに対して、速度を与える。 //インスペクタ上からアクセスできる速度変数を定義 [SerializeField] float speed = 20f; void Start(){ //3Dオブジェクトに対して与える速度ベクトルを定義する var velocity = speed * transform.forward; //RigidBodyコンポーネントを所得する var rigidbody = GetComponent<Rigidbody>(); //RigidBodyコンポーネント経由で速度ベクトルを与える rigidbody.AddForce(velocity, ForceMode.VelocityChange); } } |
ShooterDestroy.cs
オブジェクトを召喚しすぎると、処理が重くなってしまい、最悪フリーズします。
定期的にオブジェクトを壊す(Destroy)して数を減らさなくてはなりません。
こちらも、モンスターボールオブジェクトのインスペクターの中にいれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ShooterDestroy : MonoBehaviour { //当該スクリプトは、召喚から一定時間経過した3DオブジェクトをDestroyする //3Dオブジェクトのライフをインスペクタから定義する [SerializeField] float lifetime = 60.0f; void Start () { //一定時間後に 当該スクリプトがアタッチされている3DオブジェクトをDestroyする Destroy(gameObject, lifetime); } } |
以上です。