Unity3D关于AI的编写代码

2024-09-03 17:32
文章标签 代码 ai 编写 unity3d

本文主要是介绍Unity3D关于AI的编写代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. Unity3D简单AI编写

  由于这次介绍的AI很简单,代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,这里只是初步实现,所以想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等。

  1 Enemy_AI.js

  2

  3 private var Regression : Vector3;

  4 public var Player_Prefab : Transform;

  5 public var Enemy_State : String;

  6 public var Doing : boolean = true;

  7 public var Range : float = 4.0;

  8 public var Bullet : Transform;

  9 public var Bullet_Prefab : Transform;

  10 //初始化敌人方向和位置

  11 function Start()

  12 {

  13 transform.localEulerAngles.y = Random.value * 360;

  14 Regression = transform.position;

  15 }

  16 //敌人行动模式

  17 public var Thinking : boolean = true;

  18 public var Thinking_Time : float = 1.0;

  19 private var relativePos : Vector3;

  20 private var rotation : Quaternion;

  21 public var Facing : boolean = false;

  22 public var Facing_Time : float = 2.0;

  23 public var Facing_Speed : float = 2.0;

  24 public var Moving : boolean = false;

  25 public var Moving_Speed : float = 0.5;

  26 public var Moving_Time : float = 4.0;

  27 public var Moving_Back : boolean = false;

  28 public var Attacking : boolean = false;

  29 private var Bullet_DO : boolean = true;

  30 public var Bullet_CD : float = 0.2;

  31 //随机移动方位

  32 private var R_Position : Vector3;

  33 function Update ()

  34 {

  35 if(Attacking)

  36 {

  37 Enemy_State = "Attacking";

  38 Facing = true;

  39 Moving = true;

  40 //Doing = true;

  41 Thinking = false;

  42 var dist2 = Vector3.Distance(Regression, transform.position);

  43 if(dist2 > 20)

  44 {

  45 relativePos = Regression - transform.position;

  46 rotation = Quaternion.LookRotation(relativePos);

  47 Attacking = false;

  48 Moving_Back = true;

  49 }

  50 }

  51 if(!Moving_Back)

  52 {

  53 var dist = Vector3.Distance(Player_Prefab.position, transform.position);

  54 if(dist > 100)

  55 {

  56 Attacking = false;

  57 return;

  58 }

  59 else if(dist < 5)

  60 {

  61 Attacking = true;

  62 }

  63 RayJudge();

  64 }

  65 transform.localEulerAngles.x = 0;

  66 transform.localEulerAngles.z = 0;

  67 if(Thinking && !Attacking && !Moving_Back)

  68 {

  69 Enemy_State = "Thinking";

  70 if(Doing)

  71 {

  72 StartCoroutine(Think(Thinking_Time));

  73 Doing = false;

  74 }

  75 }

  76 if(Facing)

  77 {

  78 Enemy_State = "Facing";

  79 if(Attacking)

  80 {

  81 relativePos = Player_Prefab.position - transform.position;

  82 rotation = Quaternion.LookRotation(relativePos);

  83 transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);

  84 }

  85 else if(Moving_Back)

  86 {

  87 transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);

  88 }

  89 else

  90 {

  91 transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed);

  92 if(Doing)

  93 {

  94 StartCoroutine(Face(Facing_Time));

  95 Doing = false;

  96 }

  97 }

  98 }

  99 if(Moving)

  100 {

  101 Enemy_State = "Moving";

  102 if(Moving_Back)

  103 {

  104 transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 6);

  105 }

  106 else if(dist > 2)

  107 {

  108 if(Attacking)

  109 {

  110 transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 4);

  111 }

  112 else

  113 {

  114 transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed);

  115 }

  116 }

  117 if(Doing && !Attacking)

  118 {

  119 StartCoroutine(Move(Moving_Time));

  120 Doing = false;

  121 }

  122 }

  123 }

  124 //前方锁敌

  125 function RayJudge()

  126 {

  127 var layerMask = 1 << 2;

  128 layerMask = ~layerMask;

  129 var hit : RaycastHit;

  130 if(Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, 20,layerMask))

  131 {

  132 var distanceToForward = hit.distance;

  133 if(hit.transform.tag == "Player")

  134 {

  135 Attacking = true;

  136 if(Bullet_DO)

  137 {

  138 var Create = Instantiate (Bullet_Prefab, Bullet.position, Quaternion.identity);

  139 Create.rigidbody.AddForce (Bullet.forward * 1000);

  140 StartCoroutine(Wait(Bullet_CD));

  141 Bullet_DO = false;

  142 }

  143 }

  144 }

  145 }

  146 function Wait(waitTime : float)

  147 {

  148 yield WaitForSeconds (waitTime);

  149 Bullet_DO = true;

  150 }

  151 function Move(waitTime : float)

  152 {

  153 print("Move");

  154 if(Moving_Back)

  155 {

  156 yield WaitForSeconds (waitTime * 0.4);

  157 }

  158 else

  159 {

  160 yield WaitForSeconds (waitTime + Random.value * 2);

  161 }

  162 Thinking = true;

  163 Moving_Back = false;

  164 Moving = false;

  165 Facing = false;

  166 Doing = true;

  167 }

  168 function Face(waitTime : float)

  169 {

  170 print("Face");

  171 yield WaitForSeconds (waitTime + Random.value);

  172 Facing = false;

  173 Thinking = false;

  174 Moving = true;

  175 Doing = true;

  176 }

  177 function Think(waitTime : float)

  178 {

  179 print("Thinking");

  180 yield WaitForSeconds (waitTime + Random.value);

  181 R_Position = Regression + Random.insideUnitSphere * Range;

  182 R_Position.y = Regression.y;

  183 relativePos = R_Position - transform.position;

  184 rotation = Quaternion.LookRotation(relativePos);

  185 Thinking = false;

  186 Moving = false;

  187 Facing = true;

  188 Doing = true;

  189 }

  2.Unity学习过程中的一些细节分析

  1.获取位置坐标:当你translate.position获取的不是物体在世界的坐标时可以试试translate. localRotation

  2.改变旋转角度:这里多半是用translate.localRotation= Quaternion.Euler(x,y,z);

  3.如何更改鼠标指针图片,这也是羽化以后可能遇到的问题,这里只能简单分析下,首先把鼠标默认指针隐藏掉Screen.showCursor=flase;再用个粒子或者图片代替,具体位置可以用Camera.main.ScreenToWorldPoint()Input.mousePosition获得。但有个问题就产生了,UI会遮挡鼠标,鼠标图片用UI代替总感觉不妥。。。所以羽化还没想出解决方法- -

  4.有关过场Loading的制作,一张图片还好说,换个Scene或者写个UI都能解决,动态Loading的是用Application.LoadLevelAsync可以达到效果,或者是预加载,具体可以看看羽化无缝地图研究博文里面的一个别墅例子。

  5.也许有一天你也会遇到脚本用C#编写时遇到一些莫名其妙的错误,所以这里羽化建议动态脚本命令最好用js写。

t; margin-top:0pt; " > 

这篇关于Unity3D关于AI的编写代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133583

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工