반응형
코드 작성
using UnityEngine;
public class MonsterTracking : MonoBehaviour
{
public Transform player;
public float speed = 5f;
public float range = 10f;
void Update()
{
float distance = Vector3.Distance(transform.position, player.position);
if (distance <= range)
{
transform.LookAt(player);
transform.position = Vector3.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
}
}
}
다른 방식
using UnityEngine;
using UnityEngine.AI;
public class MonsterAI : MonoBehaviour
{
// NavMeshAgent를 위한 변수
private NavMeshAgent navAgent;
// 플레이어의 위치를 추적하기 위한 변수
private Transform player;
// 몬스터가 플레이어를 추적할 거리
public float chaseDistance = 10f;
// 몬스터의 초기 위치를 저장할 변수
private Vector3 startPosition;
// 몬스터가 플레이어를 추적할 최소 거리
public float stopDistance = 2f;
// 몬스터가 정찰할 위치 배열
public Transform[] patrolPoints;
private int currentPatrolIndex = 0;
void Start()
{
// NavMeshAgent 컴포넌트 가져오기
navAgent = GetComponent<NavMeshAgent>();
// Player 태그를 가진 오브젝트를 찾아서 플레이어로 설정
player = GameObject.FindGameObjectWithTag("Player").transform;
// 몬스터의 초기 위치 저장
startPosition = transform.position;
}
void Update()
{
// 플레이어와의 거리를 계산
float distanceToPlayer = Vector3.Distance(player.position, transform.position);
// 플레이어가 추적 거리 안에 있을 경우
if (distanceToPlayer <= chaseDistance)
{
// 플레이어를 추적
ChasePlayer(distanceToPlayer);
}
else
{
// 정찰 지점으로 이동
Patrol();
}
}
// 플레이어를 추적하는 함수
void ChasePlayer(float distanceToPlayer)
{
// 플레이어가 너무 가까이 있을 경우
if (distanceToPlayer <= stopDistance)
{
// 멈춘다
navAgent.isStopped = true;
}
else
{
// 플레이어를 따라간다
navAgent.isStopped = false;
navAgent.SetDestination(player.position);
}
}
// 정찰하는 함수
void Patrol()
{
// 현재 정찰 지점에 도달했는지 확인
if (!navAgent.pathPending && navAgent.remainingDistance < 0.5f)
{
// 다음 정찰 지점으로 이동
currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;
navAgent.SetDestination(patrolPoints[currentPatrolIndex].position);
}
}
}
반응형