Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / role / enemy / state / AINormalState.cs

/// <summary>
/// AI 正常状态
/// </summary>
public class AINormalState : IState<Enemy, AIStateEnum>
{
    public AIStateEnum StateType { get; } = AIStateEnum.AINormal;
    public Enemy Master { get; set; }
    public StateController<Enemy, AIStateEnum> StateController { get; set; }
    public void Enter(AIStateEnum prev, params object[] args)
    {
        Master.PathSign.Enable = false;
    }

    public void PhysicsProcess(float delta)
    {
        //检测玩家
        var player = GameApplication.Instance.Room.Player;
        //玩家中心点坐标
        var playerPos = player.MountPoint.GlobalPosition;
        
        //玩家是否在前方
        var isForward = Master.IsPositionInForward(playerPos);
        
        if (isForward) //脸朝向玩家
        {
            if (Master.GlobalPosition.DistanceSquaredTo(playerPos) <= Master.ViewRange * Master.ViewRange) //没有超出视野半径
            {
                //射线检测墙体
                Master.ViewRay.Enabled = true;
                var localPos = Master.ViewRay.ToLocal(playerPos);
                Master.ViewRay.CastTo = localPos;
                Master.ViewRay.ForceRaycastUpdate();
            
                if (!Master.ViewRay.IsColliding()) //视野无阻
                {
                    //发现玩家, 切换状态
                    StateController.ChangeStateLate(AIStateEnum.AITailAfter);
                }

                Master.ViewRay.Enabled = false;
            }
        }
        
    }

    public bool CanChangeState(AIStateEnum next)
    {
        return true;
    }

    public void Exit(AIStateEnum next)
    {
        
    }
}