我已经为功能齐全的玩家设计了一种攻击方法,但是我对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;
}
答案 0 :(得分:0)
这完全取决于您希望状态机如何工作。一个例子就是AI试图寻找并消灭其他玩家。
寻找状态:AI将在地图上移动,并带有一个检测区域(对撞机),该区域会在触发进入时改变状态。然后,这将保存检测到的通用位置的位置,该位置将用于将AI储罐向该位置移动和旋转。
射击状态:AI会在射击范围内进入新的探测区(对撞机),炮塔将移动以瞄准目标。 AI还将在地图上移动以保持最大射击距离,同时还跟踪敌人的最后已知位置(如果他们恰巧超出了范围)。
探测火力:玩家或其他AI发射武器,这可能会增加探测半径,从而导致搜寻状态被调用。
弄清楚这些功能之后,在Update()中放置一个开关或类似的东西,以允许AI中的所有内容与Unity的功能一起运行。