플레이어 자동 이동 구현
어제에 이어서 플레이어가 자동으로 목적지로 이동하던 중 몬스터가 있다면 몬스터를 먼저 공격하도록 구현을 해보자.
바로 코드를 보자.
private void WalkToWayPoint()
{
if (targetEnemy != null)
{
float distanceToEnemy = Vector3.Distance(transform.position, targetEnemy.position);
if (distanceToEnemy > attackRange)
{
agent.SetDestination(targetEnemy.position);
}
else
{
Attack();
}
}
else
{
float distanceToTarget = Vector3.Distance(wayPoint.position, transform.position);
if (distanceToTarget > detectRange)
{
agent.SetDestination(wayPoint.position);
}
else
{
Attack();
}
if (curTime > walkToRunTime && !isRunning)
{
Run();
curTime = 0;
}
}
CharacterManager.Instance.Player.animationController.Walk();
}
private void FindClosestEnemy()
{
Collider[] enemies = Physics.OverlapSphere(transform.position, detectRange, enemyLayer);
float closestDistance = Mathf.Infinity;
Transform closestEnemy = null;
foreach (var enemy in enemies)
{
float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
if (distanceToEnemy < closestDistance)
{
closestDistance = distanceToEnemy;
closestEnemy = enemy.transform;
}
}
targetEnemy = closestEnemy;
}
physics.OverlapSphere함수를 통해 플레이어 위치에서 detectRange반경내에, enemylayer에 모든 적을 탐색하게한다.
그리고 초기값으로 Mathf.Infinity를 해주어(이거보다는 클 수 없도록세팅) 반드시 첫 비교에서 갱신되도록 그리고 closestEnemy 은 null로 초기화 해주었다.
이제 foreach문으로 enemies배열을 하나씩 검사한다.
적과 플레이어 사이의 거리를 구하고, 처음에 무한대를 넣었던 closestDistance에 적과 플레이어의 거리를 넣어주며 업데이트 해주고, 널로 초기화 해준 closestEnemy을 targetEnemy에 넣어주면 된다.
그리고 마지막으로 업데이트되는 walk함수에 공격범위보다 몬스터와 플레이어의 거리가 크면 몬스터에게 이동하고, 목적지보다 몬스터와의 거리가 작으면 몬스터에게 이동 아니면 목적지로 이동하도록 구현하였다.
내일은 애니메이션 작업, 몬스터 이동 및 공격 작업을 할 예정이다.
체력도 만들고,,스텟,,ai,,할게너무 많다..어렵다..끝