2016-09-10 2 views
0

드래그를 사용하여 퍼즐을 만들고 있습니다 &가 단결합니다. 퍼즐 조각은 테트리스 조각과 같으며, 각 퍼즐 조각은 큐브 그룹으로 구성됩니다. 퍼즐 조각을 끌어서 구조물의 누락 된 큐브 (예를 들어, 직사각형)의 슬롯에 떨어 뜨려야한다. Unity, C#. 런타임에 부모의 모든 자녀를 얻는 방법?

Screenshot of the game

위의 스크린 샷

내가 3 자녀/큐브가 "블록 1"라는 큐브의 그룹 관계를 가지고있다, 그것은 또한 게임 큐브가 감소 될 필요가있어서, 슬롯이 있음을 보여줍니다. "block1"을 드래그하고 슬롯에 떨어 뜨렸을 때 슬롯에 3 개의 큐브가 있다는 것을 알면서 슬롯 하나를 차지합니다. 내가 원하는 것은 각각의 큐브가 각 슬롯 (3 슬롯)을 차지하기를 원하는 슬롯에 "block1"(3 개의 3 개의 큐브가 있음)을 떨어 뜨렸을 때입니다. 그래서 내가해야 할 일은 슬롯 1에 놓은 블록 1의 아이들 만 얻는 것입니다. 드래그 할 때 그룹을 드래그하지만 드롭 할 때 모든 큐브가 슬롯을 채울 수 있도록 자식 만 가져옵니다. 제 질문은 블록 1의 모든 아이들을 떨어 뜨리는 방법입니다. 내 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

당신은 colliders를 추가 할 수있어 슬롯에, 그리고 충돌 리스너에, 제자리에 완전히 있는지 확인하고 다음과 같이 부모 변경 :

transform.parent = [Parent Slot GameObject or Transform] 

당신은 당신의 길을 갈거야 경우지만, 여전히이를 잡으러을 아니에요을 이 종류의 게임에서 전문가, 그래서 ... 하지만 주 코드는 여전히 남아 있습니다. 위의 한 줄 코드로 부모를 변경하십시오. 당신이 전혀 부모이없는 것으로 큐브를 원하는 경우

, 당신은 말할 수 :

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'로 변경하십시오. –

관련 문제