inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

몬스터 AI #2

질문있습니다

308

요가인

작성한 질문수 35

0

몬스터 anim이 WAIT 에서 RUN으로 animator에서는 변경이 되는데 몬스터 자체 내에서 계속 Idle 상태입니다.
--> WAIT 일 때도 모션이 Idle , RUN 일 때도 Idle 입니다


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class BaseController : MonoBehaviour
{
    [SerializeField]
    protected Vector3 _destPos;

    [SerializeField]
    protected Define.State _state = Define.State.Idle;

    [SerializeField]
    protected GameObject _lockTarget;

    public virtual Define.State State
    {
        get { return _state; }
        set
        {
            _state = value;
            Animator anim = GetComponent<Animator>();
            switch (_state)
            {
                case Define.State.Idle:
                    anim.CrossFade("WAIT", 0.1f);
                    break;
                case Define.State.Moving:
                    anim.CrossFade("RUN", 0.1f);
                    break;
                case Define.State.Skill:
                    anim.CrossFade("ATTACK", 0.1f, -1, 0);
                    break;
                case Define.State.Die:

                    break;
            }
        }
    }

    private void Start()
    {
        Init();    
    }

    void Update()
    {
        switch (State)
        {
            case Define.State.Idle:
                UpdateIdle();
                break;
            case Define.State.Moving:
                UpdateMoving();
                break;
            case Define.State.Die:
                UpdateDie();
                break;
            case Define.State.Skill:
                UpdateSkill();
                break;
        }
    }

    public abstract void Init();

    protected virtual void UpdateDie() { }
    protected virtual void UpdateIdle() { }
    protected virtual void UpdateMoving() { }
    protected virtual void UpdateSkill() { }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class MonsterController : BaseController
{
    Stat _stat;

    [SerializeField]
    float _sacnRange = 10;

    [SerializeField]
    float _attackRange = 2;

    public override void Init()
    {
        _stat = gameObject.GetComponent<Stat>();

        if (gameObject.GetComponentInChildren<UI_HPBar>() == null)
            Managers.UI.MakeWorldSpaceUI<UI_HPBar>(transform);
    }

    protected override void UpdateIdle()
    {
        Debug.Log("Monster UpdateIdle");

        GameObject player = GameObject.FindGameObjectWithTag("Player");
        if (player == null)
            return;

        float distance = (player.transform.position - transform.position).magnitude;

        if (distance <= _sacnRange)
        {
            _lockTarget = player;
            State = Define.State.Moving;
            return;
        }
    }

    protected override void UpdateMoving()
    {
        Debug.Log("Monster UpdateMoving");

        //  플레이어가 내 사정거리보다 가까우면 공격
        if (_lockTarget != null)
        {
            _destPos = _lockTarget.transform.position;
            float distance = (_destPos - transform.position).magnitude;

            if (distance <= _attackRange)
            {
                State = Define.State.Skill;
                return;
            }
        }

        // 이동
        Vector3 dir = _destPos - transform.position;
        if (dir.magnitude < 0.1f)
        {
            State = Define.State.Idle;
        }
        else
        {
            // TODO
            NavMeshAgent nma = gameObject.GetComponent<NavMeshAgent>();
            nma.SetDestination(_destPos);
            nma.speed = _stat.MoveSpeed;

            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 20 * Time.deltaTime);
        }
    }

    protected override void UpdateSkill()
    {
        Debug.Log("Monster UpdateSkill");
    }

    void OnHitEvent()
    {
        Debug.Log("Monster onHitEvent");
    }
}

선생님이 올리신 Prefab의 knight 가 아닌 asset store에서 다운 받은 (Warrior Pack Bundle 2 FREE) 입니다.

Unity Chan으로 실행시 잘 움직이고 선생님 자료로 Knight를 만들어서 작동시 잘 움직이지만

다운받은 Asset으로는 작동이 안되는데 이유를 잘 모르겠습니다.

https://drive.google.com/file/d/1bV4QnQceT30opv8t34qPgKt4bfctjut8/view?usp=drive_link

 

 

 

C# unity

답변 1

-1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

요가인님, 몬스터의 애니메이션이 제대로 전환되지 않는 문제를 겪고 계시군요.

Animator에 설정된 상태에 따라 애니메이션이 바뀌지 않는 경우, 보통 몇 가지 문제를 먼저 확인해보아야 합니다.

  1. Animator의 Transition 조건 확인:
    Animator에서 WAIT 상태에서 RUN 상태로 올바르게 전이가 설정되어 있는지 확인해주세요. Transition 조건이 정확해야 애니메이션 상태가 변경됩니다.

  2. Animator Parameter의 이름 확인:
    코드에서 anim.CrossFade("WAIT", 0.1f);와 같이 애니메이션 이름을 문자열로 직접 사용하고 있습니다. Animator 내부에서 사용된 Parameter 이름과 코드상의 문자열이 정확히 일치하는지 확인해주세요.

  3. 애니메이션 클립과 연결 확인:
    Asset에서 가져온 애니메이션 클립이 Animator Controller에 올바르게 할당되어 있는지 확인해주세요. 또한, 각 애니메이션 클립이 정상적으로 재생되는 것을 테스트해보세요.

  4. Prefab의 Override 문제:
    Asset Store에서 다운받은 애니메이션을 사용하는 경우, 해당 Prefab 설정에 문제가 없는지 확인해야 합니다. 때때로 Prefab이나 애니메이션 클립에 오버라이드 설정이 잘못 적용된 경우 문제가 발생할 수 있습니다.

  5. 코드 문제:
    UpdateMoving 및 기타 상태 업데이트 함수들이 호출되는 과정에서 State 프로퍼티가 올바르게 변경되고 있는지 확인해주세요. 코드에서 로그를 출력하여 상태 변환 과정을 추적해볼 수 있습니다.

제공해주신 구글 드라이브 링크에서 추가적인 정보를 얻을 수 없어 위와 같은 일반적인 문제 해결 방안을 안내드리게 되었습니다. 만약 문제가 계속 해결되지 않는다면, Animator와 Prefab 설정을 상세히 살펴본 후 추가적인 특이사항을 발견하시게 될 수 있습니다.

조금 더 구체적인 해결책을 원하시면 저희 인프런의 ‘문의하기’ 기능을 통해 좀 더 상세한 상황을 설명해주시면 도움을 드릴 수 있을 것 같습니다.

도움이 되시길 바라며, 문제가 빠르게 해결되기를 바랍니다.

0

요가인

이미 다 해보고 질문하는겁니다...

지금 몇번이고 이런 AI 답변만 달리는데

해결방안이 그럼 없는거에요?

비쥬얼 스튜디오에서 unity연결이 없습니다.

0

39

2

UI 기능 관련 질문이 있습니다!

0

46

2

픽셀 좌표 스크린 좌표

0

35

0

전체적으로 코드 읽는게 굉장히 오래 걸리네요...

0

83

2

카메라 #2 수업 캐릭터 쓰러짐 해결

0

87

1

플레이어 움직임이 끝날때, 기울어짐 현상

0

86

1

Input 적용과 관련하여 질문 있습니다.

0

76

1

디버그 불가.. Unity에 연결 불가

0

85

1

달리기 애니메이션 에러

0

91

2

오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다

0

67

1

GetKey 오류

0

114

2

에셋을 어디에 올려두신지 알 수 있나요?

0

109

1

재귀호출? 오류나는데 왜 이래요 ?

0

170

6

Animation blending 파라미터 계산

0

70

1

newPos와 to지점이 겹쳐져야 하는거 아닌가요?

0

98

3

오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다

0

89

2

질문있습니다

0

144

2

아 이거 소스코드 같은거 없나요?

0

144

3

질문 드립니다. string.IsNullOrEmpty(name)

0

89

2

@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?

0

137

2

유니티6 NavMesh 안되는분들

1

177

1

Unity6 Unity-Chan Material 마젠타 문제 해결법

7

535

1

GetComponent<Poolable> 질문드립니다.

0

104

2

UI 불러오지 못함

0

120

2