UI가 아닌 오브젝트를 클릭해서 이동하는 것을 구현 하고 싶었다.
public class TestInputController : MonoBehaviour
{
[SerializeField] private LayerMask cardLayerMask;
private GameObject cardObject = null;
private bool isCardSelect = false;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
//화면 좌표계에 있기에 월드 좌표로 변환
Vector2 worldPos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero, 0f, cardLayerMask);
if (!isCardSelect && hit.collider != null)
{
Debug.Log(hit.transform.name);
cardObject = hit.collider.gameObject;
isCardSelect = true;
}
else if (isCardSelect)
{
cardObject = null;
isCardSelect = false;
}
}
if (cardObject != null)
{
Vector3 pos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
pos.z = 0;
cardObject.transform.position = pos;
}
}
}
현재 Update() 문으로 구현을 해서 최적화에 좋지 않을것이다.
1.마우스 클릭 Class를 생성후, event를 등록시켜서 필요할때만 호출 시키는 형식으로 리팩토링이 필요하다.
2.InputSystem을 활용하여 event로 연동 시킨다.
이 두가지 방법 중 하나를 택해서 진행하게 될것같다.
Card Class 안에 IPointerHandler를 상속시켜 쉽게 진행 할 수도 있었겠지만,
Card에는 카드가 게임에서 사용되는 효과,연출이 담겨 있어야 되고
Card를 조작하는 것은 InputController에서 담당을 해야 SRP(단일 책임 원칙)을 지킬 수 있을것 같아
이렇게 구현 하였다.
if (Input.GetMouseButtonDown(0))
{
//화면 좌표계에 있기에 월드 좌표로 변환
Vector2 worldPos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero, 0f, cardLayerMask);
이부분은 InputManager 와 InputSystem 둘다 사용 중이기에 하나를 택해서 바꿔서 진행해야 된다.
'내일배움캠프_Unity_6기 > TIL(Today I Learend)' 카테고리의 다른 글
TIL : 2025-03-12(수) :: Raycast 활용 및 마우스 클릭으로 해당 오브젝트 설치 (0) | 2025.03.13 |
---|---|
TIL : 2025-03-11(화) :: Unity 셰이더 그래프 + 근황 (0) | 2025.03.11 |
TIL : 2025-01-24(금) :: 슬라임타워디펜스 프로젝트의 누락된 트러블슈팅 기록( 타워 이동시 기존에 있던 타일 데이터가 초기화 되지 않는 이슈 ) (0) | 2025.01.24 |
TIL : 2025-01-23(목) :: 구글 스프레드 시트 유니티랑 연동하기 (API 미 사용) (0) | 2025.01.24 |
TIL : 2024-12-27(금) :: 모의면접준비 (0) | 2024.12.27 |