2016-09-10 25 views
0

私はドラッグで&を使ってパズルを作っています。パズルピースはテトリスピースのようなもので、各パズルピースはキューブのグループで構成されています。パズルピースをドラッグして、構造の欠けているキューブのスロット(例えば、長方形)に落とす必要がある。Unity、C#。実行時に親のすべての子供を得る方法?

Screenshot of the game

上のスクリーンショットは、私は3人の子供/キューブを持っている「ブロック1」という名前のキューブのグループを持っていることを示し、それはまた、ゲームキューブをドロップする必要が前記スロットを持っていることを示しています。 「block1」をドラッグしてスロットにドロップすると、3つのキューブがあることを認識して1つのスロットだけを占有します。私が望むのは、3つの3つの立方体を持つ「ブロック1」を、各キューブが各スロット(3つのスロット)を占めるようにするスロットにドロップしたときです。それで、私がする必要があると思うのは、私がスロットに落としたときにblock1の子供だけを得ることです。私はそれをドラッグするときに私はグループをドラッグしますが、私が落としたときに子供たちはすべてのキューブがスロットを埋めるようになるでしょう。私の質問は、block1のすべての子供を落とす方法です。私のslothandler sciptでは全体のブロック/ピースを取得します。前もって感謝します!

ここSlotHandlerスクリプト

using UnityEngine; 
 
using System.Collections; 
 
using UnityEngine.EventSystems; 
 
using UnityEngine.UI; 
 

 
public class SlotHandler : MonoBehaviour, IDropHandler{ \t 
 
\t 
 

 
\t public GameObject item { 
 
\t \t get { 
 
\t \t \t if(transform.childCount>0){ 
 
\t \t \t \t return transform.GetChild (0).gameObject; 
 
\t \t \t } 
 
\t \t \t return null; 
 
\t \t } 
 
\t } 
 

 
\t #region IDropHandler implementation 
 
\t public void OnDrop (PointerEventData eventData) 
 
\t { 
 
\t \t if(!item){ 
 
\t \t \t DragHandler.piece.transform.SetParent (transform); 
 
\t \t } 
 
\t } 
 
\t #endregion 
 
} 
 

 

とDragHandlerスクリプト

using UnityEngine; 
 
using System.Collections; 
 
using UnityEngine.EventSystems; 
 

 
public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler{ 
 

 
\t public static GameObject piece; 
 
\t Vector3 startPosition; 
 
\t Transform startParent; 
 

 

 
\t #region IBeginDragHandler implementation 
 

 
\t public void OnBeginDrag (PointerEventData eventData) 
 
\t { 
 
\t \t 
 
\t \t piece = gameObject; 
 
\t \t startPosition = transform.position; 
 
\t \t startParent = transform.parent; 
 
\t \t GetComponent<CanvasGroup>().blocksRaycasts = false; 
 

 
\t } 
 

 
\t #region IDragHandler implementation 
 

 
\t public void OnDrag (PointerEventData eventData) 
 
\t { 
 
\t \t transform.position = eventData.position; 
 

 
\t } 
 

 
\t #endregion 
 

 
\t #region IEndDragHandler implementation 
 

 
\t public void OnEndDrag (PointerEventData eventData) 
 
\t { 
 
\t \t piece = null; 
 
\t \t GetComponent<CanvasGroup>().blocksRaycasts = false; 
 
\t \t if(transform.parent == startParent){ 
 
\t \t \t transform.position = startPosition; 
 
\t \t \t GetComponent<CanvasGroup>().blocksRaycasts = true; 
 
\t \t } 
 
\t } 
 

 
\t #endregion 
 

 

 

 
}

答えて

0

あなたはコライダーを追加することができますスロットに、衝突リスナーでは、それが所定の位置に完全だかどうかを確認してから、このような親の変更:

transform.parent = [Parent Slot GameObject or Transform] 

をしかし、あなたはあなたの道を行くつもりであれば、まだそれはok.I'mではありませんこの種のゲームではエキスパートなので、 でもメインコードはそのままです。上記の1行のコードで親を変更してください。

キューブがまったく親を持たないようにしたい場合は、あなたが言うことができます。

transform.parent = null; 

か、私はあなたのスクリーンショット(ブロック、パネルまたはで言うように、あなたは、これらのすべての親オブジェクトを持っている場合をキャンバス)、あなたはそれをパブリックオブジェクトとしてスクリプトに追加し、それを親にすることができます。

public GameObject parent; 

... 

// when you wanna ungroup the objects 
transform.parent = parent; 
+0

申し訳ありませんが、私は「transform.parent =親」を行う際には、暗黙のうちに。私はそれを解決するにはどうすればよい?私はしたい 『UnityEngine.GameTransform』にタイプ 『UnityEngine.GameObject』を変換できません」というエラーがありますブロックをグループ解除するには – Critics

+0

transform.parent = parent.transform –

+0

あなたはパブリック変数としてトランスフォームを取得できますpublic varを 'public Transform parent' –

関連する問題