您的位置:首页 > 移动开发 > Unity3D

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐