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) { ctx.SetState(new PlayerDetectedState(_owner, _playerController, 10.0f)); } } } public void Exit(IFiniteStateMachine ctx) { Debug.Log("Exit"); } } }