FPS游戏之AI

最近在做策划给的一些关于FPS类型的需求,Demo基本已经成型,接下来整理并记录,高手略过,不喜勿喷!!!

 

一个好的AI会使游戏的可玩性大大增加,我这里只是简单的AI。

大致思路:

设置好后怪物的巡逻路径点,正常情况下,怪物处于巡逻状态,每到一个路径点会停下来张望,如果player接近怪物达到一定的距离,怪物的状态会变成追踪状态,当距离player一定距离状态会变成攻击状态,当怪物追踪到距离路径包围盒一定距离状态会转换成Back状态,回到当前路径点状态切换回巡逻状态

怪物受攻击状态过程中涉及怪物受击打动画(小坑),怪物死亡动画(后续更新)

攻击过程中player全屏掉血(后续更新)

 

上代码(不完整,主要思路)
 

//AI状态
public enum AI_State {
    None,
    Patrol,//巡逻
    ChasingPlayer,//跟随
    AimingPlayer,//
    AttackingPlayer,//攻击
    Attacked,//受到攻击
    Back,//返回状态
    Dead,//死亡
}

//敌人种类
public enum Enemy_Type {
    Soldier,
}

//当前状态
public AI_State actualState = AI_State.Patrol;
private float chasingSpeed = 2f;//跟随速度
private float nomalPatrolSpeed = 2.0f;//巡逻速度
//追踪距离
private float chasingDistance = 6;
//攻击距离
private float attackDistance = 1.5f;
//最大追踪距离
private float maxChasingDistance = 22;
 //路径
public FPS_WaypointsRoute waypointRoute;//路径点
private int currentWayPoint = 0;//当前路径索引
[HideInInspector]
public Transform[] waypoints;
private float timeToWait = 3.0f;//到达一个路径点停留时间

private UnityEngine.AI.NavMeshAgent agent;//导航组件
private Animator animator;
private AnimatorStateInfo info;

 void Start () {
        player = GameObject.FindGameObjectWithTag("Player");
        agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
        animator = GetComponent<Animator>();
      
        if (player)
            playerTransform = player.transform;

        //设置路径
        SetWaypoints();
        //设置随机等待时间
        SetTimeToWait();
        //设置初始路径点
        SetWaypoint(waypoints[0].position);

        if (waypoints.Length > 0) {
            finalGoal = waypoints[0].transform.position;
        }
        bountCenter = GetCenter(waypointRoute.transform);//所有路径点的包围盒
    }

 void Update () {


        if (animator) {
            info = animator.GetCurrentAnimatorStateInfo(0);
        }
        //路径包围盒距离Ai最大的距离
        if (Vector3.Distance(this.transform.position, bountCenter) > maxChasingDistance)                                         
        {
            actualState = AI_State.Patrol;
        }


if (actualState != AI_State.Attacked) {
                        if (playerActualDistance > chasingDistance) {
                            if (lastState == AI_State.AttackingPlayer || lastState == AI_State.ChasingPlayer || lastState == AI_State.Attacked) {
                                actualState = AI_State.Back;
                            } else {
                                actualState = AI_State.Patrol;
                            }
                        } else if (playerActualDistance <= chasingDistance && playerActualDistance >= attackDistance) {
                            if (!info.IsName("Attack")) {
                                actualState = AI_State.ChasingPlayer;
                            } else {
                                animator.ResetTrigger("AttackT");
                            }
                            if (animator) {
                                animator.ResetTrigger("AttackT");
                            }
                        } else if (playerActualDistance < attackDistance) {
                            actualState = AI_State.AttackingPlayer;
                        }
                    } else {
                        FPS_Kill.Instance.UnNomalStrike = false;
                        if (animator) {
                            animator.SetBool("Idle", false);
                        }
                        if (playerActualDistance < attackDistance) {
                            actualState = AI_State.AttackingPlayer;
                            if (animator)
                                animator.ResetTrigger("AttackT");
                        } else {
                            actualState = AI_State.Attacked;
                        }
                    }

 switch (actualState) {
            case AI_State.Patrol:

                if (waypoints.Length > 0) {

                    if (agent.remainingDistance > 0.5f && !waiting) {
                        agent.SetDestination(finalGoal);
                        if (animator) {
                            animator.SetBool("Idle",false);
                        }

                    } else if (!waiting &&  waitTimer < actualTimeToWait ) {
                        waiting = true;
                    }

                    if (waiting) {
                        if (animator) {
                            animator.SetBool("Idle", true);
                        }
                        StopMovement();
                        if (waitTimer < actualTimeToWait)
                            waitTimer += Time.deltaTime;
                        else
                            ChangeWaytpoint();
                    }
                }
                break;
            case AI_State.ChasingPlayer:
                if (animator) {
                    animator.SetBool("Idle", false);
                }
                agent.SetDestination(player.transform.position);
                lastState = AI_State.ChasingPlayer;
                break;
            case AI_State.AttackingPlayer:
                StopMovement();
                LookToTarget(player.transform.position);
                AttackPlayer();
                lastState = AI_State.AttackingPlayer;
                break;
            case AI_State.Back:
                agent.SetDestination(waypoints[currentWayPoint].transform.position);

                bloodValue = Mathf.Lerp(bloodValue, 10, (Time.time-temp)*0.001f);
                FPS_BloodStrip.Insatnce.ChangeBloodStrip(bloodValue / 10.0f, 0.0f, 1);

                if (agent.remainingDistance < 0.5f) {
                    actualState = AI_State.Patrol;
                    lastState = AI_State.None;
                    FPS_Kill.Instance.UnNomalStrike = false;
                    //回去进入巡逻状态满血
                    GetComponent<FPS_Health>().health = 10;
                    FPS_BloodStrip.Insatnce.ChangeBloodStrip(10 / 10.0f, 0.0f, 1);
                }

                break;
            case AI_State.Attacked:
                agent.SetDestination(player.transform.position);
                lastState = AI_State.Attacked;
                break;
            case AI_State.Dead:
                StopMovement();
                break;
        }
    



}

public void SetWaypoints() {
        if (waypointRoute) {
            waypoints = new Transform[waypointRoute.waypoints.Length];

            for (int i = 0; i < (waypoints.Length); i++) {
                waypoints[i] = waypointRoute.waypoints[i];

            }
        }
    }

    /// <summary>
    /// 停止移动
    /// </summary>
    void StopMovement() {
        if (agent != null) {
            agent.velocity = Vector3.zero;
           
        }
    }

    /// <summary>
    /// 巡逻等待时间
    /// </summary>
    void SetTimeToWait() {
        actualTimeToWait = Random.Range(timeToWait * 0.75f, -timeToWait * 0.75f) + timeToWait;
    }


    /// <summary>
    /// 更改路径点
    /// </summary>
    void ChangeWaytpoint() {
        waiting = false;

        currentWayPoint++;
        if (currentWayPoint >= waypoints.Length) {
            currentWayPoint = 0;
        }

        waitTimer = 0.0f;
        SetTimeToWait();

        SetWaypoint(waypoints[currentWayPoint].transform.position);
    }

    /// <summary>
    /// 设置路径点
    /// </summary>
    /// <param name="Pos"></param>
    void SetWaypoint(Vector3 Pos) {
        SetRandomPosVar(Pos);
        agent.SetDestination(finalGoal);
    }

    /// <summary>
    /// 设置目标路径点
    /// </summary>
    /// <param name="goal"></param>
    void SetRandomPosVar(Vector3 goal) {
        finalGoal = goal + new Vector3(Random.Range(-1, 1), 0, Random.Range(-1, 1));
    }





  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FPS游戏中的AI自瞄源码是指计算机程序的源代码,能够让虚拟角色自动瞄准在游戏中出现的敌人角色。这种程序常常被用于电子竞技等游戏中,但也有一些游戏开发者认为这种程序会破坏游戏的平衡性和公正性。 AI自瞄源码的实现需要具备一定的编程技术和数学算法知识,可以通过计算目标角色的速度,方向和剩余血量等因素来准确瞄准敌人角色。但是由于游戏物理引擎,键鼠输入等因素的影响,自瞄程序的准确性和稳定性并不是完美的。 此外,在某些游戏中使用AI自瞄程序是被禁止的。如果一旦被发现,玩家可能面临游戏账号封禁,被禁止参加比赛等惩罚。因此,开发者们应该明辨是非,遵循游戏规则,以诚实公正的态度去玩游戏。 ### 回答2: FPS游戏AI自瞄源码是一种利用人工智能技术实现自动瞄准的程序代码,能够大幅提高玩家在FPS游戏中的命中率和胜率,从而获得更好的游戏体验。 在FPS游戏中,AI自瞄可以通过计算玩家与敌人的距离、目标移动方向和速度等信息,自动调整瞄准角度和时间,以达到快速、准确地击中敌人的目的。这需要程序员利用复杂的算法和计算模型,通过代码实现机器学习和深度学习等先进技术,实现自动瞄准的功能。 一些知名FPS游戏,如《使命召唤》和《反恐精英》,引入了AI自瞄技术,成为了吸引玩家的重要卖点。这些游戏AI自瞄源码也成为了开发者研究和学习的重要资源。通过研究AI自瞄源码,开发者可以学习到最新的人工智能技术,了解这些技术如何应用于FPS游戏中,从而提高自己的编程能力和工作效率。 然而,需要注意的是,AI自瞄源码存在一定的道德和法律问题。一方面,使用AI自瞄软件不仅削弱了游戏的挑战性和可玩度,还可能破坏游戏的公平性和竞技性。另一方面,AI自瞄软件的开发和使用也可能违反游戏开发者的版权和用户协议,甚至触犯国家有关法律法规。因此,开发和使用AI自瞄软件需谨慎,必须遵守游戏规则和法律法规,维护游戏的公平和健康环境。 ### 回答3: FPS游戏AI自瞄源码是一个用于改进FPS游戏中的人工智能(AI)自瞄系统的源代码。FPS游戏是指射击游戏,玩家需要在游戏中控制一个虚拟角色,利用枪械等武器击败敌人。在大多数FPS游戏中,玩家需要手动瞄准并开枪打击敌人。 然而,一些FPS游戏玩家发现了一些可以让自己的角色自动瞄准并开枪的方式,这种通过第三方软件进行外挂的行为被称为“外挂自瞄”。为了打击这种作弊行为,游戏开发者开始加强游戏的安全性,并且开发了AI自瞄系统,让游戏自动瞄准。 FPS游戏AI自瞄源码是这些AI自瞄系统的核心,包括了一系列算法和代码,可以让游戏自动锁定目标并进行射击。这样不仅可以避免作弊,还可以提升游戏公平性和娱乐性。 但是,开发FPS游戏AI自瞄源码也存在一些问题。首先,很难确保AI自瞄系统的准确性,因为游戏中存在着许多变量和因素,如距离、速度、瞬间方向变化等等,这些都会影响到AI自瞄系统的准确性。其次,如果游戏开发者直接公开AI自瞄源码,那么外挂制作者也有可能通过破解源代码来制作更高效的作弊软件,从而产生更多的作弊行为。 总之,FPS游戏AI自瞄源码是一项非常有用和具有挑战的技术,但同时也需要开发者们不断地改进和加强。只有这样才能够让FPS游戏更加公平和有趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值