- 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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)