Unityでゲーム作るお(仮)

ノリでブログをはじめたUnity初心者によるゲーム制作メモの予定です。

UniBulletHellってアセットをSetActiveを使ってボスパターンっぽくしてみるで

UniBulletHell
ボスパターンについてのスクリプトと、型変換(キャスト)については下に書いてあります。


今回作ったナズーリンチーズ防衛戦で使いました
雑魚妖精が撃つ全方位に一斉に発射するよく見る弾幕
f:id:lincate:20171227203346p:plain
これは一番上の画像で円形の弾幕を撃っているYellowFairyの設定です
f:id:lincate:20171227220456p:plain
私はShotManagerを作りその中に、Ubh Shot CtrlというUniBulletHellのスクリプトをアタッチして使っています(YellowFairyにUbh Shot Ctrlをアタッチしても問題ありません)

  • Start On Awake Delay 何秒後に攻撃を開始するか指定
  • LoopとRandomはその名の通り
  • Shot ListはSizeを2に変更すると弾幕パターンを複数セット

など一通りのものがそろっています
f:id:lincate:20171228105014p:plain

Shot Listを使えば大体のことはできるけど

なんかたんねえよなあ?

ということで体力が減ると行動と弾幕の種類を変えるスクリプト書いていきま↑す↓f:id:lincate:20171227203349p:plain
第一形態 やられててウケル
f:id:lincate:20171227203350p:plain
第二形態 形態とか書いてるくせに見た目は変わりません!!
f:id:lincate:20171227203352p:plain
第三形態
f:id:lincate:20171227203355p:plain
第四形態みたいな感じにできるスクリプト書いてみたので今から書きます。

public class BossManager : MonoBehaviour {

    //percentageHp変数を作るためにbossHpとbossHpMaxを宣言しています
    public int bossHp;
    public int bossHpMax = 3000;

    //○○○○FormにはShotManagerをアタッチしています
    public GameObject firstForm;
    public GameObject secondForm;
    public GameObject thirdForm;
    public GameObject fourForm;
    public GameObject fiveForm;

    void Start () {
        //bossHpはbossHpMaxの数値を代入しています。
        bossHp = bossHpMax;
        displayBossHp = bossHp;
    }

	void Update () {
        
//今回はpercentageHpがfloatなのでint型であるdisplayBossHpを、
//(float)displayBossHpと書きfloatに変換(キャスト)します
//キャストに関してはコードの終わりに書いておくのでわからない人は読んでね
        float percentageHp = (float)displayBossHp / bossHpMax;
//percentageHpが80%より大きい場合shotForm1()メソッドを呼び出します
        if (percentageHp > 0.8f)
        {
            shotForm1();
        }
//percentageHpが60%より大きい場合shotForm2()メソッドを呼び出します
        else if (percentageHp > 0.6f)
        {
            shotForm2();
        }
//percentageHpが40%より大きい場合shotForm3()メソッドを呼び出します
        else if(percentageHp > 0.4f)
        {
            shotForm3();
        }
//percentageHpが20%より大きい場合shotForm4()メソッドを呼び出します
        else if (percentageHp > 0.2f)
        {
            shotForm4();
        }
//percentageHpが20%以下になるとshotForm5()メソッドを呼び出します
        else
        {
            shotForm5();
        }
    }
//percentageHpが80%より大きいときにこのメソッドは呼び出されます
    void shotForm1()
    {
        //firstFormがtrue(有効化)されます
        firstForm.SetActive(true);
    }

    void shotForm2()
    {
        //firstFormがfalse(無効化)secondFormがtrue(有効化)されます
        firstForm.SetActive(false);
        secondForm.SetActive(true);
    }

    void shotForm3()
    {
        secondForm.SetActive(false);
        thirdForm.SetActive(true);
    }
    void shotForm4()
    {
        thirdForm.SetActive(false);
        fourForm.SetActive(true);
    }
    void shotForm5()
    {
        fourForm.SetActive(false);
        fiveForm.SetActive(true);
    }
}
    private void OnCollisionEnter2D(Collision2D collision)
    {
      //別記事でダメージ処理について書いたのでURLを下に貼っておきます
    }

当たり判定とダメージ処理を追加する - Unityでゲーム作るお(仮)

キャストについて

int型bossHpが元であるdisplayBossHpもint型なので、float percentageHpに代入したい場合
float percentageHp = displayBossHp / bossHpMax;
と書いてもdisplayBossHpをfloatに暗黙の型変換ができず(正しく処理されない)1ダメージ減っただけでshotForm5()を呼び出されてしまいます。

これを回避するためにはdisplayBossHpをfloat型に変換します
float percentageHp = (float)displayBossHp / bossHpMax;
上記ようにdisplayBossHpの前に(float)と書くことで、displayBossHpをintからfloatに明示的な型変換(キャスト)できます。

間違いや分からないところがあったらコメントしてください



Game a week中は全く気付かなかったけどshotFormメソッドは、SwitchでもできるしぶっちゃけSwitchとかで書いたほうが短くなるしよさそう

ブログにコード載せるわけだし。リーダブルコードって本読んでみようかな

今回スクリプトは載せていないのですが、フランドールのHPケージはこちらのサイトを参考にしています。
C# - HPがちゃんと満タンにならない【(int)Mathf.Lerp】の加算問題(89433)|teratail