画像などを読み込むためのフォルダを追加する
野菜を追加しようと思いますが、野菜の画像はランダムで読み込むようにするため、スクリプトで読み込めるよう、ResourcesフォルダにImagesフォルダを作成し、中に野菜の画像を格納します。
今回はまず、cabbage(キャベツ)とtomato(トマト)の2個格納しました。
野菜の画像を読み込むPrefabを作る
野菜は共通のPrefabに野菜の画像を読み込む形で作りたいと思います。
ResourcesフォルダにPrefabsというフォルダを作り、VegetableSpriteというPrefabを作成します。
VegetableSpriteは、2D Object のSpriteをPrefabにしたものです。
GameObjectにSpriteRenderer、Rigidbody 2Dを追加します。Colliderは画像が読み込まれてから追加しますので、ここでは追加していません。
VegetableSpriteというクラスファイルを作成し、画像のセットの処理や、各コンポーネントの参照を持たせておきます。
今回はとりあえずの処理で、キャベツの画像のみ読み込む形にしています。
VegetableSprite.cs
using UnityEngine; namespace VegetableTower.Prefabs { public class VegetableSprite : MonoBehaviour { [SerializeField] SpriteRenderer _sprite; [SerializeField] Rigidbody2D _rigidbody2d; public Rigidbody2D Rigidbody2d { get { return _rigidbody2d; } } public void SetImage() { _sprite.sprite = (Sprite)Resources.Load("images/cabbage", typeof(Sprite)); } } }
ここでのポイントは参照の持たせ方かと思います。
クラス側にgetterで参照を持たせることで、getComponentしなくて良くなるので、私はこのようなスタイルで作成しています。
このスクリプトを追加して、コンポーネントの参照を設定しておきます。
GameManagerを追加する
ゲームの根幹を設定するマネージャークラスを作ります。
このクラスで野菜を生成し、設置します。空っぽのGameObjectを作成し、GameManagerのクラスを追加します。
GameManagerの処理を書く
GameManagerクラスに、起動時に野菜を表示する処理を書きます。
GameManager.cs
using UnityEngine; using VegetableTower.Prefabs; namespace VegetableTower.Managers { public class GameManager : MonoBehaviour { void Start(){ CreateVegetable(); } //野菜を生成する void CreateVegetable(){ //prefabを取得 VegetableSprite prefab = (VegetableSprite)Resources.Load("Prefabs/VegetableSprite", typeof(VegetableSprite)); //インスタンスを生成 VegetableSprite obj = Instantiate(prefab) as VegetableSprite; obj.transform.position = Vector3.zero; obj.Rigidbody2d.gravityScale = 0; obj.SetImage(); //画像を読み込んでから、当たり判定を追加 obj.gameObject.AddComponent<PolygonCollider2D>(); } } }
ここでやっていることは、Prefabを読み込んで、画面に追加し、Prefabに設けたメソッドを実行し画像を設定する。
ということです。
問題無く製作できれば、実行すると以下のようにキャベツが表示されます。
次回は、キャベツを回転させたり、落としたりします。
コメント