기존의 몬스터의 이동을 구현했던 Monster 스크립트를 일부 수정했다.
몬스터들은 캐릭터의 앞부분 타일까지만 이동할 수 있고 도달하면 더이상 이동하지 않는다.
https://velog.io/@yangju058/타워디펜스게임-2.-몬스터-이동-랜덤-위치-생성
몬스터가 도달 위치까지 이동 & 멈춤
다시 보니까 이 부분이 필요한 지 모르겠다
-> Mathf.Abs() 절대값을 반환하는 함수
MonsterTile 쪽에서 isStopped이 true가 되는 조건을 NotMonsterTile에 충돌하면 바뀌게 되어있기 때문에, 최종 도달 위치까지 사용 할 필요가 없을 듯
->수정하자
기획자님과 의논하다 생겨서 만든 로직
유닛과 몬스터가 같은 타일에 배치될 경우를 생각해보았다
-> 기존에는 충돌 범위로 했기 때문에 유닛이 배치되어있고 몬스터가 이동하다가 유닛이랑 닿으면 타일에 멈춘다.
-> 그럼 중복된 타일에 부딪힐 경우는?
-> 유닛이 배치된 타일에 몬스터가 서서히 이동하여 멈추게 하였다.
하다보니 또 문제가 있었다
유닛과 몬스터가 겹치게 배치 될 경우, 서서히 몬스터가 오는데, 몬스터의 공격 기즈모 영역은 유닛을 감지하지만(본인 영역까지 해둠), 유닛은 본인 앞부분부터 공격 기즈모 범위이기 때문에 다시 설정해야겠다
이부분도 아마 유닛과 몬스터가 같은 타일에 배치될 경우 생기는 문제같은데, 몇번 같은 타일에 충돌하다보면 몬스터가 움직이지 않는 현상이 있다
-> 유닛이 없는데 이동하지 않음

몬스터의 이동 자체는 X축만 이동하게 하였다. y축, z축은 변동 없다
멈추지 않았다면, 계속 X축이 왼쪽으로 이동되는 로직을 나중에 몬스터 별로 다르게 해줄 것이다
-> 이동속도는 몬스터마다 다르다
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Unity.Burst.CompilerServices;
using UnityEngine;
public class MonsterController : MonoBehaviour
{
public Vector3 FinalDestination; // 도착 지점
public float moveSpeed = 0.2f;
public float approachSpeed = 0.2f; // 유닛 위치로 이동하는 속도
public bool isStopped;
private Vector3 targetPosition; // 목표 위치(유닛 위치)
private Collider2D collidedUnit; // 충돌한 유닛을 추적
private void Awake()
{
FinalDestination = new Vector3(-19, 0, 0);
}
private void FixedUpdate()
{
if (!isStopped)
{
// 기본 왼쪽으로 이동
transform.Translate(new Vector3(moveSpeed * -1, 0, 0));
if (Mathf.Abs(transform.position.x - FinalDestination.x) < 0.01f)
{
isStopped = true;
}
}
}
// OnTriggerEnter2D -> 오브젝트간 충돌이 일어날때 처음 한번 호출
public void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.layer == 10) // 유닛 레이어
{
collidedUnit = collision; // 충돌한 유닛 저장
// 유닛과 몬스터의 좌표를 가져옴
Vector3 unitPosition = collision.transform.position;
Vector3 monsterPosition = transform.position;
// 유닛과 몬스터가 겹쳐 있는 경우(좌표 거의 동일)
if (Vector3.Distance(unitPosition, monsterPosition) < 0.7f) // 겹침 거리 기준 설정
{
targetPosition = unitPosition; // 유닛 위치를 목표로 설정
}
else
{
// 정면으로 맞닥뜨린 경우 멈춤
isStopped = true;
}
}
}
// OnTriggerExit2D -> 오브젝트간 충돌에서 벗어날때
public void OnTriggerExit2D(Collider2D collision)
{
if(collision == collidedUnit)
{
collidedUnit = null;
isStopped = false; // 다시 이동
}
}
}
NotMonsterTile이라면 monsterController 의 isStopped 변수가 true가 되고 몬스터가 중지한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterTile : MonoBehaviour
{
MonsterController monsterController;
private void Awake()
{
// 몬스터 컨트롤 스크립트 가져오기
monsterController = GetComponent<MonsterController>();
}
private void OnTriggerEnter2D(Collider2D other)
{
if(other.CompareTag("NotMonsterTile"))
{
monsterController.isStopped = true;
Debug.Log("몬스터가 낫타일과 충돌함");
}
}
}
몬스터의 도달 위치 Vector3값은 필요없을 거 같아. 지우자
-> 그냥 타일 충돌 시 멈추게만 해도 괜찮을 거 같다
유닛과 몬스터가 같은 타일 내에서 충돌 시 몬스터가 이동 안하고 멈추는 경우가 있더라
-> 여기 부분에 isStopped false의 조건을 추가해줘야할듯

몬스터와 유닛이 같은 타일에 겹쳐서 있을 경우, 유닛은 몬스터의 공격범위에 맞지만, 유닛의 공격범위는 몬스터를 벗어난다. 다시 영역을 잡아야할듯
-> 유닛의 공격범위에 자기 자신의 영역도 포함시켜보자

나중에 밸런스를 맞추기 위해서 몬스터들의 이동속도는 각각 변경할 것이다
-> 현재는 Translate를 이용하여 x축 이동중
