AI:原地巡逻自动攻击型

AI会在横版地图上向左向右移动,移动一段距离后会原地停止移动,等待一段时间后,会随机向左或向右移动,以此循环,其中AI移动速度,移动时间、停留时间均可以自行调控,当人物进入怪物攻击范围后 会自动面向人物进行攻击,攻击时不会移动,直至人物离开攻击范围,怪物受到攻击后会闪红,有血量:

脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ChameleonController : MonoBehaviour
{public static ChameleonController chameleonController;private void Awake(){chameleonController = this;}Animator animator;Rigidbody2D rg;public float MoveSpeed = 0;float changeTime = 0;float time = 0;//随机时间public float minTime = 0;public float maxTime = 0;int direction = 1;float distance_ = 0;bool isChange = false;bool canHit = false;Transform PlayerTransform;public float Distance = 0;float Dwell_gap = 0; //停留时间float Dwell_Cumulative = 0; //停留时间累积public float DwellMinTime = 0;public float DwellMaxTime = 0;float moveTime = 0; //行走时间//行走的最大时间和最短时间设定public float moveMinTime = 0;public float moveMaxTime = 0;float moveTimeCumulative = 0;bool isDwell = false;bool isDwellRange = false;bool CanMove = false;bool CanCount = false;bool CanTimeCumulative = false;bool isAttacking = false;bool isAttacked = false;public bool TrackPlayer = false;public float TrackSpeed = 0;public float CurrentPlayer = 0;public float Life_value = 0;public float hitTime = 0;bool isHit = false;float time1 = 0;GameObject gm;bool isinvincible = false;void Start(){animator = GetComponent<Animator>();rg = GetComponent<Rigidbody2D>();CanMove = false;CanCount = true;}void Update(){PlayerTransform = GameObject.Find("Player").transform;//得到与玩家的距离distance_ = Mathf.Sqrt(Mathf.Abs(PlayerTransform.transform.position.x - transform.position.x) * Mathf.Abs(PlayerTransform.transform.position.x - transform.position.x) +Mathf.Abs(PlayerTransform.transform.position.y - transform.position.y) * Mathf.Abs(PlayerTransform.transform.position.y - transform.position.y));time = time + Time.deltaTime;if(isChange==false){changeTime = Random.Range(minTime, maxTime);isChange = true;}transform.localScale = new Vector3(-direction, 1, 1);if (time > changeTime){direction = -direction;transform.localScale = new Vector3(-direction, 1, 1);time = 0;isChange = false;}//判断是否在攻击距离之内if(distance_<Distance){canHit = true;}else{canHit = false;}if(canHit){//判断玩家在怪物的哪边if (PlayerTransform.transform.position.x < transform.position.x){direction = 1;animator.SetBool("attack", true);GMF_PlayerController._PlayeController.inJured(CurrentPlayer);transform.localScale = new Vector3(direction, 1, 1);}else{direction = -1;animator.SetBool("attack", true);transform.localScale = new Vector3(direction, 1, 1);GMF_PlayerController._PlayeController.inJured(CurrentPlayer);}}else{animator.SetBool("attack", false);}//随机暂停时间 开始暂停 播放停留动画 人物停止移动 生成暂停时间if(CanCount){isDwellRange = true;CanTimeCumulative = true;CanCount = false;}if(isDwellRange) //设置停留动画 设置暂停时间 {Dwell_gap = Random.Range(DwellMinTime, DwellMaxTime);animator.SetBool("idem", true);animator.SetBool("run", false);CanMove = false;isDwellRange = false;}if (CanTimeCumulative){Dwell_Cumulative = Dwell_Cumulative + Time.deltaTime;}if (Dwell_Cumulative > Dwell_gap) //超过暂停时间 停留结束 结束停留动画 生成行走时间 开始行走动画{animator.SetBool("idem", false);animator.SetBool("run", true);moveTime = Random.Range(moveMinTime, moveMaxTime);CanMove = true;Dwell_Cumulative = 0;CanTimeCumulative = false;}//行走时间结束 if(CanMove){moveTimeCumulative = moveTimeCumulative + Time.deltaTime;if(moveTimeCumulative>moveTime){CanMove = false;moveTimeCumulative = 0;CanCount = true;}}if(Life_value<=0){Destroy(this.gameObject);}if (isHit){// animator.SetBool("current", true);time1 = time1 + Time.deltaTime;if (time1 > hitTime){animator.SetBool("current", false);isinvincible = false;isHit = false;time1 = 0;}}}private void FixedUpdate(){//没有停留就可以移动if(CanMove){MoveMent();}}void MoveMent(){if(TrackPlayer==false){rg.velocity = new Vector2(1 * direction * MoveSpeed, 0);}else{if (distance_ < Distance){if(PlayerTransform.transform.position.x < transform.position.x){rg.velocity = new Vector2(-1 * TrackSpeed, 0);}else{rg.velocity = new Vector2( 1 * TrackSpeed, 0);}}}}private void OnTriggerExit2D(Collider2D collision){if(collision.tag=="Player"){CanMove = true;}}private void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "Player"){CanMove = false;}if (collision.tag == "bullte"){if(isinvincible==false){animator.SetBool("current", true);isinvincible = true;isHit = true;}}}public void Current(float value){Life_value = Life_value - value;}}

AI属性面板:

AI动画设置,注意动画的命名要一样,不然需要修改代码:













需要注意的是,每个动画没有过度,直接切换,不然会有一些卡顿

人物标签需要设置为Player

怪物标签需要设置为Chameleon

如果想让怪物之间不能够相互碰撞,让怪物和玩家间可以相互碰撞,可以给怪物AI和玩家分别设置一个碰撞层级,方法如下:
首先我们需要为人物和怪物设置分别设置一个层级,一个是人物层级,一个是怪物层级,点击Layer下拉菜单:

添加一个层级:

接下来:

在编辑下拉菜单下找到Project Setting,将不想发生碰撞的两个层级较差的对勾取消掉

子弹攻击,AI掉血摧毁设置:

bullte为子弹,需要有boxCollider2D,勾选Is Trigger

Unity2D敌人/怪物AI控制 第一期相关推荐

  1. Unity2D 敌人追踪/攻击/移动AI 第二期

    AI功能简介:这个AI是在第一期的基础上进行修改后的AI,第一期的AI不能够自动追踪Palyer,只能够停留在原地不动,现在能够去自动追踪主角,只要进入了追踪范围内,就会一直追踪玩家,直至玩家离开追踪 ...

  2. 游戏编程新手教程:怪物AI设计简述

    怪物AI应该说是这是一个程序问题,如果从策划的角度来说,作为设计者,则需要了解怪物AI整体的设计流程,这样才能提出自己的需求,从而让游戏战斗的整体体验符合设计预期,毕竟怪物AI也是属于战斗和体验的重要 ...

  3. 杀人无人机:AI控制的武器杀人有多容易?这个视频会告诉你

    来源:ATYUN AI平台 Stop Autonomous Weapons(停止自主武器)组织近日在youtubee上发布了一个短片,强调了自主武器的危险性.短片旨在通过民众说服各国停止研发自主武器, ...

  4. [Unity3D]Unity3D游戏开发之怪物AI

    大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei. 在上一篇文章中,我们基本上实现了一个小地图的功能, ...

  5. 细思极恐!使用 AI 控制你的浏览器

    本期推荐开源项目目录: 1. 使用 AI 控制你的浏览器 2. Facebook力作:分割一切 3. 在 Mac 上运行 Stable Diffusion 4. ChatGPT 学术助手 5. 开源的 ...

  6. UnityStandardAsset工程、源码分析_5_赛车游戏[AI控制]_AI机制

    上一章地址: UnityStandardAsset工程.源码分析_4_赛车游戏[玩家控制]_摄像机控制 前几章我们已经将赛车游戏的绝大多数机制分析过了,而Unity还提供了不同的操控模式--AI控制. ...

  7. 怪物AI之发现玩家(视觉范围发现系列)

    在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1 ...

  8. unity3d学习(三)制作敌人简单AI和发射火球

    制作敌人简单AI和发射火球 写在前面: - 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking - 内容:第三章 -unity3d学习(一)制作第一人称 ...

  9. 【浙大脑机接口实验室探秘】人类与AI控制大鼠走出迷宫,C10背负的混合智能未来(视频)...

    (文/杨静 )我对浙江大学的脑机接口研究长久以来抱有朝圣般的浓厚兴趣,主要是受浙江大学计算机学院潘纲教授的影响.他在一次演讲里展示了脑控大鼠在一名研究人员的脑电波控制下,快速走迷宫的神奇现场,这只大鼠 ...

最新文章

  1. weblogic域,管理服务器,受管服务器,集群和机器的基本知识
  2. 虚拟私有云网络VPC
  3. elastic date时区问题解决办法
  4. Tsung MQTT协议简介及MQTT xml文档配置介绍
  5. flask基础之LocalProxy代理对象(八)
  6. 直角三角形知道两边求角度_每日一讲:解直角三角形(3.21)
  7. log日志轮转--logrotate
  8. Sql Server 部署SSIS包完成远程数据传输
  9. 数据查询和业务流分开_TiDB HTAP 助力小红书业务升级
  10. 使用jsoncpp解析生成json
  11. 如何让网站在百度有LOGO展示
  12. mysql 5.1主从_MySQL5.1版本的主从复制搭建 | 学步园
  13. java 类 date_第十九回:Java常用类之Date
  14. 群联MPALL v3.23.00量产工具(可刷PS2251-50固件)
  15. JSONP 跨域原理
  16. ThoughtWorks思特沃克2018校园招聘之春招家庭作业 - 无人机
  17. 年度总结 | 回味2022不平凡的一年
  18. 计算机管理如何格式化u盘,如何格式化U盘【图文教程】
  19. 线程池6th卷:大展经纶补天手
  20. 2018最新CATIA飞机协同设计制造工作站配置方案

热门文章

  1. c语言电脑快捷键截屏,三、Windows键盘快捷键—快捷键表
  2. 华为真的会裁掉35岁以上的程序员吗?
  3. python 判断一个数是整数还是小数
  4. 鸿蒙os苹果ios对比,华为鸿蒙OS与苹果iOS测试,谁更流畅,真实对比大家看一下...
  5. Windows双系统Ubuntu18.04安装分区过程
  6. 《Log4j 2 官方文档》多余性(Additivity)
  7. mysql 启用myisam_mysql存储引擎之myisam学习
  8. 项目成功经验分享:做好项目承诺管理
  9. 都2022年了,还有人在吵硬盘分区这事。。。
  10. 微软 Microsoft 面试 要求 资格