카테고리 없음
클릭으로 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 폴더의 위치와 사용법
- 프로젝트 Assets 폴더 내부에 Resources 폴더를 생성
- Assets/Resources/
- 그 안에 필요한 파일을 넣기
- 예: Assets/Resources/MonsterPrefab.prefab
- 스크립트에서 Resources.Load<T>()로 불러오기
GameObject monster = Resources.Load<GameObject>("MonsterPrefab");
Instantiate(monster, Vector3.zero, Quaternion.identity);
에셋의 이름과 위치를 정확하게 입력 필수