카테고리 없음

클릭으로 UI공격, 파티클, Resources(특수파일)

rxo2 2025. 3. 28. 20:56

Tag와 Raycast로 오브젝트중 몬스터 UI만 공격할수 있게 구현한 코드

private GameObject GetClickMonsterUI(Vector2 screenPosition)
{
    EventSystem eventSystem = EventSystem.current ?? FindObjectOfType<EventSystem>();
    if (eventSystem == null) return null; // EventSystem이 없으면 null 반환
    // EventSystem을 찾고, 없으면 null을 반환

    PointerEventData eventData = new PointerEventData(eventSystem)
    {
    // PointerEventData 인스턴스를 생성하면서 화면 위치 설정
        position = screenPosition // 클릭된 화면 위치를 설정
    };

    List<RaycastResult> results = new List<RaycastResult>();
    // 레이캐스트 결과를 저장할 리스트

    GraphicRaycaster uiRaycaster = FindObjectOfType<GraphicRaycaster>();
    // 씬에서 GraphicRaycaster 컴포넌트를 찾음 (UI 레이캐스트 용도)

    if (uiRaycaster == null) return null;
    // 만약 GraphicRaycaster가 없다면, null을 반환 (UI가 없다는 의미)

    uiRaycaster.Raycast(eventData, results);
    // 레이캐스트를 실행하여 결과를 results 리스트에 저장

    foreach (var result in results)
    // 레이캐스트 결과를 반복하면서 "Monster" 태그가 붙은 GameObject를 찾음
    {
        if (result.gameObject.CompareTag("Monster"))
        {
            return result.gameObject;
        }
    }
    return null;
}

 

 

 

아래의 사진은 동기와 비동기식의 간단한 예시인데 간단하게 말해서

동기식은 코드를 하나하나 읽어가면서 오류가 발생하면 그 즉시 멈추고 다음코드를 읽지 않지만

비동기식은 다른공간에서 또다른 코드작업을 하고 있어서 동기식의 영향을 크게 받지않는다]

하지만 비동기식은 역시나 많은 메모리를 소모한다 적재적소에 사용필요

 

 

파티클 구현시 Order in Layer 값과 UI순서 세팅을 하였음에도 파티클이 UI 이미지 뒤에서 나타난다

해결방안 : Canvas 컴포넌트에 Render Mode 가 기본값인  Screen Space - Overlay 일때

이것을 Screen Space - Camera 로 설정한 후 Render Camera 에 MainCamera를 넣어주면 

UI 보다 앞에 파티클이 작동하는것을 볼 수 있다

Screen Space - Overlay (기본값)

  • UI가 가장 먼저 렌더링됨 (항상 화면 위쪽에 표시됨)
  • 월드 좌표를 무시하고, 항상 화면을 덮는 방식으로 그려짐
  • 카메라와 관계없이 UI가 최상위 레이어로 렌더링됨
  • 다른 3D 오브젝트(파티클 포함)가 UI 뒤에 가려질 가능성이 높음

Screen Space - Camera (설정 후)

  • UI가 카메라에 종속되면서 3D 공간에서 렌더링됨
  • UI의 깊이(Depth)가 카메라의 Sorting Layer 및 Order in Layer 영향을 받음
  • 파티클과 UI의 렌더링 순서를 조정할 수 있음

 

 

Resources 폴더는 런타임 중에 동적으로 에셋을 로드할 수 있도록 Unity에서 제공하는 특수 폴더입니다

파일명을 철자하나 틀림없이 Resources 로 입력 필수

 

Resources 폴더의 위치와 사용법

  1. 프로젝트 Assets 폴더 내부에 Resources 폴더를 생성
    • Assets/Resources/
  2. 그 안에 필요한 파일을 넣기
    • 예: Assets/Resources/MonsterPrefab.prefab
  3. 스크립트에서 Resources.Load<T>()로 불러오기
GameObject monster = Resources.Load<GameObject>("MonsterPrefab");
Instantiate(monster, Vector3.zero, Quaternion.identity);

에셋의 이름과 위치를 정확하게 입력 필수