野菜の積み上げ位置によって生成場所を変える
その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にしています。
このあたりの数値は設定変更出来るよう、後ほど定数化します。

これで、どんどん上に積むことが出来るようになりました。
回転ボタンが隠れてしまっているので、こちら修正の必要がありますね。。

コメント