ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL_63(wayPoint Reverse, Vector3.Lerp)
    TIL 2023. 11. 2. 20:49

     

    23.11.02. 63차

     

    오늘은 어제에 이어 Stage Select씬의 기능을 마무리 했다.

     

    캐릭터가 waypoint를 따라 움직이는것에서 이제는 이전 스테이지를 갈때 되돌아가는것과, 캐릭터가 반대방향을 보며 가게 하는것, 캐릭터의 애니메이션을 추가했다.

     

    캐릭터가 waypoint를 지날때 waypoint의 rotation y의 값에 따라 보는 방향이 다른데, 이를 이용해 캐릭터가 다음 스테이지로 갈때의 waypoint들의 rotation값과 캐릭터가 이전스테이지로 갈때의 waypoint들의 rotation값을 각각 다르게 주어 처리했다.

     

    else if (Input.GetKeyDown(KeyCode.W))
            {
                isMove = true;
                isFront = true;

                if (curStage == 2)
                {
                    _4.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
                    _5.transform.rotation = Quaternion.Euler(new Vector3(0, 90, 0));
                    _6.transform.rotation = Quaternion.Euler(new Vector3(0, 90, 0));
                    _7.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));

                    TargetNextWayPoint();
                }

    위의 코드처럼 해결했는데,

    만일 w키를 누르게 되었을때 현재 스테이지가 2라면, waypoint들의 각각의 로테이션값들을 해당값으로 변경시켜주었다.

     

    캐릭터가 waypoint에서 다음 waypoint 이동할 때 회전이 필요했기때문에

     

    private void StartMove()
        {
            _elapsedTime += Time.deltaTime;

            float elapsedPercentage = _elapsedTime / _timeToWayPoint;
            elapsedPercentage = Mathf.SmoothStep(0, 1, elapsedPercentage);
            transform.position = Vector3.Lerp(_previousWayPoint.position, _targetWayPoint.position, elapsedPercentage);
            transform.rotation = Quaternion.Lerp(_previousWayPoint.rotation, _targetWayPoint.rotation, elapsedPercentage);
            if (elapsedPercentage >= 1)
            {
                if (curStage == 0)
                {
                    TargetNextWayPoint();
                }
                else if (curStage == 1 || curStage == 2)
                {
                    if (isFront == false)
                    {
                        TargetReverseWayPoint();
                    }
                    else if (isFront == true)
                    {
                        TargetNextWayPoint();
                    }
                }
                else if (curStage == 3)
                {
                    TargetReverseWayPoint();
                }
            }
        }

    위의 코드처럼 로직을 짜서 구현했었다.

     

    하지만 위의 코드에서 transform.rotation 부분때문에 waypoint사이를 이동할때 회전이 거리에 비례해 균등하게 이루어졌고, 이는 우리가 원하는 움직임이 아니었기 때문에 수정이 필요했다.

     

    그래서 곰곰히 생각하던중 회전의 시작을 늦추고, 회전의 속도를 빠르게 해준다면 수정할 수 있을것 같다는 생각이 들어서 코드를 분석해서 이해했고,

     

     transform.rotation = Quaternion.Lerp(_previousWayPoint.rotation, _targetWayPoint.rotation, elapsedPercentage);

    의 부분을

     transform.rotation = Quaternion.Lerp(_previousWayPoint.rotation, _targetWayPoint.rotation, elapsedPercentage * 4.5f - 3.5f);

    로 바꾸어주었다.

    단순하게 elapsedPercentage 값에 곱해주고 빼준것 뿐인데, 여기서 곱한 숫자는 캐릭터의 회전 속도를 나타내고, 빼낸 숫자는 몇초 뒤에 회전을 시작할지에 대한 부분을 나타낸다.

     

    이렇게 수정을 하고나니 한결 더 자연스러운 움직임을 보였다.

     

    하지만 그 전에 

    transform.position = Vector3.Lerp(_previousWayPoint.position, _targetWayPoint.position, elapsedPercentage);

    줄에서 Lerp를 사용해서 waypoint사이를 이동할때 속도가 일정한게 아닌 시작점과 끝나는 점에서 느려지며 멈추는 방식을 사용했는데, Stage와 Stage사이에 있는 waypoint에서 중간에 속도가 느려지는게 부자연스러워서 이를 해결하려고 MoveTowards를 사용도 해보았지만, 생각처럼 변경되진 않았다.

     

    하지만 이 부분은 다소 사소한 디테일적인 부분이라는 이야기를 팀원들과 나누었고, 이 부분은 나중에 디테일적인 부분을 잡을때 다시 수정해보기로 했다.

     

    캐릭터의 애니메이션은 애니메이터를 이용해서 캐릭터가 이동시의 애니메이션과 멈춰있을때의 애니메이션을 넣어놓고,

    코드에서 isMove를 bool값으로 판단해 애니메이션을 바꿔주었다.

     

    private void Update()
        {
            if (isMove == true)
            {
                animator.SetBool("isMove", true);
            }
            else if(isMove == false)
            {
                animator.SetBool("isMove", false);

                Move();
                SelectStage();
                OpenStageUI();
            }
        }

     

    이런식으로 animator.SetBool을 통해 bool 값을  true 와 false로 설정 해주어 관리했다.

    이전에는 애니메이션을 코드보단 InputSystem을 활용하여 사용했기때문에 코드로 관리한것은 처음이었는데 애니메이션이 두개뿐이었고, bool값도 하나만 있었기 때문에 수월하게 할 수 있었다.

     

    오늘 안에 stage select씬을 잘 마무리 할 수 있어서 좋았고 내일은 또 다른 부분을 얼른 완성시켜야겠다.

    'TIL' 카테고리의 다른 글

    TIL_65(Spawn을 통한 waypoint 중간 지점 난입)  (0) 2023.11.06
    TIL_64(배열, list, ArrayList, Dictionary)  (1) 2023.11.03
    TIL_62(waypoint2)  (1) 2023.11.01
    TIL_61(way point)  (0) 2023.10.31
    TIL_60(virtualCamera Fix)  (1) 2023.10.30
Designed by Tistory.