CapersProject/Assets/02.Scripts/BlueWater/Character/AiMovement.cs

144 lines
3.8 KiB
C#
Raw Normal View History

using System;
2025-02-10 02:13:46 +00:00
using DDD.Players.Tycoons;
using Pathfinding;
2024-06-03 18:26:03 +00:00
using UnityEngine;
2024-10-06 23:41:09 +00:00
using Random = UnityEngine.Random;
2024-06-03 18:26:03 +00:00
2025-02-10 02:13:46 +00:00
namespace DDD.Enemies
2024-06-03 18:26:03 +00:00
{
public class AiMovement : MonoBehaviour
{
// Variables
#region Variables
private IAstarAI _iAstarAi;
#endregion
// Unity events
#region Unity events
private void Awake()
{
InitializeComponents();
StopMove();
}
2024-06-03 18:26:03 +00:00
#endregion
// Initialize methods
#region Initialize methods
private void InitializeComponents()
2024-06-03 18:26:03 +00:00
{
_iAstarAi = GetComponent<IAstarAI>();
2024-06-03 18:26:03 +00:00
}
#endregion
// Methods
#region Methods
public void EnableMove()
{
if (_iAstarAi == null) return;
_iAstarAi.isStopped = false;
_iAstarAi.canMove = true;
}
public void StopMove()
{
if (_iAstarAi == null) return;
_iAstarAi.isStopped = true;
_iAstarAi.canMove = false;
_iAstarAi.SetPath(null);
}
public void Move(Vector3 position)
{
if (_iAstarAi == null) return;
_iAstarAi.destination = position;
EnableMove();
}
public void MoveTarget(Collider target)
{
if (!target)
{
StopMove();
return;
}
Move(target.transform.position);
}
2024-10-06 23:41:09 +00:00
public Vector3 SetRandomPoint()
{
if (_iAstarAi == null) throw new Exception("AstarAi 오류");
var randomFactor = Random.Range(0.2f, 0.8f);
return Vector3.Lerp(_iAstarAi.position, _iAstarAi.destination, randomFactor);
}
2024-06-03 18:26:03 +00:00
public void Teleport(Vector3 position)
{
_iAstarAi?.Teleport(position);
}
public bool HasReachedDestination()
{
if (_iAstarAi == null) return false;
if (_iAstarAi.pathPending) return false;
var distanceToDestination = Vector3.Distance(_iAstarAi.position, _iAstarAi.destination);
return distanceToDestination < 0.5f && _iAstarAi.reachedEndOfPath;
2024-06-03 18:26:03 +00:00
}
public void SetMoveSpeed(float speed)
{
if (_iAstarAi == null) return;
_iAstarAi.maxSpeed = speed;
}
public bool IsPositionMovable(Vector3 endPosition)
2024-06-03 18:26:03 +00:00
{
var nearestNode = AstarPath.active.GetNearest(endPosition).node;
return nearestNode != null && nearestNode.Walkable;
2024-06-03 18:26:03 +00:00
// var startNode = AstarPath.active.GetNearest(startPosition).node;
// var endNode = AstarPath.active.GetNearest(endPosition).node;
//
// return PathUtilities.IsPathPossible(startNode, endNode);
2024-06-03 18:26:03 +00:00
}
2024-10-14 11:13:08 +00:00
public void MoveToRandomPositionInRange(float range, int graphIndex = 0)
{
Vector3 randomPosition;
var isMovable = false;
var graphBounds = AstarPath.active.graphs[0].bounds;
do
{
var randomDirection = Random.insideUnitCircle.normalized;
var randomOffset = new Vector3(randomDirection.x, 0, randomDirection.y) * Random.Range(0, range);
randomPosition = _iAstarAi.position + randomOffset;
if (!graphBounds.Contains(randomPosition))
{
continue;
}
isMovable = IsPositionMovable(randomPosition);
} while (!isMovable);
Move(randomPosition);
}
2024-06-03 18:26:03 +00:00
#endregion
}
}