//2021.05.18更新,根据敌人生成器模块代码补充,敌人移动类将使用路线类获得的路点进行寻路!
//EnemyMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 敌人移动类,用于敌人向着目标点旋转,向着前方前进,判断是否已经到达目标点
/// </summary>
public class EnemyMove : MonoBehaviour
{
/// <summary>
/// 判断目标点字段
/// </summary>
private bool pd1;
/// <summary>
/// 存储路线节点元素的int类型字段
/// </summary>
private int fornum;
/// <summary>
/// 存储路线节点元素数组,已在敌人生成器类中传递WayLine类引用
/// </summary>
public WayLine wayline;
/// <summary>
/// 声明时间字段,控制帧数
/// </summary>
private float TimeCache;
private float SpeedZzhou=10;
private void Start()
{
//定义时间字段为当前时间加0.1秒
TimeCache = Time.time + 0.1F;
}
//提供敌人旋转的方法,向着目标点旋转--√
public void EnemyRotateFF(Vector3 Coordinate)
{
this.transform.LookAt(Coordinate);
}
//提供敌人向前方移动的方法--提供重载方法,另外一个方法提供移动速度变量
public void EnemyMoveFF()
{
this.transform.Translate(0,0,SpeedZzhou * Time.deltaTime);
//使用this.transform.Translate(Vector3.forward);同等以上效果
}
//判定敌人是否到达目标点方法
public bool JudgeGotoNode(Vector3 EnemyVector,Vector3 Coordinate)
{
//-----------位置确认是否相等精度需要完全相等判断,太精准会导致如果移动速度过快,对不上会一直尝试对的上的情况。
/*
if (EnemyVector == Coordinate)
{
return true;
}
*/
//-----------位置确认是否相等精度降低至int类型
int EnemyXZhou = (int)EnemyVector.x;
int EnemyYZhou = (int)EnemyVector.y;
int EnemyZZhou = (int)EnemyVector.z;
int CoordinateXZhou = (int)Coordinate.x;
int CoordinateYZhou = (int)Coordinate.y;
int CoordinateZZhou = (int)Coordinate.z;
//float DistanceNum = Vector3.Distance(EnemyVector, Coordinate);
//使用Vector3.Distance方法可以更加精准的控制两点之间判断相等的举例
//Vector3.Distance语法:Vector3.Distance(一个Vector3坐标,另一个Vector3坐标); 返回float类型,视为两点之间的距离
if (EnemyXZhou == CoordinateXZhou && EnemyYZhou == CoordinateYZhou && EnemyZZhou == CoordinateZZhou)
{
return true;
}
return false;
//float DistanceNum = Vector3.Distance(EnemyVector, Coordinate);
}
/// <summary>
/// 寻路方法
/// </summary>
public bool WayFinding()
{
//判断敌人位置与目标点位置是否相等
pd1 = JudgeGotoNode(this.transform.position, wayline.Vector3Var[fornum]);
//不相等执行以下操作
if (pd1 == false)
{
//对着点旋转
EnemyRotateFF(wayline.Vector3Var[fornum]);
//向前方前进需要加入时间限制,调试代码段
/*
if (Time.time >= TimeCache)
{
TimeCache = Time.time + 0.1F;
print("延迟0.1秒记录");
//向前方前进
//EnemyNullObj.transform.Translate(Vector3.forward);
EnemyMoveFF();
print(this.transform.position); //测试语句,打印当前位置
print(LineNodeObj[fornum].transform.position); //测试语句,打印目标点位置
print(fornum); //测试语句,打印当前前往的目标点元素位置
}
*/
EnemyMoveFF();
//print(this.transform.position); //测试语句,打印当前位置
//print(wayline.Vector3Var[fornum]); //测试语句,打印目标点位置
//print(fornum); //测试语句,打印当前前往的目标点元素位置
}
else if (fornum == wayline.Vector3Var.Length - 1) //到达目标点数组的最大值
{
//print("到点!!");
//print(pd1);
//Object.Destroy(this.gameObject); //测试点,到达目标点后,删除当前敌人物体
//Object.Destroy(this.gameObject.GetComponent<EnemyMove>());//测试点,到达目标点后,删除当前敌人移动脚本组件
return true; //true状态代表,寻路到达了所有路线节点的终点
}
else //到达一个目标点
{
//print("到点!!");
//print(pd1);
fornum += 1;
}
return false; //false状态代表,寻路还没有到达所有路线节点的终点
}
}
|