【Unity2D】实现敌人Enemy简单AI的巡回移动

unity敌人的巡逻 unityunity游戏开发过程中,敌人、怪物的自动巡逻肯定是无法避免的,今天主要讲 给敌人和怪物设置定点巡逻。 阅读详情

上一篇文章:【Unity2D】实现敌人随机简单AI来回移动_dangoxiba的博客-CSDN博客先把制作好动画帧表格导出来,我的是32*32像素的,按下面两张图把参数修改一下,并且裁剪出四张图来,把第一张图作为一个游戏对象再准备好一个EnemyBlueBug的C#脚本,我们就来编写代码,设计好随机移动,以及能移动的范围。using System.Collections;using System.Collections.Generic;using UnityEngine;public class EnemyBlueBug : Enemy{ public float mo..https://blog.csdn.net/dangoxiba/article/details/122698155

参考视频:秦无邪OvO的个人空间_哔哩哔哩_Bilibili秦无邪OvO,独立游戏开发者/美术/编曲;秦无邪OvO的主页、动态、视频、专栏、频道、收藏、订阅等。哔哩哔哩Bilibili,你感兴趣的视频都在B站。icon-default.png?t=N7T8https://space.bilibili.com/335835274?from=search&seid=2940030192624790742&spm_id_from=333.337.0.0

学习目标:

实现敌人Enemy简单AI的巡回移动,上一篇文章讲到位置的随机移动,现在可以来实现巡回来移动,这里采用左右移动。


学习内容:

先把几个空对象设置好,leftPos,rightPos还有EnemyBlueBug,必须处于y轴平行,即y轴位置相同,然后就把EnemyBlueBug贴着墙的最左最右边,leftPos,rightPos即可粘贴他的位置。

然后改进一下上次打的代码


代码部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyBlueBug : Enemy
{
    public float moveSpeed;
    public float startTime;
    public float waitTime;

    public Transform leftPos;
    public Transform rightPos;
    public Transform movePos;
   public void Start()
    {
        base.Start();
        waitTime = startTime;
        movePos.position = leftPos.position;
    }

    // Update is called once per frame
   public void Update()
    {
        base.Update();
        transform.position = Vector2.MoveTowards
                                     (transform.position, movePos.position, moveSpeed * Time.deltaTime);
        if(Vector2.Distance(transform.position, leftPos.position) < 0.05f)
        if (waitTime <= 0)
        {
            movePos.position = rightPos.position; 
        }
        else
        {
            waitTime -= Time.deltaTime;
        }
        if (Vector2.Distance(transform.position, rightPos.position) < 0.05f)
            if (waitTime <= 0)
            {
                movePos.position = leftPos.position;
            }
            else
            {
                waitTime -= Time.deltaTime;
            }
    }

然而这里没有对敌人进行转向的功能,再加几行即可。

前面那段逆天,后面不知道为什么到右边的墙不会旋转,也改不了Righbody2D的速度

在其他视频发现Scale改变x的值即可。

下面是最终代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyBlueBug : Enemy
{
    public float moveSpeed;
    public float startTime;
    public float waitTime;

    public Transform leftPos;
    public Transform rightPos;
    public Transform movePos;

    private Rigidbody2D rb2D;
   public void Start()
    {
        base.Start();
        rb2D = GetComponent<Rigidbody2D>();
        waitTime = startTime;
        movePos.position = leftPos.position;
        
    }

    // Update is called once per frame
   public void Update()
    {
        base.Update();
        transform.position = Vector2.MoveTowards
                                     (transform.position, movePos.position, moveSpeed * Time.deltaTime);
        if (Vector2.Distance(transform.position, leftPos.position) < 0.1f)
        {
            if (waitTime <= 0)
            {
                waitTime = startTime;
                transform.localScale = new Vector3(-1, 1, 1);
                //transform.localRotation = Quaternion.Euler(0, -180, 0);
                movePos.position = rightPos.position;

            }
            else
            {
                waitTime -= Time.deltaTime;
            }

        }

        if (Vector2.Distance(transform.position, rightPos.position) < 0.1f)
        {
            if (waitTime <= 0)
            {
                waitTime = startTime;
                transform.localScale = new Vector3(1, 1, 1);
               // transform.localRotation = Quaternion.Euler(0, -180, 0);
                movePos.position = leftPos.position;

            }
            else
            {
                waitTime -= Time.deltaTime;
            }
        }
    }
    //Vector2 GetRandomPos()
    //{
    //    Vector2 randomPosition = new Vector2(Random.Range(leftPos.position.x, rightPos.position.x),
    //        Random.Range(leftPos.position.y, rightPos.position.y));
    //    return randomPosition;
    //}
}

 


学习产出:

新学了一个通过Transform.localScale的x值可以转向

Unity敌人的自动巡逻脚本 此脚本可实现敌人的自动巡逻,随机方向,随机距离。 阅读详情

相关推荐

Unity2D入门教程】简单制作战机弹幕射击游戏④C#编写 敌人按指定路径以及敌人生成点脚本

前言: 我们前面忘记设置的当敌机和子弹碰到特定的位置(指屏幕外的)就会自动销毁 挂载的脚本Sherred如下 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Shredder : MonoBehaviour { private void OnTriggerEnter2D(Collider2D collision) { Destr

dangoxiba的博客 2859

unity造轮子】2d敌人AI实现,并自动躲避障碍物

unity造轮子】2d敌人AI实现,并自动躲避障碍物

Unity简单敌人巡逻方法(NavMeshAgent)

这个方法需要在外部定义一个Vector3的数组,如5,0,5,移动的位置就是当前位置减去5,0,5,数组的数量越多,巡逻点越多,数字越大巡逻的距离越远,这个方法稍微改动以下可以做成定点巡逻。基于NavMeshAgent的敌人巡逻方法。在Update方法中判断是否抵达目标。

u010158191的博客 1707

unity2d实现简单敌人AI

以上代码中,我们使用了A*算法来寻找敌人与玩家之间的最短路径。其中,FindShortestPath函数用来寻找敌人和玩家之间的最短路径,AvoidObstacles函数用来检测前方障碍物并躲避之,Update函数用于在游戏运行时不断调用这些函数。1.寻路追踪玩家:首先,需要获取敌人和玩家的位置信息,并计算它们之间的距离。可以使用避障算法,(比如基于射线的避障算法、膨胀算法、人工势场算法)来帮助敌人在遇到障碍物时自动绕开它们的路径。3.寻找最短距离:可以使用A*算法来寻找敌人和玩家之间的最短路径。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1066

Unity-2D游戏-打击感与敌人AI

基本配置完成,打击感满满功能基本完成。

#的博客 3468

unity2D横板游戏教程6-敌人AI以及受击动画

unity2D横版教程6-敌人AI以及受击动画

qq_52905520的博客 3664

Unity2d 学习笔记(三)敌人自动巡航

实现思路 在游戏中,敌人通常是可以自动在地图上巡航的,这篇文章就用一个脚本简单实现这个功能。 假设我们让敌人沿着矩形自动巡航,那么我们需要写一个小型的状态机,一共有四种状态:上,下左,右。加入我们要让敌人按照顺时针方向的矩形路径自动巡航,那么状态切换应该是上->右->下->左 。然后我们设定一下每个方向巡航的距离,这个距离就是函数检查的次数(不是物理意义上的距离),每当函数检查一次,那么这个距离就减一,当这个距离等于0的时候我们需要切换状态,然后重新设定距离的值。 以上就是简单的自.

haohulala的博客 2574

Unity2D实现敌人随机简单AI来回移动

先把制作好动画帧表格导出来,我的是32*32像素的,按下面两张图把参数修改一下,并且裁剪出四张图来,把第一张图作为一个游戏对象 再准备好一个EnemyBlueBug的C#脚本,我们就来编写代码,设计好随机移动,以及能移动的范围。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyBlueBug : Enemy { public float mo..

dangoxiba的博客 4416

Unity学习记录5——敌人简单AI检测

首先,我们可以使用这个Physics2D这个类来进行侦测玩家Physics2D他提供了很多模拟2D物理行为的方法~注:Physics2D.OverlapBox用于检测在指定的2D盒子区域内重叠的碰撞器,参数:检测盒子的中心位置,盒子大小,角度,检测碰撞图层~我这里是检测玩家图片playerLayer。如果想方便在unity界面中方便调节盒子位置大小,我们可以使用OnDrawGizmos,它可以使我们在场景绘制图形效果如下:然后到了我们敌人判定的脚本代码。

qq_52772299的博客 1128

Unity 使用AI插件制作简单平面2DAI敌人

利用 NavMeshPlus 搭配 Unity自带的AI Navigation制作俯视角2D敌人,我拿我制作的一款2D坦克对战的游戏举例子,先看视频,实现了自动寻路,释放子弹躲避子弹的功能。项目4这种方法应该是最方便快捷的方法了,大家感兴趣可以自己探索这个插件更深处。如果想体验我做的坦克与人机对决,可以在taptap搜指尖坦克体验。

m0_74150901的博客 1095

unity2D敌人自动移动AI

注:本篇为本人的学习笔记,详情见b站up:Michael-studio 版本信息:unity2020.3 实现内容:敌人左右走动 当然了 ,也会时不时跳一下发个子弹啥的,but咱还没学到那,哎嗨,不会。 纯代码,基本思路就是:给敌人限制一个左右范围,判断-到最左侧了则向右转,往右移动,到最右侧了则向左转,往左移动 转向改transform.localscale,运动改rigidbody.velocity 代码如下 usingSystem.Collections; usingSyst..

karonneveralone的博客 3758

unity3d 通过Nav Mesh Agent组件实现敌人巡逻以及有关“SetDestination”报错问题解决

这里也有一个需要注意,pos1,pos2的Y轴的值尽量与地面的Y轴贴近,不然导航的时候会出现角色乱走的情况。在实现敌人自动巡逻这一块我们可以通过使用unity自带组件Nav Mesh Agent(导航网格代理),在省去冗杂的代码量的同时可便利的实现这一功能。"GetRemainingDistance" can only be called on an active agent that has been placed on a NavMesh!这个让人懵的错误要引入NavMesh的动态烘培的概念

m0_64652083的博客 4360

2D游戏中怎样移动 敌人移动到玩家面前

2D游戏中 敌人移动到玩家面前 //放到循环里   public override void Move(Transform player, Transform npc)         {             //旋转方向             LooakAtPlayer(npc,player);             //移动        

绀目澄清 2825

unity实战】在Unity中使用有限状态机制作一个敌人AI

有限状态机以前的我嗤之以鼻,现在的我逐帧分析。其实之前我就了解过有限状态机,但是奈何那时能力不够,并不能理解其中的奥秘,只觉得麻烦。直到我项目需要越来越多的去编写敌人AI,大量的if else让我头晕目眩,各种状态的切换和调试耗费我大量的时间。于是我又重新查找一些状态机的教程进行深入学习。以下我我的学习记录,希望对你有帮助。如果后续项目使用时存在任何问题我还会回来补充和调整,文章的代码我也会尽量保持完整分享,以便大家可以复制粘贴盗自己的项目中即可使用。待机状态// 计时器// 计时器累加。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3517

this关键字

this关键字

longxiaozhang6的博客 371
上一篇: 【Unity2D】实现敌人随机简单AI来回移动
下一篇: 【Unity2D】实现敌人掉血的粒子特效
dangoxiba
博客等级 码龄5年 674粉丝 99原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值