[사각형] 가상 로터 C# 코드 섹션(2) - 핵심 코드

클릭 위치의 상대 위치 가져오기


RectTransformUtility를 사용합니다.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos) 방법.
  • RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos)는 마우스 클릭 위치가 UI 캔버스 안에 있는지 판단하고 클릭한 위치로 돌아간다
  • rectTransform: 캔버스의 위치 속성
  • Input.mousePosition: 마우스 클릭의 화면 위치
  • canvas.worldCamera: 캔버스 카메라
  • out pos:pos는 마우스 클릭 위치를 되돌려주고, out는 이 데이터를 출력(기본값은 bool 형식으로 되돌려주고, out 문장은 이 값을 추가로 되돌려준다)하는 것을 의미하며, 되돌려주는pos 위치는 이 UI 카메라 아래의 상대적인 위치이며, 실제 사용 과정에서 좌표계를 한 단계 더 변환해야 한다.
  •     #region          -Vector2 ReturnMouseDownPos()
        private Vector2 ReturnMouseDownPos() {
            Vector2 pos;
            if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos))
            //if      bool   ,               。
            {
                return pos;
            }
            else {
                return pos;
            }
    
        }
        #endregion

    획득한 클릭 위치를 통해 로터 중심의 거리를 계산한다


    마우스 점에서 중심점까지의 상대 위치


    pos는 canvas 기준 좌표계로, 이 코드는 좌표계를 Point 중심 기준 Vector2 relativePos = new Vector2 ((pos.x - this.transform.localPosition.x)로 변환합니다(pos.y - this.transform.localPosition.y).
  • 가상 로터의 중심점 위치도 canvas를 기준으로 하는 좌표계이기 때문에 상응하는 좌표를 줄여서 클릭 위치의 좌표를 가상 로터 중심점(0,0)점의 좌표로 전환시켜 거리를 계산하기 편리하다.

  • 마우스 클릭과 중심점의 거리를 계산하다


    float distance = Mathf.Sqrt((relativePos.x*relativePos.x) + (relativePos.y*relativePos.y)); 직각 삼각형의 변장 계산 공식인 Mathf를 사용합니다.Sqrt() 메서드는 루트를 나타냅니다.

    거리에 따라 다른 피드백을 취하다


    1. 거리가 30픽셀보다 작고 가상 로터 이동
    if (distance <= 30f)
    {
        //      ,        
        Narrow(ControlPanel);//        
        isFollowMouse = true;//      
    }

    2. 거리가 30픽셀보다 크고 방향을 바꾸는 것은 각각 x와 y의 양과 음의 번호를 판단하여 이동하는 방향을 확정하고 방향 속성을 수정한다.
                if (Mathf.Abs(relativePos.x) >= Mathf.Abs(relativePos.y))
                    {
                        if (relativePos.x >= 0)
                        {
                            heroDistance = HeroDistance.Right;
                            UpdateCountrolDirection();
                        }
                        else
                        {
                            heroDistance = HeroDistance.Left;
                            UpdateCountrolDirection();
                        }
                    }
                    else 
                    {
                        if (relativePos.y >= 0)
                        {
                            heroDistance = HeroDistance.Top;
                            UpdateCountrolDirection();
                        }
                        else 
                        {
                            heroDistance = HeroDistance.Bottom;
                            UpdateCountrolDirection();
                        }
                    }

    이동 방향에 따라 컨트롤의 표시와 운동 방향을 바꾸다


    대상 속성의 변화를 검측하고 실제 요구에 따라 상응하는 피드백을 한다.
     #region                   -UpdateCountrolDirection()
        private void UpdateCountrolDirection() {
            if (!isFollowMouse && GameControl._instance.gameState == GameControl.GameState.Playing) {
                if (heroDistance == HeroDistance.None)
                {
                    for (int i = 0; i < ControlDirection.Length; i++)
                    {
                        ControlDirection[i].SetActive(false);
                    }
                    GameControl._instance.direction = GameControl.Direction.None;
                }
                else if (heroDistance == HeroDistance.Top)
                {
                    //              ,     
                    if (GameControl._instance.direction != GameControl.Direction.Bottom) {
                        for (int i = 0; i < ControlDirection.Length; i++)
                        {
                            ControlDirection[i].SetActive(false);
                        }
                        ControlDirection[0].SetActive(true);
                        GameControl._instance.direction = GameControl.Direction.Top; 
                    }
                }
                else if (heroDistance == HeroDistance.Bottom)
                {
                    //              ,     
                    if (GameControl._instance.direction != GameControl.Direction.Top) {
                        for (int i = 0; i < ControlDirection.Length; i++)
                        {
                            ControlDirection[i].SetActive(false);
                        }
                        ControlDirection[1].SetActive(true);
                        GameControl._instance.direction = GameControl.Direction.Bottom;
                    }            
                }
                else if (heroDistance == HeroDistance.Left)
                {
                    //              ,     
                    if (GameControl._instance.direction != GameControl.Direction.Right) {
                        for (int i = 0; i < ControlDirection.Length; i++)
                        {
                            ControlDirection[i].SetActive(false);
                        }
                        ControlDirection[2].SetActive(true);
                        GameControl._instance.direction = GameControl.Direction.Left;
                    } 
                }
                else if (heroDistance == HeroDistance.Right)
                {
                    //              ,     
                    if (GameControl._instance.direction != GameControl.Direction.Left) {
                        for (int i = 0; i < ControlDirection.Length; i++)
                        {
                            ControlDirection[i].SetActive(false);
                        }
                        ControlDirection[3].SetActive(true);
                        GameControl._instance.direction = GameControl.Direction.Right;
                    } 
                }
            }
    
        }
        #endregion

    좋은 웹페이지 즐겨찾기