• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (121)
      • Unity (80)
        • RPG Project (39)
        • FPS Project (30)
        • 기타 - 개발 (11)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • RPG Project - 37 [ 몬스터 Nav 미끄러짐 현상, HP Fill Amount 버그 ]
        2024년 11월 29일
        • SiJun-Park
        • 작성자
        • 2024.11.29.:55

        현재 몬스터가 Nav로 움직임을 하고 나서 Idle로 돌아왔을 때 미끄러지는 현상이 있었습니다.

         

            override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
            {
                
                if (_monster._isDead) return;
        
                if (Vector3.Distance(_trans.position, _monster._player.transform.position) < _nav.stoppingDistance)
                {
        
                    if (_monster.attackdelay <= 0)
                    {
                        
                        _monster._CurrentState = MonsterControl.State.Attack;
                        animator.SetFloat("AttackType", Random.Range(0, 3));
                        animator.SetTrigger("Attack");
                        _monster.attackdelay = _monster._attackspeed;
                        _monster.Attack();
                    }
        
                }
                else
                {
                    
                    if (Vector3.Distance(_trans.position, _monster._player.transform.position) < _monster._distance)
                    {
        
                        
                        _monster._CurrentState = MonsterControl.State.None;
                        animator.SetBool("IsWalk", true);
                    }
                }
            }

         

         

        이 코드에서 그랬는데 고치는 방법은 간단합니다

        isStopped도 true로 해봤는데 이 방법으로는 안되고 velocity를 zero로 만들어줘야 합니다.

         

            override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
            {
                
                if (_monster._isDead) return;
          
                _nav.velocity = Vector3.zero; // << 새로 추가된 코드
                if (Vector3.Distance(_trans.position, _monster._player.transform.position) < _nav.stoppingDistance)
                {
        
                    if (_monster.attackdelay <= 0)
                    {
                        
                        _monster._CurrentState = MonsterControl.State.Attack;
                        animator.SetFloat("AttackType", Random.Range(0, 3));
                        animator.SetTrigger("Attack");
                        _monster.attackdelay = _monster._attackspeed;
                        _monster.Attack();
                    }
        
                }
                else
                {
                    
                    if (Vector3.Distance(_trans.position, _monster._player.transform.position) < _monster._distance)
                    {
        
                        
                        _monster._CurrentState = MonsterControl.State.None;
                        animator.SetBool("IsWalk", true);
                    }
                }
            }

        위와같이 코드를 작성한다면 움직인 후 idle로 돌아왔을 시 미끄러짐 현상을 고칠 수 있습니다.

         

         

        두번째로는 몬스터가 피격을 입었을 때 체력 게이지가 조정이 되었는데

        때릴 때 가끔 풀로 차진 상태에서 떨어지거나 0에서 다시 채워지는 경우가 있었습니다.

         

            public void Hitted(float damage)
            {
                if (_isDead) return;
        
                GameObject T = Instantiate(_Text);
                T.transform.position = _HitTextPos.transform.position;
                T.GetComponent<TextControl>()._color =  Color.yellow;
                T.GetComponent<TextControl>()._Size = 5;
                T.GetComponent<TextControl>()._Text = damage.ToString();
        
        
                if (!_HpBar.gameObject.activeSelf)
                {
                    _HpBar.SetActive(true);
                }
                _SeeHpTime = 7.0f;
                if (HP <= damage)
                {
                    _isDead = true;
                    _HpBar.GetComponent<Slider>().value = 0;
                    _HPScript.ChangeHpText("0");
                    SpawnItem();
                    SoundManager._instance.PrivatePlaySound(_diesound, transform,0.5f);
                    while(_exp > 10)
                    {
                        GameObject _ball = Instantiate(_ExpBall);
                        _ball.GetComponent<ExpBallControl>().Set_EXP_Ball(transform, 10);
                        _exp -= 10;
                    }
                    if(_exp > 0)
                    {
                        GameObject _ball = Instantiate(_ExpBall);
                        _ball.GetComponent<ExpBallControl>().Set_EXP_Ball(transform, _exp);
                    }
        
                    if(QuestNum > 0)
                    {
                        if (QuestDoumi._instance.CheckQuest(QuestNum))
                        {
                            QuestDoumi._instance.Update_Quest(QuestNum, 1);
                            UserControl._instance.Quest[QuestNum]++;
                            QuestDoumi._instance.Quest_Information_Add();
                        }
                    }
                    _Action.SetTrigger("Death");
                }
                else
                {
                    HP -= damage;
                    _HPScript.ChangeHpText(Mathf.FloorToInt(HP).ToString());
                    _HpBar.GetComponent<Slider>().value = HP;
                }
            }
            public void ChangeHpText(string txt)
            {
                _text.text = txt +"/"+ _MAX_HP.ToString();
            }

         

        위와같이 사용을 하고 있었는데 이 부분을 밑과 같이 바꾸어 주었습니다.

         

         

           public void Hitted(float damage)
            {
                if (_isDead) return;
        
                GameObject T = Instantiate(_Text);
                T.transform.position = _HitTextPos.transform.position;
                T.GetComponent<TextControl>()._color =  Color.yellow;
                T.GetComponent<TextControl>()._Size = 5;
                T.GetComponent<TextControl>()._Text = damage.ToString();
        
        
                if (!_HpBar.gameObject.activeSelf)
                {
                    _HpBar.SetActive(true);
                }
                _SeeHpTime = 7.0f;
                if (HP <= damage)
                {
                    HP = 0;
                    _isDead = true;
                    _HPScript.ChangeHpText(HP);
                    SpawnItem();
                    SoundManager._instance.PrivatePlaySound(_diesound, transform,0.5f);
                    while(_exp > 10)
                    {
                        GameObject _ball = Instantiate(_ExpBall);
                        _ball.GetComponent<ExpBallControl>().Set_EXP_Ball(transform, 10);
                        _exp -= 10;
                    }
                    if(_exp > 0)
                    {
                        GameObject _ball = Instantiate(_ExpBall);
                        _ball.GetComponent<ExpBallControl>().Set_EXP_Ball(transform, _exp);
                    }
        
                    if(QuestNum > 0)
                    {
                        if (QuestDoumi._instance.CheckQuest(QuestNum))
                        {
                            QuestDoumi._instance.Update_Quest(QuestNum, 1);
                            UserControl._instance.Quest[QuestNum]++;
                            QuestDoumi._instance.Quest_Information_Add();
                        }
                    }
                    _Action.SetTrigger("Death");
                }
                else
                {
                    HP -= damage;
                    _HPScript.ChangeHpText(HP);
                }
            }

         

            public void ChangeHpText(float value)
            {
                HP.fillAmount = (value / _MAX_HP);
                value = (Mathf.FloorToInt(value));
                _text.text = value.ToString() +"/"+ _MAX_HP.ToString();
            }

         

        여기서 왜 이렇게 했냐면 예로들어서 value가 5.9라고 하겠습니다 이거를 바로 MAX HP랑 나누어 버리니깐

         

        체력이 많을시 체력이 풀로 되었다가 줄어들거나 체력이 적을시 다시 많아 졌다가 적어지는 경우가 있었습니다.

         

        그러니 그 전에 미리 계산을 하고 그 이후에 Mathf.FloorToInt를 사용해 깔끔하게 표시를 하였습니다.

         

        'Unity > RPG Project' 카테고리의 다른 글

        RPG Project - 39 [ Save - Load System ]  (0) 2025.01.16
        RPG Project - 38 [ Boss Monster Camera Moving ]  (0) 2024.12.05
        RPG Project - 36 [ 몬스터 디버프 ]  (0) 2024.11.23
        RPG Project - 35 [ 방패 막기 ]  (0) 2024.11.22
        RPG Project - 34 [ Monster Drop Item ]  (0) 2024.11.21
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바