统一使玩家的行为适应AI

时间:2019-08-18 04:49:51

标签: c# unity3d state-machine

我已经为功能齐全的玩家设计了一种攻击方法,但是我对AI还是陌生的,不知道在将其调整为FSM状态时应该从哪里开始。

    protected void UpdateAttackState()
    { 
    // check for input
    float rot = transform.localEulerAngles.y + rotationSpeed * Time.deltaTime * Input.GetAxis("Horizontal");
    Vector3 fwd = transform.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical");

    // Tank Chassis is rigidbody, use MoveRotation and MovePosition
    GetComponent<Rigidbody>().MoveRotation(Quaternion.AngleAxis(rot, Vector3.up));
    GetComponent<Rigidbody>().MovePosition(_rigidbody.position + fwd);

        if (turret) {
            Plane playerPlane = new Plane(Vector3.up, transform.position + new Vector3(0, 0, 0));

    // Generate a ray from the cursor position
    Ray RayCast = Camera.main.ScreenPointToRay(Input.mousePosition);

    // Determine the point where the cursor ray intersects the plane.
    float HitDist = 0;

            // If the ray is parallel to the plane, Raycast will return false.
            if (playerPlane.Raycast(RayCast, out HitDist))
            {
                // Get the point along the ray that hits the calculated distance.
                Vector3 RayHitPoint = RayCast.GetPoint(HitDist);

    Quaternion targetRotation = Quaternion.LookRotation(RayHitPoint - transform.position);
    turret.transform.rotation = Quaternion.Slerp(turret.transform.rotation, targetRotation, Time.deltaTime* turretRotSpeed);
            }
        }

        if(Input.GetButton("Fire1"))
        {
            if (elapsedTime >= shootRate)
            {
                //Reset the time
                elapsedTime = 0.0f;

                //Also Instantiate over the PhotonNetwork
                if ((bulletSpawnPoint) & (bullet))
                    Instantiate(bullet, bulletSpawnPoint.transform.position, bulletSpawnPoint.transform.rotation);
            }
        }

        // Update the time
        elapsedTime += Time.deltaTime;
    }

1 个答案:

答案 0 :(得分:0)

这完全取决于您希望状态机如何工作。一个例子就是AI试图寻找并消灭其他玩家。

寻找状态:AI将在地图上移动,并带有一个检测区域(对撞机),该区域会在触发进入时改变状态。然后,这将保存检测到的通用位置的位置,该位置将用于将AI储罐向该位置移动和旋转。

射击状态:AI会在射击范围内进入新的探测区(对撞机),炮塔将移动以瞄准目标。 AI还将在地图上移动以保持最大射击距离,同时还跟踪敌人的最后已知位置(如果他们恰巧超出了范围)。

探测火力:玩家或其他AI发射武器,这可能会增加探测半径,从而导致搜寻状态被调用。

弄清楚这些功能之后,在Update()中放置一个开关或类似的东西,以允许AI中的所有内容与Unity的功能一起运行。