浏览器js加载错误是怎样加载js代码的

2676人阅读
Unity3D(156)
从本节开始我们通过做一个小的游戏,来给大家讲解中的巡逻机器人的功能。巡逻机器人是指在游戏中,如果对手没有出现(或者是没有发现敌人)的情况下,巡逻机器人在巡逻区域内自动来回行走,巡逻周围情况。一旦发现敌人,它将自动跟踪敌人并攻击敌人。和这种具有自动追击功能的机器人相对的是防守机器人,它们只守在自己的地方,一旦敌人靠得足够近(指在攻击范围内),就发起攻击。
在这节我们需要准备如下素材,一个能够做攻击动作和死亡动作的模型,一个图标作为Gizmo,用于在编辑器中帮助我们查看巡逻区域的网格。
上节的场景大家都熟悉了,上节的功能主要是,一群角色在一个区域,有一个玩家角色可以跑去追他们,在离的足够近的时候,这些角色将会逃跑。这些角色是不是显得太笨了?只会跑,什么都干不了,像唐僧一样。那么现在我们就做出一些机器人来保护这个“唐僧”。首先是做一个像孙悟空一样的角色,它能够在唐僧的周围巡逻,一旦发现有妖怪靠近(这里指我们自己,一不小心把自己的角色变成妖怪了。哈哈……)。孙悟空将追上“妖怪”并发动攻击。下面通过图来演示该游戏的功能。
看清上面的逻辑之后,我们就可以开始写代码完成所需的功能了。这里“唐僧”的角色我们上节已经学会做了,他什么都不会,只会在妖怪来临的时候跑。
妖怪的角色,就是我们玩家控制的角色,现在我们要给他加一个生命的信息。在他活着的时候(生命指大于0的时候),他会跑向唐僧,要吃掉他(要吃唐僧的功能大家可以自己做)。在“孙悟空”攻击“妖怪”的时候,妖怪的血量下降。直至为0。妖怪死亡。
1. 首先我们要做一个“孙悟空”巡逻的区域。就是图中绿色的区域,它是由若干个点生成的一个区域。首先创建几个空物体全部命名为WayPoint,作为巡逻区域的限制点。新建一个C#代码段,命名为AutoWayPoint。输入如下代码
using UnityE
using System.C
public class AutoWayPoint : MonoBehaviour
public static ArrayList waypoints = new ArrayList(); //场景中所有的WayPoint
public ArrayList connected = new ArrayList(); //连接的节点
public static float kLineOfSightCapsuleRadius = 0.25f;
static AutoWayPoint closestWayP //距离角色最近的节点
public static AutoWayPoint FindClosest(Vector3 pos) //查找到距离角色最近的WayPoint
// The closer two vectors, the larger the dot product will be.
foreach (AutoWayPoint cur in waypoints)
float distance = Vector3.Distance(cur.transform.position, pos);
if (distance & 100)
float closestDistance =
closestWayPoint =
return closestWayP
//@ContextMenu (&Update Waypoints&)
void UpdateWaypoints()
RebuildWaypointList();
void Awake()
RebuildWaypointList();
// Draw the waypoint pickable gizmo
void OnDrawGizmos()
Gizmos.DrawIcon(transform.position, &Waypoint.tif&);
// Draw the waypoint lines only when you select one of the waypoints
void OnDrawGizmosSelected() //在编辑器中以连线的方式显示连接的点
if (waypoints.Count == 0)
RebuildWaypointList();
foreach (AutoWayPoint p in connected)
if (Physics.Linecast(transform.position, p.transform.position))
Gizmos.color = Color.
Gizmos.DrawLine(transform.position, p.transform.position);
Gizmos.color = Color.
Gizmos.DrawLine(transform.position, p.transform.position);
void RebuildWaypointList()
Object[] objects = FindObjectsOfType(typeof(AutoWayPoint));
waypoints = new ArrayList(objects);
foreach (AutoWayPoint point in waypoints)
point.RecalculateConnectedWaypoints();
void RecalculateConnectedWaypoints()
connected = new ArrayList();
foreach (AutoWayPoint other in waypoints)
// Don't connect to ourselves
if (other == this)
// Do we have a clear line of sight?
if (!Physics.CheckCapsule(transform.position, other.transform.position, kLineOfSightCapsuleRadius))
connected.Add(other);
保存,把代码拖给场景中所有的WayPoint物体,然后选择它们。我们应该能够看到场景中根据各个节点生成了一个网格,这个网格的边界就是“孙悟空“巡逻的区域。
2.为”孙悟空“添加巡逻并追击妖怪的本领。新建一个C#代码,变量如下
public int speed = 3;
public GameObject fireB
public float rotationSpeed = 5.0f;
public float shootRange = 50.0f;
public float shootAngle = 4.0f;
public float dontComeCloserRange = 5.0f;
public float delayShootTime = 0.35f;
public float pickNextWaypointDistance = 10.0f;
AnimationEvent attackEvent = new AnimationEvent();
float tempAttackT
private float nextFire = 0;
这里的变量主要包括,要攻击的角色,发射攻击的手的位置。攻击的武器,这里指一个小球。攻击频率,攻击距离等。
3. 巡逻功能,新建一个方法Patrol。该方法主要功能在于在”孙悟空“,没有发现”妖怪“前,沿着巡逻区域的边界巡逻。
IEnumerator Patrol()
AutoWayPoint curWayPoint = AutoWayPoint.FindClosest(transform.position);
while (true)
Vector3 waypointPosition = curWayPoint.transform.
if (Vector3.Distance(waypointPosition, transform.position) & pickNextWaypointDistance)
curWayPoint = PickNextWayPoint(curWayPoint);
if (CanSeeTarget())
yield return StartCoroutine(AttackPlayer());
MoveTowards(waypointPosition);
4. 判断是否能够看见”妖怪“,这里使用Physics.Linecast判断是否能看见妖怪。判断方法有很多,也可以根据距离判断,还可以使用OnTriggerEnter,或者RayCastHit等方法。我们这里用这个方法是想让妖怪躲在遮挡物后面的时候,不让”孙悟空“看见。
bool CanSeeTarget()
& & & & if (Vector3.Distance(transform.position, target.position) & 15)
& & & & & &
& & & & RaycastH
& & & & if (Physics.Linecast(transform.position, target.position, out hit))
& & & & & & return hit.transform ==
& & & & else if (!Physics.Linecast(transform.position, target.position))
& & & & & &
AutoWayPoint PickNextWayPoint(AutoWayPoint currentWaypoint)
& & & & var forward = transform.TransformDirection(Vector3.forward);
& & & & var best = currentW
& & & & var bestDot = -10.0;
& & & & foreach (AutoWayPoint cur in currentWaypoint.connected)
& & & & & & var direction = Vector3.Normalize(cur.transform.position - transform.position);
& & & & & & var dot = Vector3.Dot(direction, forward);
& & & & & & if (dot & bestDot && cur != currentWaypoint)
& & & & & & {
& & & & & & & & bestDot =
& & & & & & & & best =
& & & & & & }
5.然后是攻击的方法,当看见”妖怪“之后,发动攻击,直到”妖怪“死亡。在没发现之前,巡逻并搜索妖怪。
IEnumerator AttackPlayer()
var lastVisiblePlayerPosition = target.
while (true)
if (target == null)
var distance = Vector3.Distance(transform.position, target.position);
if (distance & shootRange * 3)
lastVisiblePlayerPosition = target.
if (distance & dontComeCloserRange)
MoveTowards(lastVisiblePlayerPosition);
if (distance 0.0)
MoveTowards(position);
if (CanSeeTarget())
timeOut -= Time.deltaT
7. 发射武器的方法。在攻击的时候,按照指定频率发射小球(这里指我们的攻击武器)。
void InstantiateBullet()
if (Time.time & nextFire)
nextFire = Time.time + 1.4f;
attackEvent.time = tempAttackT
animation[&attack&].weight = 0.5f;
GameObject clone = Instantiate(fireBall, hand.position, hand.rotation) as GameO
Physics.IgnoreCollision(clone.collider, collider);
clone.rigidbody.velocity = transform.TransformDirection(Vector3.forward * 20);
BulletScript bulletScript = clone.gameObject.AddComponent();
bulletScript.playerShooting = this.gameO
8.在找到妖怪的时候,暂停巡逻,并转向“妖怪”
void RotateTowards(Vector3 position)
var direction = position - transform.
direction.y = 0;
if (direction.magnitude & 0.1)
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);
void MoveTowards(Vector3 position)
var direction = position - transform.
direction.y = 0;
if (direction.magnitude & .5)
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);
var forward = transform.TransformDirection(Vector3.forward);
var speedModifier = Vector3.Dot(forward, direction.normalized);
speedModifier = Mathf.Clamp01(speedModifier);
direction = forward * speed * speedM
GetComponent().SimpleMove(direction);
animation.Play(&run&);
最后我们在Awake和Start函数中设置角色跑步,攻击和静止的动画层,
void Awake()
animation.AddClip(animation[&run&].clip, &run2&);
tempAttackTime = animation[&attack&].clip.
void Start()
StartCoroutine( Patrol());
animation[&idle&].layer = 1;
animation[&run&].layer = 2;
animation[&attack&].layer = 1;
animation[&run2&].layer = 2;
attackEvent.functionName = &InstantiateBullet&;
现在我们完成了”孙悟空“巡逻功能的开发。接下来的一节我们要为这个代码添加相关的妖怪血量的代码控制,武器攻击妖怪的控制能代码功能。
原文链接:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1211346次
积分:11919
积分:11919
排名:第1151名
原创:78篇
转载:350篇
评论:90条
(2)(3)(2)(1)(3)(1)(4)(2)(2)(6)(25)(2)(5)(3)(65)(20)(2)(4)(4)(58)(12)(10)(82)(75)(25)(1)(1)(1)(3)(2)(8)(1)Unity3D简单的怪物AI代码(C#脚本);usingUnityE;usingSystem.C;publicclassBoosAI:MonoBe;//敌人状态;//敌人站立状态;publicconstintSTATE_STAN;//敌人行走;publicconstintSTATE_WALK;//敌人奔跑状态;publicc
Unity3D简单的怪物AI代码(C#脚本)
usingUnityE
usingSystem.C
public class BoosAI : MonoBehaviour
//敌人状态
//敌人站立状态
publicconstint STATE_STAND = 0;
//敌人行走
publicconstint STATE_WALK = 1;
//敌人奔跑状态
publicconstint STATE_RUN = 2;
//记录敌人的当前状态
privateintenemyS
//主角对象
privateGameO
//备份上一次的敌人思考时间
private float backU
//敌人思考下一次行为的时间
publicconstint AI_THINK_TIME = 2;
//敌人的巡逻范围
publicconstint AI_ATTACK_DISTANCE = 10;
// Use this for initialization
void Start()
//得到主角对象
hero = GameObject.Find(&Cube&);
//设置敌人的默认状态站立
enemyState = STATE_STAND;
// Update is called once per frame
void Update()
//判断敌人与主角的距离
if (Vector3.Distance(transform.position, hero.transform.position) &
(AI_ATTACK_DISTANCE))
//敌人进入奔跑状态
gameObject.animation.Play(&run&);
enemyState = STATE_RUN;
//设计敌人面朝主角方向
transform.LookAt(hero.transform);
//敌人进入巡逻状态
//计算敌人的思考时间
if (Time.time - backUptime&= AI_THINK_TIME)
//敌人开始思考
backUptime = Time.
//取得0~2之间的随机数
int rand = Random.Range(0,2);
if (rand == 0)
//敌人进入站立状态
gameObject.animation.Play(&idle&);
enemyState = STATE_STAND;
else if (rand == 1)
//敌人进入站立状态
//敌人随机旋转角度
Quaternion rotate = Quaternion.Euler(0,Random.Range(1,5) * 90,0);
//1秒内完成敌人旋转
transform.rotation = Quaternion.Slerp(transform.rotation,rotate,Time.deltaTime * 1000);
//播放行走动画
gameObject.animation.Play(&walk&);
enemyState = STATE_WALK;
switch (enemyState)
case STATE_STAND:
case STATE_WALK:
//敌人行走
transform.Translate(Vector3.forward * Time.deltaTime);
case STATE_RUN:
//敌人朝向主角奔跑
if (Vector3.Distance(transform.position, hero.transform.position) & 3)
transform.Translate(Vector3.forward * Time.deltaTime * 3);
三亿文库包含各类专业文献、中学教育、幼儿教育、小学教育、应用写作文书、外语学习资料、文学作品欣赏、10Unity3D简单的怪物AI代码(C#脚本)等内容。 
 如何安装 AI 脚本安装 AI 脚本非常简单, 只要将脚本文件放置在 AI 的 Presets/Scripts 文件夹里, 这样脚本就 会出现在脚本菜单里(文件 File&脚本 Scripts) 。...  这是一个关于 Unity 内部脚本如何工作的简单概览。 ...中放置在函数之外的代码,在 C#或 Boo 中要放置在...这种方法在很多情况下非常有用,但通常在 AI 中并...  我学院:Unity3D使用C#编程脚本基础_计算机软件及应用_IT/计算机_专业资料。我...如果你希望自己实现, 运算符重载也非常简单, 对于上面的例子, 代码大致是下面...  unity3d游戏开发之编写脚本(hello world)_计算机软件...创建 C#脚本(Assets-create-C# Script) 可重命名...()里输入代码 using UnityE using System....  学习C#进行 unity3D 编程 Unity3D 提供了三种可供选择的脚本编程语言:JavaScript...如果你希望自己实现,运算符重载 也非常简单,对于上面的例子,代码大致是下面这个...  C# 或 Boo 脚本中显示申明.如果你在 Unity 内部...编写 JavaScript 代码很简单.但是这也使得代码运行...这种方法在很 多情况下非常有用,但通常在 AI 中...  Unity3d C#脚本 实现点击物体旋转_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 Unity3d C#脚本 实现点击物体旋转_计算机软件及应用_...  unity3d脚本选择_计算机软件及应用_IT/计算机_专业资料。U3D 支持 C#,JavaScript,BOO 三种语言格式的代码编写。首先来简单介绍下这三种语言的特点: 对 U3D 来说,...  附上代码 BALL 类 using UnityE using System.C using Unity...Unity3D GUI C#脚本 ... 2页 免费
java 打砖块程序 2页 2下载券网站已改版,请使用新地址访问:
Tank 使用C#做的坦克大战小游戏, 包括单人模式以及双 ,而且可以自定义 .net 246万源代码下载-
&文件名称: Tank& & [
& & & & &&]
&&所属分类:
&&开发工具: C#
&&文件大小: 10035 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:使用C#做的坦克大战小游戏,游戏包括单人模式以及双人模式,而且可以自定义游戏-Use C# do Tankedaizhan small game, the game includes a single player mode and double mode, and you can customize the game
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&完整代码&&........\Resources&&........\.........\add.wav&&........\.........\blast.wav&&........\.........\blast1.gif&&........\.........\blast2.gif&&........\.........\blast3.gif&&........\.........\blast4.gif&&........\.........\blast5.gif&&........\.........\blast6.gif&&........\.........\blast7.gif&&........\.........\blast8.gif&&........\.........\bomb.gif&&........\.........\born1.gif&&........\.........\born2.gif&&........\.........\born3.gif&&........\.........\born4.gif&&........\.........\destory.gif&&........\.........\enemy1D.gif&&........\.........\enemy1L.gif&&........\.........\enemy1R.gif&&........\.........\enemy1U.gif&&........\.........\enemy2D.gif&&........\.........\enemy2L.gif&&........\.........\enemy2R.gif&&........\.........\enemy2U.gif&&........\.........\enemy3D.gif&&........\.........\enemy3L.gif&&........\.........\enemy3R.gif&&........\.........\enemy3U.gif&&........\.........\enemymissile.gif&&........\.........\fire.wav&&........\.........\grass.gif&&........\.........\hit.wav&&........\.........\mintank.gif&&........\.........\over.gif&&........\.........\p1tankD.gif&&........\.........\p1tankL.gif&&........\.........\p1tankR.gif&&........\.........\p1tankU.gif&&........\.........\p2tankD.gif&&........\.........\p2tankL.gif&&........\.........\p2tankR.gif&&........\.........\p2tankU.gif&&........\.........\select.gif&&........\.........\selecttank.gif&&........\.........\star.gif&&........\.........\start.wav&&........\.........\steel.gif&&........\.........\steels.gif&&........\.........\symbol.gif&&........\.........\tankmissile.gif&&........\.........\timer.gif&&........\.........\title.gif&&........\.........\wall.gif&&........\.........\walls.gif&&........\.........\water.gif&&........\Tank&&........\....\Tank&&........\....\Tank.sln&&........\....\Tank.suo&&........\....\....\bin&&........\....\....\...\Debug&&........\....\....\...\.....\image&&........\....\....\...\.....\.....\bomb1.gif&&........\....\....\...\.....\.....\bomb2.gif&&........\....\....\...\.....\.....\bomb3.gif&&........\....\....\...\.....\.....\bomb4.gif&&........\....\....\...\.....\.....\bomb5.gif&&........\....\....\...\.....\.....\bomb6.gif&&........\....\....\...\.....\.....\bomb7.gif&&........\....\....\...\.....\.....\bomb8.gif&&........\....\....\...\.....\.....\enemyD.gif&&........\....\....\...\.....\.....\enemyL.gif&&........\....\....\...\.....\.....\enemymissile.gif&&........\....\....\...\.....\.....\enemyR.gif&&........\....\....\...\.....\.....\enemyU.gif&&........\....\....\...\.....\.....\mytankD.gif&&........\....\....\...\.....\.....\mytankL.gif&&........\....\....\...\.....\.....\mytankR.gif&&........\....\....\...\.....\.....\mytankU.gif&&........\....\....\...\.....\.....\p2tankD.gif&&........\....\....\...\.....\.....\p2tankL.gif&&........\....\....\...\.....\.....\p2tankR.gif&&........\....\....\...\.....\.....\p2tankU.gif&&........\....\....\...\.....\.....\select.gif&&........\....\....\...\.....\.....\selecttank.gif&&........\....\....\...\.....\.....\tank.ico&&........\....\....\...\.....\.....\tankmissile.gif&&........\....\....\...\.....\.....\title.gif&&........\....\....\...\.....\Tank.exe&&........\....\....\...\.....\tank.ico&&........\....\....\...\.....\Tank.pdb&&........\....\....\...\.....\Tank.suo&&........\....\....\...\.....\Tank.vshost.exe&&........\....\....\...\.....\Tank.vshost.exe.manifest&&........\....\....\...\Release&&........\....\....\...\.......\Tank.exe&&........\....\....\...\.......\Tank.pdb&&........\....\....\...\.......\Tank.vshost.exe
&输入关键字,在本站246万海量源码库中尽情搜索:程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之游戏开发中的人工智能AI(三十八)
Unity3D研究院之游戏开发中的人工智能AI(三十八)
围观48608次
编辑日期: 字体:
很久没有写Unity3D相关的东西了,是因为这段时间我深陷一款IOS的软件开发中。不过以后我还是会回归Unity3D游戏开发的。什么语言都在用,生活与工作都挺给力的嚯嚯。今天还是打开了久违的Unity3D编辑器,那我就写点东西吧,今天我想说的是游戏中的人工智能。人工智能这个东西在游戏中是非常重要的,人工智能说简单了就是根据随机的数字让敌人执行一些动作或逻辑,说难了TA需要一个非常复杂的算法,本文我主要说说Unity3D中人工智能的脚本如何来编写。
首先你应该搞清楚的一点AI脚本属于一个工具类脚本,工具类脚本的含义就是他应当是由策划人员来绑定游戏对象使用的。也就是说AI脚本程序员应当写的非常的灵活,策划人员可以通过修改脚本对外的变量数值接口就能控制其中的敌人AI。接着创建一个c#脚本AI.CS ,如下图所示,目前脚本对外留出枚举接口变量,策划人员在使用这条脚本时选择对应敌人类型即可。(注:这里仅仅是示例,细致的话还可以将很多敌人详细的信息写入,如:攻击速度、技能类型、移动速度、命中率、攻击百分比、等等,但是一定要让你的脚本写的比较灵活,策划人员在外面选择即可完成)因为目前是一个示例,所以我在这里只简单的区分的敌人类型。
下面时这段简单AI的脚本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
using UnityEngine;using System.Collections;&//这里是枚举选择敌人类型public enum EnemyType{ Enemy0, Enemy1}&public class AI : MonoBehaviour {& //敌人类型枚举 有策划人员选择 public EnemyType enemyType = EnemyType.Enemy0;& //主角游戏对象 public GameObject player;& //敌人状态 普通状态 旋转状态 奔跑状态 追击主角状态 攻击主角状态 private const int EMEMY_NORMAL=0; private const int EMEMY_ROTATION=1; private const int EMEMY_RUN = 2; private const int EMEMY_CHASE = 3; private const int EMEMY_ATTACK = 4;& //记录当前敌人状态 根据不同类型 敌人播放不同动画 private int state; //旋转状态,敌人自身旋转 private int rotation_state; //记录敌人上一次思考时间 private float aiThankLastTime; & void Start () {
//初始话标志敌人状态 以及动画为循环播放
state = EMEMY_NORMAL;
this.animation.wrapMode = WrapMode.Loop; }& void Update () {
//根据策划选择的敌人类型 这里面会进行不同的敌人AI
switch(enemyType)
case EnemyType.Enemy0:
updateEnemyType0();
case EnemyType.Enemy1:
updateEnemyType1();
} }& //更新第一种敌人的AI void updateEnemyType0() {
//这个AI比较简单, 当主角与他的距离小于10米时,他将始终朝向这主角
if(Vector3.Distance(player.transform.position,this.transform.position) &= 10)
this.transform.LookAt(player.transform);
} }& //更新第二种敌人的AI void updateEnemyType1() {&
//判断敌人是否开始思考
if(isAIthank())
//敌人开始思考
AIthankEnemyState(3);
//更新敌人状态
UpdateEmenyState();
} }& int getRandom(int count) {&
return new System.Random().Next(count);& }& bool isAIthank() {
//这里表示敌人每3秒进行一次思考
if(Time.time - aiThankLastTime &=3.0f)
aiThankLastTime = Time.time;
return true;&
return false; }& //敌人在这里进行思考 void AIthankEnemyState(int count) {
//开始随机数字。
int d = getRandom(count);&
//设置敌人为站立状态
setEmemyState(EMEMY_NORMAL);
//设置敌人为旋转状态
setEmemyState(EMEMY_ROTATION);
//设置敌人为奔跑状态
setEmemyState(EMEMY_RUN);
}& }& void setEmemyState(int newState) {
if(state == newState)
state = newState;&
string animName = "Idle";
switch(state)
case EMEMY_NORMAL:
animName&&=&&"Idle";
case EMEMY_RUN:
animName&&=&&"Run";
case EMEMY_ROTATION:
animName&&=&&"Run";
//当敌人为旋转时, 开始随机旋转的角度系数
rotation_state = getRandom(4);
case EMEMY_CHASE:
animName&&=&&"Run";
//当敌人进入追击状态时,将面朝主角方向奔跑
this.transform.LookAt(player.transform);
case EMEMY_ATTACK:
animName&&=&&"Attack";
//当敌人进入攻击状态时,继续朝向主角开始攻击砍人动画
this.transform.LookAt(player.transform);
//避免重复播放动画,这里进行判断
if(!this.animation.IsPlaying(animName))
//播放动画
this.animation.Play(animName);
}& }& //在这里更新敌人状态 void UpdateEmenyState() {
//判断敌人与主角之间的距离
float distance = Vector3.Distance(player.transform.position,this.transform.position);
//当敌人与主角的距离小于10 敌人将开始面朝主角追击
if(distance &= 10)
//当敌人与主角的距离小与3 敌人将开始面朝主角攻击
if(distance &= 3)
setEmemyState(EMEMY_ATTACK);
&&&&//否则敌人将开始面朝主角追击
setEmemyState(EMEMY_CHASE);
//敌人攻击主角时 主角迅速奔跑 当它们之间的距离再次大于10的时候 敌人将再次进入正常状态 开始思考
if(state == EMEMY_CHASE || state == EMEMY_ATTACK)
setEmemyState(EMEMY_NORMAL);
switch(state)
case EMEMY_ROTATION:
//旋转状态时 敌人开始旋转, 旋转时间为1秒 这样更加具有惯性
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler(0,rotation_state * 90,0),&&Time.deltaTime * 1);
case EMEMY_RUN:
//奔跑状态,敌人向前奔跑
transform.Translate(Vector3.forward *0.02f);
case EMEMY_CHASE:
//追击状态 敌人向前开始追击
transform.Translate(Vector3.forward *0.02f);
case EMEMY_ATTACK:&
如下图所示,我们在游戏世界中添加两个敌人,此时给敌人们都绑定上AI的脚本,编辑器中设置不同的敌人类型,敌人执行各自的生命周期,当你控制主角与接近敌人时,敌人开始追击你并且向你展开攻击。
demo仅仅是一个示例,主要希望大家明白一个道理。在编写Unity游戏脚本时,一定要想想这条脚本和对象的生命周期,切记每一条脚本只管和自己有关的东西,和自己无关的东西一概不要管。不然你会发现你的脚本会越写越乱,下一篇文章我会写点我平时在Unity3D开发中时如何搭建架构的,希望大家多多讨论,互相学习。
下载地址:
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 微信浏览器无法加载js 的文章

 

随机推荐