preview Link : https://velog.io/@suhan0304/Unity2D-GameUndead-Survivor-5
gitHub Link : https://github.com/suhan0304/Undead-Survivor
Sprite의 Enemy 1의 Run 0을 끌어와 Enemy 오브젝트를 생성해 준 후 다음과 같이 설정한다.
위와 같이 동일한 방법으로 Enemey (1)을 만들어준다.
몬스터 스크립트 Enemy를 다음과 같이 만들어준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed; //속도
public Rigidbody2D target; //목표 Rigidbody
bool isLive = true; //생존여부
Rigidbody2D rigid;
SpriteRenderer spriter;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
spriter = GetComponent<SpriteRenderer>();
}
void FixedUpdate()
{
if (!isLive) //죽었으면 종료
return;
Vector2 dirVec = target.position - rigid.position; // 방향 = 위치 차이의 정규화 (위치 차이 = 타겟 위치 - 나의 위치)
Vector2 nextVec = dirVec.normalized * speed * Time.fixedDeltaTime; //방향(정규화) * 속도 * 프레임 시간 보정
rigid.MovePosition(rigid.position + nextVec); //현재 위치에 next벡터를 더한다.
//다른 리지드바디와 부딪히게 되면 물리 속도가 생기는데 우리는 위치 이동을 채용하고 있으므로 물리 속도로 위치가 변화하면 안되므로 velocity를 0 만들기
rigid.velocity = Vector2.zero; //물리 속도가 이동에 영향을 주지 않도록 속도는 제거
}
private void LateUpdate()
{
if (!isLive) //죽었으면 종료
return;
//목표의 x축과 자신의 x축 값을 비교하여 작으면 X축을 기준으로 Flip 되도록 FlipX를 True로 설정
spriter.flipX = target.position.x < rigid.position.x;
}
}
이후 해당 스크립트를 Enemy와 Enemy (1)에 넣어준 후 Speed를 2.5, Target에 Player를 드래그드랍해서 초기화시켜준다.
몬스터가 플레이어보다 느리게 되면 나중에 플레이어로부터 너무 멀어져 타일맵 밖에서 계속 따라오게 된다. 따라서 너무 벗어나게 되면 다시 가까이 재배치 시켜주는 로직이 필요하다. 따라서 기존의 Reposition 스크립트의 Enemy 부분을 업데이트해준다.
Collider2D coll;
void Awake()
{
coll = GetComponent<Collider2D>();
}
case "Enemy": //collsion의 태그가 Enemy일 경우
if (coll.enabled) // 콜라이더가 활성화 되어있는지 조건 먼저 작성 - 몬스터가 죽었으면 비활성화 되어있음 => 재배치 필요가 없음
{
transform.Translate(playerDir * 20 + new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), 0f));
//적어도 맵 크기만큼은 이동 -> 플레이어의 시야 밖에서 재배치 되도록
}
break;