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

相关文章

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

SpringBoot集成Shiro+JWT(Hutool)完整代码示例

《SpringBoot集成Shiro+JWT(Hutool)完整代码示例》ApacheShiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,在现代应用开发中,Shiro因... 目录一、背景介绍1.1 为什么使用Shiro?1.2 为什么需要双Token?二、技术栈组成三、环境

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配