Unityで何かを作ってみる その7

Unity

野菜の積み上げ位置によって生成場所を変える

その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にしています。
このあたりの数値は設定変更出来るよう、後ほど定数化します。

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

Unity
スポンサーリンク
northprintをフォローする
おおよそ北の方向から

コメント