选择一个敌人,按ctrl+d,复制出3个,调整一下它们的位置,不重叠,修改Tag为Enemy,禁用EnemyAI。

创建Targetting脚本,绑定到Player玩家对象

public class Targetting : MonoBehaviour {
public List<Transform> targets;
public Transform selectedTarget;
// Use this for initialization
void Start () {
targets = new List<Transform> ();
AddAllEnemies ();
} public void AddAllEnemies(){
GameObject[] go = GameObject.FindGameObjectsWithTag ("Enemy");
foreach (GameObject enemy in go) {
targets.Add(enemy.transform);
}
} public void SelectTarget(){
selectedTarget = targets [];
} // Update is called once per frame
void Update () {
if (Input.GetKeyUp (KeyCode.Tab)) {
SelectTarget ();
}
}
}

运行查看属性如下

当按Tab时,第一个敌人被获取到SelectedTarget中

下面完善Tab键选敌人功能:

1. 假如已选敌人为null,那么选择最近敌人,并将已选敌人的材质的颜色改为红色。

2. 假如已选敌人不为null,那么按Tab将选择当前已选的下一个敌人(按距离排序),将之前选的敌人颜色改成绿色,新选的改成红色。

3. 在选择敌人完成后,调用Player的PlayerAttack组件,给它的target赋值。完整如下:

public class Targetting : MonoBehaviour {
public List<Transform> targets;
public Transform selectedTarget;
public Transform myTransform;
// Use this for initialization
void Start () {
targets = new List<Transform> ();
AddAllEnemies ();
myTransform = transform;
} public void AddAllEnemies(){
GameObject[] go = GameObject.FindGameObjectsWithTag ("Enemy");
foreach (GameObject enemy in go) {
targets.Add(enemy.transform);
}
}
//按距离排序敌人
public void SortTargetByDistance(){
targets.Sort (delegate(Transform t1, Transform t2){
return Vector3.Distance(t1.position,myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position));
});
}
  //选择敌人
public void SelectEnemy(){
if (selectedTarget == null) {
SortTargetByDistance ();
selectedTarget = targets [];
}
else {
int index = targets.IndexOf(selectedTarget);
if(index < targets.Count - ){
index++;
}else{
index = ;
}
       //删除之前选择的敌人
DeleteTarget();
selectedTarget = targets[index];
}
     //已选择敌人
SelectTarget();
} private void SelectTarget(){
selectedTarget.renderer.material.color = Color.red;
     //给攻击组件赋值,切换当前攻击的敌人
PlayerAttack pa = (PlayerAttack)GetComponent ("PlayerAttack");
pa.target = selectedTarget.gameObject;
} private void DeleteTarget(){
selectedTarget.renderer.material.color = Color.blue;
} // Update is called once per frame
void Update () {
if (Input.GetKeyUp (KeyCode.Tab)) {
SelectEnemy ();
}
}
}

简单3d RPG游戏 之 005 选择敌人的更多相关文章

  1. 简单3d RPG游戏 之 003 怪物AI

    游戏中,怪物会自动的往玩家所在地点走去,那需要创建一个C#脚本EnemyAI,包含两个功能: 1. 怪物旋转自己对准玩家 2. 怪物向前移动,追逐玩家 public class EnemyAI : M ...

  2. 简单3d RPG游戏 之 002 生命条(二)

    在游戏中,游戏人物的血条可能会因为受伤或吃血瓶而长度变化,所以需要将血条的长度单独提出来作为一个变量,方便直接修改数值. public float healthBarLength; 改变生命值函数如下 ...

  3. 简单3d RPG游戏 之 004 攻击(一)

    功能:实现点击键盘F键,怪物血量条减少,并且假定是近战,需要对距离进行判断,距离小于一定值的时候按F才会减少怪物的血条. 新建c#脚本PlayerAttack,绑定到Player,并在unity里将敌 ...

  4. 简单3d RPG游戏 之 001 生命条(一)

    1.创建一个新项目,引用如下的包: 2.将asset里的First Person Controller拖入project作为游戏角色,将其命名为Player,将mainCamera删除,这样就是用Pl ...

  5. 简单3d RPG游戏 之 004 攻击(二)

    人物和怪物的攻击都有CD冷却,在PlayerAttack脚本中添加成员 //冷却倒计时 public float attackTimer; //CD冷却时间 public float coolDown ...

  6. 使用HTML5制作简单的RPG游戏

    很久以前就想着做一个游戏,但什么都不会又不知道从哪里开始,胡乱找来一些书籍和资料结果太深奥看不懂,无奈只能放弃.这一弃就是十多年,倥偬半生,眼看垂垂老矣,还是没能有什么成果. 近年来游戏引擎越来越多, ...

  7. RPG游戏中如何判断敌人是否在玩家的攻击范围之内

    // 方式1:通过主角和场景中的所有敌人比较 private void AtkCondition1(float _range,float _angle) { // 搜索所有敌人列表(在动态创建敌人时生 ...

  8. Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统

    Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手  来源: 博客园  发布时间: 2011-04-19 11:18  阅读: 1282 次  推荐: 0 ...

  9. 用webgl打造自己的3D迷宫游戏

    用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam    背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...

随机推荐

  1. Android混淆打包配置总结

    Android打包失败出现Proguard returned with error code 1. See console的错误 这个问题是由于代码混淆引起的,找不到引用包. 只需在你的proguar ...

  2. T-SQL利用Row_Number函数实现分页

    SQL: CREATE PROCEDURE PagingViewTest ( @currentPageIndex INT, --页序号 @pageSize INT, --页大小 @pageCount ...

  3. HttpClient(4.3.5) - HTTP Protocol Interceptors

    The HTTP protocol interceptor is a routine that implements a specific aspect of the HTTP protocol. U ...

  4. JavaScript之Loading进度条

    一个loading进度条,定义一个fakeProgress方法,定位一个URL,然后setTimeout设置跳转时间我们就能看到我们要打开的URL网址了. 这个链接我就直接链接到我的新浪博客去了,算是 ...

  5. 通过读取配置文件App.config来获取数据库连接字符串

    有两种方式://通过读取配置文件来获取连接字符串 第一种方式: App.config 文件的格式: <?xml version="1.0" encoding="ut ...

  6. C语言(简单游戏)-走出迷宫

    #include <stdio.h> //宏定义 maze[ROWS][COLS];行和列; #define ROWS 7 #define COLS 6 //绘制迷宫(全局变量) char ...

  7. 20141015--for语句2

    for语句,打印等腰三角形: 第一种方法:(使用for语句嵌套) 第二种方法:(定义string型变量) 以下是其他形状的等腰三角形: (穿插使用了for语句嵌套,定义string型)

  8. node.js笔记——gulp

    1.全局安装 npm install gulp -g 2.安装到具体目录,并安装相应的自动化插件 npm install -save-dev gulp gulp-concat gulp-minify- ...

  9. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] 第 3 章 用 JavaScri ...

  10. 打包并发布自己的Android应用(eclipse)

    第一步,在Eclipse中选择需要打包的项目,然后右键--选择Export,会弹出一个打包的提示框,如下图所示. 按Next之后,会继续出现一个提示框,这里你可以选择自己需要打包的项目(默认是刚才选中 ...