Unity实现敌人沿着指定路线移动

这篇具有很好参考价值的文章主要介绍了Unity实现敌人沿着指定路线移动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        使用的是2D模板,但是除了增加一个Z轴的考虑,其它基本都是一样的,当然如果你的3D场景是平坦面的话几乎代码可以直接复用。

        想要让敌人沿着指定路线移动,就要规定他需要移动的路点位置。

        在这里,我采用的是建立一个空对象line,在再这个line对象底下一次插入空对象point,使用空对象的原因是因为我们只需要路点得到的位置,除非特殊需求,我们不需要其它的组件属性,为了便于观察,设置点的图标,确定敌人是否会沿着点位移动。

unity物体按固定路线移动,unity,游戏程序

        接下来,关键就是如何取得这些点位的位置了,最开始我尝试使用GetComponentsInChildren<GameObject>();拿到所有的子物体,再取得所有子物体的TransForm获得位置,但是实际上这个方法不能直接拿子物体本身,所以<>中至二级选择取TransForm就可以了,之后的部分就非常简单了,见代码。

//这个的理解难度相比于弹幕追踪要简单很多,实现难度也低很多,所以注释会比较少
public class AI_Move_line : MonoBehaviour
{
    public GameObject line;//线路组

    public Transform[] line_array;//所有路点位置的数组

    [Range(0, 50)]
    public float speed;//移动速度

    [Range(0, 2)]
    public int move_method;//移动循环方式
    //0为从出发点开始,到终点时从起点为目标再次开始循环移动
    //1为到了终点后,沿着原路返回,回到起始点后再次按路径到终点
    //2为到了终点后将不再移动

    private Rigidbody2D body;//刚体组件

    [Range(0, 10)]
    public float point_waittime;//每次到达一个位置后的的等待时间

    [Range(0, 10)]
    public float point_distance;//距离路点的位置容忍差

    private int index;//标点位置

    private bool set = true;//路径移动辅助,默认true

    void Start()
    {
        index = 0;
        body = GetComponent<Rigidbody2D>();
        line_array = line.GetComponentsInChildren<Transform>();//拿到所有的路点,确定寻路位置
    }


    void Update()//根据选择的移动方式进行移动
    {
        switch (move_method)
        {
            case 0:
                Move_line0();
                break;
            case 1:
                Move_line1();
                break;
            case 2:
                Move_line2();
                break;
            default:
                break;
        }
    }

    private float Get_Distance(Transform point)//获取物体和路点的距离
    {
        return Vector3.Distance(transform.position, point.position);
    }

    void Move_line0()//移动方式-0,这个判断格式使得此方法可以复用
    {
        if (Get_Distance(line_array[index]) <= point_distance && set)
        {
            index = (index + 1) % line_array.Length;
        }
        else if (Get_Distance(line_array[index]) <= point_distance && !set)
        {
            index--;
        }
        Move();
    }

    void Move_line1()//移动方式-1,到大最后一个点是修改set,使得line0中index从自增改为自减
    {
        if(index == line_array.Length - 1 && set)
        {
            set = false;
        }
        else if(index == 0 && !set)
        {
            set = true;
        }
        Move_line0();
    }

    void Move_line2()//判断到达终点后不再进行移动操作
    {
        if(index == line_array.Length -1 && Get_Distance(line_array[index]) <= point_distance)
        {
            return;
        }
        else
        {
            Move_line0();
        }
    }

    void Move()//朝向目标移动
    {
        Vector2 rot = line_array[index].position - transform.position;
        rot = rot.normalized;
        Vector2 position = transform.position;
        position.x += rot.x * speed * Time.deltaTime;
        position.y += rot.y * speed * Time.deltaTime;
        body.MovePosition(position);
    }
}

        line的作用就是存储路径,我们可以在编辑器界面设置好线路后,只需要将线路对象给line变量,就可以通过GetComponentsInChildren拿到所有子物体点的位置,特别要注意的一点是,这个方法还会将父物体本身的TransForm返回,如果你不想要计入这个点,可以将index起始设置为1。

另外这段代码其实很亢余,有些函数的调用判断其实可以简化的(Get_Distance)就是,所以仅做参考,实际使用需要学会简化算法的时间复杂度和空间复杂度,优化结构,节省性能开销。

        再来看看我设置的三种方式移动效果

unity物体按固定路线移动,unity,游戏程序

unity物体按固定路线移动,unity,游戏程序

unity物体按固定路线移动,unity,游戏程序 

        线路移动可以用于设置敌人沿着某个固定路线移动,从而产生一种巡逻的效果,当发现玩家时就退出线路移动追踪玩家,否则继续沿着路径移动。另外这些点在游戏中改变了位置时,敌人也会改变随之移动路径。文章来源地址https://www.toymoban.com/news/detail-530348.html

到了这里,关于Unity实现敌人沿着指定路线移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity让一辆越野车沿着指定路径自动行驶(非手动操作)

    本文根据油管作者EYEmaginary原视频创作,视频地址是Car AI Tutorial #1 (Unity 5 ) - Make the Path - YouTube 本文主要做的是对视频中的内容进行分析和讲解,如果各位有时间请去看原视频。以下内容如有错误请留言评论,欢迎理性讨论。  本文详细介绍视频中的内容,具体实现的效果可以

    2024年02月04日
    浏览(28)
  • [Unity] 使用Mathf函数实现平滑移动物体的7种方法

     Unity中要利用Mathf中的函数实现物体的平滑运动,有以下7种方法: Mathf.SmoothDamp、Mathf.Lerp、Mathf.SmoothStep三个方法非常相似,分别使用三个方法移动同一个物体的效果如图所示: 可以看出,三者均是先快后慢,但SmoothDamp方法会有一些卡顿;SmoothStep与Lerp比较起来,Mathf.Smooth

    2024年02月12日
    浏览(36)
  • Unity实现用WASD控制一个物体前后左右移动-小白课程01

      02 根据业务写代码   完成

    2024年02月09日
    浏览(37)
  • Unity虚拟相机Cinemachine-实现相机自动移动到指定位置

    介绍两种方法, 第一种使用虚拟相机自带DollyCart和DollyTrack进行设置; 第二种使用时间线Timeline和DollyTrack进行设置 1.首先添加图中三个虚拟相机 2.点击 DollyTrack,添加点,设置轨道 3.调整点的位置,使轨道在相机移动的起点和终点保持平滑 4.设置Dolly Cart,将轨道拖拽到Dolly

    2024年01月25日
    浏览(36)
  • 在Unity中,实现两点生成抛物线,物体在生成的抛物线上移动的效果。

    创建游戏物体:编写脚本,将游戏物体放置在抛物线上,让游戏物体沿抛物线移动。

    2024年02月16日
    浏览(33)
  • Unity之用代码移动物体(平滑移动)

    因为移动的起点和终点都是不确定,所以这里用代码进行实现而不是动画(试过动画,但是发现无法成功添加clip) 物体移动常用的有两个方法,一个是Mathf.MoveTowards,一个是Mathf.Lerp,他们都用于值的平滑过渡 Mathf.MoveTowards          current:起点位置         target:目

    2024年02月07日
    浏览(28)
  • Unity点击物体后,移动到物体所在位置

    脚本挂在被点击的物体上 脚本挂在角色控制器上 改进:使用Raycast中的LayerMask 创建“cube”层 将想要被检测的物体放入该层 3.1、 3D物体事件监听 在相机上挂Physics Raycaster组件 检查是否有EventSystem 将脚本挂在被点击的物体上 添加组件Event Trigger组件 3.2、 世界UI世界监听

    2024年02月07日
    浏览(38)
  • Unity中的物体移动

    局部坐标系(Transform.localPosition)是指当前物体相对于父物体的位置,会受到父物体的影响。 世界坐标系(Transform.Position)是指当前物体在世界空间坐标系中的位置,不受父物体影响。 若该物体有父类,则二者的关系为:该物体的世界坐标=该物体父类的世界坐标+该物体的局

    2024年02月03日
    浏览(42)
  • Unity 控制物体移动

    目录 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController以及碰撞检测 一、相关代码展示 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController 以及碰撞检测 注:使用时首先要给物体添加CharacterC

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包