简单3d RPG游戏 之 005 选择敌人
选择一个敌人,按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 选择敌人的更多相关文章
- 简单3d RPG游戏 之 003 怪物AI
游戏中,怪物会自动的往玩家所在地点走去,那需要创建一个C#脚本EnemyAI,包含两个功能: 1. 怪物旋转自己对准玩家 2. 怪物向前移动,追逐玩家 public class EnemyAI : M ...
- 简单3d RPG游戏 之 002 生命条(二)
在游戏中,游戏人物的血条可能会因为受伤或吃血瓶而长度变化,所以需要将血条的长度单独提出来作为一个变量,方便直接修改数值. public float healthBarLength; 改变生命值函数如下 ...
- 简单3d RPG游戏 之 004 攻击(一)
功能:实现点击键盘F键,怪物血量条减少,并且假定是近战,需要对距离进行判断,距离小于一定值的时候按F才会减少怪物的血条. 新建c#脚本PlayerAttack,绑定到Player,并在unity里将敌 ...
- 简单3d RPG游戏 之 001 生命条(一)
1.创建一个新项目,引用如下的包: 2.将asset里的First Person Controller拖入project作为游戏角色,将其命名为Player,将mainCamera删除,这样就是用Pl ...
- 简单3d RPG游戏 之 004 攻击(二)
人物和怪物的攻击都有CD冷却,在PlayerAttack脚本中添加成员 //冷却倒计时 public float attackTimer; //CD冷却时间 public float coolDown ...
- 使用HTML5制作简单的RPG游戏
很久以前就想着做一个游戏,但什么都不会又不知道从哪里开始,胡乱找来一些书籍和资料结果太深奥看不懂,无奈只能放弃.这一弃就是十多年,倥偬半生,眼看垂垂老矣,还是没能有什么成果. 近年来游戏引擎越来越多, ...
- RPG游戏中如何判断敌人是否在玩家的攻击范围之内
// 方式1:通过主角和场景中的所有敌人比较 private void AtkCondition1(float _range,float _angle) { // 搜索所有敌人列表(在动态创建敌人时生 ...
- Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统
Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手 来源: 博客园 发布时间: 2011-04-19 11:18 阅读: 1282 次 推荐: 0 ...
- 用webgl打造自己的3D迷宫游戏
用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam 背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...
随机推荐
- 2012蓝桥杯C组本科决赛答案
题目: 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C.T. ...
- zoj 2676 网络流+01分数规划
思路: 这题的结论得要看amber的论文,结论就是将求f(x)/b(x)最小转化为求min(f(x)-b(x)*λ),其中x为S集的解空间,f(x)为解的边权和,b(x)为解的边数, λ=f(x)/b ...
- maven的一些常用配置
配置JDK<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupI ...
- VSX规划Package文件
VSX是VS扩展,可以针对不同项目编写插件,虽然接触VSX的时间并不多,但是当了解VSX后深刻感受到VSX的魅力. VSX的材料比较少,配置文件也很繁琐,当初我也走了不少弯路. 这篇文章将帮助您更好的 ...
- BootStrap glyphicons字体图标
本章将讲解Bootstrap glyphicons字体图标,并通过一些实例了解它的使用,字体图标是在 Web 项目中使用的图标字体.字体图标在下载的Bootstrap的fonts文件夹中 本章将讲 ...
- html保留字符详解
本文由 www.169it.com 搜集整理 1. 注释 HTML中的注释和其它语言注释作用相似,都是为了方便阅读和调试代码.当浏览器遇到注释时会自动忽略注释内容.HTML的注释格式多行和单行注释都用 ...
- 两种查看eclipse或MyEclipse是64bit还是32bit的方法
方法一: 对于:eclipse 打开eclipse后:Help-->About Eclipse-->Installation Details-->Configuration 如果看到 ...
- 第十篇、微信小程序-view组件
视图容器 常用的样式的属性: 详情:http://www.jianshu.com/p/f82262002f8a display :显示的模式.可选项有:flex(代表view可以伸缩,弹性布局)- f ...
- Cocos2d-x加速度计
加速度计是一种能够感应设备一个方向上线性加速度的传感器.广泛用于航空.航海.宇航及武器的制导与控制中.线加速度计的种类很多,在iOS等移动设备中目前采用的是三轴加速度计,可以感应设备上X.Y.Z轴方向 ...
- javascript笔记---算法基础学习