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

相关文章

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La