MuscleDeveloper5683 2023. 10. 17. 20:39
728x90
SMALL

1. 오브젝트 만들기

 

1.1우선 적의 오브젝트를 생성해주자

 

 

 

1.2 각각의 컴포넌트를 추가하자

(애니메이터, 물리작용)

 

 

 

Animator Controller - 적의 애니메이터 컨트롤러 생성 후 넣어주기

Gravity Scale - 중력은 받지 않음으로 0으로 설정

Freeze Rotation - 충돌 시 회전하면 안됨으로 체크

 

 

 

Enemy 오브젝트들을 생성한 모습

 

 

 

2. 적들이 플레이어를 추적하기

 

2.1 Enemy.Cs를 생성후 작성

 

 

LateUpdate란?

 -  모든 Update 함수가 호출된 후, 마지막으로 호출된다. 주로 오브젝트를 따라가게 설정한 카메라는 LateUpdate 를 사용한다.

 

rigidbody의 velocity란?

 - Rigidbody의 속도를 나타낸다. Velocitiy를 지정하면 오브젝트의 질량과 상관없이 일정 속도를 준다.

 

 

 

 

 

 

전체 코드

 

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

public class Enemy : MonoBehaviour
{
    // 적의 속도
    [SerializeField]
    private float enemySpeed = 2.5f;
    // 따라갈 목표
    [SerializeField]
    private Rigidbody2D target;
    // 생존 여부
    private bool isLive = false;

    private Rigidbody2D enemyRigidbody;
    private SpriteRenderer enemySpriteRen;

    void Awake()
    {    
        enemyRigidbody = GetComponent<Rigidbody2D>();
        enemySpriteRen = GetComponent<SpriteRenderer>();
        isLive = true;
    }

    private void FixedUpdate()
    {
        // 만약 몬스터가 살아있지 않을 경우 실행 x
        if(!isLive)
            return;

        // 플레이어와 적의 위치거리
        Vector2 directionPosition = target.position - enemyRigidbody.position;
        // 적이 이동헤야할 방향의 거리의 값
        Vector2 nextPosition = directionPosition.normalized * enemySpeed * Time.fixedDeltaTime;
        // 적이 타겟을 향해 이동
        enemyRigidbody.MovePosition(enemyRigidbody.position + nextPosition);
        // 적과 플레이어가 충돌 시 물리 속도의 영향을 주지 않기 위해 0으로 지정
        enemyRigidbody.velocity = Vector2.zero;
    }

    // 모든 Update 함수가 호출된 후, 마지막으로 호출됩니다. 주로 오브젝트를 따라가게 설정한 카메라는 LateUpdate 를 사용
    private void LateUpdate()
    {
        if(!isLive)
            return;

        // 적의 시선(방향)처리 - 적을 기준으로 플레이어가 왼,오 인지 체크해서 바라보게
        enemySpriteRen.flipX = target.position.x < enemyRigidbody.position.x;
    }
}

 

3. 몬스터 재배치

 

만약 플레이어의 이동속도가 적의 이동속도보다 빠를경우 적은 따라오지 못할 것 이다. 플레이어가 이동한 위치에 적들이 리스폰 되게 해보자

 

 

3.1 적의 충돌 처리를 위해 Collider를 사용하자

 

 

 

3.2 적이랑 플레이어의 충돌 Area의 충돌감지

 

 

Random.Range 를 사용하여 랜덤한 위치에서 리스폰 되게 

 

 

3.3 Enemy 오브젝트에 Reposition.cs 도 추가해주자

 

 

 

작성 코드

 

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UIElements;

public class Reposition : MonoBehaviour
{
    private Collider2D enemyCollider;

    void Awake()
    {
        enemyCollider = GetComponent<Collider2D>();   
    }   

    // 오브젝트 충돌을 감지하는 함수 
    private void OnTriggerExit2D(Collider2D collision)
    {
        // 플레이어의 이동 방향을 저장하기 위한 변수 추가
        Vector3 playerDirection = GameManager.Instance.player.InputVector;

        // 이 스크립트가 달린 오브젝트가 어떤 태그랑 충돌하는지 체크하기 위해서
        switch(transform.tag)
        {   
            // 적일 경우
            case "Enemy":
                // 적의 충돌이 활성화 일때만(죽었을 경우 충돌나면 안되기 때문에)
                if(enemyCollider.enabled)
                {   
                    // 플레이어가 가는 방향 * 타일맵의 크기 + 랜덤한 x,y의 위치
                    // X : -3에서 3사이에 랜덤 , Y : -3 에서 3사이에 랜덤 , Z는 해당사항 없음
                    this.transform.Translate(playerDirection * 20f + new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), 0f));  
                }
                break;
        }
         
    }
}

 

 

 

실행 모습

 

 

728x90