6-3. 15조 Monster

keubung·2024년 11월 28일
  1. 처음에는 투명상태에서 움직임이 멈춰있는 상태

    void PassiveUpdate()
    {
        if (aiState == AIState.Wandering && agent.remainingDistance < 0.1f)
        {
            SetState(AIState.Idle);
            Invoke("WanderToNewLocation", Random.Range(minWanderWaitTime, maxWanderWaitTime));
        }
    
        if (playerDistance < detectDistance)    // 플레이어 감지하고 공격 상태
        {
            SetState(AIState.Attacking);
        }
        else if (aiState != AIState.Wandering)  // 플레이어가 도망갔을 때
        {
            SetState(AIState.Wandering);
            Invoke("BecomeInvisible", Random.Range(minWanderWaitTime, maxWanderWaitTime)); // Wandering 후 투명화
        }
    }
    
    void BecomeInvisible()
    {
        if (aiState == AIState.Wandering) // Wandering 상태에서만 실행
        {
            SetState(AIState.Idle);
            if (monster != null)
            {
                monster.BecomeInvisible();
            }
        }
    }
  2. 몬스터를 감지하면 몬스터가 움직이기 시작(IDetectable 연결)

    public class Monster : Entity , IDetectable
    {
        [SerializeField] private MonsterController controller;
        [SerializeField] private MeshRenderer renderer;
    
        public bool isRevealed = false;
        public override void Init()
        {
            base.Init();
        }
    
        private void Awake()
        {
    
        }
    
        public void Detected()
        {
    
        }
    
        public void Revealed()
        {
            //controller.isRevealed = true;
            if (!isRevealed)
            {
                isRevealed = true;
                renderer.enabled = true;
    
                controller.SetState(AIState.Wandering);
            }
        }
    
        public void BecomeInvisible()
        {
            if (isRevealed)
            {
                isRevealed = false;
    
                if (renderer != null)
                {
                    renderer.enabled = false;
                }
    
                if (controller != null)
                {
                    controller.SetState(AIState.Idle);
                }
            }
        }
    }
  3. 플레이어 감지하고 바라보기

    private void LookingAtPlayerUpdate()
    {
        if (playerDistance > lookAtPlayerDistance)
        {
            SetState(AIState.Wandering);
        }
        else
        {
            Vector3 directionToPlayer = (playerTransform.position - transform.position).normalized;
            Quaternion lookRotation = Quaternion.LookRotation(directionToPlayer);
            transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * 5f);
        }
    }
profile
김나영(Unity_6기)

0개의 댓글