• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

질문있습니다

23.12.03 18:35 작성 23.12.03 19:04 수정 조회수 163

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

 

 

 

답변 1

답변을 작성해보세요.

-1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.05

안녕하세요, 인프런 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 설정을 상세히 살펴본 후 추가적인 특이사항을 발견하시게 될 수 있습니다.

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

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

요가인님의 프로필

요가인

질문자

2023.12.06

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

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

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