プレイするゲームがないなら、自分で作ればいいじゃない!
ということで Unity 初心者が「ゲームを作る」ゲームをやっていきます!
今回は「自機の弾を強化する」の記事です
内容
プレイヤーの弾を強化させる
「弾数の追加」と「子機の追加」を行います
強化アイテム
まずは画像を用意

ItemType を SHOT_UP にしてショット強化アイテムのプレハブを作る
プレイヤーのスクリプトを編集
ショット部分
発射位置の空のオブジェクトを作成しておく
// ボタンを押したとき
if( Input.GetButtonDown("Fire1") )
{
// 弾の生成
if (bulletLevel == 0)
{
Instantiate(BulletObj, transform.position + bulletPointList[0].localPosition, Quaternion.identity);
}
// 2つ発射
else if(bulletLevel >= 1)
{
Instantiate(BulletObj, transform.position + bulletPointList[1].localPosition, Quaternion.identity);
Instantiate(BulletObj, transform.position + bulletPointList[2].localPosition, Quaternion.identity);
}
SoundManager.Instance.PlaySe("shot");
}
当たり判定
SHOT_UP の判定を追加する
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.CompareTag("Item"))
{
ItemController item = other.gameObject.GetComponent<ItemController>();
if(item)
{
switch (item.GetItemType())
{
// ショット強化
case ItemController.ITEM_TYPE.SHOT_UP:
{
++bulletLevel;
// 子機を付けたい
if(bulletLevel >= 2)
{
CreateMiniPlayer();
}
}
break;
}
}
// アイテムを消す
Destroy(other.gameObject);
}
}
子機を作る
子機の画像を用意

コライダーとスクリプトの追加をします
子機のスクリプト
位置以外はプレイヤーと同じような処理
public class MiniPlayerController : MonoBehaviour
{
[SerializeField] PlayerBullet BulletObj; // 弾のゲームオブジェクト
Vector3 bulletPoint; // 弾の位置
[SerializeField] Vector3 offsetPos; // プレイヤーからのオフセット位置
GameObject playerObj = null; // プレイヤーオブジェクト
void Start()
{
bulletPoint = transform.Find("point").localPosition;
// プレイヤーオブジェクトを取得する
playerObj = GameObject.Find("player");
}
void Update()
{
// プレイヤーがいない場合
if(playerObj == null)
{
// 自身を消す
Destroy(gameObject);
return;
}
// 位置の更新
transform.position = playerObj.transform.position + offsetPos;
// ボタンを押したとき
if (Input.GetButtonDown("Fire1"))
{
// 弾の生成
Instantiate(BulletObj, transform.position + bulletPoint, Quaternion.identity);
}
}
// オフセット位置の設定
public void SetOffsetPos(Vector3 _pos)
{
offsetPos = _pos;
}
void OnTriggerEnter2D(Collider2D other)
{
// 敵にヒット
if (other.gameObject.CompareTag("Enemy") || other.gameObject.CompareTag("enemy_bullet"))
{
// 自身を消す
Destroy(gameObject);
}
}
}
インスペクタービューの設定

プレイヤーのスクリプトを編集2
子機の情報を設定できるようにして、作成処理を追加する
[SerializeField] MiniPlayerController miniPlayerObj; // 子機のゲームオブジェクト
List<MiniPlayerController> miniPlayerList = new List<MiniPlayerController>(); // 子機
[SerializeField] List<Transform> miniPlayerPointList; // 子機の位置
void Start()
{
miniPlayerList.Add(null);
miniPlayerList.Add(null);
}
// 子機を作る
void CreateMiniPlayer()
{
if(miniPlayerList[0] == null)
{
miniPlayerList[0] = Instantiate(
miniPlayerObj,
transform.position + miniPlayerPointList[0].localPosition,
Quaternion.identity
);
miniPlayerList[0].SetOffsetPos(miniPlayerPointList[0].localPosition);
}
else if(miniPlayerList[1] == null)
{
miniPlayerList[1] = Instantiate(
miniPlayerObj,
transform.position + miniPlayerPointList[1].localPosition,
Quaternion.identity
);
miniPlayerList[1].SetOffsetPos(miniPlayerPointList[1].localPosition);
}
}
インスペクタービューの設定

サンプル動画
さいごに
何故かアイテム1つ取ると2段階強化されるバグが発生
2つの弾が同時に当たってアイテムが2個出ていたのが原因でした…
コメント