마우스 커서

CJB_ny·2021년 12월 6일
0

Mini_MMO_RPG

목록 보기
4/16
post-thumbnail

1.마우스 커서 에셋 다운

이번시간에는 마우스를 클릭을 했을 때 일어나는 규칙들을 확립을 할것이다.

예를들면 땅을 클릭을 한 상태에서 몬스터를 클릭을 하더라도 계속 땅에 락인이 되고 몬스터를 한번 클릭한 상태로 드래그 해도 몬스터한테 락인이 되는 그런 형식으로 만들어보자(리니지1, 디아블로3) 같은 형식

그래서 일단 마우스 커서가 몬스터한테 갈때랑 땅을 클릭을 할 때랑 알아보기 힘드니까 커서작업부터 해보도록 하자.


사용할 녀석은 이녀석이다.


import해주고 들어가보면 이렇게 나온다.

그래서 자기가 원하는 커서 아이콘

이렇게 따로 빼놔서 준비를 하자(Cursor 256 x 256 에서 빼왔다)

그래서 이것을 Resource에다가 옮겨야 되는에 커서는 어떤 객체에 종속적인 아이는 아니니까

Textures 폴더 만들고 이안에다가 옮겨주자 그리고 뭐 나중에 갯수가 많아지면 여기에 서브 폴더를 만들어서 작업을 이어가면 될 것이다.

그리고 아까 Cursors폴더 전체 없애주도록 하자.


그리고 이왕 하는김에 Cursor폴더 만들어서 아까 3개 안에 넣어서 관리를 해주도록하자.

그리고 이제 커서를 사용을 하려면 아까 3개의 텍스쳐의 타입을 바꿔줘야한다.

  • 커서를 사용하는 방법은 크게 두가지가 있다.

    오른쪽위에 Sprite(2D and UI)라고 해가지고 UI로 관리를 해서 실시간으로 게임화면 위에 띄워주는 방법이 있고

아니면 아싸리 Texture Type을

Sprite밑에 Cursor라는 애로 바꿔서 사용하는 방법이 있는데

우리는 Cursor로 텍스쳐 타입을 변경해서 사용하도록하자.
왜냐하면 그냥 훨씬 더 간단하기 때문이다.

커서로 바꾸고 Apply해준다.

만약 커서의 종류가 막 여러가지가 아니라 그냥 하나라면

File -> BuildSetting -> 가보면 밑에 PlayerSetting이라는 것이 있는데

여기에 Default Cursor라고 커서를 선택하는 란이 있다.
그래서 뭐
여기 3가지중 드래그 드롭해서 사용하는 것이 가장 간단하기는 하다.

근데 우리는 지금 땅이냐 몬스터냐에 따라서 커서가 바뀔테니까 우리는 그렇게 하지는 않는다.
그래서 우리는 타겟팅 되는 애에 따라서 커서가 왓다갔다 바뀔테니까 이것을 우는 코드로 관리를 하도록하자.

우리가 클릭을 하는 부분은 PlayerController에서 막 다뤘었으니까 여기서 고쳐보면 될거같다라는 생각이 든다.

2. 마우스커서 코드 작성하기

![](https://velog.velcdn.com/images%2Fstarkshn%2Fpost%2Fa0e65b33-ff01-453c-a5cb-fb9fcc97f499%2Fimage.png) 그래서 OnMouseClicked가 우리가 레이캐스팅을 관리를 하던 부분인데..고민이 되는게 커서관리코드를 이부분에다가 넣는 것이 맞을 지 의문이 든다...(내 생각에는 CursorManager를 따로파야 할 거같다)

OnMouseClicked은 결국 InputManager에서 받아와서 사용을 하고 있었다.

여기서 이렇게 event를 받아가지고 사용을 하고있었다.


위의 사진에서 우리가 지금 MouseAction != null 일때
GetMouseButton(0)일때 ==
누르는 순간에 발생하는 event == MouseAction.Invoke(Define.MouseEvent.Press);
이것이랑
마우스를 누르고 손가락을 땠을때(클릭할 때) == MouseAction.Invoke(Define.MouseEvent.Click); 눌럿다가 땟을 때 이런 MouseEvent.Click이라는 event를
이렇게 굉장히 간단하게 만들어 주었었다.

그런데 지금 이부분은 우리가 만들 게임에 따라서 계속 조절을 해주어야 하기는 하는데

여기서 살짝 문제가 되는 부분이 무엇이냐고 하면은
딱히 뭔가를 누르지 않더라도
이런부분에서 마우스를 그냥 왓다갔다만 거려도 커서가 바뀔 수도 있다(그런데 이게 더 좋은거 아닌가...?) + (먼말인가??)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
지금 InputManager에서 if(MouseAction != null)이 if문에서 클릭을 하자마자 event를 받는 부분과 클릭했을때 event를 받는데

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이녀석은 별도의 Update문안에서 관리를 하는 것이 맞다고 생각이 든다 => (왜 그렇게 처리를 해야하는지 이해가 안간다...)


일단 이런 함수를 하나 판다음에 마우스 관리는 여기서 하도록 하겠다.

기본적인 방식은
이녀석이랑 굉장히 비슷할 것이다.

그래서 이 함수안에서 몬스터 위에 마우스를 올려놨냐 아니면 땅위에다가 올려놨냐에 따라가지고 마우스 커서가 변경이 될 것이다.


그래서 OnClickedMouse함수 안에 있는 것을 복붙을 해주자.


그리고 Collider가 몬스터이냐 그라운드이냐에 따라서 Update를 해줄 것이니까 if 문안에 없애주고 _destPos, _state부분도 없애주자
왜냐하면 Update하면서 그냥 몬스터인지 Ground인지 구분만 해주는 것이니까.


그래서 이상태에서 이제 마우스 커서가 어떻게든 바뀌게 작업을 해주면 될 것이다.

그리고 아까 마우스커서 이미지는 Texture2D로 불러오면 되는데

이렇게 ()안에는 path를 넣어주어서 Resource.Load<>로 가져오도록 하자.

그리고 이제 cursor를 셋팅하는 함수는
여기다가 Cursor.SetCursor()안에다가 인자를 넣어주면 될 것이다.

첫번째 인자는 보자마자 뭘 넣어야 할 지 알거같은데 두번째 인자부터는 뭔지 모르겠으니까 Vector2.zero, CursorMode !

이렇게 일단 넣어주도록 하자.

그래서 이제 Cursor.SetCursor()의 두번째 인자와 세번째 인자의 기능을 설명을 하자면은

두번째 인자의 경우는
지금 이미지에서 커서의 끝점이 지금 Attack의 경우 검의 끝 부분에 와야지 정상적으로 작동을 할 것이다.
Vector2.zero -> (0, 0)하게되면 Attack cursor이미지의 왼쪽 제일 위에(0, 0)을 나타내게 되는데...

그려면 이제 살짝 문제가 있을 것이다.
마우스는 제대로 가르키고 있는데 커서아이콘 모양은 조금 왼쪽에?가있는 그런 문제가 있을 것이다.
그래서 이미지를 보면 Y표는 크게 상관이 없을거같은데(Attack, Hand), X좌표를 오른쪽으로 좀 밀어 줘야 할거같다.

그래서 이 작업을 해보도록 하자.

그래서 new Vector2의 tex의 width의 5등분 한거만큼의 x좌표랑 y좌표는 그대로 해주고 Ground일때는 3등분 한거만큼의 x좌표를 가지도록 하자.
이거는 그냥 눈때중으로 커서이미지의 끝이 x좌표 어디정도쯤 가르킬지 보고 나눈 값을 넣은 것이다.

그리고 마지막인자 세번째 인자는 아까 CursorMode.Auto넣은 부분은 뭐하는 것이냐 하면은
Auto로 하면은 하드웨어에 따라서 조금 최적화를 해주고 두번째 인자인ForcesoftWare를 해주게 되면은 얘가 무조건 소프트웨어 적으로 그리는 작업을 해주게 된다.

우리는 일단 뭔지 모르겠으면 그냥 Auto로 맞춰 주면은 된다.
Device에 따라서 Cursor Api가 따로 뽑혀 있는 경우가 있는데 그것을 이제 활용을 할지 않할지 설정을 하는 그런 옵션이라고 보면된다.

그리고 생각을 해보니까

Texture2D tex = Managers.Resource.Load("Textures/Cursor/Attaack");
이 Load하는 부분은 Update를 할때마다 매번 Managers에서 Load할 필요 없으니까 Start()에서 한번만 Load를 해서 계속 사용을 할 수 있도록 만들어 주도록하자


그래서 이렇게 Start안에 넣우주고 위에 따로 뺴놔서 _attackIcon으로 이름을 바꿔주도록하자.

Hand도 있으니까 복붙해서 같이 작업을 해주자.


그리고 이렇게 수정을 해주고 UPdate문 안에 넣어주자


여기 위에다가
지금 _state는 그냥 죽었는지 살았는지 움직이는지 더 추가 할 것이 있으면 나중에 수정을 해주도록 하자.
그래서 죽었으면 Updatemousecursor에서 예외 상황으로 나중에 죽었을때 마우스 커서가 어떻게 안되도록 수정을 해주면 될 것이다.

현재는 커서가 안보이는데 잘 실행된다.

3. 깜빡 거림 에러 해결

그런데 커서가 가끔이나 자주 깜빡깜빡 거릴수도 있는데 이것은 너무 빈번하게 바꿔치기 할 때 이러한 현상이 일어난다. (나는 안일어 나는데 그래픽카드가 좋아서 다 처리를 하는거 같다..?) CursorSetting을 계속 하니까 밀리면서 깜빡거리는 현상이 발생하는거 같다.

그래서 여기 SetCursor를 매 프레임마다 하는것이 아니라
Layer에 따라서 진짜 바뀔 때 만
Cursor.SetCursor(_attackIcon, new Vector2(_attackIcon.width / 5, 0) , CursorMode.Auto);
이녀석이 실행되도록 바꿔 주도록 하자.

그래서 PlayerController위로가서 enum하나 파주도록 하자.


이렇게 enum만들어주고 _cursorType = None으로 일단 선언을 해주도록 하자.

그래서 다시 내려간다음에


여기에서 우리가 추가를 해주면 될 것이다.

이렇게 if문을 하나 더 파가지고 Attack이 아닐때 SetCursor로 _cursorType = CursorType.Attack으로 변경해주자.

그러면은 이제 대부분의 경우
if(_cursorType != CursorType.Attack) 이녀석이 한번 셋팅이 되있을 경우

이부분을 굳이 다시 실행을 안하니.

Hand도 똑같이 해주자.

왜 != 로 _cursorType을 설정했냐면은
만약 _mask가 몬스터가 아닐경우 else문으로 들어와서 SetCursor해서 _handIcon으로 커서 변경되었는데
만약 몬스터를 계속 Ray를 안찍는다면
SetCursor계속 안해도되서 매 프레임마다 SetCursor안하게되어서 -> 부화 적어진다 -> 아까처럼 깜빡 거리는 현상 없어진다.
굿!

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글