简单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 背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...
随机推荐
- 修改ie版本的注册表webbroswer
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Exp ...
- 【改进】用Log4net建立日志记录
上一篇随笔中只使用了普通的文件读写来进行日志的写入,正如很多朋友说的,频繁的对文件进行读写会造成很多的问题,代码缺少边界控制和操作控制,没有对资源进行管理,是非常典型的bad code. 然后经过前辈 ...
- django 学习-11 Django模型数据模板呈现
1.for author in Author.objects.all(): for book in author.book_set.all(): print book 2.vim blog/vie ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- js画了一个椭圆
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jQuery学习一:jQuery中的ready和load事件
//ready事件 $(document).ready(function(){ 代码........ }); //ready事件简写: $(function(){ 代码........ }); //l ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
- 如何在Android SDK 下查看应用程序输出日志的方法
该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...
- QQ音乐API分析记录
我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API. 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时 ...
- Winform ComboBox控件高亮显示
//重绘下拉表单窗口,需要在窗口设计代码中加入下面这一句 this.cmdChannelName.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawF ...