bool isGround; //是否落地 private void EnemyForward() { RaycastHit hit; //看见攻击目标则攻击 if (Physics.Raycast(eye.position, transform.forward, out hit, view, LayerMask.GetMask("City"))) { state = EnemyState.attack; anim.Play("attack"); target = hit.collider.GetComponent <MainCity>(); } if (Physics.Raycast(eye.position, Vector3.down, out hit, 4.1f, LayerMask.GetMask("Way"))) { way = hit.transform; wayDir = Quaternion.LookRotation(way.forward); //获取与道路的偏移量 Vector3 distance = transform.position - way.position; float offset = Vector3.Dot(distance, way.right.normalized); //往道路方向旋转和移动 transform.rotation = Quaternion.RotateTowards(transform.rotation, wayDir, speed * 20 * Time.deltaTime); transform.Translate(-offset * Time.deltaTime, 0, speed * Time.deltaTime); isGround = true; } else { isGround = false; } }
//前进方法 private void EnemyForward() { RaycastHit hit; //看见攻击目标则攻击 if (Physics.Raycast(eye.position, transform.forward, out hit, view, LayerMask.GetMask("City"))) { state = EnemyState.attack; anim.Play("attack"); target = hit.collider.GetComponent <MainCity>(); } //斜下方30°打射线检测前方道路 if (Physics.Raycast(eye.position, Quaternion.AngleAxis(30, transform.right) * transform.forward, out hit, 50, LayerMask.GetMask("Way"))) { Debug.DrawLine(eye.position, hit.point, Color.blue); //发现未走过的道路,获取该道路,朝向该路通往的方向 if (!ways.Contains(hit.collider)) { ways.Add(hit.collider); way = hit.transform; wayDir = Quaternion.LookRotation(way.forward); } } else //前方没路了发射球形射线检测周围是否有路 { Collider[] colliders = Physics.OverlapSphere(transform.position, 8, LayerMask.GetMask("Way")); for (int i = 0; i < colliders.Length; i++) { //发现未走过的道路,获取该道路,朝向该路通往的方向 if (!ways.Contains(colliders[i])) { way = colliders[i].transform; wayDir = Quaternion.LookRotation(way.forward); break; } } } //获取与脚下道路x轴上偏差值,好让自身走在路中间 float offset = 0; if (way != null) { Vector3 distance = transform.position - way.position; offset = Vector3.Dot(distance, way.right.normalized); } //面向该路指向的方向前进 transform.rotation = Quaternion.RotateTowards(transform.rotation, wayDir, speed * 20 * Time.deltaTime); transform.Translate(-offset * Time.deltaTime, 0, speed * Time.deltaTime); }