纳金网

标题: 人物控制脚本的实现 [打印本页]

作者: 狂风大尉    时间: 2014-6-25 02:36
标题: 人物控制脚本的实现

只是简单地实现了一下几个动作的调用,目前还在实验阶段,也不知道这样的调用方法可以一直延续下去不,当控制状态变得越来越多的时候,怎么样做到不互相影响,并且维护起来也是个问题,希望大家能一起考虑一下。也许可以借鉴一下已有项目的经验。

对D3D的空间几何知识是必要的,而这里要注意的是U3D提供了一个方法来判断是否与地面相碰撞,_grounded = (_flags & CollisionFlags.CollidedBelow) != 0;
其中CollisionFlags.CollidedBelow要想获得一个值,玩家的移动方向必须有朝向地面的方向向量分量。_grounded = (_flags & CollisionFlags.CollidedBelow) != 0;

为了在跳跃过程中更具有真实性,加入了重力加速度的概念,注意_gravity表示的是“重力速度”,也就是向下的一个向量分量。
  1. // Require a character controller to be attached to the same game object
  2. @script RequireComponent(CharacterController)
  3. var _speed : float;
  4. var _jumpspeed : float;
  5. var _rotatespeed : float;
  6. var _originalgravity : float;
  7. var _gravity : float;
  8. var _addgravity : float;
  9. var _moveDirection: Vector3;
  10. var _lastDirection: Vector3;
  11. var _originalRotation : Quaternion;
  12. var _flags;
  13. var _grounded;
  14. var _canjump;
  15. var _animation;
  16. var _run : AnimationClip;
  17. var _idle : AnimationClip;
  18. var _attack : AnimationClip;
  19. var _jump : AnimationClip;
  20. private var _controller : CharacterController;
  21. enum PlayerState
  22. {
  23. STATE_READY   = 0,
  24. STATE_RUN    = 1,
  25. STATE_IDLE    = 2,
  26. STATE_ATTACK   = 3,  
  27. STATE_JUMP    = 4,
  28. }
  29. private var _playerstate : PlayerState;
  30. function Start(){
  31. _speed = 50F;
  32. _jumpspeed = 40F;
  33. _rotatespeed = 10F;

  34. _originalgravity = 40;
  35. _gravity = 40;
  36. _addgravity = 3;

  37. _canjump = true;

  38. _moveDirection = Vector3.zero;
  39. _lastDirection = Vector3.zero;
  40. _originalRotation = new Quaternion(0f, 0f, 0f, 1f);

  41. _grounded = true;
  42. _animation = GetComponent(Animation);

  43. _controller = GetComponent(CharacterController);

  44. _playerstate = PlayerState.STATE_READY;

  45. _moveDirection.y = -1; //给Y轴方向一个初始值,以使其可以与地面正确相撞
  46. }
  47. function Update () {
  48. //模型的旋转(临时)
  49. if(Input.GetKey("a")){
  50.   transform.Rotate(-Vector3.up*2);
  51. }
  52. if(Input.GetKey("d")){
  53.   transform.Rotate(Vector3.up*2);
  54. }


  55. if(_grounded)
  56. {
  57.   //本地空间水平移动方向向量
  58.   _moveDirection = Vector3( 0 , -1 ,Input.GetAxis("Vertical"));
  59.   
  60.   //本地空间移动方向转为世界空间的移动方向向量
  61.   _moveDirection = transform.TransformDirection(_moveDirection);
  62.   _moveDirection *= _speed;
  63.   
  64.   //重力速度还原
  65.   _gravity = _originalgravity;
  66. }

  67. //跳跃
  68. if (Input.GetButton("Jump") )
  69. {
  70.   _playerstate = PlayerState.STATE_JUMP;
  71.   
  72.   //获得初速度
  73.   _moveDirection.y = _jumpspeed;
  74.   
  75.   _animation.Play("jump");
  76. }


  77. //如果当前处于跳跃中,就算一下Y向量
  78. if(_playerstate == PlayerState.STATE_JUMP)
  79. {
  80.   _gravity += _addgravity;
  81.   _moveDirection.y -= _gravity * Time.deltaTime;  
  82. }
  83.   
  84. //移动,并获得碰撞标示
  85. var _flags : CollisionFlags =_controller.Move(_moveDirection *Time.deltaTime);
  86. //是否已经着地
  87. _grounded = (_flags & CollisionFlags.CollidedBelow) != 0;
  88. print(_grounded);
  89. //=======================================================================
  90. //攻击
  91. if(Input.GetKeyUp("f") && _grounded &&_playerstate == PlayerState.STATE_IDLE)
  92. {
  93.   _playerstate = PlayerState.STATE_ATTACK;
  94.   _animation.Play("attack");
  95. }

  96. //休闲
  97. if(_moveDirection.x == 0  &&  _moveDirection.z == 0&& _grounded && _playerstate != PlayerState.STATE_ATTACK)
  98. if(_moveDirection != Vector3(0,0,0))
  99. {
  100.   if(_playerstate != PlayerState.STATE_ATTACK)
  101.   {
  102.    _playerstate = PlayerState.STATE_IDLE;
  103.    _animation.Play("idle");
  104.   }
  105. }

  106. //跑动
  107. if((_moveDirection.x != 0 || _moveDirection.z != 0) &&_grounded  )
  108. {
  109.    _playerstate = PlayerState.STATE_RUN;
  110.    _animation.Play("run");
  111. }
  112. }
  113. //供外部UI调用的接口,调用攻击动作
  114. function PlayAnimation_Attack()
  115. {
  116. if(_grounded && (_playerstate ==PlayerState.STATE_IDLE||_playerstate ==PlayerState.STATE_ATTACK))
  117. {
  118.   _playerstate = PlayerState.STATE_ATTACK;
  119.   _animation.Play("attack");
  120. }
  121. }
复制代码

作者: hyui    时间: 2014-6-25 03:17
Wow you are really machine!!
作者: pz789as    时间: 2014-6-25 08:16
目前没用到,可以自己试试,谢谢分享
作者: hariboot    时间: 2014-6-25 08:19
不是有内置的那个第一人称控制器么?
作者: Kadina    时间: 2014-6-25 08:29
Thanks for sharing!
作者: 嵐淵瑟    时间: 2014-10-16 16:18
支持一個,感謝分享~~




欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5