ブログへのスクリプトコードの記載方法だけど、迷い迷って、結局、はてなブログの特権である、「はてな記法」に頼る事にした。
もっといい方法が見つかれば、そっちに変えるかもしれないけど、しばらくはこれでやってみようと思う。
さて、サイドビューアクションゲームの続きだけど、暫定だったアイテム生成を完成させた。
ちょっと悩んだけど、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