对金玺曾版《Unity3D手机游戏开发》第三章“第一人称射击游戏”修改,使支持僵尸连续攻击
我个人觉得这本书写的至少很和我口味,而且他的光盘资料也很详尽,比如,一个实例,不仅有一个完整的实现工程,还有一份供作练习的工程(该工程中没有要练习的部分,而资源啥的都有),让人感觉很好。
这本书下载电子版也很方便,比如:http://download.csdn.net/detail/u012337666/8402165。
我接下来具体说说自己对 第三章“第一人称射击游戏”中的改动。
先上改动前的源代码:
using UnityEngine;
using System.Collections;[AddComponentMenu("Game/Enemy")]
public class Enemy : MonoBehaviour {// Transform组件Transform m_transform;//CharacterController m_ch;// 动画组件Animator m_ani;// 寻路组件NavMeshAgent m_agent;// 主角Player m_player;// 角色移动速度float m_movSpeed = 0.5f;// 角色旋转速度float m_rotSpeed = 120;// 计时器float m_timer=2;// 生命值int m_life = 15;// 成生点protected EnemySpawn m_spawn;// Use this for initializationvoid Start () {// 获取组件m_transform = this.transform;m_ani = this.GetComponent<Animator>();m_agent = GetComponent<NavMeshAgent>();// 获得主角m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();}// 初始化public void Init(EnemySpawn spawn){m_spawn = spawn;m_spawn.m_enemyCount++;}// 当被销毁时public void OnDeath(){//更新敌人数量m_spawn.m_enemyCount--;// 加100分GameManager.Instance.SetScore(100);// 销毁Destroy(this.gameObject);}// Update is called once per framevoid Update () {// 如果主角生命为0,什么也不做if (m_player.m_life <= 0)return;// 获取当前动画状态AnimatorStateInfo stateInfo = m_ani.GetCurrentAnimatorStateInfo(0);// 如果处于待机状态if (stateInfo.nameHash == Animator.StringToHash("Base Layer.idle") && !m_ani.IsInTransition(0)){m_ani.SetBool("idle", false);// 待机一定时间m_timer -= Time.deltaTime;if (m_timer > 0)return;// 如果距离主角小于1.5米,进入攻击动画状态if (Vector3.Distance(m_transform.position, m_player. m_transform.position) < 1.5f){m_ani.SetBool("attack", true);}else{// 重置定时器m_timer=1;// 设置寻路目标点m_agent.SetDestination(m_player. m_transform.position);// 进入跑步动画状态m_ani.SetBool("run", true);}}// 如果处于跑步状态if (stateInfo.nameHash == Animator.StringToHash("Base Layer.run") && !m_ani.IsInTransition(0)){m_ani.SetBool("run", false);// 每隔1秒重新定位主角的位置m_timer -= Time.deltaTime;if (m_timer < 0){m_agent.SetDestination(m_player. m_transform.position);m_timer = 1;}// 追向主角MoveTo();// 如果距离主角小于1.5米,向主角攻击if (Vector3.Distance(m_transform.position, m_player. m_transform.position) <= 1.5f){//停止寻路 m_agent.ResetPath();// 进入攻击状态m_ani.SetBool("attack", true);}}// 如果处于攻击状态if (stateInfo.nameHash == Animator.StringToHash("Base Layer.attack") && !m_ani.IsInTransition(0)){// 面向主角RotateTo();m_ani.SetBool("attack", false);// 如果攻击动画播完,重新进入待机状态if (stateInfo.normalizedTime >= 1.0f){m_ani.SetBool("idle", true);// 重置计时器m_timer = 2;m_player.OnDamage(1);}}// 死亡if (stateInfo.nameHash == Animator.StringToHash("Base Layer.death") && !m_ani.IsInTransition(0)){if (stateInfo.normalizedTime >= 1.0f){OnDeath();}}}// 转向目标点void RotateTo(){// 当前角度 Vector3 oldangle = m_transform.eulerAngles;// 获得面向主角的角度m_transform.LookAt(m_player.m_transform);float target = m_transform.eulerAngles.y;// 转向主角float speed = m_rotSpeed * Time.deltaTime;float angle = Mathf.MoveTowardsAngle(oldangle.y, target, speed);m_transform.eulerAngles = new Vector3(0, angle, 0);}// 寻路移动void MoveTo(){float speed = m_movSpeed * Time.deltaTime;m_agent.Move(m_transform.TransformDirection((new Vector3(0, 0, speed))));}// 伤害public void OnDamage(int damage){m_life -= damage;// 如果生命为0,销毁自身if (m_life <= 0){m_ani.SetBool("death", true);}}
}
我发现以书中的逻辑:僵尸每次到达攻击范围后,只会发起一次攻击,然后就转为IDEL状态,然后再检测是否有攻击,没有则继续追有则再发起攻击。
感觉运行起来的效果不是太好,因为僵尸只攻击一次(也就是挥一次手臂),然后就恢复站立状态,等下再挥,很不像僵尸的作风。至少也得连续挥舞吧。
连续挥舞有两种实现方式:
1.设置Attack的动画为Loop,然后将上述代码中的这一句if(stateInfo.normalizedTime > 1.0f),将1.0f稍微该大些,这样僵尸就会挥动很多次手臂。
但我觉得这种方式直接改掉了Attack这个动画本来的意义,不采用
2.对Animator中的Attack状态做些变化,目前Attack这个状态有下面的3个状态变化,
那么目前我就需要 一个attack -> attack的状态变化,以实现attack的连续执行。
设置如下:
这样就建立了attack->attack的动画过渡效果,然后还需要代码控制这一状态,于是再设置:
这样,当bool值attack的值为False时,Attack这个动画就不再重复了。
我改动的代码如下:
if (stateInfo.fullPathHash == Animator.StringToHash ("Base Layer.attack")&& !m_ani.IsInTransition(0)) {RotateTo ();if (m_timer > 0) {m_timer -= Time.deltaTime;return;}m_ani.SetBool ("attack", false);if (stateInfo.normalizedTime >= 1.0f) {m_ani.SetBool ("idle", true);m_timer = 0.1f;}}
这里,我将在RotateTo后面等待m_Timer的时间,这个时间也就是动画重复播放的时间,这个时间过之后,我就会设置Attack的值为False,然后当再播放完一次时,就设置idle为true,然后程序就会转而执行idle的部分了。
总体效果就是:僵尸到达攻击范围,攻击N次,然后停止,再继续攻击N次,直到主角死亡,或者不再攻击范围而追击主角。
对金玺曾版《Unity3D手机游戏开发》第三章“第一人称射击游戏”修改,使支持僵尸连续攻击相关推荐
- unity3D第一人称射击游戏(推荐)
unity3d第一人称射击游戏(推荐) 第一部分:简介 这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS).其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思 ...
- Unity3D FPS Game:第一人称射击游戏(一)
耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...
- Unity3D FPS Game:第一人称射击游戏(二)
耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...
- Unity3D FPS Game:第一人称射击游戏(三)
耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...
- u3d5第一人称射击游戏(C#脚本)完整版并在iOS9.3系统上真机运行
参考资料:<Unity3D\2D手机游戏开发>(第二版) + 百度 涉及U3D的功能有:摄像机控制.物理.动画.智能寻路等. 开发工具:Unity3D5.3.4,VS2015,VMpl ...
- 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 10 日,在 120 年前的今天,瑞典国王和挪威诺贝尔基金会首次颁发了诺贝尔奖.根据诺贝尔 ...
- linux 射击 游戏,Ubuntu下安装第一人称射击游戏 Nexuiz 2.4.2(图)
Ubuntu下安装第一人称射击游戏 Nexuiz 2.4.2(图) Nexuiz 是最流行的基于 DarkPlaces 引擎的开源第一人称射击游戏之一.经过漫长的开发旅程,在2008年05月11日,该 ...
- fedora上的第一人称射击游戏
fedora工作之余也可以休息娱乐,第一人称射击游戏CS在Fedora上跑起来不容易,但不要放弃! 1.openarena是雷神之锤的开源版.使用quake引擎.0.8.5版近400M.我的破本本能跑 ...
- FPS - 第一人称射击游戏
第一人称射击类游戏,FPS(First-person shooting game), 严格来说第一人称射击游戏属于ACT类游戏的一个分支,但和RTS类游戏一样,由于其在世界上的迅速风靡,使之发展成了一 ...
最新文章
- Kotlin 数组的使用
- 符号主义对深度学习的意义浅谈
- php开发mvc教程,php开发一个简单的MVC
- 5 华为兼容性 双指缩放_华为EMUI10“滚屏翻译”之背后的学问
- SpringCloud SpringBoot 推荐
- android crop 大图,com.android.camera.action.CROP 实现图片剪裁
- conda清华源安装pytorch依旧慢踩坑
- 连续被巨头青睐,SpaceX 部分新项目原型系 Rust 构建
- 禁用联想笔记本电脑自带的键盘
- 计算机主板的电路,电脑主板电路图全).pdf
- 网页端播放视频加速方法
- qca wlan wifi modules解析三
- VS2019无法启动程序 系统找不到指定文件解决办法
- android 夜间模式源码,Android Support Library 之 夜间模式
- 《架构设计2.0大型分布式系统架构方法论与实践》三高笔记
- NLP自然语言处理—主题模型LDA案例:挖掘人民网留言板文本数据
- 基于Python的决策树分类器与剪枝
- 【语音识别】动态时间规整算法(RTW)语音识别系统【含GUI Matlab源码 341期】
- kiss原则包括什么_kiss是什么意思(kiss原则包括什么)
- 计算机负数的绝对值,负数的绝对值是什么
热门文章
- 【Android】直播必备之YUV使用总结 —— 常用的几种格式:NV21/NV12/YV12/YUV420P的区别
- MapReduce环形缓冲区底层实现
- 2022年二级建造师机电工程常用材料及工程设备测试题及答案
- Hi3518e图像偏绿,且比较暗的解决方法
- 猪年设计素材:一波免费猪猪icon已为你备好
- css3条纹边框效果
- 如何知识变现?介绍几个变现途径
- 1989年个人简历_像1989年一样进行计算
- ISE14.7使用教程(一个完整工程的建立)
- z世代消费力白皮书_“Z世代”的世界 消费流里的商机