2017-07-07 6 views
1

私は、Spawnerオブジェクトを翻訳するx軸からブロックをインスタンス化する、Unityでの2Dブロックスタッキングゲームを作成しています。私が直面している問題は、スタックが高すぎてスポーナに近づいたときです。スポンサーとゲームカメラをY軸上に移動する必要があります。プレハブのスタックを測定して、Boundsを使用して高さを取得しています私はいつカメラとスポーナーを動かすかを知っています。私が直面している問題は、GetMaxBounds関数を呼び出し、parentBounds変数に追加していない追加ポイントをカプセル化するときです。私のparentBounds.max.yは決して増加しません。私はプログラミングとC#の初心者です。前もって感謝します。Unity3D - オブジェクトのスタックの高さを測定する方法は?

Game view

if (Input.GetMouseButtonDown(0)) { 
     Instantiate (fallingBrick, spawnPosObj.transform.position, Quaternion.identity, parentStack.transform); 
     var parentBounds = GetMaxBounds (parentStack); 
     Debug.Log (parentBounds.max.y); 
    } 

} 

Bounds GetMaxBounds(GameObject g) { 
    var b = new Bounds(g.transform.position, Vector3.zero); 
    foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) { 
     b.Encapsulate(r.bounds); 
    } 
    return b; 
} 
+4

スタック内の個々のオブジェクトの高さを追加するだけです。 –

+0

ありがとうございます。問題は、それらが常に均等にスタックするとは限らないことです。ときどき転倒し、回転し、異なる高さで終わる。 – Lewie

+0

ブロックがタワーに積み重なっているかどうかチェックしていますか?そうであれば、うまく積み重ねられ、単一のブロックの高さで乗算されるすべてのオブジェクトを通過できます。 –

答えて

3

スタック内のオブジェクトが画面上に存在しており、それをアイテムがあなたのスタックに追加されるたびにインクリメントどのように多く格納するカウンタを保管してください。次に、1つのアイテムのサイズを保存したことを考慮して、スタックにあるアイテムの数でサイズを掛けなければなりません。このサイズをシーンの現在の垂直サイズと比較し、スタックが画面の垂直サイズの80%に達するとカメラを移動します。

これを行うときは、おそらくカメラを上に移動し、スタックの下位レベルにあるほとんどのアイテムが非表示になるため、項目数をリセットすることを忘れないでください。たとえば、カメラを動かすときに3つの立方体しか表示されないようにするには、スタック内のアイテム数を3に戻します。

同じようにスタックしないオブジェクトが含まれているように見えるので、 Boundsを使用することです。スタック内のすべてのアイテムのリストを保持していると仮定して、スタックを表す親オブジェクトに追加される各オブジェクトの境界を評価し、各子境界をカプセル化して垂直サイズを評価することができます。

Bounds GetMaxBounds(GameObject stack) { 
    var b = new Bounds(stack.transform.position, Vector3.zero); 
    foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) { 
    b.Encapsulate(r.bounds); 
    } 
    return b; 
} 

そして、あなたはその後min yの値に評価さBoundsオブジェクトのmax y値をsubstractingことにより、垂直方向の大きさを評価することができます:あなたはthis answerの例を見つけることができます。だからあなたのようなものかもしれない:あなたのカメラを移動している場合は、再度

float GetVerticalSize(GameObject stack) { 
    var b = new Bounds(stack.transform.position, Vector3.zero); 
    foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) { 
    b.Encapsulate(r.bounds); 
    } 

    float size = b.max.y - b.min.y; 
    return size; 
} 

を、唯一実際に画面に表示される項目で、このソリューションを使用してください。

+0

ありがとうございます。問題はスタックの増分が必ずしも高さが1ブロックではないことです。ときには転倒して回転するため、下のプラットフォームで混乱します。この場合、測定する方法はありますか?私はプラットフォームを縮小し、ブロックを垂直方向に1つずつ積み重ねてこの方法を使用できるようにしました。 – Lewie

+0

すべてのブロックを正常に積み重ねた状態で保管している場合は、1つのブロックのサイズと、落ちなかった積み重ねられたブロックのサイズを複数倍にできるはずです。 –

+0

@ルーイ私はあなたの場合に別の解決策を提案しました。 – Isuka

関連する問題