Files
gpd-924/AI/Assets/Scripts/FSM/IdleState.cs
T
david 19a08085fe add unity project
add example for FSM
2025-04-08 13:03:11 +02:00

53 lines
1.5 KiB
C#

using System;
using UnityEngine;
namespace DefaultNamespace.FSM
{
public class IdleState : IState
{
private GameObject _owner;
private PlayerController _playerController;
private float _viewAngle;
private float _cosViewAngle;
public IdleState(GameObject owner, PlayerController player, float viewAngle)
{
_owner = owner;
_playerController = player;
_viewAngle = viewAngle;
_cosViewAngle = Mathf.Cos(_viewAngle * Mathf.Deg2Rad);
}
public void Enter(IFiniteStateMachine ctx)
{
Debug.Log("Enter");
}
public void Update(IFiniteStateMachine ctx)
{
Debug.Log("Update");
// option 1 view angle
float angle = Vector3.Angle(_owner.transform.forward, _playerController.transform.position - _owner.transform.position);
if (angle > _viewAngle) return;
// option 2 trigger
// option 3 Physics.SphereCast, Physics.BoxCast, ...
if (Physics.Raycast(_owner.transform.position, _owner.transform.forward, out RaycastHit hit, 1000))
{
if (hit.transform.GetComponent<PlayerController>() == _playerController)
{
ctx.SetState(new PlayerDetectedState(_owner, _playerController, 10.0f));
}
}
}
public void Exit(IFiniteStateMachine ctx)
{
Debug.Log("Exit");
}
}
}