シューティングゲームを作ろう vol.3
自機の弾の発射を作成します。
シューティングゲームを作ろうvol1でダウンロードした
・SpaceShooterAssetPack
から「SpaceShooterAssetPack_Projectiles.png」を使用します。
「SpaceShooterAssetPack_Projectiles.png」をプロジェクトに追加をして下さい。
(ファイルをAssets→Spriteフォルダにドラッグ&ドロップします)
プロジェクトに追加した「SpaceShooterAssetPack_Projectiles.png」をクリックして「Inspector」(画面左側に表示)を開きます。
「SpriteMode」を「Multiple」、「PixelPerUnit」を「8」、「FilterMode」を「Point(no filter)」に変更します。
「SpriteEditor」を開きます。
「PixelSize」をX「8」、Y「8」に設定して分割します。
分割した画像から左から2番目の緑色の弾(SpaceShooterAssetPack_Projectiles.png)をSceneに追加(ドラッグ&ドロップ)します。
追加した緑色の弾のオブジェクト名(Inspectorの一番上の項目)を「PlayerBullet」に変更しましょう。
Projectウィンドウで新規Scriptファイルを作成します。Script名は「PlayerBulletController.cs」です。
Scriptファイル「PlayerBulletController.cs」をダブルクリックして「PlayerBullet」を制御するプログラムを作成しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBulletController : MonoBehaviour
{
[SerializeField] GameObject p_obBullet;
//弾の移動速度
[SerializeField] float p_fMoveSpeed;
void Start() {
}
public bool Move()
{
float fY;
//縦上方向に座標を更新します
fY = transform.position.y + p_fMoveSpeed * Time.deltaTime;
if (fY < 6f) {
//画面内にある場合
transform.position = new Vector3(transform.position.x,fY,0f);
} else {
//画面外にはみ出た場合
transform.position = new Vector3(10f,20f,0f);
return false;
}
return true;
}
public void SetPos(Vector3 vec3) {
transform.position = new Vector3(vec3.x,vec3.y+0.25f,0f);
}
}
「PlayerController.cs」も以下のように処理を追加、変更をします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private const int BULLET_NUM = 10;
//弾オブジェクト
private GameObject[] p_obBullet = new GameObject[BULLET_NUM];
private PlayerBulletController[] p_clBullet = new PlayerBulletController[BULLET_NUM];
// Start is called before the first frame update
void Start()
{
int i;
GameObject wkObj;
transform.position = new Vector3(0f,-3f,0f);
//prefabからPlayerBulletを生成
wkObj = (GameObject)Resources.Load("PlayerBullet");
for (i=0;i<BULLET_NUM;i++) {
p_obBullet[i] = (GameObject)Instantiate(wkObj, new Vector3(10f+i, 20f, 0f), Quaternion.identity);
p_clBullet[i] = p_obBullet[i].GetComponent<PlayerBulletController>();
p_obBullet[i].SetActive(false);
}
}
// Update is called once per frame
void Update () {
int i;
Vector3 vecWk;
if (Input.GetKey (KeyCode.LeftArrow)) {
transform.Translate (-0.01f, 0, 0);
}
if (Input.GetKey (KeyCode.RightArrow)) {
transform.Translate (0.01f, 0, 0);
}
//スペースキーが押されたとき弾を発射する
if (Input.GetKeyDown (KeyCode.Space)) {
for (i=0;i<BULLET_NUM;i++) {
if (p_obBullet[i].activeSelf==false) {
p_obBullet[i].SetActive(true);
vecWk = new Vector3(transform.position.x + 0.03f,transform.position.y,0f);
p_clBullet[i].SetPos(vecWk);
break;
}
}
}
for (i=0;i<BULLET_NUM;i++) {
if (p_obBullet[i].activeSelf==true) {
if (p_clBullet[i].Move()==false) {
p_obBullet[i].SetActive(false);
}
}
}
}
}
Updateメソッドのスペースキーが押されたら弾を発射する処理ですが、生成したp_obBullet[]の中からactiveでないオブジェクトを探し、見つけたらactiveにする処理をしています。
if (Input.GetKeyDown (KeyCode.Space)) {・・・スペースキーが押されたら
for (i=0;i<BULLET_NUM;i++) {・・・生成したオブジェクト配列数をループする
if (p_obBullet[i].activeSelf==false) {・・・activeでないオブジェクトを探す
p_obBullet[i].SetActive(true);・・・見つけたらactiveにする
その後の処理で、すべてのp_obBullet[]オブジェクトの中からactiveなオブジェクトに対して移動させています。
for (i=0;i<BULLET_NUM;i++) {・・・全てのオブジェクトをループさせる
if (p_obBullet[i].activeSelf==true) {・・・activeなオブジェクトを探す
if (p_clBullet[i].Move()==false) {・・・Move(移動)させる
p_obBullet[i].SetActive(false); ・・・Move()からfalseが返されたらactiveをfalse(無効化)する
ヒエラルキーウィンドウの「PlayerBullet」に「PlayerBulletController.cs」をアタッチ(ドラッグ&ドロップ)して下さい。
Inspectorウィンドウの「PlayerBulletController」の「p_obBullet」にヒエラルキーウィンドウの「PlayerBullet」をアタッチ、「p_fMoveSpeed」に5を設定しましょう。
「PlayerBullet」の設定が終わりましたら、プレハブ(Prefab)化しましょう。
プレハブ化とはオブジェクトの複製を作りやすくなる仕組みです。
ヒエラルキーウィンドウの「PlayerBullet」をプロジェクトウィンドウの「Resource」フォルダに追加(ドラッグ&ドロップ)します。
この操作だけでプレハブ化されました。
上記で修正した「PlayerController.cs」の「Start」メソッドの中で、プレハブを利用して「PlayerBullet」オブジェクトを複製しています。
ここまで出来ましたら実行して、動作を見てみましょう。
スペースキーを押すと自機から弾が発射されると思います。
前回の記事