查看: 2163|回复: 6
打印 上一主题 下一主题

[其他] 人物控制脚本的实现

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-6-25 02:36:37 |只看该作者 |倒序浏览

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

对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. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-6-25 03:17:25 |只看该作者
Wow you are really machine!!
回复

使用道具 举报

10

主题

8

听众

1872

积分

助理设计师

Rank: 4

纳金币
188
精华
0

活跃会员

板凳
发表于 2014-6-25 08:16:34 |只看该作者
目前没用到,可以自己试试,谢谢分享
回复

使用道具 举报

3

主题

1

听众

6189

积分

高级设计师

Rank: 6Rank: 6

纳金币
370
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-6-25 08:19:57 |只看该作者
不是有内置的那个第一人称控制器么?
回复

使用道具 举报

0

主题

2

听众

4092

积分

中级设计师

Rank: 5Rank: 5

纳金币
530
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2014-6-25 08:29:59 |只看该作者
Thanks for sharing!
回复

使用道具 举报

6#
无效楼层,该帖已经被删除

0

主题

1

听众

170

积分

设计实习生

Rank: 2

纳金币
77
精华
0

最佳新人

7#
发表于 2014-10-16 16:18:33 |只看该作者
支持一個,感謝分享~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-27 15:01 , Processed in 0.094532 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部