유니티 씬 내에서 RayCast를 이용한 상호작용 기능이 있을때, UI 버튼을 누르면 그 아래에도 Ray가 적용되어 의도하지 않은 결과가 나타난 문제가 발생하였습니다. 이것을 검색해보니 적절한 자료가 있었습니다.
Block raycast through the UI
public Camera cam; public NavMeshAgent agent; // Update is called once per frame public void MoveToLocation() { Ray ray =...
forum.unity.com
UI를 뚫고 레이캐스트가 진행되는 같은 문제로 질문이 있었는데, 해당 답변들 중 다음의 코드를 레이캐스트 함수에 넣으라고 있었네요.
if(EventSystem.current.IsPointerOverGameObject()) return;
현재 레이의 포인터가 EventSystem의 게임오브젝트라면 리턴을 시킵니다.
using UnityEngine.EventSystems;
위 함수를 사용하기 위해서는 EventSystems를 스크립트 내에 포함시켜야합니다.
void Update()
{
...
if (Input.GetMouseButton(0) && mClickReady) // 마우스가 클릭 되면
{
//클릭시 UI라면 리턴한다.
if(EventSystem.current.IsPointerOverGameObject()) return;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if(hit.transform.tag == "Water")
{
hit.transform.GetComponent<WaterRipple>().RunRipple(hit.point);
mWaterParticlePool.GetFromPool().transform.position = hit.point;
mClickReady = false;
}
}
...
}
}
|
cs |
제 스크립트에 적용한 예시입니다. Input이 있어 레이를 쏠때, 그 전에 검사를 해주어 UI에 닿았다면 리턴을 해줍니다.
추가로, 해당 스크립트를 추가하여 이용하기위해서는 버튼 오브젝트에 Graphics Raycaster을 추가해야합니다.
08/22 추가
> 버튼같은 UI는 UI뒤에 레이캐스트를 막도록 설정했지만, 텍스트 등 막을 필요가 없는 UI가 레이캐스트를 막는 문제를 발견하였다. 이것을 해결하기 위해서는 Canvas Group을 설정해주자.
텍스트 필드는 레이캐스트를 막지 않기때문에 Block Raycasts를 비활성화 시켜준다.
그렇게 하면 텍스트 필드 영역을 클릭해도 레이가 막히지 않아 의도한 마우스 클릭 이벤트가 나타난다.
'unity etc. > others' 카테고리의 다른 글
유니티 빌트인 기능 Spline / 2 - Spline Animate (0) | 2022.08.19 |
---|---|
유니티 빌트인 기능 Spline / 1 (0) | 2022.08.19 |
유니티 벡터 연산의 이해 (0) | 2022.08.10 |
유니티 WebGL 로드 화면 바꾸기 (0) | 2022.08.05 |
유니티 WebGL 빌드 용량 최적화를 위한 로그 확인 (0) | 2022.07.31 |