unity手游<少侠历险记>(1)使用CharacterController控制人物移动

来源:互联网 发布:云计算的特点有哪些 编辑:程序博客网 时间:2024/04/30 04:04


本文由作者@zx一路飞奔出品,转载请注明出处
文章地址:http://blog.csdn.net/u014735301/article/details/42966247
作者微博:http://weibo.com/u/1847349851 



之前在网上找到一个完整的rpg的游戏demo,断断续续自个琢磨了2个月,
学习NGUI的时候,就用NGUI插件把游戏本身基于GUI的部分UI界面改编了一下,
一直在看里面的游戏逻辑,刚开始一头雾水,之后慢慢的理解一部分东西了,借此写博客的机会,
决定重新开始学习其代码,参考下,做一个手游RPGdemo,自己对于RPG的美好记忆应该是源于小学时候玩的98版仙剑奇侠传。恩,真的是人生中美好的记忆~


CharacterController


开始正题,对于人物的移动,一般可以给人物添加collider和rigidbody组件,也可以添加CharacterController人物控制组件来进行控制

CharacterController包含Rigidbody组件的一些属性,个人理解,有了CharacterController,就不用再添加Rigidbody组件了,

控制器不会对加在它自身上的力做出反应,也不会自动推开其他刚体。

如果想让角色控制器推开其他刚体或者对象,你可以在对象附加的脚本中添加OnControllerColliderHit()函数,这样对它们施加力就能够产生碰撞。




长得像一个胶囊体,对于其属性的一些调整,有一些需要注意的

Slope Limit 坡度限制,不能设的太小,一般使用90度会比较合适。由于是胶囊体,角色控制器不会爬上墙。

Step Offset 角色可以迈上的最高台阶高度,确保对于一个两米大小的人来说该值介于0.1到0.4之间。

Skin width 皮肤厚度,皮肤厚度决定了两个碰撞器可以互相渗入的深度。较大的皮肤厚值度会导致颤抖。小的皮肤厚度值会导致角色被卡住。

实践中比较好的值是至少要大于0.01并且大于Radius的10%。如果发现你的角色频繁被卡住,尝试调整Skin Width值。

Min Move Distance 角色移动距离小于该值,角色就不会移动,避免颤抖现象,建议为0就行

center 调整胶囊体的位置

Radius 胶囊体半径,

Height 高度


下面来了解下,如何使用CharacterController来控制人物移动,上代码!


[csharp] view plain copy
  1.     void Move(){  
  2.         //控制移动  
  3.         float h = Input.GetAxis("Horizontal");  
  4.         float v = Input.GetAxis("Vertical");  
  5.         if(h != 0 || v != 0){  
  6.             //angle为人物 绕y轴旋转的角度  
  7.             float angle = Mathf.Atan2(h,v) * Mathf.Rad2Deg;  
  8.             targetRotation = Quaternion.Euler(new Vector3(0, angle, 0));  
  9.             //旋转人物方向  
  10.             this.transform.rotation = Quaternion.Lerp(this.transform.rotation,targetRotation,Time.deltaTime *25);  
  11.   
  12.             moveSpeed = 3.5f;  
  13.             ctrlAnimState = ControlAnimationState.Move;   
  14.         }else{  
  15.             moveSpeed = 0;  
  16.             ctrlAnimState = ControlAnimationState.Idle;   
  17.         }  
  18. //      if(target!=null){  
  19. //          this.transform.LookAt(target.transform.position);  
  20. //          destinationDistance = Vector3.Distance(target.transform.position,this.transform.position);  
  21. //          if(destinationDistance < 1f){  
  22. //              moveSpeed = 0f;  
  23. //              ctrlAnimState = ControlAnimationState.Idle;   
  24. //              target = null;  
  25. //          }else{  
  26. //              moveSpeed = 3.5f;  
  27. //              ctrlAnimState = ControlAnimationState.Move;   
  28. //          }  
  29. //      }  
  30.   
  31.         if(ctrlAnimState == ControlAnimationState.Move){  
  32.             if(controller.isGrounded){  
  33.                 movedir = Vector3.zero;  
  34.                 movedir = transform.TransformDirection(Vector3.forward*moveSpeed);  
  35.             }  
  36.         }else  
  37.         {         
  38.             movedir = Vector3.Lerp(movedir,Vector3.zero,Time.deltaTime * 10);     
  39.         }  
  40.         //应用重力  
  41.         movedir.y -= 20 * Time.deltaTime;  
  42.         //move  
  43.         controller.Move(movedir * Time.deltaTime);    
  44.     }  
本文由作者@zx一路飞奔出品,转载请注明出处
文章地址:http://blog.csdn.net/u014735301/article/details/42966247
作者微博:http://weibo.com/u/1847349851 



之前在网上找到一个完整的rpg的游戏demo,断断续续自个琢磨了2个月,
学习NGUI的时候,就用NGUI插件把游戏本身基于GUI的部分UI界面改编了一下,
一直在看里面的游戏逻辑,刚开始一头雾水,之后慢慢的理解一部分东西了,借此写博客的机会,
决定重新开始学习其代码,参考下,做一个手游RPGdemo,自己对于RPG的美好记忆应该是源于小学时候玩的98版仙剑奇侠传。恩,真的是人生中美好的记忆~


CharacterController


开始正题,对于人物的移动,一般可以给人物添加collider和rigidbody组件,也可以添加CharacterController人物控制组件来进行控制

CharacterController包含Rigidbody组件的一些属性,个人理解,有了CharacterController,就不用再添加Rigidbody组件了,

控制器不会对加在它自身上的力做出反应,也不会自动推开其他刚体。

如果想让角色控制器推开其他刚体或者对象,你可以在对象附加的脚本中添加OnControllerColliderHit()函数,这样对它们施加力就能够产生碰撞。




长得像一个胶囊体,对于其属性的一些调整,有一些需要注意的

Slope Limit 坡度限制,不能设的太小,一般使用90度会比较合适。由于是胶囊体,角色控制器不会爬上墙。

Step Offset 角色可以迈上的最高台阶高度,确保对于一个两米大小的人来说该值介于0.1到0.4之间。

Skin width 皮肤厚度,皮肤厚度决定了两个碰撞器可以互相渗入的深度。较大的皮肤厚值度会导致颤抖。小的皮肤厚度值会导致角色被卡住。

实践中比较好的值是至少要大于0.01并且大于Radius的10%。如果发现你的角色频繁被卡住,尝试调整Skin Width值。

Min Move Distance 角色移动距离小于该值,角色就不会移动,避免颤抖现象,建议为0就行

center 调整胶囊体的位置

Radius 胶囊体半径,

Height 高度


下面来了解下,如何使用CharacterController来控制人物移动,上代码!


[csharp] view plain copy
  1.     void Move(){  
  2.         //控制移动  
  3.         float h = Input.GetAxis("Horizontal");  
  4.         float v = Input.GetAxis("Vertical");  
  5.         if(h != 0 || v != 0){  
  6.             //angle为人物 绕y轴旋转的角度  
  7.             float angle = Mathf.Atan2(h,v) * Mathf.Rad2Deg;  
  8.             targetRotation = Quaternion.Euler(new Vector3(0, angle, 0));  
  9.             //旋转人物方向  
  10.             this.transform.rotation = Quaternion.Lerp(this.transform.rotation,targetRotation,Time.deltaTime *25);  
  11.   
  12.             moveSpeed = 3.5f;  
  13.             ctrlAnimState = ControlAnimationState.Move;   
  14.         }else{  
  15.             moveSpeed = 0;  
  16.             ctrlAnimState = ControlAnimationState.Idle;   
  17.         }  
  18. //      if(target!=null){  
  19. //          this.transform.LookAt(target.transform.position);  
  20. //          destinationDistance = Vector3.Distance(target.transform.position,this.transform.position);  
  21. //          if(destinationDistance < 1f){  
  22. //              moveSpeed = 0f;  
  23. //              ctrlAnimState = ControlAnimationState.Idle;   
  24. //              target = null;  
  25. //          }else{  
  26. //              moveSpeed = 3.5f;  
  27. //              ctrlAnimState = ControlAnimationState.Move;   
  28. //          }  
  29. //      }  
  30.   
  31.         if(ctrlAnimState == ControlAnimationState.Move){  
  32.             if(controller.isGrounded){  
  33.                 movedir = Vector3.zero;  
  34.                 movedir = transform.TransformDirection(Vector3.forward*moveSpeed);  
  35.             }  
  36.         }else  
  37.         {         
  38.             movedir = Vector3.Lerp(movedir,Vector3.zero,Time.deltaTime * 10);     
  39.         }  
  40.         //应用重力  
  41.         movedir.y -= 20 * Time.deltaTime;  
  42.         //move  
  43.         controller.Move(movedir * Time.deltaTime);    
  44.     }  
0 0
原创粉丝点击