OldBlueWater/BlueWater/Assets/02.Scripts/Ai/Patrol.cs
NTG 86f9d2607e Closes #213 #214 해적선 Ai 추가 및 항해 씬 취합
+ 해적선 Ai 추가
  ㄴ 패트롤, 추격, 공격 등의 패턴 적용
+ Cannon 클래스 분리
  ㄴ 캐논 자체의 기능만 남기고, Player는 CannonController와 연결해서 사용
+ Player, Pirate 용 cannon projectile 분리
+ New input system 네이밍 변경
  ㄴ ToggleCannon -> ToggleLaunchMode
  ㄴ FireCannon -> LaunchCannon
+ 해적선 Ai에 Rayfire(파괴) 기능 테스트용 추가
2024-03-05 12:47:17 +09:00

124 lines
4.2 KiB
C#

using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class Patrol : MonoBehaviour
{
/***********************************************************************
* Variables
***********************************************************************/
#region Variables
// 패트롤 옵션
[Title("패트롤 옵션")]
[SerializeField] private bool showWayPointGizmo = true;
[field: SerializeField] public WayPointInfo[] WayPoints { get; set; }
[field: SerializeField] public Vector3 OriginalPoint { get; set; }
[field: SerializeField] public int CurrentIndex { get; set; }
[field: SerializeField] public int PreviousIndex { get; set; }
// 기즈모 잠금 기능
[Title("기즈모 잠금 기능")]
[field: SerializeField] public bool LockHandlesOnXAxis { get; set; }
[field: SerializeField] public bool LockHandlesOnYAxis { get; set; }
[field: SerializeField] public bool LockHandlesOnZAxis { get; set; }
#endregion
/***********************************************************************
* Unity Events
***************************************************************m********/
#region Unity Events
private void OnDrawGizmosSelected()
{
if (WayPoints == null || WayPoints.Length <= 0 || !showWayPointGizmo) return;
if (!Application.isPlaying)
{
OriginalPoint = transform.position;
}
for (var i = 0; i < WayPoints.Length; i++)
{
var currentColor = i == CurrentIndex ? Color.blue : Color.yellow;
if ((i + 1) < WayPoints.Length)
{
Gizmos.color = currentColor;
Gizmos.DrawLine(OriginalPoint + WayPoints[i].Point, OriginalPoint + WayPoints[i + 1].Point);
}
if (i == WayPoints.Length - 1)
{
Gizmos.color = currentColor;
Gizmos.DrawLine(OriginalPoint + WayPoints[i].Point, OriginalPoint + WayPoints[0].Point);
}
}
if (!Application.isPlaying) return;
DrawGizmoPoint(OriginalPoint + WayPoints[CurrentIndex].Point,2f, Color.blue);
DrawGizmoPoint(OriginalPoint + WayPoints[PreviousIndex].Point, 2f, Color.red);
}
private static void DrawGizmoPoint(Vector3 pos, float size, Color color)
{
Gizmos.color = color;
Gizmos.DrawWireSphere(pos, size);
}
private void Start()
{
OriginalPoint = transform.position;
}
#endregion
/***********************************************************************
* Methods
***********************************************************************/
#region Methods
public WayPointInfo GetCurrentWayPointInfo() => WayPoints[CurrentIndex];
public Vector3 GetCurrentWayPoint() => OriginalPoint + WayPoints[CurrentIndex].Point;
public int GetNextIndex()
{
if (WayPoints == null) return -1;
var maxSize = WayPoints.Length;
var nextIndex = CurrentIndex + 1;
if (nextIndex >= maxSize)
{
nextIndex = 0;
}
return nextIndex;
}
public bool HasReachedDestination()
{
var myPosition = transform.position;
var movePoint = OriginalPoint + WayPoints[CurrentIndex].Point;
var distance = Vector3.Distance(myPosition, movePoint);
if (distance > 3f) return false;
return true;
}
public void SetMovePoint()
{
if (WayPoints == null || WayPoints.Length <= CurrentIndex) return;
PreviousIndex = CurrentIndex;
CurrentIndex = GetNextIndex();
}
#endregion
}
}