我个人觉得这本书写的至少很和我口味,而且他的光盘资料也很详尽,比如,一个实例,不仅有一个完整的实现工程,还有一份供作练习的工程(该工程中没有要练习的部分,而资源啥的都有),让人感觉很好。

这本书下载电子版也很方便,比如: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手机游戏开发》第三章“第一人称射击游戏”修改,使支持僵尸连续攻击相关推荐

  1. unity3D第一人称射击游戏(推荐)

    unity3d第一人称射击游戏(推荐) 第一部分:简介   这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS).其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思 ...

  2. Unity3D FPS Game:第一人称射击游戏(一)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  3. Unity3D FPS Game:第一人称射击游戏(二)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  4. Unity3D FPS Game:第一人称射击游戏(三)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  5. u3d5第一人称射击游戏(C#脚本)完整版并在iOS9.3系统上真机运行

    参考资料:<Unity3D\2D手机游戏开发>(第二版) +   百度 涉及U3D的功能有:摄像机控制.物理.动画.智能寻路等. 开发工具:Unity3D5.3.4,VS2015,VMpl ...

  6. 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 10 日,在 120 年前的今天,瑞典国王和挪威诺贝尔基金会首次颁发了诺贝尔奖.根据诺贝尔 ...

  7. linux 射击 游戏,Ubuntu下安装第一人称射击游戏 Nexuiz 2.4.2(图)

    Ubuntu下安装第一人称射击游戏 Nexuiz 2.4.2(图) Nexuiz 是最流行的基于 DarkPlaces 引擎的开源第一人称射击游戏之一.经过漫长的开发旅程,在2008年05月11日,该 ...

  8. fedora上的第一人称射击游戏

    fedora工作之余也可以休息娱乐,第一人称射击游戏CS在Fedora上跑起来不容易,但不要放弃! 1.openarena是雷神之锤的开源版.使用quake引擎.0.8.5版近400M.我的破本本能跑 ...

  9. FPS - 第一人称射击游戏

    第一人称射击类游戏,FPS(First-person shooting game), 严格来说第一人称射击游戏属于ACT类游戏的一个分支,但和RTS类游戏一样,由于其在世界上的迅速风靡,使之发展成了一 ...

最新文章

  1. Kotlin 数组的使用
  2. 符号主义对深度学习的意义浅谈
  3. php开发mvc教程,php开发一个简单的MVC
  4. 5 华为兼容性 双指缩放_华为EMUI10“滚屏翻译”之背后的学问
  5. SpringCloud SpringBoot 推荐
  6. android crop 大图,com.android.camera.action.CROP 实现图片剪裁
  7. conda清华源安装pytorch依旧慢踩坑
  8. 连续被巨头青睐,SpaceX 部分新项目原型系 Rust 构建
  9. 禁用联想笔记本电脑自带的键盘
  10. 计算机主板的电路,电脑主板电路图全).pdf
  11. 网页端播放视频加速方法
  12. qca wlan wifi modules解析三
  13. VS2019无法启动程序 系统找不到指定文件解决办法
  14. android 夜间模式源码,Android Support Library 之 夜间模式
  15. 《架构设计2.0大型分布式系统架构方法论与实践》三高笔记
  16. NLP自然语言处理—主题模型LDA案例:挖掘人民网留言板文本数据
  17. 基于Python的决策树分类器与剪枝
  18. 【语音识别】动态时间规整算法(RTW)语音识别系统【含GUI Matlab源码 341期】
  19. kiss原则包括什么_kiss是什么意思(kiss原则包括什么)
  20. 计算机负数的绝对值,负数的绝对值是什么

热门文章

  1. 【Android】直播必备之YUV使用总结 —— 常用的几种格式:NV21/NV12/YV12/YUV420P的区别
  2. MapReduce环形缓冲区底层实现
  3. 2022年二级建造师机电工程常用材料及工程设备测试题及答案
  4. Hi3518e图像偏绿,且比较暗的解决方法
  5. 猪年设计素材:一波免费猪猪icon已为你备好
  6. css3条纹边框效果
  7. 如何知识变现?介绍几个变现途径
  8. 1989年个人简历_像1989年一样进行计算
  9. ISE14.7使用教程(一个完整工程的建立)
  10. z世代消费力白皮书_“Z世代”的世界 消费流里的商机