아래 코드로 calculatePrefab 활성화 하면
calculatePrefab 오브젝트 컴포넌트가 모두 비활성화로 되는데
뭐가 문제일까여?ㅠㅠ
계속 몇시간째 해보는데 안대네영ㅠㅠ
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
public class DragUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private RectTransform rectTransform;
private GameObject dragObject; // 드래그 중인 복사본 오브젝트
private RectTransform dragObjectRectTransform;
private BoxCollider2D dragObjectCollider; // 콜라이더 참조 추가
private bool isPlaced = false; // 복사본이 최종적으로 위치에 고정되었는지 여부
public GameObject calculatePrefab; // 새로운 프리팹 참조
void Awake()
{
rectTransform = GetComponent<RectTransform>();
}
public void OnBeginDrag(PointerEventData eventData)
{
if (gameObject.tag == "calculate" && !isPlaced)
{
Debug.Log("Drag started with 'calculate'");
// 프리팹을 사용하여 새로운 오브젝트 생성
dragObject = Instantiate(calculatePrefab, transform.parent);
Debug.Log("Instantiated new object: " + dragObject.name);
// 루트 오브젝트를 강제로 활성화
dragObject.SetActive(true);
dragObjectRectTransform = dragObject.GetComponent<RectTransform>();
dragObjectRectTransform.anchoredPosition = rectTransform.anchoredPosition;
dragObjectRectTransform.sizeDelta = rectTransform.sizeDelta;
dragObjectRectTransform.localScale = rectTransform.localScale;
dragObjectCollider = dragObject.GetComponent<BoxCollider2D>();
if (dragObjectCollider != null)
{
Debug.Log("Before enabling, Collider enabled: " + dragObjectCollider.enabled);
StartCoroutine(EnableComponentsAfterDelay(dragObject));
}
else
{
Debug.LogError("No BoxCollider2D component found!");
}
dragObjectRectTransform.position = eventData.pointerPressRaycast.worldPosition;
ObjectManager.Instance.ActivateCalculateObjects(); // 필요한 오브젝트 활성화
}
}
private IEnumerator EnableComponentsAfterDelay(GameObject obj)
{
yield return new WaitForEndOfFrame(); // 프레임 끝날 때까지 대기하여 오브젝트가 완전히 초기화되도록 함
// 모든 컴포넌트를 활성화
foreach (var component in obj.GetComponents<Component>())
{
if (component is Behaviour behaviourComponent)
{
behaviourComponent.enabled = true;
Debug.Log("Enabled component: " + behaviourComponent.GetType().Name);
}
else if (component is Collider2D colliderComponent)
{
colliderComponent.enabled = true;
Debug.Log("Enabled component: " + colliderComponent.GetType().Name);
}
else if (component is Renderer rendererComponent)
{
rendererComponent.enabled = true;
Debug.Log("Enabled component: " + rendererComponent.GetType().Name);
}
// 추가적으로 필요한 컴포넌트에 대한 활성화 코드를 추가할 수 있습니다.
}
Debug.Log("Components enabled.");
}
public void OnDrag(PointerEventData eventData)
{
if (dragObject != null && !isPlaced) // 고정되지 않은 경우에만 드래그 업데이트
{
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(dragObjectRectTransform, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
dragObjectRectTransform.position = globalMousePos;
}
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (dragObject != null && !isPlaced)
{
Collider2D hit = Physics2D.OverlapPoint(dragObjectRectTransform.position);
if (hit != null && hit.gameObject.CompareTag("on_calculate"))
{
// 복사본 위치를 'on_calculate' 오브젝트 위치에 고정
dragObjectRectTransform.position = hit.transform.position;
isPlaced = true; // 복사본 고정
Debug.Log("Snapped to 'on_calculate' object at " + hit.transform.position);
}
else
{
// 복사본이 적절한 위치에 있지 않으면 파괴
Destroy(dragObject);
Debug.Log("Drag object destroyed");
}
}
}
}
EnableComponentsAfterDelay에서 활성화하려는 컴포넌트 말고 나머지는 건너뛰게 해봐 else{Debug.Log("Skip component: " + + component.GetType().Name);}