53 lines
1.5 KiB
C#
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");
|
|
}
|
|
}
|
|
} |