提要

今天要实现的是一个简单人物控制器。包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画。虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现。先上效果图:

场景搭建

首先下载这个package,里面包含了人物的动作还有地面的模型。将人物和地面都拖进场景中。这里的模型默认的动画模式是lagacy,不用修改。模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale factor,可能会出现骨骼错位的问题。

接下来给摄像机添加一个天空盒组件,添加一个unity自带的天空盒就好。

对于人物还要添加几个component:

添加Rigdbody来控制人物,选择IsKinematic,这样角色就不会被外力影响。加了CapsuleCollider让角色 不掉下去。HeroController用来控制角色的运动和打斗,下面会说。

角色行走

思路很简单,通过wasd获得行走的方向,然后对应控制角色的位移就可以了,不过在变向的时候要注意角色的平滑转身。

首先定义 一个 枚举变量,为角色可能的状态。

 public enum ActionState{Attack_1,Attack_2,Attack_3_1,Attack_3_2,Attack_3_3,Attack_4,Fire,Jump,Run,Idle}private ActionState actionState = ActionState.Idle;

Animate函数来根据角色的状态播放对应的动画

 void Animate(){float delayTime = -0.1f;switch (actionState) {case ActionState.Attack_3_1:delayTime = -0.1f;playerAnimation.CrossFade("Attack3-1", 0.15f);currentAnimationClip = playerAnimation["Attack3-1"].clip;break;case ActionState.Attack_3_2:delayTime = -0.1f;playerAnimation.CrossFade("Attack3-2", 0.15f);currentAnimationClip = playerAnimation["Attack3-2"].clip;break;case ActionState.Attack_3_3:delayTime = -0.1f;playerAnimation.CrossFade("Attack3-3", 0.15f);currentAnimationClip = playerAnimation["Attack3-3"].clip;break;case ActionState.Attack_4:delayTime = -0.1f;playerAnimation.CrossFade("Attack4", 0.15f);currentAnimationClip = playerAnimation["Attack4"].clip;break;case ActionState.Idle:playerAnimation.CrossFade("Idle", 0.35f);currentAnimationClip = playerAnimation["Idle"].clip;break;case ActionState.Jump:playerAnimation.CrossFade("Jump", 0.15f);currentAnimationClip = playerAnimation["Jump"].clip;break;case ActionState.Run:playerAnimation.CrossFade("Run", 0.15f);currentAnimationClip = playerAnimation["Run"].clip;break;case ActionState.Fire:playerAnimation.CrossFade("Fire", 0.15f);currentAnimationClip = playerAnimation["Fire"].clip;break;default: break;}//Switch to default if an animation is almost overif (playerAnimation[currentAnimationClip.name].time > (playerAnimation[currentAnimationClip.name].length + delayTime)){actionState = ActionState.Idle;currentAnimationClip = playerAnimation["Idle"].clip;}}

在update函数中添加对应的逻辑函数:

 // Update is called once per framevoid Update () {float h = Input.GetAxis("Horizontal");  float v = Input.GetAxis("Vertical");  MovementManagement (h, v);Animate ();}

MovementManagement函数就是根据输入处理角色行走的

 void MovementManagement(float horizontal, float vertical){if(horizontal != 0f || vertical != 0f){Rotating(horizontal, vertical);actionState = ActionState.Run;moveDirection = new Vector3(horizontal, 0.0f, vertical);rigidbody.MovePosition(rigidbody.position + speed * moveDirection * Time.deltaTime);}}

平滑转身函数(参考Unity官网的toturial)

void Rotating(float horizontal, float vertival){Vector3 targetDirection = new Vector3 (horizontal, 0f, vertival);// Create a rotation based on this new vector assuming that up is the global y axis.Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);// Create a rotation that is an increment closer to the target rotation from the player's rotation.Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);// Change the players rotation to this new rotation.rigidbody.MoveRotation(newRotation);}

由于这里是简单的平地,所以处理起来比较简单。当需要控制角色在复杂的地形上行走的时候,比如山川丘陵,就需要角色在Y方变化了。这个时候只需要勾选角色的rigidbody component的 use gravity,然后限制rigidbody的x,z方向的移动了,x,z方向的移动要完全靠脚本来处理。

角色连击

首先来思考一下逻辑。角色初始值状态是Idle,此时按下攻击,发连招的第一招,如果玩家继续按的话就进入第二招,依次类推,如果中途停下的话,就还是回到Idle状态。这是最简单的单线连招的逻辑,没有考虑打断,多连等情况,代码实现如下:

 void AttackLogic(){if (Input.GetButtonDown ("Fire1")) {if(actionState != ActionState.Attack_3_1 && actionState != ActionState.Attack_3_2&& actionState != ActionState.Attack_3_3&& actionState != ActionState.Attack_4){Debug.Log ("Fire");actionState = ActionState.Attack_3_1;}else if(actionState == ActionState.Attack_3_1 && playerAnimation[currentAnimationClip.name].time > 1.0f){actionState = ActionState.Attack_3_2;}else if(actionState == ActionState.Attack_3_2 && playerAnimation[currentAnimationClip.name].time > 1.0f){actionState = ActionState.Attack_3_3;}else if(actionState == ActionState.Attack_3_3 && playerAnimation[currentAnimationClip.name].time > 1.0f){actionState = ActionState.Attack_4;}/*else if(actionState == ActionState.Attack_3 && playerAnimation[currentAnimationClip.name].time > 2.0f){actionState = ActionState.Idle;}*/}else if(Input.GetButtonDown ("Jump")){actionState = ActionState.Jump;}else if(Input.GetButtonDown ("Fire2")){actionState = ActionState.Fire;//if (currentSkill==null)}}

运行一下,就可以实现最开始的那个效果了。

参考

Unity3d toturial - Stealth

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击相关推荐

  1. Unity3D游戏开发从零单排(一) - 真机运行(Android和WindowsPhone)

    提要 周末不想学习,就来玩一玩Unity3D好了. 本以为网上会有很多关于Unity3D的配置文章,但搜到的要么是iOS的,要么比较 坑爹,所以还是自己来写一篇. 又是一个单排,希望这次的单排能够一路 ...

  2. 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作

    在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...

  3. Unity3D游戏开发之邂逅Unity3D

    从今天起,博主决定要在毕业前把大学里想学的东西都学完.所以,从今天起,大家将看到由我为大家带来的Unity3D系列文章,让我们一起来学习Unity3D游戏开发吧! 在正式今天的文章之前,博主想简单介绍 ...

  4. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  5. Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)

    今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游 ...

  6. Unity3D游戏开发-宣雨松读书摘要(2015-4-17 18:36)

    本书基于Unity3.5编写,通过丰富的游戏实例,以JavaScript与C#两种语言介绍Unity开发. Unity3D游戏开发-宣雨松 序 它支持JavaScript.C#.Boo三种脚本语言 ...

  7. Unity3D游戏开发之仿仙剑奇侠传角色控制效果

    在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图,如果结合GUI在这个小地图下面绘制一些背景贴图,相信整体的效果会更好一些.博主希望这个问题大家能够自己去做更深入的研究, ...

  8. [Unity3D]Unity3D游戏开发之怪物AI

    大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei. 在上一篇文章中,我们基本上实现了一个小地图的功能, ...

  9. Unity3D游戏开发之使用Unity3D开发2D游戏 (一)

    今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游 ...

最新文章

  1. linux下apache+php+mysql升级安装过程
  2. ASP.NET Web Pages – Chart 帮助器简介
  3. mongodb 持久化 mysql_scrapy数据持久化存储(MySQL、MongoDB)
  4. Nginx(四)------nginx 负载均衡
  5. 操作系统:进程调度算法
  6. 台达变频器vfb—d参数表_台达变频器在印刷涂布机上的应用
  7. .NET 中安全高效跨平台的模板引擎 Fluid 使用文档
  8. Bioconda软件安装神器:多版本并存、环境复制、环境导出
  9. input在type=number时去右边上下箭头
  10. 格灵深瞳发起 AI · 爱 算法 在线编程挑战赛
  11. py导入包异常跳出_Python:尝试从导入的包导入模块时出现“ModuleNotFoundError”
  12. 类型转换一种处理方式
  13. mysql 相关操作
  14. 查询sql语句所花时间
  15. 禁用word公式编辑器
  16. mysql报错error2002_mysql中异常出错ERROR:2002的处理办法分享
  17. 论一个优秀的小牛论坛管理员(转:五只鹳狸猿进笼观猴,各留一只爪)
  18. 教你一步解决大部分wallpaper engine使用时卡顿、鼠标延迟的问题
  19. C++-鼠标操作大全
  20. c语言define作用范围,#define的作用(C语言)

热门文章

  1. python做积分_利用python求积分的实例
  2. python 爬虫,获取携程网站机票数据
  3. ant pro-table点击表格行高亮显示
  4. h5课件制作_H5课件——H5页面在教学上的妙用
  5. 【IJCAI 2016】Modularity Based Community Detection with Deep Learning 阅读小记
  6. 把VOB格式转换成其它格式的工具
  7. 【hadoop生态之Hbase】HBase部署与使用【笔记+代码】
  8. PE,成长,利率:对估值的再思考——最聪明的投资回收期
  9. 【SegNet】 A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
  10. 业务流程管理(BPM)系统的九大必备特点