ゲーム制作勉強中!あこがれだったプログラマーに今からなろう!

昔、あこがれていたプログラマー。今からでも勉強してみようと思い立ち、チャレンジ開始! 勉強メモや、悪戦苦闘な日々の記録です。

サイドビューアクションゲームを作ろう(12):アイテム生成完成

ブログへのスクリプトコードの記載方法だけど、迷い迷って、結局、はてなブログの特権である、「はてな記法」に頼る事にした。
もっといい方法が見つかれば、そっちに変えるかもしれないけど、しばらくはこれでやってみようと思う。


さて、サイドビューアクションゲームの続きだけど、暫定だったアイテム生成を完成させた。

ちょっと悩んだけど、ScriptableObjectのEnemy Data Tableに、それぞれのEnemyのアイテム出現率を設定した。


敵を倒したタイミングで、EnemyからItem ManagerにEnemy Noを渡し、
Item Managerは受け取ったEnemy Noを使って、Enemy Data Tableからアイテムの出現率を取得する。


Enemy側のスクリプトには下記の様なOndeadメソッドを入れてある。
このOndeadメソッドで、Item ManagerのItem Generateメソッドに引数でEnemyNoを渡してやる。

public override void Ondead()
        {
            var ss=transform.position;
         
            ItemManager.itemGene.ItemGenerate(transform.position,enemyNo);//ここで渡す。
            Destroy(gameObject,4.5f);
        }


Item Manager側は、受け取ったenemyNoで

    public void ItemGenerate(Vector3 vector3,int enemyNo)
    {
        itemnumber=9;
        int rand=Random.Range(0,100);
        Debug.Log(rand);

        foreach(EnemyData i in EnemyDataTable.Entity.enemyDataList)
        {
            if (i.enemyNo != enemyNo) continue;
            
            enemyItem=i.enemyItem; //ここでアイテムの出現率を取得
            enemyExp=i.enemyEXP;     //ついでに経験値も取得
        }

        playerManager.playerEXP+=enemyExp;
        playerManager.OnUpdateEXP((float)playerManager.playerEXP/(float)playerManager.nextLevel);
        for (int i = 0; i < 7; i++)
        {
            if(rand<enemyItem[i] && itemnumber==9)//ここで出現率と乱数を比較してアイテムを決めている。
            {
                itemnumber=i;
            }
        }
        
        if(itemnumber!=0)//0ならアイテムなし。ハズレ。
        {
            foreach(ItemData i in ItemDataTable.Entity.itemDataList)
            {
                if (i.itemNo != itemnumber) continue;
                ino=i.itemNo;
                iobj=i.itemPrefab;
                iTYPE=i.iTEM_TYPE;
                iValue=i.iTEM_Value;
            }
            generateItem=Instantiate(iobj,new Vector3(vector3.x,vector3.y+0.5f,vector3.z),Quaternion.identity);
            generateItem.GetComponent<Rigidbody2D>().AddForce(Vector2.up *jumpPower);
            generateItem.GetComponent<Item>().iTYPE=iTYPE;
            generateItem.GetComponent<Item>().iValue=iValue;
            
        }
    }
}

これでEnemyの種類に応じた、アイテム出現率でアイテムを生成する事ができるだろう。
もっとスマートなやり方があるのかもしれないけれど、今の自分に考えつくのはこんなものかな。
youtu.be


使用アセット
Pixel Fantasy Caves
Hero Knight - Pixel Art
Slime Character
Pixel Potions (with Animation)
Animated 2D Coins
Bandits - Pixel Art

使用画像
七三ゆきのアトリエ:https://nanamiyuki.com/