Unity简单AI编写

C# 如何高效使用 AI 提高代码质量 但需要注意的是,AI 只是一种工具,开发者仍然需要对代码有深入的理解,并对 AI 提出的建议进行适当的评估和调整,以确保最终的代码符合项目的要求和最佳实践。同时,AI 可以根据代码的复杂度和功能,建议合理的测试覆盖率目标,帮助开发者更好地规划测试工作。以编写一个 C# 中的数据库访问层为例,当你定义了数据库连接字符串和相关的实体类后,AI 可以帮助生成基本的 SQL 查询语句执行方法,如Select、Insert、Update和Delete操作的代码,大大减少了手动编写这些重复性代码的时间。 阅读详情

开发环境

Window7

Unity3D  3.4.1

MB525defy   Android 2.2.1

         羽化的第十二篇博客。最近心情挺好,开始看C#了-0- 为了进一步巩固Unity,当你学了一个计算机语言再学另一个语言发现其实很容易,计算机语言都有很多共通之处,现在学C#真有点原来写VB的感觉,想想时间过得真快啊,已经毕业4个月了,自己到底成长了多少,得到多少,也就只有自己知道。。。羽化一直认为每个人都有各自的特长,有些人一直找不到成功的诀窍可能是因为没找到自己到底在哪方面拥有天赋,努力是很重要,但往不正确的地方努力也许会迷失自己。今天才和室友们一起出去吃饭,大家干着不一样的工作,过不一样的生活,拿着不一样的工资,也有各自的烦恼与苦闷,但能聚在一起谈天谈地,没有身份高低,这种畅所欲言的感觉也许只有这里才能体会到,真心希望大家都能找到奋斗的方向,怀念在117一起生活的日子,虽然只过去4个月。。。

         话说羽化买到了10月回家的车票,现在买火车票真是便利啊,自动售票系统应用很完善,但还是觉得中国铁路票价很坑爹,卖票人员都跟你扯一些理由不卖你票,但换个窗口说不定有票,而且每次回家都晚点,估计这次也是,全世界也就国人能忍受这种不负责任的态度,说起就气啊=。= 不说这些了,这里祝大家10.1出去旅游还是回家的同志一路顺风,玩得愉快~ ~

         这次是一个简单的AI编写,没有仿照任何一个人的做法,羽化因为觉得很有趣在工作时心血来潮简单写的一个,平时也可以Demo演示用用,写的时间不长,但也将就能用,以后把这AI完善了再传上来分享,有什么好的AI书籍推荐都可以给羽化留言,喜欢的朋友可以拿去看看,虽然写得很简陋,不接受嘲讽-0-

 

本次学习:

1.      Unity简单AI编写

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

 

1.   Unity简单AI编写

       由于这次介绍的AI很简单,羽化就把代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,有经验的人认为羽化这样写得不对,由于这里只是初步实现,所以羽化想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等,这里代码送上。这次没有写Android的控制器,但肯定可以在Android下用的-0-

Enemy_AI.js

private var Regression : Vector3;
public var Player_Prefab : Transform;
public var Enemy_State : String;
public var Doing : boolean = true;
public var Range : float = 4.0;
public var Bullet : Transform;
public var Bullet_Prefab : Transform;

//初始化敌人方向和位置
function Start()
{
	transform.localEulerAngles.y = Random.value * 360;
	Regression = transform.position;
}

//敌人行动模式
public var Thinking : boolean = true;
public var Thinking_Time : float = 1.0;
private var relativePos : Vector3;
private var rotation : Quaternion;

public var Facing : boolean = false;
public var Facing_Time : float	= 2.0;
public var Facing_Speed : float = 2.0;

public var Moving : boolean = false;
public var Moving_Speed : float = 0.5;
public var Moving_Time : float = 4.0;
public var Moving_Back : boolean = false;

public var Attacking : boolean = false;
private var Bullet_DO : boolean = true;
public var Bullet_CD : float = 0.2;

//随机移动方位
private var R_Position : Vector3;

function Update () 
{
	if(Attacking)
	{
		Enemy_State = "Attacking";
		Facing = true;
		Moving = true;
		//Doing = true;
		Thinking = false;
		var dist2 = Vector3.Distance(Regression, transform.position);
		if(dist2 > 20)
		{
			relativePos = Regression - transform.position;
			rotation = Quaternion.LookRotation(relativePos);
			Attacking = false;
			Moving_Back = true;
		}
	}
	if(!Moving_Back)
	{
		var dist = Vector3.Distance(Player_Prefab.position, transform.position);
		if(dist > 100)
		{
			Attacking = false;
			return;
		}
		else if(dist < 5)
		{
			Attacking = true;
		}
		RayJudge();
	}
	
	transform.localEulerAngles.x = 0;
	transform.localEulerAngles.z = 0;
	
	if(Thinking && !Attacking && !Moving_Back)
	{
		Enemy_State = "Thinking";
		if(Doing)
		{
			StartCoroutine(Think(Thinking_Time));
			Doing = false;
		}
	}
	if(Facing)
	{
		Enemy_State = "Facing";
		if(Attacking)
		{
			relativePos = Player_Prefab.position - transform.position;
			rotation = Quaternion.LookRotation(relativePos);
			transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);
		}
		else if(Moving_Back)
		{
			transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);
		}
		else
		{
			transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed);
			if(Doing)
			{
				StartCoroutine(Face(Facing_Time)); 
				Doing = false;
			}
		}
	}
	if(Moving)
	{
		Enemy_State = "Moving";
		if(Moving_Back)
		{
			transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 6);
		}
		else if(dist > 2)
		{
			if(Attacking)
			{
				transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 4);
			}
			else
			{
				transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed);
			}
		}
		if(Doing && !Attacking)
		{
			StartCoroutine(Move(Moving_Time));
			Doing = false;
		}
	}
}

//前方锁敌
function RayJudge()
{
	var layerMask = 1 << 2;
    layerMask = ~layerMask;
	
	var hit : RaycastHit;
	
	if(Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, 20,layerMask)) 
	{
		var distanceToForward = hit.distance;
		if(hit.transform.tag == "Player")
		{
			Attacking = true;
			if(Bullet_DO)
			{
				var Create = Instantiate (Bullet_Prefab, Bullet.position, Quaternion.identity);
				Create.rigidbody.AddForce (Bullet.forward * 1000);
				StartCoroutine(Wait(Bullet_CD)); 
				Bullet_DO = false;
			}
		}
	}
}

function Wait(waitTime : float)
{
	yield WaitForSeconds (waitTime);
	Bullet_DO = true;
}

function Move(waitTime : float)
{
	print("Move");
	if(Moving_Back)
	{
		yield WaitForSeconds (waitTime * 0.4);	
	}
	else
	{
		yield WaitForSeconds (waitTime + Random.value * 2);	
	}
	Thinking = true;
	Moving_Back = false;
	Moving = false;
	Facing = false;
	Doing = true;
}

function Face(waitTime : float)
{
	print("Face");
	yield WaitForSeconds (waitTime + Random.value);
	Facing = false;
	Thinking = false;
	Moving = true;
	Doing = true;
}

function Think(waitTime : float)
{
	print("Thinking");
	yield WaitForSeconds (waitTime + Random.value);
	R_Position = Regression + Random.insideUnitSphere * Range;
	R_Position.y = Regression.y;
	relativePos = R_Position - transform.position;
	rotation = Quaternion.LookRotation(relativePos);
	Thinking = false;
	Moving = false;
	Facing = true;
	Doing = true;
}

工程截图(这里是9个拿枪的敌人- - 蓝色为控制角色,WASD控制行动)


  

       还是那句话,代码本身并不难,羽化也是初学者写不出让人觉得高深的代码-0-,高手也许看一眼就知道这是一个简单的状态切换判断而已,羽化也是从原来Android游戏经验中提取出来的,因为原来都有个FrameWork,框架控制着整个游戏构成,于是就想像AI也能如此,这种敌人AI要有更多的随机性和针对性才能让人觉得真实吧,代码没什么优化,也许效率不是很好,以后估计要添加复杂地形寻路,技能释放,攻击站位判断等内容了,话说原来杨写的那AI真叫个凶残。。。


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

         最近群里面人原来越多,当初羽化加圣典2群的时候才30个不到的人,现在已经120个人了,想想Unity普及得也够快的,于是就出现了各种问题有人问,有些问题可能新手一直搞不清楚,老鸟们又懒得回答-0- 羽化不是高手,这里只是说说一些可能遇到的问题,与大家分享下。

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写。。。

 

 

本次工程下载地址(羽化只想说优快云的上传很不给力啊-0-):

 http://dl.dbank.com/c0ngaqgbzz

 

下集预告:

Unity3D游戏开发之切割方块(Android支持- -)
Unity新手适合的简单AI 初学unity的朋友大家可能在制作自己脑海中的游戏的时候回用到AI 今天我来写一篇关于简单AI的代码及教程 第一步 首先在项目中创建一个Cube和一个Plane吧 在plane上添加脚本(在其他物体上添加也是可以的) 首先我们把这个cube制作成一个预制体; 然后这个cube就可以删除了 在之后就是编写脚本了 只需要熟悉Instantiate函数的用法就可以; Instantiate(物体名字,... 阅读详情

相关推荐

A* Pathfinding Project (Unity A*寻路插件) 使用教程

下面是动态图,借助 A* 插件,编写很少的代码就可以做到寻路。 1、创建场景 在场景中添加一些Cube 作为障碍物 Obstacles,添加一个 Capsule 作为Player,然后添加一个Plane 作为地面,再添加一个Plane,作为斜坡测试。 在创建一个GameObject,改名为 A* ,添加A Star Path (

Unity 9356

Unity 游戏 AI 入门手册(一)

在过去十年蓬勃发展的所有技术中,有一项对我们的社会变得至关重要,它增强了所有其他技术领域以及我们生活的方方面面:人工智能(AI)。从导航系统到智能汽车,从虚拟助手到我们智能手机上的增强现实(AR)应用,几乎我们使用的每一个软件和设备都在引擎盖下具有人工智能。电子游戏也不例外。我们越深入,越多的人工智能以非玩家角色(NPC)、模拟和最近旨在增强用户体验的 AR 应用的形式出现在游戏应用中。机器学习算法开始成为增强图形和动画甚至实现新游戏功能的常见解决方案。

龙哥盟 2055

Unity自动寻路功能的实现(二)

方法二:自己写脚本,定义路点自动寻路 . 1,新建一个3D Object Plane 地面,添加一个Cube作为玩家,改名Player,然后创建3个GameObject,设置位置不一样,然后改名为Point01,Point02,Point03,3个路点作为玩家要去的目标点 ,我设置的如下: 2,然后新建一个AutoMove脚本,挂到Player下,脚本如下 using System.Colle...

m0_37752943的博客 1284

Unity3D如何编写AI

1. Unity3D简单AI编写   由于这次介绍的AI很简单,代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,这里只是初步实现,所以想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等。   1 Enemy_AI.js   2   3 private var Regression : Vector3;   4 public var Player_Pr

u013265457的专栏 1823

A Pathfinding Project Unity A 寻路插件 使用教程

A Pathfinding Project Unity A 寻路插件 使用教程

qq_43667944的博客 466

Unity AI 导航系统

AI导航系统让角色能够理解自身需要走楼梯才能到达二楼或跳过沟渠。这两个问题是紧密相关的,但性质却截然不同。关卡推断问题更具全局性和静态性,因为需要考虑整个场景。移动到目标更具局部性和动态性,只考虑移动的方向以及如何防止与其他移动的代理发生碰撞。

m0_66358314的博客 6214

unity2D学习(10)创建敌人、为敌人编写简单的AI

1 创建敌人 按照之前创建Player角色的方法,一样创建出敌人,并为角色添加刚体、碰撞、动画。(具体可以参考我之前的unity2D学习(4)(5)) 素材包里面有三种敌人,我选择crab来做示范动画状态转移,我把 2为敌人设置简单ai 敌人简单ai的想法:如果Player角色出现在某一范围内,敌人就会超玩家走去碰撞。 3角色碰撞敌人受伤 设置Player角色受伤状态的动画转换,然...

qq_40306845的博客 7740

Unity智能AI实现:BehaviorDesigner与MovementPack教程

在当今游戏开发领域中,人工智能(AI)已成为提升游戏体验不可或缺的部分。Unity,作为领先的游戏引擎之一,提供了多种开发AI的方法和工具。本章将概述Unity游戏AI开发的重要性、方法论以及相关技术和工具。在Unity中,BehaviorDesigner是一个高度可定制的行为树系统。首先,你需要通过Unity的Asset Store安装BehaviorDesigner插件。在Asset Store中搜索”Behavior Designer”,然后点击”下载并导入”。

weixin_34162851的博客 801

unity简单AI

1.   Unity简单AI编写        由于这次介绍的AI很简单,羽化就把代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,有经验的人认为羽化这样写得不对,由于这里只是初步实现,所以羽化想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等,这里代码送上。这次没有写Android的控制器,但肯定可以在Android下用的-0- Enemy_AI.

编程小生的专栏 2403

Unity AI系统

Unity有限状态机

Behavior Designer v1.5.12 – Unity AI行为设计可视化脚本工具

Behavior Designer是Unity行为设计脚本,被AAA工作室用来创建逼真的AI,借助行为设计器,可以将行为树的力量带入Unity! Behavior Designer提供了一个具有强大API的直观可视化编辑器,可以让我们轻松创建新任务,它还包括数百项任务,PlayMaker集成和广泛的第三方集成,使得创建复杂的AI成为可能,而无需编写单行代码! Behavior Designer从初始阶段就设计为尽可能高效,零分配,因此,它在包括移动设备在内的所有平台上运行良好,行为设计器专门用于行为树,这意味着每次更新都将成为更好的行为树实现。

简单敌人AI制作-unity

通过简单的脚本编写来实现一个简单的敌人AI行为

2302_79594853的博客 694

解决Word中英文混排的5个常见排版问题(含单词换行、间距调整等)

本文详细解析Word中英文混排的5大常见排版问题,包括单词换行、间距调整、标点混用等,提供专业解决方案。通过设置段落格式、调整兼容性选项和使用字体组合等技巧,帮助用户轻松解决文档排版难题,提升专业性和阅读体验。

vim8coder的博客 1337

算法-简单的敌人AI《漫游算法》

本文将向大家介绍一套简单的敌人AI巡逻与追击的算法,简称漫游算法。 主要就是利用协程来编写一个脚本,让敌人在地图上随机漫游。如果敌人发现玩家在附近,敌人会追击玩家,直到玩家逃跑出敌人的攻击范围。 漫游算法可能听起来很复杂,但是当我们逐步分解它时,就会发现这一切都是非常容易实现的。下图就是蛮有算法的示意图。我们将分阶段实现每个部分,并在前进的过程中逐一解释,这样就不会感到不知所措。 接下来,我将以简单的2D游戏来实现和说明这个算法。 1.准备工作 首先给我们“敌人”的预制上添加C...

zhangchong5522的博客 1253

基于多智能体深度强化学习的空地协同通信系统轨迹设计与访问控制

所属子方向: UAV assisted communication 名词注释 coordinated:协调、协同 base stations 基站,公用移动通信基站,是移动设备接入互联网的接口设备,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。 UAV-BS:无人机基站 cooperative-competitive game:合作竞争博弈 throughput :吞吐量,每秒比特数 bps,bits per second Determinis

skysys的研究小屋 4969

避坑指南:海康MV_CC_SetIntValue接口的7个典型报错解决方案

本文深度解析海康工业相机SDK中MV_CC_SetIntValue接口的典型报错,提供7个实战解决方案。针对MV_E_CALLORDER、MV_E_PARAMETER等高频错误码,从设备状态、参数值域、依赖关系等核心约束入手,给出清晰的诊断流程与根治代码,帮助开发者构建健壮的参数设置模块,提升开发效率。

y2z3a4b5c的博客 1080

Unity3D基础教程:简单AI编写

但有个问题就产生了,UI会遮挡鼠标,鼠标图片用UI代替总感觉不妥。有关过场Loading的制作,一张图片还好说,换个Scene或者写个UI都能解决,动态Loading的是用Application.LoadLevelAsync可以达到效果,或者是预加载,具体可以看看羽化无缝地图研究博文里面的一个别墅例子。由于这次介绍的AI很简单,代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,这里只是初步实现,所以想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等。

小小姑娘 1155

Matlab Arduino 硬件支持包安装 MATLAB_Support_Package_for_Arduino_Hardware

Matlab Arduino硬件支持包离线安装

weixin_43283734的博客 2841

Unity接入DeepSeek实现AI对话功能

本文介绍了DeepSeek国产开源大语言模型及其Unity集成方法。主要包含:1)DeepSeek简介,突出其高性能和普惠性;2)接入准备,包括API密钥获取、接口地址和Token机制;3)Unity实现方案,提供完整的C#脚本示例,涵盖API请求、参数设置和NPC角色交互;4)详细的使用说明,指导开发者配置模型参数、UI组件及对话流程。该方案可快速实现智能对话功能,适用于游戏开发等场景。

YF云飞的博客 2775

人大金仓V8R3企业版License更新全攻略:从查看到重启一步到位

本文详细解析了人大金仓V8R3企业版License更新的完整运维流程,涵盖从诊断当前授权状态、获取与验证新文件、精准定位旧文件路径,到安全替换文件及服务重启验证的全过程。重点针对更新流程中常见的版本匹配、文件定位、权限与服务重启等关键环节提供了实战解决方案和避坑指南,帮助运维人员高效、平稳地完成授权续期。

redis7keeper的博客 899

手把手教你用STM32+LAN8720搭建以太网通信模块(含原理图)

本文详细介绍了如何使用STM32微控制器与LAN8720物理层芯片搭建以太网通信模块,涵盖硬件设计、软件配置及常见问题排查。重点讲解了LAN8720的低功耗设计、RMII接口简化布线等特性,以及STM32CubeMX配置和LwIP协议栈移植技巧,助力开发者快速实现稳定可靠的嵌入式网络通信。

CAT789的专栏 413

Behavior Designer:Unity 中的 AI 行为树解决方案

在游戏开发中,AI 行为是提升玩家沉浸感和游戏体验的关键因素。Behavior Designer 是一个强大的工具,它通过行为树的形式,让开发者能够轻松地设计和实现复杂的 AI 逻辑。

Unity打怪升级 1188

微信小程序 - 苹果ios无法播放视频、安卓android手机可以播放,使用video播放MP4视频时安卓正常播放视频iOS无法播放出现黑屏、加载失败或一片黑没反应等(uniapp微信小程序也能解决)

微信小程序ios无法播放视频,微信小程序 video标签 ios不能播放视频或视频黑屏,ios无法播放视频,android手机可以播放,视频格式为mp4,uniapp微信小程序安卓设备android可以播放在线网络视频 ,苹果ios设备无法播放视频,微信小程序 video标签 ios不能播放视频或视频黑屏,安卓手机正常播放iPhone手机却黑屏,如何解决这个问题,在线播放视频URL链接,iOS无法播放MP4视频文件的解决方案,在Android设备上可以正常播放,但在iOS设备上却出现黑屏、无法加载或无法播放

🏆 前端领域优质创作者 1万+

Enemy AI Unity2D-平台巡逻移动小怪

Enemy AI Unity2D-平台巡逻移动小怪 前言场景二、编写代码总结 前言 简单编写一个unity2D循环移动小怪(纯移动) 场景 下图为一个简单测试场景: 二、编写代码 代码如下(示例): using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyAI_1 : MonoBehaviour { public float moveSpeed = 10.

Leo__ch的博客 640

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

专业解决各种上架过包问题,专业团队专业处理 3187

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Unity调用Android
下一篇: Android Unity3D游戏开发之切割方块
羽化
博客等级 码龄16年 323粉丝 27原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值