unity手游<少侠历险记>(1)使用CharacterController控制人物移动
2015-01-21 11:49
465 查看
前言
本文由作者@zx一路飞奔出品,转载请注明出处文章地址:/article/7715155.html
作者微博: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来控制人物移动,上代码!
void Move(){ //控制移动 float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); if(h != 0 || v != 0){ //angle为人物 绕y轴旋转的角度 float angle = Mathf.Atan2(h,v) * Mathf.Rad2Deg; targetRotation = Quaternion.Euler(new Vector3(0, angle, 0)); //旋转人物方向 this.transform.rotation = Quaternion.Lerp(this.transform.rotation,targetRotation,Time.deltaTime *25); moveSpeed = 3.5f; ctrlAnimState = ControlAnimationState.Move; }else{ moveSpeed = 0; ctrlAnimState = ControlAnimationState.Idle; } // if(target!=null){ // this.transform.LookAt(target.transform.position); // destinationDistance = Vector3.Distance(target.transform.position,this.transform.position); // if(destinationDistance < 1f){ // moveSpeed = 0f; // ctrlAnimState = ControlAnimationState.Idle; // target = null; // }else{ // moveSpeed = 3.5f; // ctrlAnimState = ControlAnimationState.Move; // } // } if(ctrlAnimState == ControlAnimationState.Move){ if(controller.isGrounded){ movedir = Vector3.zero; movedir = transform.TransformDirection(Vector3.forward*moveSpeed); } }else { movedir = Vector3.Lerp(movedir,Vector3.zero,Time.deltaTime * 10); } //应用重力 movedir.y -= 20 * Time.deltaTime; //move controller.Move(movedir * Time.deltaTime); }
相关文章推荐
- unity手游<少侠历险记>(1)使用CharacterController控制人物移动
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- <Linux+qt>设置使用键盘控制事件响应
- HTML5 <video> - 使用 DOM 进行控制
- HTML5 <video> - 使用 DOM 进行自定义控制示例
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- 手势检测实现相册的左右滑动(并加上移动与旋转的特效) 首先,activity_main.xml里,使用ViewFlipper组件(可使用动画控制多个组件之间的切换效果) <?xml version="
- HTML5使用js jq控制<audio>的播放 暂停
- 使用Subversion进行版本控制 针对 Subversion 1.4(根据r2866编译)-------<转载>这是重要的知识点
- HTML5<video>标签,使用DOM进行播放控制
- 问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?
- sp使用<c:choose>标签来控制内容显示
- <一>Ioc控制反转——手把手教学:如何配置并使用单元测试一个spring框架(附源码)
- jsp使用<c:choose>标签来控制内容显示
- <Unity3D>上下左右 键控制人移动
- HTML5 视频(二) <video> 使用 DOM 进行控制
- <转>Oracle PGA 使用控制
- 问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?
- 使用innerHTML属性来控制DIV和SPAN<$log_hiddenIcon$>
- js 在<input type='file'/>的使用中,控制文件的后缀jpg gif等