野菜の積み上げ位置によって生成場所を変える
その6で、次々と野菜が生成されるようにしましたが、このままだと、積んでいった場所に生成されてしまって、積めなくなってしまい、おかしな動きになってしまいます。
そこで、一番上に積んである野菜の位置を把握して、それよりも上に生成するようにします。
まず、GameManagerに最大のY位置のプロパティを追加します。
GameManager.cs
-略- //現在の最大の高さ float _maxHeight; public float MaxHeight { get { return _maxHeight; } set { _maxHeight = value; } } -略-
そして、野菜の生成位置を計算する関数を作り、野菜生成のメソッドを修正します。
GameManager.cs
-略- //野菜を生成する public void CreateVegetable(){ //prefabを取得 VegetableSprite prefab = (VegetableSprite)Resources.Load("Prefabs/VegetableSprite", typeof(VegetableSprite)); //インスタンスを生成 _vegetableSprite = Instantiate(prefab) as VegetableSprite; //高さを算出 _vegetableSprite.transform.position = CalcHeight(); _vegetableSprite.Rigidbody2d.gravityScale = 0; _vegetableSprite.SetImage(); //画像を読み込んでから、当たり判定を追加 _vegetableSprite.gameObject.AddComponent(); } -略- Vector3 CalcHeight(){ //現在の最大の高さを算出 if (_maxHeight > -3){ return new Vector3(0, _maxHeight + 3, 0); } return Vector3.zero; } -略-
ここで、3という数字を出しておりますが、これは野菜が最初に生成される場所から、野菜が乗る下のテーブルまでの距離になります。
野菜の状態によって、高さの値やカメラの座標を変更する
ここまでで準備は出来ましたが、実際の値のセットはVegetableSprteクラスで行います。
VegetableSprte.cs
-略- void Update(){ if (_state != State.destroy) { if (_rigidbody2d != null && _state == State.move) { if (_rigidbody2d.IsSleeping()) { _state = State.stop; GameManager.Instance.MaxHeight = gameObject.transform.localPosition.y; //カメラの移動 if (gameObject.transform.localPosition.y > 1) { Camera.main.transform.localPosition = new Vector3(0, gameObject.transform.localPosition.y, -10); } GameManager.Instance.CreateVegetable(); } } if (!GetComponent().isVisible && _state == State.move) { _state = State.destroy; GameManager.Instance.CreateVegetable(); GameManager.Instance.MaxHeight = -3; } } } -略-
ポイントは、座標の値をlocalPositionで統一することです。
カメラの移動のしきい値が1になっていますが、y座標が1を越えると、野菜の位置が上にズレるため、1にしています。
このあたりの数値は設定変更出来るよう、後ほど定数化します。
これで、どんどん上に積むことが出来るようになりました。
回転ボタンが隠れてしまっているので、こちら修正の必要がありますね。。
コメント