移動、旋回ができるようになったところで今度は弾を発射したい。
弾を発射させるためには、弾丸のオブジェクトをゲーム中に生成しなくてはならない。
オブジェクトの生成はチュートリアルになかった内容なのでちょっと調べる。
こちらの記事を参考にしました
PrefabとInstantiateの基本(2)効率的にBlockを並べる:「はじめてのUnity」のブロック崩しを改造しながら学ぶ
とにかく生成したいオブジェクトをPrefabとして登録しておき、
Instance関数の引数にPrefabを設定してやることで生成できるそうな。
Purefabの登録はチュートリアルでやったな。
というわけでテキトーにBulletオブジェクトをPrefabに登録し、
Bulletオブジェクトを生成するWeaponスクリプトを作成。
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 |
public class Weapon : MonoBehaviour { public GameObject bullet; void Update () { /*射撃ボタン1が押されたとき*/ bool fire = Input.GetButtonDown ("Fire1"); if (fire == true) { //弾を出現させる位置を取得 Vector3 placePosition = this.transform.position; //出現させる位置をずらす値 Vector3 offsetGun = new Vector3 (0,0,2); //武器の向きに合わせて弾の向きも調整 Quaternion q1 = this.transform.rotation; //弾を90度回転させる処理 Quaternion q2 = Quaternion.AngleAxis(90, new Vector3(1,0,0)); Quaternion q = q1 * q2; //弾を出現させる位置を調整 placePosition = q1 * offsetGun + placePosition; //弾生成! Instantiate (bullet, placePosition, q); } } } |
ただ出現させるだけでは銃口の位置や向きが考慮されず生成されるため、
それらを考慮する処理をてから生成。
弾を90度回転させているのは、弾のモデルの向きが縦向きなので、横向きに直しているため。
このままでは弾は生成されるも飛んでいかない為、弾に生成された瞬間に飛んでく力が加わるようにBulletスクリプトを作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Bullet : MonoBehaviour { public Quaternion firstRotation; public float speedY = 100; void Start () { firstRotation = transform.rotation; Rigidbody rigidbody = GetComponent<Rigidbody>(); Vector3 movementSpeed = new Vector3 (0,speedY,0); movementSpeed = firstRotation * movementSpeed; rigidbody.AddForce(movementSpeed); } void Update () { } } |
そんなこんなでこうなりました
ええかんじ
イカしたウィンナー発射装置ってかんじ。
今は最初に力を加え、後はRigidbodyの演算に任せているが。
いずれは有効射程距離までは等速直線運動を行い、
その後失速、重力による落下をするようにしていきたい。
まぁ、多分有効射程距離まで重力なし、抵抗なしにして、
越えたら重力あり、抵抗ありにすればいいよね。
また、ミサイルを実装するならロックオンした敵の位置情報のポインターを弾に渡したいところ。生成したオブジェクトに関数を介して値を渡す方法を調べなくちゃね。
コメント